Tandem 浏览器 — AI 代理浏览器技能
Tandem 是一个基于 Electron 的浏览器,用于人机协作。它通过 HTTP API(端口 8765)暴露 253 个 MCP 工具。任何 MCP 兼容的代理(OpenClaw、Claude Code、Cursor、Hermes Agent、Agent Zero 等)都可以通过 mcporter 连接到它 — 工具以 tandem.tandem_* 的形式提供。兼容:OpenClaw · Claude Code · Cursor · Hermes Agent · Agent Zero · 任何 MCP 兼容的 AI 代理。要求:Tandem 浏览器在本地运行,MCP 服务器在 http://127.0.0.1:8765/mcp 上。身份验证令牌:~/.tandem/api-token(Bearer 令牌)。有什么不同:Tandem 是一个共享浏览器 — 代理与用户在同一个浏览器实例中协作。没有无头代理,没有隐藏窗口。用户可以看到代理的所有操作,每个升级(JS 执行、表单提交)都需要用户授予的同意。信任是通过赚取的,而不是绕过的。
通过 systemd(推荐 — 清洁、一个窗口、工作 GUI):
systemctl --user start tandem.service # 启动
systemctl --user stop tandem.service # 停止
systemctl --user status tandem.service # 检查
或者直接从发布目录:
cd /path/to/tandem-browser/release/linux-unpacked
DISPLAY=:0 nohup ./tandem-browser --no-sandbox > /tmp/tandem.log 2>&1 &
规则:
--no-sandbox — 总是需要在 Linux 上
--disable-gpu — 不要使用 — 会破坏 GUI
服务默认禁用(需要时手动启动)
浏览器以完整 GUI 运行,因此用户可以看到代理的所有操作
CLI 模式(临时调用)
mcporter call tandem tandem_browser_status
守护模式(持久、多步骤工作流)
mcporter daemon start # 然后使用带有 tandem.tandem_ 前缀的工具
工具命名
所有 Tandem MCP 工具都使用 tandem_ 前缀。当通过 mcporter 调用时,选择器是 tandem.tandem_<工具>:
工具名称 mcporter 选择器
tandem_browser_status tandem.tandem_browser_status
tandem_list_tabs tandem.tandem_list_tabs
tandem_snapshot tandem.tandem_snapshot
mcporter 接受两种形式的参数。根据复杂性选择。
格式 A:key=value(简单、平面字符串)
mcporter call tandem tandem_navigate url="https://example.com"
mcporter call tandem tandem_open_tab url="https://example.com" focus="false" source="wingman"
限制:所有值都是字符串。布尔值如 focus:false 被发送为字符串 "false",在 JS 中是 truthy 的。始终使用 --args JSON 来表示布尔值、数字或数组。
格式 B:--args JSON(正确类型、复杂结构)
mcporter call tandem tandem_open_tab --args '{"url":"https://example.com","focus":false,"source":"wingman"}'
mcporter call tandem tandem_snapshot_click --args '{"ref":"@e2"}'
mcporter call tandem tandem_wait --args '{"selector":".result","timeout":10000}'
何时使用格式 B:
布尔值(focus:false、compact:true)
数字(timeout:10000、viewportWidth:1920)
空值
数组或嵌套对象
混合不起作用
不要混合 key=value 和 --args。选择一个。
工作区范围内的活动选项卡
"活动选项卡"不是全局的。每个工作区都有自己的活动选项卡。用户和代理可能在不同的工作区中。
tandem_active_tab_context 返回您会话看到的内容
要找到用户的选项卡:在用户的工作区中查找 active:true(通常是 "Default")
三种目标样式(选择最小的可行的):
活动选项卡 — 隐式。适用于简单导航,当您确保拥有工作区时。
特定选项卡 — 传递 tabId 到背景读取而不聚焦。首选当已知时。
会话 — X-Session 标头用于隔离浏览器分区。
黄金法则:始终使用 tabId 而不是 "活动选项卡"
当您知道要指向哪个选项卡时,始终传递 tabId。免疫工作区范围和竞争条件。
这是最常见的模式。按顺序运行:
# 1. 检查 Tandem 是否活着
mcporter call tandem tandem_browser_status
# 2. 获取当前上下文(找到活动选项卡 ID)
mcporter call tandem tandem_active_tab_context
# 3. 打开一个背景帮助选项卡
mcporter call tandem tandem_open_tab --args '{"url":"https://en.wikipedia.org/wiki/Artificial_intelligence","focus":false,"source":"wingman"}'
# → 从响应中提取 TAB_ID(例如 "tab_7f3a")
# 4. 阅读页面内容(优先于 HTML)
mcporter call tandem tandem_read_page --args '{"tabId":"tab_7f3a"}'
# 5. 通过快照交互(获取 @ref ID)
mcporter call tandem tandem_snapshot --args '{"tabId":"tab_7f3a","compact":true}'
# 6. 点击元素通过 @ref
mcporter call tandem tandem_snapshot_click --args '{"tabId":"tab_7f3a","ref":"@e4"}'
# 7. 填写表单字段
mcporter call tandem tandem_snapshot_fill --args '{"tabId":"tab_7f3a","ref":"@e7","value":"搜索词"}'
# 8. 完成后关闭
mcporter call tandem tandem_close_tab --args '{"tabId":"tab_7f3a"}'
优先工具 何时使用
1st tandem_read_page 最适合理解。返回 markdown。紧凑。
2nd tandem_snapshot