sa2web/sa2web-mcp
GitHub: sa2web/sa2web-mcp
基于 Playwright 的远程浏览器 MCP 封装,使 AI 代理能够通过标准化工具接口驱动云端浏览器进行页面浏览、数据提取和交互操作。
Stars: 5 | Forks: 2
# SA2WEB MCP
语言:English | [中文](README.zh.md) | [日本語](README.ja.md) | [Français](README.fr.md) | [Español](README.es.md) | [Русский](README.ru.md)
本项目通过 Playwright 将基于 DOM 的远程浏览器作为 MCP 工具暴露出来。
远程浏览器 shell 在 `iframe#rbi-frame` 内部渲染目标网站。`browser_snapshot`
始终从该 iframe 开始,并递归包含子代 iframe 节点。诸如
`browser_extract_text`、`browser_click`、`browser_type` 和 `browser_wait` 之类的 DOM 工具默认在该
iframe 树内运行。
对于代理,推荐路径非常精简:
```
sa2_help
-> sa2_list_available_targets # only when opening saved SaaS/workspace/inner sites
-> sa2_open_target
-> browser_snapshot or browser_extract_text
-> browser_click / browser_type / browser_press / browser_wait
```
直接使用 `sa2_open_target` 访问任意公共网站:
```
{
"type": "cloud",
"url": "https://example.com"
}
```
对于已保存的 SaaS、workspace 和 inner-site 条目,请首先使用 `sa2_list_available_targets`。它
会返回稳定的 `targetId` 值,例如 `saas:12`、`workspace:34` 和 `inner:56`;将其中之一传递
给 `sa2_open_target`。
较低级别的 `browser_*` 列表/进入/导航工具仍可用于兼容性和
高级控制,但普通代理应优先使用上述 `sa2_*` 工具。
`browser_navigate` 通过云浏览打开目标 URL。远程浏览器源是从
`SA2_LOGIN_URL` 推断出来的。
因此 `browser_navigate({ "url": "https://example.com" })` 会打开:
```
https://www.test7878.com/?surf=direct&_d=https%3A%2F%2Fexample.com
```
## 安装
当包发布到 npm 后,普通用户可以全局安装它,这样 `sa2`、`sa2-browser` 和 `sa2-mcp` 就可以在 PATH 中使用:
```
npm install -g @sa2web/mcp
npx playwright install chromium --with-deps
```
如果您是从本地检出版本而不是从 npm 安装,请先进行构建,然后全局安装当前文件夹:
```
npm install
npx playwright install chromium --with-deps
npm run build
npm install -g .
```
普通的 `npm install` 只会为当前检出的代码安装依赖;它不会将此包自身的命令添加到您的全局 PATH 中。对于开发,在 `npm run build` 之后执行 `npm link` 也是可以的。
## 运行
```
npm start
```
开发模式:
```
npm run dev
```
CLI:
```
npm run build
npm run cli -- help
npm run cli -- shell
npm run cli -- targets
npm run cli -- open https://example.com
npm run cli -- open --target-id workspace:123
npm run cli -- open workspace 123
npm run cli -- saas GitHub
npm run cli -- inner 7
npm run cli -- snapshot --url https://example.com --headless true
npm run cli -- snapshot --url https://example.com --filter 'main article'
npm run cli -- click --url https://example.com --ref e3
npm run cli -- type --url https://example.com --selector '#email' --text hello@example.com
```
在全局安装或链接后,该包会暴露 `sa2` 和 `sa2-browser` CLI 命令,以及用于 MCP 客户端的 `sa2-mcp`。CLI 会在内部通过 stdio 启动 MCP 服务器,并支持 `shell`、`open`、`targets`、已保存目标的快捷方式(`workspace`、`saas`、`inner`)、`snapshot`、`text`、`click`、`type`、`paste`、`scroll`、`device`、`press`、`wait`、`screenshot`、`back`、`forward`、`reload`、`close` 以及原生 `tool` 命令。
使用 `sa2 shell` 获取持久的浏览器会话。单命令调用仍会启动自己的服务器进程,并在命令完成后将其关闭,因此对于需要页面状态的命令,请传递 `--url`、`--target-id` 或其他目标选择器。如果未提供目标,CLI 将打开 `SA2_LOGIN_URL`。
在 `sa2 shell` 中,来自 `snapshot` 的引用(ref)在后续命令中仍然可用:
```
sa2> open https://example.com
sa2> targets
sa2> open --target-id workspace:123
sa2> open saas GitHub
sa2> inner 7
sa2> snapshot
sa2> click --ref e3
sa2> type --selector '#email' --text hello@example.com
sa2> screenshot --output page.png
sa2> exit
```
## MCP 客户端配置
代码库包含用于本地开发的 `.mcp.json`。MCP 客户端只有在全局安装或链接了该包之后才能运行 `sa2-mcp`:
```
npm install
npm run build
npm install -g .
```
如果您希望在开发过程中立即反映出检出版本中的更改,请使用 `npm link` 而不是 `npm install -g .`。
重要的值包括:
```
{
"SA2_LOGIN_URL": "https://www.test7878.com/agent/login?clientId=...&clientSecret=...",
"SA2_LOGIN_REDIRECT_PATH": "/app/login",
"SA2_LOGIN_REDIRECT_WAIT_MS": "8000",
"SA2_RBI_FRAME_SELECTOR": "#rbi-frame",
"SA2_RBI_FRAME_WAIT_MS": "5000",
"SA2_RBI_FRAME_CONTENT_WAIT_MS": "15000",
"SA2_AUTO_LOGIN_BEFORE_NAVIGATE": "true",
"SA2_LOGIN_SETTLE_MS": "1500",
"SA2_IGNORE_HTTPS_ERRORS": "true",
"SA2_LOG_LEVEL": "info",
"SA2_LOG_STDERR": "true",
"SA2_LOG_FILE": "/tmp/sa2-browser.log"
}
```
日志使用 log4js 风格的时间戳、级别和类别布局。级别包括 `trace`、`debug`、`info`、`warn`、
`error`、`fatal` 和 `off`。默认情况下,日志会输出到 stderr,因为 stdout 专为 MCP stdio 协议保留;
`SA2_LOG_FILE` 可以选择将同样的脱敏日志追加到文件中。URL 密钥、token、密码、cookie 和
授权值都会被脱敏处理。
在实际使用中,请将 `clientSecret` 保留在版本控制之外,并通过您的 MCP 客户端的
环境配置来注入它。
不同的 AI 客户端使用不同形状的 MCP 配置。在
[configs/README.md](configs/README.md) 中提供了可直接复制的模板,包括 Claude Desktop、Claude Code、Cursor、Windsurf、
VS Code Copilot、Cline、Roo Code、opencode、Gemini CLI 和 Zed。
## 工具
推荐的高级工具:
- `sa2_help`:返回预期的代理工作流程和示例。
- `sa2_list_available_targets`:列出代理选项以及所有已保存的 SaaS、workspace 和 inner-site 目标及其稳定的 `targetId` 值。
- `sa2_open_target`:打开任何目标。对于公共网站使用 `{ "type": "cloud", "url": "https://example.com" }`,或对于已保存的目标使用 `{ "targetId": "workspace:34" }`。
页面检查和交互工具:
- `browser_snapshot`:为模型返回扁平的语义快照,包含可交互的引用(ref)、可读的文本 ID、媒体元素、子代 iframe、隐藏的原始 URL,以及用于控件的紧凑型 `context=[t1,t2]` 引用。可选的 `filter` 接受 CSS 选择器;省略它则默认进行完整快照。操作时使用 `ref=eN` 值。`id=tN` 和 `context=[tN]` 是仅供快照使用的文本引用,而不是 DOM id、CSS 选择器或可操作的引用。
- `browser_extract_text`:从 iframe 树返回可见的页面文本。其可选的 `selector` 必须是真实的 CSS 选择器;不要传递诸如 `t7`、`#t7` 或 `text[id='t7']` 的快照文本 ID。
- `browser_click`:通过快照引用(ref)、选择器、role/name、文本或 x/y 坐标进行点击。
- `browser_type`:通过快照引用(ref)、选择器、role/name 或当前聚焦的元素进行输入/填充,保留多行 textarea 和 contenteditable 输入。
- `browser_press` / `browser_press_key`:按下键盘按键。
- `browser_wait`:等待毫秒数、文本、选择器或 URL 子字符串。
- `browser_hover` / `browser_drag`:鼠标悬停和拖拽。
- `browser_fill_form` / `browser_select_option` / `browser_check` / `browser_uncheck`:表单操作。
- `browser_file_upload`:通过文件输入上传文件。
- `browser_paste`:通过剪贴板数据粘贴纯文本、HTML、RTF 和本地文件(包括图像);文件输入直接使用 `setInputFiles`。
- `browser_scroll`:按方向/距离、至坐标或边缘滚动根页面或元素,或者将 ref/选择器目标滚动到可见范围内。
- `browser_list_devices`:列出设备模拟接受的每个 Playwright 设备预设。
- `browser_toggle_device`:使用 Playwright 设备预设和 Chromium CDP 切换桌面/移动模拟,而无需重新创建浏览器上下文。
- `browser_handle_dialog`:接受或关闭 alert/confirm/prompt 对话框。
- `browser_navigate_back` / `browser_navigate_forward` / `browser_reload`:点击 shell 按钮 `#btn-back`、`#btn-forward` 和 `#btn-reload`。
- `browser_screenshot` / `browser_take_screenshot`:返回 PNG 截图。
- `browser_resize`:调整视口大小。
- `browser_evaluate` / `browser_run_code`:针对 `iframe#rbi-frame` 运行调试代码。
- `browser_close`:关闭浏览器会话。
高级兼容性工具:
- `browser_open_login`:打开 `SA2_LOGIN_URL`。
- `browser_list_proxies`:列出来自 `/api/v1/home/freebrowse` 的云浏览代理选项。
- `browser_navigate`:通过云浏览打开目标 URL;可选的 `surf` 会根据 `/api/v1/home/freebrowse` 进行验证。
- `browser_list_saas_sites` / `browser_enter_saas_site`:列出并进入 SaaS 站点。
- `browser_list_workspaces` / `browser_enter_workspace`:列出 workspace 帐户并进入帐户级别的 workspace。
- `browser_list_inner_sites` / `browser_enter_inner_site`:列出并进入 inner-site。
## 代理使用
有关将此 MCP
服务器连接到 AI 代理、推荐的工具工作流程、发布保障和故障排除的详细说明,请参阅 [docs/AGENT_USAGE.md](docs/AGENT_USAGE.md)。
有关特定于 opencode 的设置说明,请参阅 [docs/OPENCODE_USAGE.md](docs/OPENCODE_USAGE.md)。
## 手动测试
```
npm run build
npm run manual-test -- https://example.com
```
在调试期间保持浏览器处于打开状态:
```
npm run manual-test -- https://example.com --keep-open
```
标签:AI代理工具, MCP, MITM代理, Playwright, 浏览器自动化, 特征检测, 自动化攻击, 远程浏览器