mcpField
M
MCP Browser Extension

MCP Browser Extension

本地服务
mcp-browser-extension.com浏览器自动化6今天更新

关于 MCP Browser Extension

MCP Browser Extension 让 AI Agent 操作现有且已登录的 Chrome 标签页。它由 Chrome 扩展和本地 MCP 服务组成,按域名和操作权限控制访问,默认拒绝访问。

主要功能

  1. 01控制现有 Chrome 标签页
  2. 02使用当前会话和 Cookie
  3. 03按域名限制访问
  4. 04读取页面时清除机密信息
  5. 05记录调用和访问判定
  6. 06在后台标签页操作

适用场景

  1. 01读取已登录的 Gmail 或 GitHub 页面
  2. 02从没有 API 的网页仪表板收集数据
  3. 03在获准域名内自动执行浏览器任务

MCP 相关

本地 MCP 服务与必需的 Chrome 扩展通信,并向 MCP 客户端提供浏览器控制工具。域名访问和操作能力默认全部禁用,可按需显式开放。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"mehmoodqureshi-mcp-browser-extension": {
"command": "npx",
"args": [
"-y",
"mcp-browser-extension"
]
}
}
}
启动命令npx -y mcp-browser-extension

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmmcp-browser-extension0.9.36

工具

21

收录的工具列表 · 更新于 今天

此工具无需参数。

详细介绍

MCP 浏览器扩展

CI npm license

网站和文档: mcp-browser-extension.com · 快速入门 · 全部 43 个工具 · 从 Chrome 网上应用店安装扩展程序

让 Claude 使用你已经登录的 Chrome。 不用每次打开网站都像陌生访客一样的全新自动化浏览器,而是使用你的 Chrome,保留你的会话、Cookie,并且已经完成双重身份验证。只要你能在浏览器中看到某个页面,Agent 就能读取它,无需重新登录,也无需在任何地方粘贴凭据。

大多数浏览器 MCP 服务会启动自己的 Chromium,并向 Agent 提供一个未登录的窗口。MCP 浏览器扩展则相反:一个 MV3 扩展会连接到本地主机 WebSocket 服务,并通过 chrome.scripting/chrome.tabs 操控你已经打开的浏览器。可与 Claude Code、Claude Desktop 及任何其他 MCP 主机搭配使用。

MCP 浏览器扩展由两部分组成:扩展程序,以及通过 npx 运行的轻量级 MCP 服务(npm 包和命令:mcp-browser-extension)。扩展程序可从 Chrome 网上应用店 安装,也可以解压后加载。

此版本仅包含扩展程序。 它绝不会启动或连接到自己的 Chromium,因此扩展程序是必需的,而非可选项——没有扩展程序,任何工具都无法运行。CDP 标志(--cdp-fallback、--no-cdp-fallback、--cdp-endpoint、--prefer)仍可接受,以保持向后兼容,但会被忽略。

完整设计: docs/BLUEPRINT.md — 架构、线路协议、完整工具集、扩展程序清单、安全模型和分阶段构建计划。

在已登录的 Chrome 中使用 Claude

你已经登录了 Gmail、GitHub、分析仪表板、管理面板和 CRM。MCP Browser Extension 让 Claude(Claude Code、Claude Desktop 或任何其他 MCP 主机)在这些相同的标签页中工作:无需重新登录,无需再次进行双重身份验证,也无需在配置文件中保存密码或 Cookie。扩展在你日常使用的 Chrome 中运行,因此 Agent 打开的页面,就是你会看到的页面。

  • Gmail — 在已打开的标签页中读取邮件会话或搜索结果。
  • GitHub — 以你的身份浏览 PR、问题和设置页面,包括私有仓库。
  • 仪表板 — 从没有 API 或你从未配置过 API 的分析、账单或管理界面中提取数据。

其他工具也可以驱动已登录的 Chrome(例如 hangwin/mcp-chrome 扩展),因此关键在于,除了会话之外你还能获得什么:

  • 按域名设置允许列表,默认拒绝所有访问。 不设置任何标志时,Agent 无法读取任何内容。--allow-domain mail.google.com --allow-domain github.com 只开放这些主机(*.example.com 覆盖一个域及其子域);其他所有网站都会在调用到达页面之前被拒绝。读取操作也受限,而不仅仅是点击操作;扩展还会在自身侧重新检查同一策略。修改、执行代码、下载和上传都需要单独选择启用。
  • 绝不返回密码值,并且 --redact 会从页面读取内容中清除令牌、API 密钥和 JWT。
  • 审计记录:每次调用都会记录 URL、允许/拒绝判定、耗时和返回的字节数。
  • Chrome 中的近期活动:弹出窗口会显示最近 5 条活动(一个标签页的打开/关闭记录共用一行);设置页面最多显示 100 条,并支持按结果筛选。此会话历史会包含网站名称和应用密钥,但不包含页面文本、输入值或完整 URL。
  • 停止访问:可通过弹出窗口或设置页面断开所有应用的连接。停止状态会在重启后保留;恢复连接需要为每个应用重新批准。已在运行的命令可能会完成,已完成的操作无法撤销。
  • 不会打扰你当前的标签页:Agent 会在后台打开自己的标签页并在那里操作,因此不会切换你当前所在的页面、点击其中的内容,也不会让它失去焦点。batch 可在一次调用中同时读取多个标签页。
  • 多个 Chrome 配置文件:在工作和个人配置文件中加载扩展,并使用 profile_use 在它们之间切换。
  • auth_check:会话过期时,Agent 会收到 [AUTH_REQUIRED] 信号,而不是令人困惑的超时,这样它就能停止操作并请你重新登录。MCP Browser Extension 不会保存凭据,也不会代你登录。

设置分为两部分:MCP 服务(下方的 npx)和扩展。你可以**从 Chrome 网上应用店安装**,也可以从服务解压出的文件夹中加载扩展。

