内容
<p align="center">
<img src="assets/banner.png" alt="BrowserOps. 你的浏览器,完全自主。" width="100%">
</p>
<p align="center"><b>为你的 AI 代理提供真正的浏览器。属于你。</b></p>
<p align="center">
<a href="https://www.npmjs.com/package/browserops"><img src="https://img.shields.io/npm/v/browserops" alt="npm 版本"></a>
<a href="https://chromewebstore.google.com/detail/browserops/fcjcldlmaoincljnghkbhhalnjfmbhnp"><img src="https://img.shields.io/badge/chrome-web%20store-blue" alt="Chrome 应用商店"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="MIT 许可证"></a>
</p>
BrowserOps 是一个 MCP 服务器,允许任何 AI 客户端驱动你已经运行、已经登录的 Chrome。不是无头克隆:与你每天使用的相同的身份验证会话,因此无需重新身份验证,无需指纹不匹配,也无需机器人检测墙。在 2FA 和 Cloudflare 后面也能工作。
工作原理:任何与 MCP 兼容的客户端(Claude Code、Cursor、Zed、Continue、Windsurf、自定义 SDK 代理)调用 `browser_*` 工具 → 本地 Node 桥将它们转发到 Chrome MV3 扩展名上的 WebSocket → 扩展名使用 `chrome.tabs` / `chrome.scripting` / `chrome.debugger` 来控制你的真实浏览会话,包括已登录的网站。
**为什么选择 BrowserOps**
- **你的 Chrome,而不是无头克隆。** 代理在你已经登录的会话中运行。
- **MCP 原生。** 一个服务器,所有 MCP 客户端。注册一次,从任何编辑器或代理使用。
- **开源,永久免费。** MIT 许可,本地优先;桥只绑定到 `127.0.0.1`。
- **可重用过程。** 一次学习的工作流程可以确定性地重放,并在所有客户端共享。
验证的用例:测试自己的前端,多 MCP 协调,在真实账户上执行社交媒体任务,在登录或 Cloudflare 后进行爬取。
## 先决条件
- macOS 或 Linux(通过 WSL 的 Windows)
- Node.js ≥ 20.10
- Chrome ≥ 120
## 快速入门
### 1. 安装
```bash
npm i -g browserops
```
您也可以使用 `pnpm add -g browserops` 或使用 `npx browserops` 运行。
### 2. 初始化
```bash
browserops init
```
这是一个一次性向导。它会生成 `~/.browserops/token`,创建一个空的 `~/browserops/procedures/shared/` 目录,在 `127.0.0.1:57321` 上启动桥守护进程,然后检测您已安装的 MCP 客户端(Claude Code、Cursor、Zed、Continue、Windsurf、Codex),并提供在每个客户端的配置中注册 `browserops` 的选项。重新运行它是安全的,并且是幂等的。
标志:
- `--yes` — 非交互式(接受所有检测到的客户端)
- `--no-mcp` — 跳过 MCP 客户端安装
- `--client claude-code,cursor` — 显式子集
- `--dry-run` — 打印差异,不写入
### 3. 安装 Chrome 扩展
从 Chrome 应用商店安装已发布的扩展:
[**browserops 在 Chrome 应用商店**](https://chromewebstore.google.com/detail/browserops/fcjcldlmaoincljnghkbhhalnjfmbhnp)
安装后会自动打开一个 onboarding 标签页 — 点击 **Confirm & connect**。Chrome 工具栏图标在一秒内变为绿色。
### 4. 使用它
从终端 — `browserops` 确保桥正在运行,并将任务预加载到您的编辑器中:
```bash
# 通用首次运行 — 适用于所有人
browserops "打开 hacker news 并为我读取 top story"
# 能力演示 — 显示实时配置文件优势
browserops "检查我的 gmail 并总结我最近的 3 条邮件"
```
裸 `browserops "task"` 通过您配置的默认启动器(在 `init` 期间设置;使用 `browserops config set default_launcher codex` 更改)路由。强制使用特定启动器,方法是使用 `--claude`、`--codex` 或 `--cursor`。
或者,打开您在步骤 2 中注册的编辑器,然后直接与它对话 — `browserops` 已作为 MCP 服务器连接,因此任何可以使用浏览器的提示都将选择它。
### 每日生命周期
```bash
browserops status # PID, 端口, 正常运行时间, 最后错误
browserops start # 启动守护进程(如果已经运行则为 no-op)
browserops stop
browserops restart
browserops logs -f # tail ~/.browserops/log.jsonl
browserops doctor # 诊断 Node / 端口 / token / 客户端 / 功能
browserops upgrade # 升级全局安装 + 运行 `browserops sync` + 重启
browserops sync # 刷新技能 + MCP 客户端配置以匹配已安装的包
browserops sync skills # 仅刷新 ~/.claude/skills/<name>/SKILL.md
browserops sync --dry-run # 预览而不写入
browserops feature list # 显示实验性功能及其状态
browserops feature enable <name> # 选择过程或传说
browserops feature disable <name> # 退出
```
**升级后首次同步的注意事项:** 下一次 `browserops sync` (或 `browserops upgrade` )会在使用早期软件包版本的机器上首次安装 `browserops-teach` 技能,位于 `~/.claude/skills/browserops-teach/SKILL.md` — 早期版本将技能包含在存储库中,但不包含在发布的 CLI 包中,因此它从未安装。现有的 `~/.claude/skills/browserops/SKILL.md` 会在检测到本地编辑时刷新并生成时间戳备份。
`procedures` 作为 **实验性** 功能发布 — 默认关闭。启用它可以获得始终开启的 `browser_*` 工具,而无需其他功能:对于仅需要基本浏览器自动化的用户,token 开销最小。使用 `browserops feature enable procedures` 并运行 `browserops restart`,以便守护进程广播新的功能集到扩展。启用后,代理将获得过程存储工具(`procedures_search`、`_get`、`_save`、`_delete`、`_execute`、`_resume`)和 `browserops-teach` 技能,该技能自主创建新的过程。
### 每个项目的规则(可选)
两个客户端自动发现代理规则:Claude Code 读取 `CLAUDE.md`,Codex CLI 读取 `AGENTS.md`。其他客户端(Cursor、Windsurf、Copilot、Continue)需要一次性复制到每个项目的规则槽中 — 在您想要 browserops 具有代理意识的任何项目中运行:
```bash
browserops install-rules
```
## 审批模式
有两个 **独立的门控**:一个在 browserops 中(哪些浏览器操作需要确认),另一个在您启动的启动器中(代理本身是否暂停每个操作的确认)。
### 浏览器端:browserops 自动批准
browserops 默认 **自动批准模式** 运行:高风险操作(`browser_execute_js`、点击/输入敏感域、标记为 `risky: true` 的过程)无需提示继续。
要改为需要手动批准,请使用以下任意一种:
- `BROWSEROPS_APPROVAL=gate browserops start`
- 在扩展程序弹出窗口中选中 **Require approval for risky actions**。
破坏性键盘和弦(`Primary+W`、`Primary+Q`、`Primary+T`、`Primary+N`、`Primary+Shift+N`、`Alt+F4`)和导航到 `javascript:`、`file://` 或 `chrome://` URL 无论模式如何都将被拒绝。
审计跟踪:当设置 `BROWSEROPS_TRACE=1` 时,每个自动批准的操作都会被写入跟踪文件中。
### 启动器端:安全模式
当您运行 `browserops "task"` 时,CLI 会跳过权限提示启动您的默认启动器,以便代理可以完成任务而无需您监督:
| 启动器 | 我们传递 |
| --------- | ------------------------------------------------------------------------ |
| Claude Code | `claude --dangerously-skip-permissions` |
| Codex CLI | `codex exec --full-auto` (跳过批准,保持 codex 沙盒开启) |
| Cursor | 无 CLI 标志 — 设置 Cursor → **设置 → 代理 → 自动运行** 为“允许” |
随时开启安全模式以恢复启动器自己的每个操作提示:
```bash
browserops config set safe_mode true
```
上面的浏览器端门控是独立且不受影响的。
## 连接您的 MCP 客户端
`browserops init` 会自动在每个检测到的客户端中注册 shim。下面是手动或非检测设置的片段 — 将它们粘贴到客户端的 MCP 配置中。shim 是一个普通的 stdio MCP 服务器(`browserops-shim` 在 `npm i -g browserops` 后在 PATH 上),它在第一次调用时自动启动长期运行的守护进程,因此多个客户端可以并发共享一个 Chrome 配置文件。
### Claude Code
```bash
claude mcp add browserops --scope user -- browserops-shim
```
使用 `claude mcp list` 验证。
### Cursor
`~/.cursor/mcp.json`:
```json
{
"mcpServers": {
"browserops": { "command": "browserops-shim" }
}
}
```
### Zed
`~/.config/zed/settings.json`:
```json
{
"context_servers": {
"browserops": { "command": { "path": "browserops-shim", "args": [] } }
}
}
```
### Continue (VS Code / JetBrains)
`~/.continue/config.json` 在 `experimental.modelContextProtocolServers` 下:
```json
{
"experimental": {
"modelContextProtocolServers": [
{ "transport": { "type": "stdio", "command": "browserops-shim" } }
]
}
}
```
### Windsurf / Codeium
`~/.codeium/windsurf/mcp_config.json`:
```json
{
"mcpServers": {
"browserops": { "command": "browserops-shim" }
}
}
```
### Codex CLI
`~/.codex/config.toml`:
```toml
[mcp_servers.browserops]
command = "browserops-shim"
args = []
```
### 自定义 / 基于 SDK 的代理
任何基于官方 MCP SDK 的客户端都可以使用 `command: "browserops-shim"` 连接,无需参数,无需环境变量(token 和扩展 ID 通过 `~/.browserops/` 处理)。
### 设置环境变量
所有客户端都支持在 `command` 旁边使用 `env` 块。例如,要绑定非默认端口,请放入:
```json
"env": { "BROWSEROPS_PORT": "9876" }
```
然后在扩展程序的选项页面中镜像相同的端口。
## 代理说明
**每次运行 browserops 都需要 `AGENTS.md`。** 它包含您的代理必须遵循的编排规则:过程优先搜索,然后规划,何时使用子代理,键盘和弦语法以及过程创作规则。没有它,代理会重新规划已经编码在过程中的步骤,获取不必要的截图,跳过 `procedures_search` 调用,并生成无效的 YAML。
两个客户端自动发现它,无需设置:
| 客户端 | 如何 |
| -------------------- | -------------------------------------------------------------------------- |
| **Claude Code** | 从存储库根目录自动读取 `CLAUDE.md`(符号链接 → `AGENTS.md`) |
| **OpenAI Codex CLI** | 从存储库根目录自动读取 `AGENTS.md` |
所有其他客户端需要将每个项目复制到其规则槽中。从项目内部运行:
```bash
browserops install-rules
```
这为每个检测到的客户端写入相应的文件:
| 客户端 | 插槽 |
| ---------------------- | -------------------------------------------------------- |
| **Cursor** | `.cursor/rules/browserops.mdc` (frontmatter + AGENTS.md) |
| **Windsurf / Codeium** | `.windsurfrules` 中的块 |
| **GitHub Copilot** | `.github/copilot-instructions.md` 中的块 |
| **Continue** | `.continue/config.json` 中的 `customInstructions` |
| **Zed** | 手动粘贴到 Settings → Assistant → System prompt 中 |
重新运行 `install-rules` 是幂等的 — 它通过 sentinel 注释替换现有的块,而不是附加重复项。
## 可用工具
**标签页:** `browser_list_tabs`、`browser_current_tab`、`browser_new_tab`、`browser_close_tab`、`browser_switch_tab`、`browser_set_session_name`、`browser_release_tab`
**导航:** `browser_navigate`、`browser_back`、`browser_forward`、`browser_reload`
**观察:** `browser_observe`(自动选择每页最便宜的表示方式)、`browser_read`(完整的可访问性树作为序列化 blob)、`browser_quick_read`(按标签查找元素)、`browser_describe_ref`、`browser_query_selector`、`browser_screenshot`、`browser_wait_for`、`browser_wait_for_idle`
**输入:** `browser_click`、`browser_click_at`、`browser_click_by_text`、`browser_type`、`browser_find_and_replace`、`browser_press`、`browser_hover`、`browser_scroll`、`browser_execute_js`、`browser_set_cdp`
**定位器帮助程序(过程功能):** `browser_locate`、`browser_propose_locator`
**过程(过程功能):** `procedures_search`、`procedures_get`、`procedures_save`、`procedures_delete`、`procedures_execute`、`procedures_resume`
**跨代理传说(传说功能):** `lore_save`、`lore_search`、`lore_get`、`lore_delete`
每个工具的完整 JSON 模式在 `packages/shared/src/tools.ts` 中声明。
**点击/类型的工作原理。** 代理驱动的每个 https 标签页都会自动附加持久的 `chrome.debugger`。`browser_click` / `browser_click_at` / `browser_click_by_text` / `browser_type` / `browser_press` / `browser_hover` 通过 CDP `Input.*` 分派 — 受信任的合成器事件(`isTrusted: true`)遍历 iframe、shadow DOM 和 `isTrusted` 门控处理程序(Slack、Discord、Linear、Notion、Gmail 富文本编辑器、仅悬停菜单、画布应用)。Chrome 的“受自动化测试软件控制”的横幅出现在每个驱动的标签页上,同时 CDP 附加 — 这是预期的,不是失败信号。如果某个站点确实需要合成调度,请使用 `browser_set_cdp(tab_id, false)` 退出。
对于元素寻址,`browser_observe` 是一般状态读取的最便宜路径;`browser_quick_read` 按标签查找特定元素;`browser_read` 返回完整的可访问性树。在创作过程时,`browser_propose_locator` 会走一个一级优先的梯子(`aria_label`、`data_testid`、`href`、`attr`),并返回元素的最小稳定定位器描述符。
**限制:**
- `browser_screenshot` with `full_page: true` 返回 `INTERNAL` — 仅限视口。
## 过程
> **实验性 — 默认关闭。** 使用 `browserops feature enable procedures` 启用(然后 `browserops restart`),或在 `browserops init` 期间选择。关闭此功能时,六个 `procedures_*` 工具将从您的代理目录中隐藏,并且不会构建进程索引 — 对于只需要浏览器自动化的用户,token 开销最小。
过程是命名、参数化、可重用的操作图,代理可以发现和重放,而无需每次从截图重新规划。从 `~/browserops/procedures/`(用户可见,非隐藏)存储库中生存下来,并通过六个 MCP 工具公开:`procedures_search`、`procedures_get`、`procedures_save`、`procedures_delete`、`procedures_execute`、`procedures_resume`。
存储库出厂为空 — 没有捆绑的“默认”过程。新的过程按需由 **`browserops-teach`** 技能(自主)或通过 `procedures_save` 手动创建。过去的会话通过 `bump_success: true` 累积,因此存储库随着用户的使用而增长;没有任何内容出厂。
过程默认为 `status: draft`,直到验证。`procedures_search` 默认排除草稿,当没有受信任的匹配项时,fallback 到包含它们。要标记过程为受信任,请在验证运行后调用 `procedures_save` 并设置 `bump_success: true`;状态更改为 `trusted`,并且该条目在默认搜索中显示。
表单绑定 `{{step.field}}` 在保存时根据引用的工具的 `outputSchema` 进行验证。对于不存在于工具输出的字段的引用被拒绝,并返回 `PROC_SCHEMA_INVALID`,在过程运行之前。
过程模式和搜索排名位于 `packages/shared/src/procedures.ts`。
### 编写新流程:`browserops-teach` 技能
当代理决定没有可信的流程涵盖某个流程时,它会调用 **`browserops-teach`** 技能(位于 `~/.claude/skills/browserops-teach/SKILL.md`,镜像到 `skills/browserops-teach.md`)。该技能默认是自主的:一个用户输入,一个消息输出。它会预先检查是否存在现有的流程,读取应用程序先验知识, 直接使用 `browser_*` 工具探测实时页面,保存一个可运行的草稿,仅使用非严格的 `procedures_execute` / `procedures_resume` 来发现确定性的修复,然后在经过干净的严格验证连胜和外部目标基础谓词后,使用 `bump_success: true` 促进。
代理最多会问一个澄清问题,只有当硬安全门触发时:
1. **跨用户副作用且无安全自测试路径或精确授权** (实际接收者,实际可见性)。
2. **资金或账户级不可逆转** (支付,转账,删除,计划更改)。
3. **目标真正无法解析且标签/知识中无应用上下文**。
对于诸如 _"在Slack上给Pratham发消息"_ 之类的典型消息目标,接收者被作为输入编写,但验证尽可能使用安全的虚拟用户。当用户明确授权进行精确的真实接收者验证时,代理仅在训练期间向Pratham发送消息。
如果无法提升流程,仍然会留下一个有用的草稿:保存的YAML,失败分类,`procedures_execute` 分歧,`meta.health`,学到的知识以及精确的下一个解锁操作。重复失败通过切换策略类来处理 —— 准备/时机,定位器,入口基元,辅助恢复,谓词,然后是运行时不变式 —— 而不是重试相同的编辑固定次数。
这取代了旧的两个阶段的 `teach` (手动演示记录器)+ `autoteach` (迭代重放和优化循环)机制,该机制已被删除。通过自主默认,代理监视其自己的 `browser_*` 调用,并在其自己的上下文中编写YAML —— 无需单独的按键记录器,无需桥侧重放循环,无需瞬时会话存储。
编写检查清单(手动编写流程时仍然适用):
- 搜索第一。如果现有的流程已经涵盖了流程,请重用它,而不是编写平行版本。
- 编写围绕真实UI状态的叶子。每个叶子应代表一个稳定的过渡。
- 在执行之前保存第一个可运行的YAML作为草稿,以便阻止的 teach 运行留下可恢复的制品。
- 在编写前在实时站点上测试每个叶子。不要提升未经验证的流程;只有在严格验证成功后才使用 `bump_success`。
- 仅使用 `packages/shared/src/procedures.ts` 中的模式支持字段。
- 仅当叶子返回确切的字段时绑定输出,并验证绑定与实际结果。
- 优先使用显式等待和成功条件,而不是隐含假设。
- 仅将非严格执行/恢复用作创作辅助工具;将任何成功的补丁烘焙成YAML,并在提升前重新运行严格。
## 知识(跨代理)
> **实验性 - 默认关闭。** 使用 `browserops feature enable lore` 启用(然后 `browserops restart`)。关闭此功能时,下面四个 `lore_*` 工具将从 `tools/list` 中隐藏,任何直接调用都会返回 `FEATURE_DISABLED`。
一个位于 `~/browserops/lore/<name>.md` 的小型Markdown存储库,任何MCP客户端都可以读取或写入。目的是 **跨代理持久性**:从Claude Code会话中保存的课程对于稍后打开相同browserops桥的Cursor或Zed会话可见。它与Claude Code自己的自动存储在 `~/.claude/projects/.../memory/` 位于同一目录,但由于定义而仅限于Claude。
### 何时使用
当课程对可能接管相同browserops桥的任何MCP客户端有用时,请保存一个知识条目 - browserops行为,浏览器流程陷阱,跨会话生存的定位器,项目上下文。 将Claude私有事物(键绑定,响应样式)保存在自动知识存储中。
### MCP工具
| 工具 | 输入 | 输出 |
| --- | --- | --- |
| `lore_save` | `name`,`description`,`type`(`user`\|`feedback`\|`project`\|`reference`),`body`,`replace?:bool` | `{saved, path, created}` |
| `lore_search` | `query`,`type?`,`limit?`(1..25,默认10),`min_score?`(0..1,默认0.2) | `{matches, total, truncated}` |
| `lore_get` | `name` | `{meta, body, path}` |
| `lore_delete` | `name` | `{deleted, path}` |
`name` 匹配 `^[a-z][a-z0-9._-]{0,79}$`。除非设置 `replace:true`,否则重复名称会被拒绝并返回 `LORE_ALREADY_EXISTS`。搜索仅返回元数据 - 使用 `lore_get` 获取正文。
### 存储
每个知识条目都是一个带有YAML前置的Markdown文件:
```markdown
---
name: feedback_terse_responses
description: user wants terse responses
type: feedback
source: mcp-tool
created: 2026-04-29T12:00:00.000Z
updated: 2026-04-29T12:00:00.000Z
---
Keep responses under three sentences whenever possible.
```
由于设计原因,没有索引清单 - 桥会在每次 `lore_search` 时遍历目录并解析前置。如果 `BROWSEROPS_LORE_DIR` 被设置,则会覆盖根目录。
当启用 `lore` 功能时,提供给您的代理的MCP `initialize` 指令将增长一个关于 `lore_save` / `_search` / `_get` / `_delete` 的短段落 - 代理将在下一次会话中自动获取。关闭此功能时,这些工具及其文档将从 `tools/list` 和服务器指令中删除,以保持提示的简洁。
## 安全默认值
- **速率限制:** 每分钟16次操作/标签,全球60次/分钟。超出 → `RATE_LIMITED` 且 `retry_after_ms`。
- **终止开关:** 点击扩展工具栏图标 → **断开连接**。仅在选项页面中重新连接(故意增加摩擦力)。
- **审批模式:** 默认自动批准。要为高风险操作要求手动批准,请参阅上面的 [审批模式](#approval-mode)。
- **敏感域名列表:** `~/.browserops/risky-domains.json`(扩展了 `packages/bridge/src/risky-domains.ts` 中的内置默认值)。
## 本地开发
如果您想在browserops本身上进行黑客攻击,而不是仅仅使用它:
```bash
git clone https://github.com/quaylabshq/browserops.git
cd browserops
pnpm setup
```
`pnpm setup` = `pnpm install && pnpm build && node packages/cli/dist/index.js init`(与发布的 `browserops init` 相同,只是驱动程序来自您的克隆)。构建产物:
- `packages/cli/dist/index.js` — `browserops` CLI二进制文件
- `packages/bridge/dist/index.js` — `browserops-shim` MCP服务器二进制文件
- `packages/extension/dist/` — 解包的Chrome扩展
对于本地开发,请从 `packages/extension/dist/` 通过 `chrome://extensions` → **加载解包** 加载解包的扩展,而不是从Chrome应用商店安装。这样,您就可以测试本地更改。
## 开发循环
```bash
pnpm dev
```
在一个终端中启动四个观察者:
- `@browserops/shared` — `tsc -b --watch`,在保存时发出类型
- `@browserops/bridge` — `tsx watch`,在保存时热重启
- `@browserops/extension` — `vite build --watch`,在保存时重写 `dist/` (crxjs在Chrome中自动重新加载扩展)
- `browserops`(CLI)— `tsx watch`,在保存时热重启
在 `packages/shared/src/` 中编辑共享协议类型,在 `packages/extension/src/background/handlers/` 中实现处理程序,在 `packages/bridge/src/mcp-server.ts` 中调整桥接调度管道,或在 `packages/cli/src/` 中扩展CLI。
## 测试
```bash
pnpm test # 所有单元测试
pnpm -F @browserops/bridge test # 仅限桥接
```
目前,在共享(信封守卫,工具目录不变式,过程模式)和桥接(速率限制器,风险域通配符,过程存储,索引构建器,搜索排名器,处理程序)之间,总共有约220个单元测试。 计划了一个Playwright烟雾测试套件。
## 环境变量
| 变量 | 默认值 | 目的 |
| --- | --- | --- |
| `BROWSEROPS_HOST` | `127.0.0.1` | WebSocket绑定主机(从不 `0.0.0.0` - 在启动时强制执行) |
| `BROWSEROPS_PORT` | `57321` | WebSocket端口 |
| `BROWSEROPS_EXTENSION_ID` | 空 = 任意 | 来源允许列表;请在生产中将其固定为扩展ID |
| `BROWSEROPS_GLOBAL_CAP` | `60` | 每分钟全局速率限制上限 |
| `BROWSEROPS_LOG_LEVEL` | `normal` | `normal` 截断 > 200个字符的字符串;`audit` 记录完整有效载荷 |
| `BROWSEROPS_APPROVAL` | `auto` | `auto` (默认)或 `gate` ;控制高风险操作的审批模式 |
| `BROWSEROPS_TRACE` | 未设置 | `=1` 将自动批准的跟踪事件写入 `~/.browserops/trace.jsonl` |
| `BROWSEROPS_FEATURES` | 未设置 | 以逗号分隔的实验性功能名称列表,以强制启用(例如 `procedures,lore`)。当显式设置时,覆盖 `~/.browserops/config.json` ;空字符串禁用所有功能。持久性切换使用 `browserops feature enable/disable <name>` 而不是。 |
| `DO_NOT_TRACK` | 未设置 | 标准信号。`=1` 完全禁用遥测(无PostHog事件,无安装ID别名)。 |
| `BROWSEROPS_TELEMETRY` | 未设置 | browserops特定的遥测切换。`=0` 禁用遥测。两者中任意一个禁用。 |
| `BROWSEROPS_ALIAS_EMAIL` | 未设置 | 显式同意将用户的电子邮件发送到PostHog作为不同ID别名(跨机器合并需要)。默认关闭 - 除非设置此标志为 `1`,否则 **从不** 发送电子邮件。 |
## 遥测
browserops将 **匿名使用遥测** 发送到PostHog实例(`https://us.i.posthog.com`)。目的是检测回归并优先考虑功能。除了以下内容外, **没有** 其他产品表面:
**发送的内容。** 工具名称,错误代码,时间,操作系统平台/架构,Node主要版本,桥/CLI版本,安装ID(随机UUID,本地生成并存储在 `~/.browserops/install-id`)。确切的事件允许列表在 [`packages/bridge/src/telemetry/redact.ts`](packages/bridge/src/telemetry/redact.ts) 中 - 允许列表中没有的每个键都在源处被删除。
**从未发送。** 页面文本,网址,标签标题,截图,输入文本内容,文件路径,MCP工具有效载荷,搜索查询,流程YAML正文,知识条目,您的电子邮件(除非您明确选择加入 - 参见下文)。
**禁用遥测。** 以下任意一种:
- `DO_NOT_TRACK=1` - 行业标准信号。
- `BROWSEROPS_TELEMETRY=0` - browserops特定的标志。
两者都禁用PostHog客户端,没有备用通道。
**电子邮件别名需用户选择加入。** 如果您已在 `~/.browserops/config.json` 中设置了 `identity.email` (通过 `browserops identify` 或 `browserops init`),除非您还导出了 `BROWSEROPS_ALIAS_EMAIL=1`,否则不会发送您的电子邮件。这是故意的:电子邮件仅在跨机器身份合并时有用,而同意比别名更重要。
## 故障排除
`browserops doctor` 检查Node版本,端口可用性,令牌存在性,控制套接字可达性以及哪些客户端二进制文件在PATH上。先从那里开始。
**扩展在客户端运行后显示“断开连接”**。
检查 `~/.browserops/log.jsonl` - 查找 `{"dir":"system","event":"boot"}`。如果不存在,则桥接未启动。尝试 `browserops status` (守护进程是否启动?)和 `browserops doctor`。如果桥接启动但扩展无法连接,请确认扩展选项页中的端口和主机与桥接的匹配。
**日志中出现“错误令牌”关闭(代码4001)**。
令牌不匹配 - 通常是因为 `~/.browserops/token` 在扩展程序上次配对后被重新生成。最简单的修复方法是重启桥接(以便它生成一个新的配对代码),打开扩展程序弹出窗口 → **运行设置**,并确认。或者,将当前令牌粘贴到选项页面中。
**`list_tabs` 返回的标签少于我在Chrome中看到的标签数**。
桥接仅为扩展程序观察到的标签生成 `tab_id`。重启扩展程序(在 `chrome://extensions` 中切换关闭/打开)以重新枚举现有标签 - 或关闭并重新打开您关心的标签。
**“full_page需要CDP附件(延迟到v2)”**。
使用 `full_page: false` (默认)。完整页面捕获随v2 CDP工作一同发布。
**端口冲突(57321)**。
在MCP配置的 `env` 块中设置 `BROWSEROPS_PORT=9876`,并在扩展程序的选项页面中设置相同的内容。
**一次多个MCP客户端**。
桥接支持主/从角色拆分:第一个绑定 `:57321` 的进程拥有与扩展程序的WebSocket,随后的桥接进程(例如,另一个编辑器中的第二个客户端)通过本地控制套接字代理。无需配置更改 - 只需在两个客户端中注册相同的命令即可。
## 项目布局
```
browserops/
├── packages/
│ ├── shared/ # 协议类型,错误代码,工具目录
│ ├── bridge/ # @browserops/bridge — MCP + WebSocket服务器
│ ├── extension/ # MV3扩展(后台SW,选项,弹出窗口)
│ └── cli/ # browserops — CLI协调器(init,守护进程,启动器)
└── skills/ # browserops + browserops-teach技能提示
```
## 已发布包
| 包 | 用途 |
| --- | --- |
| [`browserops`](https://www.npmjs.com/package/browserops) | CLI协调器。提供 `browserops init`, `--claude/--cursor/--codex`,生命周期命令。依赖于 `@browserops/bridge`。 |
| [`@browserops/bridge`](https://www.npmjs.com/package/@browserops/bridge) | MCP stdio服务器(`browserops-shim`二进制文件)。MCP客户端生成的二进制文件。 |
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器