一句话定义:矩阵架构 = "一台电脑 × N 套独立身份 × 每套身份 1 个浏览器 + 1 个 cdp-proxy 进程 + M 个 agent"。身份之间靠浏览器/账号/IP/指纹四重隔离;同身份内的多 agent 靠 chrome-mcp-proxy 的 sessionId 路由互不串台。
v1.0 → v1.1 关键修正:
- 端口分配从"按平台维度"改为"按身份维度"
- 共享浏览器模型替代"一 agent 一浏览器"
- 全局配置路径全部按 Claude Code v2.1.x 实测路径
- 增加 hub 协调层、指纹工具、住宅代理、CDP 安全
- 工具调用必须走
mcp__chrome__*强制约束
适用:Claude Code v2.1.126+(v2 工具发现机制)。验证环境:macOS + Chrome 147 + chrome-mcp-proxy v1.0(William Wang)。
1. 核心定义
身份 (Identity) = 一个浏览器 app + 一套登录态 + 一个住宅 IP + 一个 cdp-proxy 进程
↓
工种 (Role) = 一个 Claude Code agent(独立工作目录),跟同身份其他 agent 共享同一个浏览器实例
这里的"agent" = 一个独立的 Claude Code 终端窗口/会话,不是 Claude Code 内部的 sub-agent / Task 工具,是字面意义上的"开一个新终端、跑一次 claude 命令"。
2. 架构总览
graph TB
A[一台电脑] --> B[全局共享层 ~/.claude/]
A --> C[身份 A: Chrome + US-East 住宅 IP]
A --> D[身份 B: Arc + US-West 住宅 IP]
A --> E[身份 C: Brave + UK 住宅 IP]
A --> F[hub 协调层 ~/agents/_hub/]
B --> B1[~/.claude.json mcpServers]
B --> B2[~/.claude/CLAUDE.md 全局偏好]
B --> B3[~/.claude/skills/ 全局 skill]
C --> C1[cdp-proxy 9401 → Chrome 9222]
C1 --> C2[agent A1 publisher]
C1 --> C3[agent A2 engager]
C1 --> C4[agent A3 researcher]
F --> F1[不接浏览器,只读 logs + memory<br/>做调度]
3. 端口对分配(v1.1 按身份维度)
| 身份 | 浏览器 app | proxy 端口 | chrome 调试端口 | 用户数据目录 | 住宅代理出口 |
|---|---|---|---|---|---|
| identity-A | Chrome | 9401 | 9222 | ~/agents/identity-A/browser-data/ |
US-East |
| identity-B | Arc | 9402 | 9223 | ~/agents/identity-B/browser-data/ |
US-West |
| identity-C | Brave | 9403 | 9224 | ~/agents/identity-C/browser-data/ |
UK |
| identity-D | Edge | 9404 | 9225 | ~/agents/identity-D/browser-data/ |
DE |
| identity-E | Vivaldi | 9405 | 9226 | ~/agents/identity-E/browser-data/ |
JP |
| ... | ... | +1 | +1 | ... | ... |
| identity-J | (随选) | 9410 | 9231 | ... | ... |
预留 9450+/9270+ 给实验/临时用。
同一身份下多 agent:所有 agent 的 .mcp.json 都指向同一个 proxy 端口(如 identity-A 下的所有 agent 都指 9401)。chrome-mcp-proxy 通过 sessionId 路由保证它们看到的事件互不干扰。
4. 三层配置分层(v2.1.x 实测)
| 层级 | MCP 配置 | Skill 路径 | CLAUDE.md 路径 | 加载方式 |
|---|---|---|---|---|
| Enterprise | (managed) | (managed) | /Library/Application Support/ClaudeCode/CLAUDE.md |
优先级最高 |
| User(全局) | ~/.claude.json 的 mcpServers |
~/.claude/skills/<name>/SKILL.md |
~/.claude/CLAUDE.md |
所有 agent 自动继承 |
| Project(项目) | ./.mcp.json |
./.claude/skills/<name>/SKILL.md |
./CLAUDE.md |
仅该工作目录下生效 |
| Local(本地) | ./.claude/settings.local.json |
— | ./CLAUDE.local.md |
不入 git,最后 append |
关键规则
- MCP 写入命令:
claude mcp add <name> -s user|project|local <command> [args...],不要手编 JSON - Skill 优先级:Enterprise > Personal > Project > Plugin
- CLAUDE.md 是拼接不是覆盖 —— 全局 CLAUDE.md 写的所有内容都会出现在每个 agent 里,必须保持极简
4 问决定放哪一层
1. 这个能力绑定特定资源吗?(如某个浏览器端口) → Project
2. 不同身份/agent 凭证不一样吗?(如各自 API key)→ Project
3. 不同身份/agent 行为不一样吗?(如不同语气) → Project
4. 纯逻辑、所有 agent 都用同一份? → User(全局共享)
MCP / Skill / CLAUDE.md 分层示例
| 资产 | 层 | 理由 |
|---|---|---|
chrome MCP(端口 9401/9222) |
Project | 不同身份指向不同 proxy 端口对 |
filesystem MCP |
User | 纯本地工具 |
fetch MCP |
User | 纯网络工具 |
notion MCP(hub agent 用) |
User(在 hub 项目里启用) | 单一工作区 |
Skill:markdown-writer |
User | 通用写作 |
Skill:youtube-publish |
Project(identity 级) | 该身份的 YT 账号特有规则 |
Skill:identity-A-tone |
Project | 该身份口吻 |
| 全局 CLAUDE.md | User,只写跨 agent 偏好 | 拼接到每个 agent,必须极简 |
| 项目 CLAUDE.md | Project | agent 人设、绑定浏览器、铁律 |
5. 单身份目录结构
~/agents/identity-A/
├── _identity/ ← 身份级共享资产
│ ├── start-browser.sh ← 启动浏览器 + cdp-proxy
│ ├── stop-browser.sh
│ ├── browser-data/ ← user-data-dir
│ ├── identity.env ← 身份元数据
│ ├── .browser.pid
│ └── .proxy.pid
│
├── publisher/ ← Agent A1:管发布
│ ├── .mcp.json ← 指向 9401
│ ├── CLAUDE.md ← 该 agent 人设
│ ├── .claude/
│ │ └── skills/
│ │ ├── publish-youtube/SKILL.md
│ │ ├── publish-tiktok/SKILL.md
│ │ └── publish-instagram/SKILL.md
│ ├── feedback.md
│ ├── memory/
│ └── logs/
│
├── engager/ ← Agent A2:管评论互动
│ └── (结构同上,skill 不同)
│
└── researcher/ ← Agent A3:监控同行
└── (结构同上)
6. 关键文件模板
6.1 start-browser.sh(节选关键部分)
#!/bin/bash
set -e
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
mkdir -p "$DIR/browser-data" "$DIR/logs"
IDENTITY_NAME="identity-A"
PROXY_PORT=9401
CHROME_PORT=9222
BROWSER_EXEC="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
PROXY_HOST="residential.example.com"
PROXY_USER="your-user"
PROXY_PASS="your-pass"
PROXY_PORT_RESIDENTIAL=22225
PROXY_SCHEME="socks5"
CDP_PROXY_SCRIPT="$HOME/chrome-mcp-proxy/chrome-mcp-proxy.sh"
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY
# 启动浏览器
"$BROWSER_EXEC" \
--remote-debugging-port=$CHROME_PORT \
--remote-debugging-address=127.0.0.1 \
--user-data-dir="$DIR/browser-data" \
--proxy-server="${PROXY_SCHEME}://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT_RESIDENTIAL}" \
--no-first-run --no-default-browser-check --window-size=1280,800 \
> "$DIR/logs/browser.log" 2>&1 &
# 启动 cdp-proxy
nohup bash "$CDP_PROXY_SCRIPT" $PROXY_PORT $CHROME_PORT > "$DIR/logs/proxy.log" 2>&1 &
完整版见 sources/learning/wangkai/方案探讨/multi-agent-browser-matrix-v1.1.md §5.1
6.2 identity.env(身份元数据)
IDENTITY_NAME="identity-A"
BROWSER="Chrome"
PROXY_PORT=9401
CHROME_PORT=9222
RESIDENTIAL_PROXY_REGION="US-East"
ACCOUNTS_YOUTUBE="creator-yt-A@example.com"
ACCOUNTS_TIKTOK="@creatorA_us"
# ... 15 平台清单
STATUS_YOUTUBE="active"
STATUS_TIKTOK="active"
# 风控状态记录
6.3 .mcp.json(每个 agent)
{
"mcpServers": {
"chrome": {
"command": "bash",
"args": [
"/Users/lilimeng/chrome-mcp-proxy/chrome-mcp-proxy.sh",
"9401",
"9222"
]
}
}
}
或者用命令行(推荐):
cd ~/agents/identity-A/publisher
claude mcp add chrome -s project bash $HOME/chrome-mcp-proxy/chrome-mcp-proxy.sh 9401 9222
6.4 项目 CLAUDE.md 模板(关键铁律)
# Agent 人设:identity-A / publisher
## 身份
我是身份 A 的 publisher agent,负责该身份在 15 个平台的内容发布。
身份 A 的浏览器是 Chrome(住宅代理 US-East),由 cdp-proxy 9401 → 9222 控制。
## 工具铁律
- 只能用 mcp__chrome__* 工具操作浏览器
- 禁止用 Bash 写脚本绕路调 CDP(端口 9222 / 9401)
- 禁止操作其他端口(9402/9403/...)或其他浏览器 app
- 禁止登录与 identity-A 无关的账号
## 合规铁律(违反一次账号就废)
- TikTok / IG Reels:禁止任何 NSFW 暗示
- 不发硬广,不发政治/宗教
- 不让 Claude 替我润色发挥(让 Claude 翻译,不发挥)
- 发布前自审一次
## 出错处理
- 浏览器加载失败 → 重试 1 次 → 仍失败写 logs/error-YYYYMMDD.log
- 检测到限流/风控提示 → 立即停止 + 更新 STATUS_<平台>="throttled"
- chrome MCP 工具找不到 → 不要绕路,停下来报错,让人类来 fix
6.5 全局 ~/.claude/CLAUDE.md(必须极简)
# 全局偏好(影响所有项目,请极简)
- 语言:中文优先,技术名词用英文原文
- 代码风格:函数命名 snake_case,注释解释为什么不解释做什么
- token 风格:宁可多问一次,不要假设
- 不主动 commit / push git,等明确指令
禁止在全局 CLAUDE.md 写:项目名、产品名、平台账号、密钥、个人偏好以外的任何内容。
7. Hub 协调层
矩阵规模 ≥ 3 个身份后必须有 hub。hub agent 不接浏览器,只读各 identity 的 logs / memory / identity.env,做调度和监控。
~/agents/_hub/
├── CLAUDE.md ← "你是 hub,不操作浏览器,只调度"
├── .mcp.json ← 只装 filesystem 和 fetch(无 chrome)
├── inbox/ ← 人类下发任务的目录
├── outbox/ ← hub 给各 identity 下发任务
├── dashboard/ ← hub 生成的状态报告
├── memory/
└── feedback.md
Hub 工作流
- 启动后先扫描所有 identity.env,汇总当前矩阵状态
- 读人类放进
./inbox/的任务文件 - 拆解任务 → 决定派给哪些 identity 的哪些 agent
- 写任务文件到对应 agent 的
./inbox/ - 每天 9:00 / 18:00 生成 dashboard 报告
报警规则
- 任何
STATUS_*出现 throttled / banned → 高亮 - 任何 agent 24h 没有新 feedback.md 条目 → 警告(说明卡住了)
- 任何
logs/error-*.log在过去 1h 出现新条目 → 警告
8. 浏览器指纹工具
选型(按预算)
| 工具 | 价格 | 何时用 |
|---|---|---|
| GoLogin | 免费 3 profile / 付费 $24/mo 起 | 起步、矩阵 ≤ 3 个身份 |
| AdsPower | 免费 5 profile / 付费 $5.4/mo 起 | 国内出海团队用得多 |
| Multilogin | $99/mo 起 | TikTok / X 严打期、矩阵 ≥ 5 身份 |
| BitBrowser | (未给价) | 备选 |
为什么需要:5 个不同 Chromium 浏览器(Chrome / Arc / Brave / Edge / Vivaldi)的指纹只是表面差异,深层指纹(Canvas / WebGL / 字体 / AudioContext)相似度极高,TikTok / X / Instagram 风控能识别。
集成方式
指纹工具替代 start-browser.sh 里直接 launch Chrome 的部分:
# GoLogin 示例
PROFILE_ID="65a1b2c3d4e5f6789"
GOLOGIN_TOKEN="$(cat ~/.gologin-token)"
RESPONSE=$(curl -s -X POST "http://localhost:36912/browser/${PROFILE_ID}/start" \
-H "Authorization: Bearer ${GOLOGIN_TOKEN}")
CHROME_PORT=$(echo $RESPONSE | python3 -c "import sys,json; print(json.load(sys.stdin)['port'])")
每个 identity 在指纹工具里建一个 profile,配上:
- 不同 user-agent / OS 组合
- 不同时区(匹配住宅代理的地理位置)
- 不同 Canvas / WebGL / Audio 噪声
- 独立 cookie / localStorage 存储
- 绑定的住宅代理
9. 住宅代理
| 提供商 | 价格 | 备注 |
|---|---|---|
| Bright Data | $8.4/GB | 老牌,IP 池最大 |
| Soax | $7/GB | 性价比 ok |
| IPRoyal | $7/GB | 起步价低 |
| Smartproxy | $7/GB | 入门友好 |
机房代理(Datacenter)绝对禁用 —— X / TikTok / Reddit 在机房 IP 上注册即封。
代理 endpoint 形式
http://user-xxx:pass-xxx@gate.smartproxy.com:7000
socks5://user-xxx:pass-xxx@residential.brightdata.com:22225
地理一致性(风控最容易抓的点)
代理 IP 的地理位置必须和该身份的"人设"一致:
- identity-A = 美国东海岸用户
- → US-East 住宅 IP
- → 时区
America/New_York(指纹工具里设置) - → 平台账号都用 EST 时间发布
地理矛盾是风控最容易抓的点。
验证
启动浏览器后用 chrome MCP 验证出口 IP:
mcp__chrome__navigate_page("https://api.ipify.org")
mcp__chrome__take_screenshot()
10. CDP 安全(必读)
CDP 端口(9222 / 9223 / ...)暴露 = 该浏览器的所有 cookie / 标签页内容 / JS 执行权全部公开。
默认监听 127.0.0.1 是安全的,但:
# start-browser.sh 必须写:
--remote-debugging-address=127.0.0.1
禁止
- ❌ 改成
0.0.0.0想从别的机器连 - ❌ 用 Docker 时做
-p 9222:9222的端口映射 - ❌ 把 9222/9401 端口写进任何对外的脚本/截图/配置
额外建议
- 矩阵浏览器禁止登录你的私人重要账号(私人 Gmail / 工作邮箱 / 银行)
- 不安装来源不明的 npm 包(有偷扫本地 CDP 端口的攻击案例)
11. 完整工作流
11.1 第一次搭建(一次性)
# 1. 全局共享层
mkdir -p ~/.claude/skills
claude mcp add filesystem -s user npx -y @modelcontextprotocol/server-filesystem $HOME
claude mcp add fetch -s user npx -y @modelcontextprotocol/server-fetch
cat > ~/.claude/CLAUDE.md << 'EOF'
# 全局偏好(影响所有项目,请极简)
- 语言:中文优先
- ...
EOF
# 2. 模板目录
mkdir -p ~/agents/_template/{_identity,publisher,engager,researcher}
chmod +x ~/agents/_template/_identity/*.sh
# 3. hub
mkdir -p ~/agents/_hub/{inbox,outbox,dashboard,memory}
11.2 新增一个身份(5 分钟)
cp -r ~/agents/_template ~/agents/identity-A
# 改 _identity/start-browser.sh / identity.env 里的端口、代理、账号清单
$EDITOR ~/agents/identity-A/_identity/start-browser.sh
$EDITOR ~/agents/identity-A/_identity/identity.env
# 给每个 role agent 注册 chrome MCP
for role in publisher engager researcher; do
cd ~/agents/identity-A/$role
claude mcp add chrome -s project bash $HOME/chrome-mcp-proxy/chrome-mcp-proxy.sh 9401 9222
$EDITOR CLAUDE.md # 改人设、改身份名
done
# 启动浏览器(一次性,常驻)
cd ~/agents/identity-A/_identity && ./start-browser.sh
11.3 日常启动 agent
# iTerm2 开多 tab
cd ~/agents/identity-A/publisher && claude
cd ~/agents/identity-A/engager && claude
cd ~/agents/identity-A/researcher && claude
cd ~/agents/_hub && claude
浏览器和 cdp-proxy 常驻,只在重启电脑后跑一次 start-browser.sh。
11.4 不同浏览器路径
# Chrome
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
# Arc
"/Applications/Arc.app/Contents/MacOS/Arc"
# Brave
"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser"
# Edge
"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"
# Vivaldi
"/Applications/Vivaldi.app/Contents/MacOS/Vivaldi"
# Opera
"/Applications/Opera.app/Contents/MacOS/Opera"
.mcp.json 不用改 —— chrome-devtools-mcp 通过 CDP 协议接管,所有 Chromium 系浏览器都支持。
12. 验证清单
# 1. 目录结构
tree ~/agents/identity-A -L 3
# 2. 浏览器和 proxy 启动
cd ~/agents/identity-A/_identity && ./start-browser.sh
# 3. CDP 端口可达
curl http://127.0.0.1:9222/json/version
# 4. proxy 状态
curl http://127.0.0.1:9401/proxy/status
# 5. 出口 IP 是住宅代理(在 publisher agent 里)
# "用 mcp__chrome__navigate_page 打开 https://api.ipify.org,然后截图"
# 6. MCP 工具直接可用(关键!)
# /mcp,展开 chrome,应该看到 29 tools
# 7. 多 agent 不串台
# 同时开 publisher / engager 两个 tab,检查 proxy/status 应 clients: 2
13. 常见坑
13.1 端口冲突
lsof -i :9222
# 占用了就换端口或 kill 进程
13.2 user-data-dir 锁定
"profile in use" → ps aux | grep -i chrome → kill 残留 / 删 browser-data/SingletonLock
13.3 关掉浏览器窗口后 MCP 失联
- proxy 有 5 秒自动重连
- 还是不行:
./stop-browser.sh && ./start-browser.sh
13.4 Chrome 已经在跑
完全退出日常用的 Chrome(Cmd+Q)再跑 start-browser.sh,或者矩阵 Chrome 全部用 9223+ 起步避开 9222
13.5 npx 启动慢
npm install -g chrome-devtools-mcp
13.6 chrome MCP 工具不被 agent 调用(v1.1 重点)
症状:agent 看到任务后绕路写 Node.js/Python 脚本调裸 CDP
原因:Claude Code v2.x 工具发现机制不会 eager-load 仅在 user 级注册的 MCP
强制注册法(每个 agent 项目目录里也注册一份 chrome):
cd ~/agents/identity-A/publisher
claude mcp add chrome -s project bash $HOME/chrome-mcp-proxy/chrome-mcp-proxy.sh 9401 9222
仍绕路 → 启动后第一句话发 /mcp,确认 chrome 列出来后再下任务。
13.7 全局 CLAUDE.md 污染
症状:agent 在 A 项目里突然回复 B 项目的事 → 检查 ~/.claude/CLAUDE.md,砍到只剩偏好
13.8 Skill 同名冲突
全局和项目级有同名 skill 时项目级覆盖。命名上避免重名(全局 markdown-writer,项目级 markdown-writer-tiktok)
13.9 多 identity 抢焦点
chrome-mcp-proxy 已防 agent 调用时的焦点抢夺。但浏览器首次启动时会跳出来 → --window-position=$((PROXY_PORT - 9400))00,100 让窗口错开;或用指纹工具的 headless 模式
14. 给新接手者的搭建顺序
- 读完第 1-2 节理解架构
- 核实 Claude Code 版本:
claude --version必须 ≥ v2.1.126 - 核实 chrome-mcp-proxy 已装:
ls ~/chrome-mcp-proxy/chrome-mcp-proxy.sh - 建全局层(11.1)
- 建 hub(复制模板)
- 建第一个 identity(11.2)
- 跑通 13.6 那个 MCP 工具调用验证 —— v1.1 最大修正点,必须确认通过
- 加指纹工具 + 住宅代理(第 8 / 9 节)
- 复制扩展:每加一个 identity,重复 6-8
15. 王凯帖子原文索引
| 帖子 | 日期 | 核心观点 |
|---|---|---|
| #1278 | 2026-03-11 | HN Agent 自动注册闭环 |
| #1296-1300 | 2026-03 | 控制浏览器代替自己用浏览器 |
| #1297 | 2026-03 | iTerm2 常开 10 标签页 |
| #1319 | 2026-04-06 | "杀手级 Chrome MCP" 改造(focus-stealing 修复) |
| #1326 | 2026-04-08 | "每台电脑不同 agent 窗口控制不同浏览器"——架构核心 |
| #1327 | 2026-04-09 | 一个项目拆成多窗口 → 部门 → 岗位 → 职能 |
| #1330 | 2026-04-13 | "终端开多个窗口跑 Claude Code,一台电脑多个浏览器" |
| #1331 | 2026-04-14 | 10 电脑 × 5 浏览器 × 15 平台终极路线图 |
| #1336 | 2026-04-21 | 5 运营窗口 + 5 视频生产窗口分工 |
| #1339 | 2026-04-28 | 把知识写成代码塞进 skill |
16. 王凯说
"身份隔离靠四件套(浏览器 app + 住宅 IP + 指纹 + 账号),同身份多 agent 协作靠 chrome-mcp-proxy 的 sessionId 路由。"
"Claude Code 的 agent 就是工作目录,目录是 agent 的身体,CLAUDE.md 是它的人设,.mcp.json 是它的工具,feedback.md 是它的成长记录。"
"任何想跳过养号、批量发链接的方案都会被反作弊系统秒杀。"
引用
- 王凯 Claude Code 终端工作流方法论(完整版) - Claude Code 完整工作流(本 wiki 的方法论基础)
- 王凯 6 平台海外运营 SOP - 6 平台 SOP(本 wiki 的应用层)
- 王凯 Agent 工程实操 - Agent 工程主 wiki(总述)
- 王凯 出海推广 SOP 与海外多账号矩阵实战 - 出海推广(矩阵化运营的目标场景)