快速开始

粘贴一次即可启动

将以下内容交给你的 AI Agent(Claude Code、Cursor、Windsurf 或任何 MCP 工具),它会安装服务、将其接入客户端,并引导你安装扩展、验证邮箱和配对 Chrome:

Set up MCP Browser Extension on this machine by fetching and following
https://raw.githubusercontent.com/Mehmoodqureshi/mcp-browser-extension/main/SETUP.md
exactly, step by step. Work autonomously and verify each step.

想在让 Agent 操作你的电脑之前先阅读说明?SETUP.md 是 Agent 会遵循的准确文件。手动步骤如下。

1. 注册 MCP 服务到你的主机。

Claude Code(终端) — 一条命令,无需查找配置文件
claude mcp add mcp-browser-extension -s user -- \
  npx -y mcp-browser-extension@latest \
  --allow-domain example.com --enable-mutations --persist-token

-- 之前的所有内容都属于 Claude Code;之后的所有内容都是此服务的命令和标志。务必保留 --,否则 --allow-domain 会被当作 Claude Code 选项读取。

-s user 会为你电脑上的所有项目注册此服务。使用 -s local(默认值)则仅限当前项目;使用 -s project 则会写入团队可提交的 .mcp.json。 使用 claude mcp list 检查服务是否已启动。升级服务后,在会话中使用 /mcp 重新连接,无需重启。

Claude Desktop 和其他 MCP 主机 — JSON 配置
{
  "mcpServers": {
    "mcp-browser-extension": {
      "command": "npx",
      "args": ["-y", "mcp-browser-extension@latest",
               "--allow-domain", "example.com", "--enable-mutations",
               "--persist-token"]
    }
  }
}

默认情况下,所有权限均为拒绝(不允许任何域名、代码求值或变更)。使用 --allow-domain <glob>(可重复指定)、--enable-mutations、--enable-downloads、--enable-uploads 或 --unsafe-enable-eval,仅授予所需权限。不支持访问所有网站;请在 Chrome 扩展弹出窗口中批准指定网站。

默认启用邮箱验证。对于可信的本地无人值守配置,可使用 --no-email-verification 退出验证(或设置 MCP_BROWSER_EXTENSION_EMAIL_VERIFICATION=0)。这样会跳过邮箱提示和 Firebase 访问服务,因此不会向其发送邮箱或设备授权。本地 MCP 客户端仍需在 Chrome 中获得批准,才能使用扩展,并且仍受配置的域名和功能策略限制。请将所有能够启动或访问此本地服务的进程视为可信进程。此选项不能与 --tunnel 同时使用,也不会关闭遥测或 npm 更新检查。

--enable-uploads 允许使用 upload_file(在页面的文件 <input> 中设置本地文件)。此功能默认关闭,因为向页面发送本地文件存在数据泄露风险;同时还受目标域名允许列表限制。搭配 --uploads-dir <path> 使用可将上传范围限制在该目录中的文件(会阻止 .. 路径遍历)——强烈建议在无人值守时使用。

重启后保持传输配对状态。 上述两个示例都包含 --persist-token,它能让配对状态在重启后保留;如果你更倾向于使用下文所述的更严格默认设置,可以移除它。

不使用 --persist-token 时,每次启动都会生成新令牌(安全默认设置),这意味着每次重启后都需要重新配对扩展。使用该选项后,令牌会以 0600 权限存储在 ~/.mcp-browser-extension/token 中,并在后续启动时复用;扩展的 keepalive 会自动重新连接,无需手动操作。MCP_BROWSER_EXTENSION_TOKEN 可用于显式固定令牌(且绝不会写入磁盘)。此传输配对不会授予应用访问权限:每个新应用会话都有独立密钥,并且需要在 Chrome 中获得批准。

2. 安装扩展——必需;没有扩展,服务无法执行任何操作。

从 Chrome 网上应用店安装 MCP Browser Extension。 一键安装,无需启用开发者模式,而且 Chrome 会为你自动更新。请通过此方式安装。

3. 验证邮箱。 在 MCP 客户端中,让 Agent 调用 chrome_status。首次调用浏览器工具时,客户端会显示邮箱提示。输入你可以访问的邮箱地址,然后打开发送到该地址的登录链接,并点击验证此设备。等待中的工具会报告邮箱已验证,然后继续执行。

如果工具返回 ACCESS_PENDING,让 Agent 再次调用 chrome_status,继续等待同一个链接即可。无需再次输入邮箱,也无需验证码。

如果你的客户端屏蔽了提示(例如在 YOLO/绕过模式下)、不支持 MCP 引导,或对话框被关闭,服务会自动在浏览器中打开一个临时本地验证表单。工具也会返回 ACCESS_INPUT_REQUIRED 和该表单的链接,因此如有需要,你可以在运行 MCP 服务的计算机上自行打开。请在浏览器表单中输入邮箱,然后打开收件箱中的登录链接。点击验证此设备,然后调用 chrome_status 继续。 本地表单会在 10 分钟后过期;再次调用工具即可获取新的表单。打开表单不会发送邮件;只有验证邮箱链接和设备授权后,访问才会开放。仅安装扩展不会激活访问权限。 4. 如果 Chrome 尚未配对,请点击 Connect。 全新安装会打开扩展程序的设置页面,其中有一个 Connect 按钮(工具栏弹出窗口中也有)。点击该按钮,允许 Chrome 请求的一项 权限,即可完成配对:服务器每次启动时,都会向 Chrome 注册一个小型辅助程序,而该按钮会向它请求端口和令牌。Chrome 只允许此扩展程序与该辅助程序通信。如果服务器更改了令牌,扩展程序会自动获取新令牌。无需复制或粘贴任何内容。

