内容
browser-rs
一款高性能、以**隐身**为首要目标的浏览器,仅通过 **MCP** 提供服务 —— 无需捆绑代理,无需LLM,无需聊天UI。任何MCP客户端(Claude Code、Cursor、您自己的代理)都可以与其连接,并驱动一个**真实**的浏览器。
可以将其视为 *patchright-mcp,用Rust重建* —— 一个代理可以真正好用的浏览器,大小约为5 MB。
## 安装
```bash
curl -fsSL https://raw.githubusercontent.com/maestrojeong/browser-rs-mcp/main/install.sh | sh
browser-rs --port 9321 # HTTP MCP: /mcp (可流式传输) + /sse (旧版)
browser-rs # 或stdio
```
无需npm/Node/Rust —— 脚本会为您的平台下载预编译的二进制文件。其他方式:从 [Releases](../../releases) 获取二进制文件,或使用 `cargo install --git https://github.com/maestrojeong/browser-rs-mcp ab-mcp`。
完整说明(版本锁定、直接下载、MCP客户端设置、更新):**[INSTALL.md](INSTALL.md)**。
使用MCP客户端注册:
```jsonc
{ "mcpServers": { "browser-rs": {
"command": "browser-rs" // stdio
} } }
// HTTP:运行 `browser-rs --port 9321` 并将客户端指向
// http://127.0.0.1:9321/mcp?owner=user:group:topic
// 相同的owner也可以作为X-Browser-Owner发送。
```
## 共享配置文件和标签所有权
HTTP客户端可以共享一个浏览器进程和持久配置文件,同时保持其标签的隔离性。为每个主题、 worker 或 cron 作业提供一个稳定的 `owner`:
```text
http://127.0.0.1:9321/mcp?owner=42:100:research
X-Browser-Owner: 42:100:research
```
新标签页将分配给请求所有者。`browser_pages`、`browser_tabs` 和每个页面操作仅解析属于该连接的所有者的页面。知道另一个具体页面ID不足以访问它。在所有者范围的连接上,`browser_close`仅关闭该所有者的标签页;它共享浏览器。
主机应在主题或作业时清理所有者:
```bash
curl -X DELETE 'http://127.0.0.1:9321/owners?owner=42%3A100%3Aresearch'
```
这会关闭所有者的真实Chrome标签页并删除其内存映射,而不会删除配置文件或影响其他所有者。没有所有者的连接保留整个进程的管理访问权限,因此请将HTTP侦听器保留在localhost上或置于受信任的代理后面。
## vs mcp-patchright
| | mcp-patchright | **browser-rs** |
|---|---|---|
| 语言/运行时 | Node + Playwright | **Rust**,单个静态二进制文件 |
| 浏览器控制 | Playwrightright) | **原始**,一个多路复用的WebSocket |
| 隐身方法 | *修补自动化指令* | *不创建它们* —— **成为真正的浏览器** |
| 最强模式 | 隐身修补启动 | **附加到您自己的Chrome** (`--connect`) —— 相同的指纹 |
| 代理视图 | HTML / DOM转储 | **可访问性树 + `[ref]`**,操作返回 **结算差异** |
| 工具表面 | ~60种工具 | **59种工具** (接近完整的对等) |
| 传输 | stdio + HTTP/SSE | **stdio + HTTP/SSE** (相同的CLI标志) |
| 占用空间 | ~79 MB安装,~182 MB RSS | **~5 MB二进制文件,~6 MB RSS** |
| 启动/每次操作 | 基线 | **~100倍更快的启动,~2-3倍每次操作** |
| 许可证 | — | **Apache-2.0**检测器的隐身能力相当(两者在rebrowser-bot.net上均显示**无检测**);区别在于更轻量的Rust堆栈、不同的隐身哲学和优先考虑可访问性的接口。
## 隐身:成为真正的浏览器
可靠的隐身方法是 **与人类的Chrome无区别**。注入JS以覆盖`navigator.webdriver`、`toString`、`screen`、`WebGL`、`deviceMemory`等会传递幼稚的检测器,但每个覆盖本身就是一个异常——检测器(Akamai、Kasada、DataDome和开放的CreepJS / incolumitas)会标记那些不一致的组合。
因此,默认情况下,browser-rs **不注入任何内容**:它在真正的硬件上运行 **headful**,使用 **持久的真实配置文件**,仅设置`AutomationControlled`启动标志(因此`navigator.webdriver`原生为假),从不启用可检测的`Runtime`/`Console` CDP域,并在 **隔离的世界**中评估JS。无需隐藏,因为没有伪造的内容。
| 模式 | 方法 | 指纹 |
|---|---|---|
| **默认** | headful,持久配置文件,无修补 | 真实的Chrome指纹 |
| **连接** (最强) | `--connect 9222` → 连接到您使用 `--remote-debugging-port=9222` 启动的Chrome | *字面上就是您日常使用的浏览器* |
| **无头备用** | `--headless --stealth` → 选择加入JS修补层 | 尽力而为;仅在无头模式下不可用 |
结果:在[rebrowser-bot-detector.net](https://bot-detector.rebrowser.net)和[bot.sannysoft.com](https://bot.sannysoft.com)上 **0次检测**,在CreepJS上 **0%隐身** —— 所有这些都无需修补页面。
## 工具(59)
**读取/查看:** `navigate` · `new_page` · `snapshot` · `read`(markdown)·
`get_visible_html` · `get_visible_text` · `find` · `take_screenshot` · `save_pdf` · `pages` · `tabs` ·
`switch_page` · `status`
**操作 `ref` 或CSS`):** `click `type` · `press_key` · `hover`select_option` · `fill_form` · `drag `file_upload` · `navigate_back` · `wait · `resize` ·
`evaluate` · `run_code` · `iframe_click` · `iframe_fill`_page` · `close`
**网络:** `` · `route_block` · `route_clear` ·
_state_set` (离线)· `route_mock `api_request`
**Cookie:** `cookie_{list,getdelete,clear}`
**Web存储:** `locallist,get,set,delete,clear}` ·
`sessionstorage,get,set,delete,clear}` · `storage_save` · `storage_load`
**诊断:** `console_messages`fingerprint_check`
**对话框/调试:** `handle_dialog` · `highlight` · `hide_highlight`
**身份** `webauthn` (安装虚拟身份验证passkey提示不会阻塞;网站会回落到密码)
操作工具获取快照 `ref` **或** CSS `selector`,等待页面稳定并返回 **可访问性树的差异** —— “是否成功”的信号。点击/输入使用类似人类的鼠标路径和按键时序。
## CLI / 标志(兼容patchright)
```
browser-rs # stdio MCP传输
browser-rs --port 9321 [选项] # HTTP MCP传输在/mcp
--host <host> HTTP绑定主机(默认为127.0.0.1)
--user-data-dir <path> 持久浏览器配置文件目录
--headless | --headed 运行无头或有头(默认为有头)
--connect <port|url> 连接到Chrome上的--remote-debugging-port
--stealth 注入无头JS隐身修补层
```
每个标志都有一个环境变量等价项(`AB_HTTP`、`AB_PROFILE`、`AB_HEADLESS`、`AB_CONNECT`、`AB_STEALTH`、`AB_CHROME`)。由于它采用 `--port` + `--user-data-dir` 类似 `mcp-patchright`,因此主机可以为每个配置文件分配一个端口,并将多个所有者范围的会话连接到它。
## 基准测试(浏览器 + 检测器共进化)
存储库自带其自己的机器人检测器,CI门控依赖于它 —— 失败的新检测器检查必须在同一个提交中通过隐身修复。
```bash
node bench/run.mjs target/release/browser-rs # 无头备用层(CI门控)
node bench/external.mjs target/release/browser-rs # 有头 vs bot.sannysoft.com
node bench/rebrowser.mjs target/release/browser-rs # CDP告诉 vs rebrowser-bot-detector.net
```
## 布局
```
crates/
ab-cdp/ # CDP传输:一个WS,扁平会话,命令/事件路由
ab-browser/ # 浏览器 + 页面:启动,隐身,快照,操作,网络,存储
ab-mcp/ # MCP服务器(rmcp)—— stdio + HTTP/SSE,唯一的服务接口
bench/ # 机器人检测页面 + 运行器(CI回归门控)
install.sh # curl | sh安装程序预编译二进制文件)
```
## 发布
发布是一个提交 + 一个标签 —— CI构建二进制文件和 `curl | sh` 安装程序会自动获取最新版本:
```bash
# 升级Cargo.toml中的版本(workspace.package.version),然后:
git commit -am "Release vX.Y.Z"
git tag vX.Y git push origin main v
```
推送*` 标签会触发/workflows/release.yml`会构建 macOS-arm64 + Linux-x64 二(带有 SHA-256并将它们附加到 Release 上。`` 默认使用 `releases/latest`,因此不需要(使用 `AB_VERSION.Y.Z` 固定
## 许可证-2.0 [LICENSE](LICENSE)。