5. 在 Chrome 中批准应用连接。 运行 chrome_status,然后打开扩展程序弹出窗口中的 App connections 部分。将密钥指纹与工具结果中的指纹进行比较,然后点击 Approve for 8 hours。 应用名称由应用提供;密钥用于标识此特定会话。批准后重试该工具。即使客户端隐藏了提示,问号徽标和弹出窗口也会显示待处理请求。可直接在弹出窗口或设置中批准、拒绝、撤销和恢复连接。

每个应用会话都有自己的签名密钥,该密钥仅保存在该服务器会话的内存中。 批准在此 Chrome 配置文件中有效 8 小时。重启应用的 MCP 连接会生成一个新密钥,需要重新批准。Remove access 会阻止该密钥执行后续命令;已在运行的操作可能会完成。YOLO、绕过权限模式和 --no-email-verification 都无法跳过此扩展程序检查。

6. 允许访问所需的网站。 弹出窗口会显示网站访问请求。 点击 Allow,然后在 Chrome 显示网站权限提示时接受。此操作会一次性将该网站添加到 Chrome 和服务器的允许列表中。 允许网站后,已批准的应用便可读取该网站并在其中执行操作,包括发送消息、删除信息和进行购买;具体取决于配置的工具权限。每项操作无需单独获得扩展程序批准。网站访问权限会一直保留,直到将其移除,并由已批准的应用会话共享;每个应用仍需单独获得尚未过期的连接批准。 移除网站时,也会移除其 Chrome 权限。现有服务器标志不会授予 Chrome 访问权限,升级后也可能需要重新批准网站。

需要时,Cookie 和下载会在 Extra permissions 下分别请求权限。这些权限默认关闭,其对应按钮也可用于移除权限。下载内容时不会使用浏览器 Cookie,会拒绝重定向,且文件大小限制为 50 MiB。需要使用已登录浏览器会话或会重定向的链接可能无法使用。代理 身份验证和 IP 查询会在设置中请求权限。Chrome 不支持将 debugger 或 proxy 设为可选权限;这两项仍为必需权限,而且执行 debugger 命令前仍会检查网站权限。

使用客户端批准功能前,请更新扩展程序和服务器。旧版扩展程序无法强制执行此功能,而更新后的服务器在扩展程序更新前会拒绝浏览器命令。请参阅客户端批准详情。

开发者:改为以未打包方式加载

扩展程序也包含在 npm 包中,服务器每次启动时都会将其复制到 ~/mcp-browser-extension(Windows 上为 %USERPROFILE%\mcp-browser-extension;可通过 MCP_BROWSER_EXTENSION_EXTENSION_DIR 更改位置)。打开 chrome://extensions → 启用 Developer mode → Load unpacked → 选择该文件夹。扩展程序会根据服务器写入其中的 pairing.json 自动完成配对;服务器每次启动时都会刷新文件(绝不会使用较旧的构建版本),因此扩展程序会在 30 秒内自动重新加载。

未打包的副本不会通过 Chrome 更新,因此其弹出窗口会提示使用商店版本。全新构建的未打包版本包含商店版本的公钥,因此 ID 相同:在一个 Chrome 配置文件中,只加载其中一个版本,不能同时加载未打包版本和商店版本。更新会保留现有未打包安装的 ID,包括没有清单密钥的旧副本;这些副本会继续通过随附的 `pairing.json` 配对。 从 git 克隆版本开始使用? 先运行 `npm install && npm run build:ext`;`extension-dist/` 已加入 gitignore。 `npm run clean` 会清除服务端构建输出并保留 `extension-dist/`,其中的清单和配对数据可能属于已在 Chrome 中加载的安装。

**徽章位置:**徽章显示在 Chrome 工具栏中的扩展程序图标上,而不是 chrome://extensions 页面上。Chrome 会将新扩展程序隐藏在地址栏右侧的拼图按钮后面,因此请点击该按钮,找到 MCP Browser Extension,然后点击旁边的图钉一次;之后图标就会固定在工具栏中。将鼠标悬停在图标上可查看文字状态。

徽章含义
绿色圆点传输已配对并连接
问号需要你检查连接或网站
黄色圆点正在连接
灰色圆圈尚未配对(尚未运行任何服务,或没有配对文件)
红色感叹号令牌已被拒绝;服务端已轮换令牌,将在片刻后自动重新配对

手动备用方案(使用 --no-native-host 关闭辅助程序,或 Connect 报告问题时):运行 npx -y mcp-browser-extension@latest --print-pairing,打开扩展程序的 Settings,然后粘贴 ~/.mcp-browser-extension/handshake.json 中的 port 和 token。

重启 Chrome 后扩展程序消失

运行只读诊断,查看实际安装类型、缺失文件、Chrome 停用原因以及任何冲突的扩展程序注册信息:

npx -y mcp-browser-extension@latest extension doctor

旧的未打包副本在更新时,如果清单中加入了 Web Store 公钥,可能会获得新的 ID。随后 Chrome 会为同一文件夹保留两个 ID,并在下次启动时跳过该文件夹。现在更新会保留现有 ID。对于已受到这一特定冲突影响的安装:

npx -y mcp-browser-extension@latest extension repair
# Review the preview, fully quit Chrome and other Chromium browsers, then:
npx -y mcp-browser-extension@latest extension repair --apply

修复程序会将原始偏好设置备份到 ~/.mcp-browser-extension/extension-repair-backups/ 下,仅移除已确认过时的注册信息,并保留当前扩展程序及其已保存的设置。Chromium 浏览器运行时,它会拒绝写入。之后重新打开 Chrome。 自定义浏览器数据位置时,请使用 --user-data-dir <directory>;要生成诊断报告,请使用 extension doctor --json。报告包含扩展程序路径和注册状态,但不包含浏览历史记录、Cookie 或配对令牌。

如果 Web Store 安装不存在匹配的过期 ID 冲突,则不会对其进行更改。如果诊断发现文件缺失、已停用的 Store 副本或没有注册信息,则需要单独诊断;此命令不会臆测原因或重置浏览器配置文件。从未打包副本迁移到 Store 版本时,请先移除未打包副本,再从 Store 安装。

运行多个会话

每个 MCP 主机会话(每个 Claude 终端、标签页或窗口)都会启动自己的 MCP Browser Extension 服务,并同时共用你的 Chrome。最先启动的会话会占用 桥接端口并接入扩展程序,成为 hub。之后启动的每个会话都会找到一个正在运行的 MCP Browser Extension 服务所占用的端口,并以 peer 身份加入:它的工具调用会经由 hub 转发到相同的浏览器,因此每个会话都能并行工作。没有会话会断开连接。

当 hub 所属的会话结束时,其 peer 会争抢端口;其中一个会接管端口 (使用相同的令牌,因此扩展程序会在几秒内自动重新配对),其余会话则加入新的 hub。此时正在执行的调用会失败一次,返回 EXTENSION_DISCONNECTED,并会在安全可重试时自动重试。

Peer 使用 0600 握手文件中的配对令牌向本地传输进行身份验证。仅凭该令牌无法授权浏览器命令:每个会话都必须使用在 Chrome 中获准的密钥为自己的命令签名。无法共用端口的旧版服务会像之前一样被替换:系统会先验证它是否为 MCP Browser Extension 服务,再将其停止。任何未经验证的 MCP Browser Extension 服务都不会被触碰——如果端口由其他程序占用,系统会报告情况,但绝不会将其终止。

各个会话共用一个浏览器,因此也共用其标签页:如果两个会话同时操作同一个标签页,就会相互干扰。请为每个会话使用各自的标签页(tab_new),或各自的 Chrome 配置文件(见下文)。

每个会话也可以同时操作多个浏览器:在每个 Chrome 配置文件中加载扩展程序,它们都会配对到同一个服务,并分别使用自己的配置文件名称。工具会操作当前活动配置文件——在启动时使用 --profile <name>,或在运行时使用 profile_use 工具来选择。

名称会自动分配。Chrome 不会告知扩展程序它运行在哪个配置文件中,因此每次安装都会保留一个随机 ID,由服务为其命名:第一个浏览器名为 default,接下来是 profile-2、profile-3,依此类推。名称存储在 ~/.mcp-browser-extension/profiles.json 中,因此浏览器重启后仍会保留名称。 chrome_status 会列出所有已配对的浏览器(并显示其活动标签页作为提示),而 profile_rename 可为其中一个浏览器设置易记的名称(profile-2 → work)。如果想自行固定名称,可在扩展程序的 Options → Profile 中输入;该设置始终优先。

不使用 --port 时,每个服务都会绑定一个临时端口(绝不会冲突),但每次启动时端口都会变化,因此每次都需要重新配对扩展程序。若要只配对一次,请固定使用 --port 和 --persist-token。

Windows

不需要使用 WSL2——原生 Windows 即可。不过需要修改一项配置: 在 Windows 上,npx 是 npx.cmd,属于批处理脚本,而 MCP 宿主启动服务时 不会通过 shell 启动,因此无法执行 .cmd。所以 "command": "npx" 无法 启动。请用 cmd /c 包装:

{
  "mcpServers": {
    "mcp-browser-extension": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "mcp-browser-extension@latest",
               "--allow-domain", "example.com", "--enable-mutations",
               "--persist-token"]
    }
  }
}

也可以通过 Claude Code 执行:claude mcp add mcp-browser-extension -- cmd /c npx -y mcp-browser-extension@latest --allow-domain example.com

正常使用时,请按照上文所述从 Chrome 网上应用店安装扩展,然后点击 Connect。Windows 常规设置中不要使用 Load unpacked。未打包的开发版与网上应用店版本具有相同的扩展 ID, 因此加载开发版可能会替换网上应用店的安装版本;之后 Chrome 可能会停用非网上应用店版本。如果你正在开发 mcp-browser-extension,请在单独的 Chrome 配置文件中加载 %USERPROFILE%\mcp-browser-extension。

这些工具涵盖标签页、导航、交互(click/type/press/hover/ scroll/select_option)、读取(get_text/get_html/screenshot/eval/wait_for)、 无障碍 snapshot(包含可交互元素及稳定的 ref,供模型定位,而不必猜测 CSS 选择器)、会话访问(get_cookies/storage)、 辅助工具(extract_links/read_as_markdown/fill_form/download_file/upload_file)、 以及 chrome_status。upload_file 无需通过操作系统对话框,即可在文件 <input> 中设置本地文件(需要 --enable-uploads)。

click/type 支持设置 trusted: true,以使用真实的操作系统级输入(适用于 React/Vue 受控输入);交互会自动等待目标出现。

随处使用 — --tunnel

通过 claude.ai、Claude 移动应用、ChatGPT、另一台机器上的 Claude Code,或运行在服务上的 Agent, 驱动你电脑上的 Chrome。

brew install cloudflared            # once (Windows: winget install --id Cloudflare.cloudflared)
npx -y mcp-browser-extension@latest --tunnel --allow-domain example.com --enable-mutations

它会打印一个连接器 URL,例如 https://<random>.trycloudflare.com/mcp/<key>:

  • claude.ai / Claude 移动应用: Settings > Connectors > Add custom connector,粘贴 URL。
  • ChatGPT(网页): Plugins > Add > Add custom MCP server。选择 Server URL, 粘贴完整的连接器 URL(包括 /mcp/<key>),然后选择 No authentication。创建并安装个人插件,然后在新聊天中使用 @ 选择该插件。保持隧道运行。
  • 在其他位置运行的 Claude Code / Agent: 使用 <url>/mcp,并设置 Authorization: Bearer <key>; 同时也会打印准确的 claude mcp add 命令。

密钥(32 个随机字节,保存在 ~/.mcp-browser-extension/remote-key)会保护每个 请求;密钥错误或缺失时会直接返回 404。任何持有该 URL 的人都能在允许的网站范围内操控 你的浏览器,因此请妥善保管 URL,并严格限制允许列表。--rotate-remote-key 会切断所有客户端连接。快速隧道 URL 每次启动都会变化;单独使用 --http 时,服务会监听 127.0.0.1:38018(--http-port),供你 自行搭建隧道(ngrok、Tailscale Funnel、反向代理)。服务会一直运行,直到按下 Ctrl-C。

每个 Chrome 配置文件单独设置代理 — proxy_status

Chrome 会将代理应用于整个配置文件,而不是单个标签页,因此请为每个 IP 使用一个 Chrome 配置文件: 在该配置文件的扩展程序 Settings 页面中设置代理,并在那里为配置文件命名,然后使用 profile_use 切换。代理失效时, 网页会加载失败,而不会回退到你的真实 IP。proxy_status 会报告出口 IP 和国家/地区;Agent 无法更改代理或读取其密码。

同时操作多个标签页 — batch

batch 可在 一个 请求中运行多个工具调用——parallel(默认)或 serial(可选 stopOnError)。每个子操作都经过与直接调用相同的策略门控、速率限制和错误处理(不会绕过,也不能嵌套)。可用它将任务分发到多个标签页:

// open three product pages (background, so they don't fight for focus)…
{ "name": "batch", "arguments": { "ops": [
  { "tool": "tab_new", "args": { "url": "https://a.example/p" } },
  { "tool": "tab_new", "args": { "url": "https://b.example/p" } },
  { "tool": "tab_new", "args": { "url": "https://c.example/p" } }
]}}

// …then read them all at once (wall-clock ≈ the slowest one, not the sum)
{ "name": "batch", "arguments": { "ops": [
  { "tool": "get_text", "args": { "tabId": "<a tabId>" } },
  { "tool": "get_text", "args": { "tabId": "<b tabId>" } },
  { "tool": "get_text", "args": { "tabId": "<c tabId>" } }
]}}

在 parallel 模式下,针对标签页的操作必须传入明确的 tabId——并发时使用默认的活动标签页不安全,因此系统会拒绝请求,而不是悄悄将其路由到错误的标签页。(tab_new、tabs_list、chrome_status 除外。)

Agent 在自己的标签页中工作,而不是你的标签页。 tab_new 会在后台打开标签页,该标签页随后成为 Agent 的标签页:未指定 tabId 的调用会发送到该标签页。如果 Agent 还没有自己的标签页,未指定标签页的 navigate 会新开一个,而不是替换你的页面;tab_new 只会复用自己打开的空白标签页,不会复用你的“新标签页”。在 Agent 打开任何内容之前,读取操作会查看你的活动标签页,因此“总结此页面”仍然有效;要操作你的页面,Agent 会传入从 tabs_list 获取的 tabId。传入 active: true 可将标签页置于前台。

访问 iframe 和 shadow root

选择器“应该”能匹配元素却没有匹配到,几乎总是因为元素位于选择器无法访问的地方:<iframe> 内部(结账组件、OAuth 同意屏幕、嵌入式编辑器),或 Web 组件的 shadow root 内部。

shadow root 会自动处理——现在,每个选择器和每个 ref 都会通过开放的 shadow root 解析,因此 snapshot 显示的任何内容都可以点击。(以前它会显示无法点击的元素:快照会遍历 shadow root,但操作不会。)

Frame 需显式启用,因为是否访问 frame 应由你决定:

frames_list {}                                  // what frames exist, and their URLs
click { "selector": "#pay", "allFrames": true } // find it in whichever frame has it
get_text { "frameId": 7 }                       // pin one frame

每个 frame 在执行任何操作前,都会根据其自身的 URL 进行授权,因此,允许列表中的页面嵌入第三方 iframe,不会成为读取第三方内容的途径。来源不在允许列表中的 frame 会被跳过。

查看页面出错的原因 — console_logs、network_log、dialogs

读取 DOM 可以告诉你页面出错后的样子,却无法说明原因。启用 --enable-observers 后,页面内钩子会记录控制台输出、未捕获的错误和 fetch/XMLHttpRequest 流量,并拦截原生对话框:

console_logs { "level": "exception" }    // the uncaught error behind a broken page
network_log  { "failedOnly": true }      // the 500 behind the blank screen
dialogs      { "policy": "accept" }      // answer confirm() with true from here on

它默认关闭,而且这是有意为之:该钩子会在真实浏览器中每个允许列表页面上修改 console、fetch、XMLHttpRequest 和对话框函数。启用后,它只会在允许列表中的域名上、于 document_start 时注册(因此可以捕获加载时发生的故障),并且记录的内容在工具调用读取之前不会离开页面——读取时也会经过与其他页面读取相同的门控。

拦截对话框不只是观察,也是在修复问题:alert/confirm/beforeunload 会阻塞渲染进程,因此以前,打开对话框的点击会让每个注入脚本一直挂起,直到命令超时并报告 TIMEOUT,却没有任何线索。启用观察器后,对话框会得到响应(默认执行 dismiss:confirm → false,prompt → null),并被记录。

network_log 能看到什么: 页面代码发出的请求——fetch 和 XMLHttpRequest,包括方法、URL、状态和耗时——以及你要求记录时的 Resource Timing 条目(脚本、图像、样式)。不包括文档请求、重定向或标头。这是为了不让调试器会话持续占用你的浏览器而付出的代价。

仅查看变更内容 — snapshot { diff: true }

快照是工具功能中成本最高的读取操作,而最常使用它的循环(snapshot → click → snapshot)每次都会重新发送几乎完全相同的页面内容。改为请求差异:

snapshot { "diff": true }                       // added / removed / changed only
click { "selector": "#save", "snapshotAfter": true }   // what the click changed

节点通过角色和可访问名称在快照之间匹配,而不是通过 ref——每次快照都会按文档顺序重新编号 ref,因此若按它们进行差异比较,上方一旦出现任何内容,一个未发生变化的按钮就会被报告为先删除再添加。

记住页面并在之后捕捉变化 — page_watch

保存一个命名的无障碍检查点,然后在之后的会话中将当前页面与之进行比较。检查点保存在当前 Chrome 配置文件下,因此工作和个人浏览器身份彼此分开:

page_watch { "action": "create", "name": "Vendor pricing" }
page_watch { "action": "compare", "watchId": "watch_…" }
page_watch { "action": "list" }
page_watch { "action": "delete", "watchId": "watch_…" }

结果会显示新增、移除和更改的控件。它会存储无障碍标签和控件状态,剥除 URL 查询字符串,应用已配置的脱敏规则,并且绝不会保存实时表单值。创建或比较检查点仍要求页面所属域名已获准访问。

按角色和名称定位

操作接受定位器,而非 CSS 选择器,因此你无需先获取快照来查找 ref:

click { "role": "button", "name": "Sign in" }
type  { "role": "textbox", "name": "Email", "text": "[email protected]" }

解析在服务端进行,且不会猜测:如果定位器有歧义,操作会失败并列出候选项,而不会直接作用于第一个候选项(传入 nth 即可选择)。

会话过期了吗?— auth_check 和 failOnAuthWall

复用已登录的 Chrome 可以省去登录步骤,但会话 Cookie 仍可能在运行过程中失效。如果没有明确的信号,下一步操作会以 SELECTOR_NOT_FOUND 或 TIMEOUT 失败,而评估运行的测试框架会将其判为 Agent 失败,实际上它只是身份验证失败。现在,每个 snapshot 都会在页面看起来像登录墙时附带 authWall 判定,并且提供了专用的探测工具:

auth_check {}                                   // { authRequired, confidence, signals }
auth_check { "failOnAuthWall": true }           // [AUTH_REQUIRED] error instead
navigate  { "url": "https://app.example.com/dashboard", "failOnAuthWall": true }
snapshot  { "failOnAuthWall": true }

对于测试框架,只需设置一次,无需每次调用都设置:

npx -y mcp-browser-extension@latest --allow-domain app.example.com --enable-mutations --fail-on-auth-wall

启用此标志后,每个可能改变标签页内容的步骤(navigate、click、type、select_option、press、fill_form、back、forward、reload)都会检查其到达的页面;如果该页面是登录墙,则会以 [AUTH_REQUIRED] 失败。如果 wait_for 在此类页面上超时,也会报告 [AUTH_REQUIRED],而非 [TIMEOUT]。每个受保护的步骤都会额外花费一次快照往返;关闭此标志则不会产生额外开销。测试框架遇到 [AUTH_REQUIRED] 时,会暂停并让人工在同一个 Chrome 中重新登录,然后重试该步骤。MCP Browser Extension 不会自行重新进行身份验证:它按设计不持有任何凭据。

检测只读取快照中已有的信息:URL(登录路由、身份提供方主机,例如 accounts.google.com、login.microsoftonline.com、Okta、Auth0)、标题、密码字段和登录控件。high 置信度需要两个独立线索(例如,密码字段和登录按钮);单独的密码字段或简单的 /auth/... URL 属于 medium。普通页面上的“登录”链接永远不会被计入。failOnAuthWall 仅在置信度为 high 时触发,因此测试框架可以将 [AUTH_REQUIRED] 与其他所有失败分别归类,而包含“当前密码”字段的设置页面则会正常继续。

打印 — print_pdf
print_pdf { "landscape": true }

它通过 Chrome 自带的打印流程进行渲染,并将文件保存到任务的 results/ 目录,返回路径和大小。PDF 文件本身不会被返回——PDF 有数 MB,而模型无法读取 base64 内容。

每轮降低开销 — --tools

每个已连接的 MCP 服务都会在你向它提出任何请求前占用上下文:宿主每一轮都会向模型发送完整的工具目录。MCP Browser Extension 的 43 个工具包含 28 KB 的 JSON Schema,每轮约占 7.1k 个 token。

大多数运行只需要其中少数几个。--tools 只会公布指定工具:

npx -y mcp-browser-extension@latest \
  --allow-domain app.example.com --enable-mutations \
  --tools tabs_list,tab_new,navigate,snapshot,click,type,get_text

这样工具列表只有 6.0 KB,约 1.5k 个 token——比完整目录减少 78%;适用于本来就不需要打印 PDF 或上传文件的运行。

  • 以逗号分隔,并可重复使用:--tools navigate,get_text --tools click。
  • 未包含的工具会从 tools/list 中隐藏,调用时也会被拒绝——batch 操作如果指定了此类工具,会像指定未知工具一样失败。隐藏工具是一种真正的限制,而非显示筛选。不过,这不能替代策略门控:没有 --unsafe-enable-eval,--tools eval 仍不会执行任何操作。
  • 未知名称会在启动时导致失败并打印工具目录,因此拼写错误绝不会悄悄地将 click 从工具列表中移除。
  • mcp-browser-extension --help 会打印完整的 43 个工具名称目录供选择。

状态

v0.5.0 — 安全的多标签页并发。 新增 batch 扇出工具,使并行标签页自动化不再发生竞态(显式 tabId 守卫;按标签页串行化 chrome.debugger 操作;无冲突的 tab_new),通过 chrome.debugger 截取屏幕截图(针对指定标签页且不会抢占焦点,还支持真正的整页和元素截图),并默认聚焦新打开的标签页。包含 111 项自动化测试,以及一项受控的有头扩展冒烟测试。

v0.2.0 — 六个构建阶段全部完成且通过。端到端流程已可运行: npx mcp-browser-extension ⇄ 桥接 ⇄ 扩展 ⇄ 你实际使用的 Chrome,并带有 Playwright CDP 回退方案。v0.2 新增无障碍 snapshot 和元素引用、自动等待、Cookie/存储/select_option、可信输入(chrome.debugger)、工具栏状态徽章,以及稳定的配对令牌(--persist-token)。

  • 阶段 0 — 契约与骨架: shared/protocol.ts(通信契约), src/executor/types.ts(Executor 接口),src/security/policy.ts (默认拒绝策略 + 能力门控),src/config.ts(CLI/环境变量/策略 解析),构建与测试框架。
  • 阶段 1 — MCP 服务 + StubExecutor: mcp/server.ts(标准输出干净的 stdio),mcp/tools.ts(28 项工具目录 + 永不抛出错误的分发 + 偏差检查),验证器/封装对象/辅助函数,ExecutorManager + StubExecutor,cli.ts。现在即可将 MCP 主机指向 node dist/src/cli.js。
  • 阶段 2 — WebSocket 桥接 + 身份验证: bridge/server.ts(回环 WS、 hello 令牌门控、welcome/unauthorized、连接置换),bridge/auth.ts (每次启动生成 256 位令牌、原子式 0600 握手、SHA-256 timingSafeEqual), bridge/connection.ts(ID 关联、按方法区分超时、背压、关闭时拒绝所有请求、 心跳)。
  • 阶段 3 — ExtensionExecutor + CdpExecutor + 选择: executor/extension-executor.ts(通过桥接实现 Executor), executor/cdp-executor.ts(Playwright 连接/启动 + 锁恢复 + 标签页解析),executor/select.ts(扩展 ping 有响应时使用扩展,否则 使用 CDP)。CLI 现在会启动桥接、写入 0600 握手信息,并提供真实后端。新增 playwright。
  • 阶段 4 — MV3 扩展: extension/ — manifest.json、 sw/ws-client.ts(拨号 + hello/welcome + pong)、sw/executor.ts (chrome.scripting/chrome.tabs 命令实现)、sw/router.ts(永不抛出错误 + 偏差检查)、sw/background.ts(顶层监听器 + 25 秒保活/重新连接), 选项页面(手动配对),esbuild 构建 → extension-dist/。已通过实时 --load-extension 冒烟测试验证(配对 → 导航 → get_text)。新增 esbuild + @types/chrome。
  • 阶段 5 — 辅助工具、下载、HITL: 强化 download_file (shared/download.ts — 路径遍历/危险扩展名净化 + 大小上限, 接入两个后端)、增强版 read_as_markdown,以及人在回路中的 测试框架(hitl/ — npm run test:hitl [-- --include-mutating]), 使用纯函数和经过单元测试的门控。包含 50 项自动化测试。
  • 阶段 6 — 打包与文档: files 白名单(仅打包 dist/src、 dist/shared、extension-dist、LICENSE、蓝图,不包含源代码/测试), prepack 构建、bin、快速入门 + .mcp.json 片段。已通过 tarball 安装 冒烟测试验证(npm pack → 安装 → MCP tools/list)。

安全态势(默认)

默认拒绝的安全模式。 未配置策略时:允许列表为空,禁用 eval、下载和修改类工具。需明确选择启用:

mcp-browser-extension --allow-domain example.com --enable-mutations
mcp-browser-extension --policy ./policy.json          # see policy.example.json
mcp-browser-extension --enable-observers              # console/network/dialog capture (patches page globals)
mcp-browser-extension --redact                        # scrub secret-shaped strings out of page reads

无需重启即可允许网站。 如果因网站不在允许列表中而拒绝调用,扩展程序的工具栏图标会显示 ?。点击图标:弹出窗口会列出被拦截的网站,并显示一个 Allow 按钮;还会显示你当前所在的网站是否已获允许(并提供单独的 Allow 按钮),以及已允许的网站列表。选项页面(弹出窗口中的 Settings)也有一个输入框,可用于允许其他网站。允许某个网站后,所有共用此 Chrome 的会话会立即生效;该设置会保存到 ~/.mcp-browser-extension/allowed-sites.json,因此重启后仍然有效。可在此处移除通过该方式允许的网站;通过 --allow-domain 允许的网站会一直保留,直到更改标志。全匹配模式不会授予访问权限。启动前,请从旧配置中移除已弃用的 --unsafe-all-domains 选项。Agent 无法自行批准网站:MCP Browser Extension 从不读取或驱动扩展程序自身的页面。使用 --no-site-grants 运行,可确保允许列表严格遵循标志指定的内容。

返回的内容同样受到限制。 允许列表决定哪些页面可以读取,但不限制页面上的内容。已登录的页面经常会将会话令牌渲染到脚本标签中,或将 API 密钥显示在设置页面上。

  • 默认隐藏 Cookie 值。 get_cookies 会返回每个 Cookie 的名称、域名、路径和标志,并将值替换为 [hidden]。会话 Cookie 无需密码即可授予账户访问权限。 如果任务确实需要 Cookie 值,请传入 --enable-cookie-values。
  • 始终屏蔽密码字段的值——在 get_html 中会屏蔽;在 snapshot 中字段仍会显示(因此你可以在其中输入),但会标记为 secret: true 且不含值。没有标志,也无需选择启用:没人想要那些字符。
  • --redact 还会从 get_text、get_html、read_as_markdown 和 eval 的结果中清除类似机密的字符串——JWT、AWS/GitHub/Slack/Google 密钥、Bearer 标头、私钥块。此功能需要主动启用,因为某个模式迟早会匹配到你实际需要的内容。--redact-pattern <regex> 可添加自定义模式(并隐含启用 --redact);如果模式无效,启动时会报错,而不会悄悄导致匹配失效。
  • 截断输出之前会先执行脱敏,因此,截断读取不会泄露完整读取本应隐藏的内容。

每次调用都会记录到任务的 history.jsonl 中,包括访问的 URL、策略判定结果(allowed/denied)、耗时、返回的字节数以及清除的机密数量。这样,事后也能回答“Agent 在我的浏览器中做了什么”。

每次启动时生成的 256 位令牌存储在 ~/.mcp-browser-extension/handshake.json 中(模式为 0600),它是唯一的信任边界;令牌绝不会写入 stdout/stderr。在 POSIX 系统上,每次写入后都会重新验证权限;如果文件最终允许组用户或其他用户访问,服务会默认拒绝运行。Windows 没有这类权限位——在那里,chmod 只会切换只读属性——因此会跳过检查,令牌的机密性依赖于 %USERPROFILE%\.mcp-browser-extension 的每用户 ACL。

更新

无需进行任何操作即可保持最新。上文的安装片段使用 @latest;此外,已安装的副本(通过 npx 或全局安装)启动时会检查 npm:如果发布了更新版本,就会使用相同参数启动该版本,以替换当前版本。因此,几个月前编写的 MCP 配置仍会运行最新版本。离线时,检查会在 1.5 s 后放弃;从 git 检出目录运行的副本不会自行更新。新服务还会刷新 ~/mcp-browser-extension 中解压的扩展程序,并让其自行重新加载;Chrome Web Store 版本则照常通过 Chrome 更新。使用 --no-auto-update 或 MCP_BROWSER_EXTENSION_AUTO_UPDATE=0 可关闭此功能。

遥测

MCP Browser Extension 服务(而非扩展程序)会向 PostHog 发送匿名使用统计信息,以便项目了解有多少安装处于活跃状态、正在使用哪些版本和平台,以及哪些工具最常出错。它首次运行时会显示一条通知。

发送的内容:随机安装 ID(保存在 ~/.mcp-browser-extension/telemetry.json 中)、服务版本、操作系统、CPU 架构和 Node 主版本、当前会话是独占桥接端口还是与其他会话共享、有多少浏览器已配对、已配对扩展程序的版本及其是商店版本还是未打包副本,以及每个工具的调用和错误计数及错误代码。首次批次会在首次工具调用一分钟后发送,之后每 10 分钟发送一次。对于 PostHog 的 MCP Analytics 视图,每次工具调用也会作为一个 $mcp_tool_call 事件发送,仅包含工具名称及其分组(读取、导航……)、调用时长、是否失败及错误代码、MCP 客户端的名称和版本(例如 claude-code)、MCP 协议修订版本、客户端在其请求元数据中提供的 AI 模型(Codex 会提供),以及一个在闲置 30 分钟后更换的随机会话 ID。客户端连接时,会记录一个事件,包含该握手信息和所提供工具的名称。不会发送 Agent 发送或读取的任何内容:没有参数、结果、错误消息或意图。每 15 秒批量发送一次。启动一分钟后会发送一个 pair_check 事件,说明是否有浏览器完成配对;如果没有,则记录适用的几种固定原因之一(no_extension、token_mismatch、version_mismatch、profile_mismatch),以便在问题发生处解决设置问题。

绝不会发送的内容:URL、域名、工具参数、页面内容、屏幕截图、Cookie、配置文件名称、令牌、文件路径或你输入的任何内容。事件不包含个人信息,并且已禁用 GeoIP 查询。

浏览器扩展程序不会发送任何内容——它只会与 127.0.0.1 通信。

可通过以下任一方式关闭:

MCP_BROWSER_EXTENSION_TELEMETRY=0     # or false / off
DO_NOT_TRACK=1
--no-telemetry             # server flag

了解更多

完整文档、各 MCP 客户端的设置指南和安全模型均可在网站上查阅:MCP Browser Extension 文档。

开发

npm install
npm run typecheck       # server/test sources
npm run typecheck:ext   # extension sources (@types/chrome)
npm run build:ext       # bundle the extension → extension-dist/
npm test                # builds, then runs node --test on dist/test
RUN_EXT_SMOKE=1 node --test dist/test/extension-smoke.test.js   # live, headed

扩展

已在 Chrome 网上应用店发布,名称为 MCP 浏览器扩展。 只有在 extension/ 发生更改时,扩展版本才会更新,因此所列构建版本可能比 npm 包落后一版;两者会在连接时协商功能,因此较旧的扩展只会缺少功能,不会导致故障。

正常使用时,请从上方的 Chrome 网上应用店安装。以下内容仅适用于本地开发;请勿在与网上应用店扩展相同的 Chrome 配置文件中加载此未打包副本。在 Windows 上,Chrome 可能会停用非网上应用店版本。

extension/ 会通过 esbuild 构建到 extension-dist/,然后在 chrome://extensions 中选择 加载已解压的扩展程序 → 选择 ~/mcp-browser-extension 加载;这是服务在每次启动时从 extension-dist/ 刷新的镜像(也可以直接加载 extension-dist/)。扩展会从服务写入该文件夹的 pairing.json 中读取配对信息;只有在备用情况下,才需要在 选项 页面粘贴 ~/.mcp-browser-extension/handshake.json 中的 port 和 token(运行 npx -y mcp-browser-extension@latest --print-pairing 即可获取路径)。

读取和交互使用 chrome.scripting/chrome.tabs —— 不会显示“正在调试”横幅,支持符合 CSP 的读取(隔离世界),可在 Playwright 下测试。 仅在必要且值得使用时才会使用 chrome.debugger:用于 trusted: true 输入(在 React/Vue 输入框中触发真实的操作系统级事件)和 screenshot(截取指定标签页,无需激活该标签页——可在并行 batch 中安全使用,并支持真正的整页和元素截图)。这些操作在调试器连接期间会显示调试横幅;最后一次操作结束后,会话会保留 1.5 秒,因此一连串操作只需连接一次。截图默认采用 JPEG 格式(质量 70),尺寸为 CSS 像素;传入 format: "png"、quality 或 scale 可更改设置。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。