ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

三大平台装好 Chrome MCP 本地主机只需几步:mcp-chrome-bridge 安装与注册避坑实战指南

三大平台装好 Chrome MCP 本地主机只需几步:mcp-chrome-bridge 安装与注册避坑实战指南

三大平台装好 Chrome MCP 本地主机只需几步:mcp-chrome-bridge 安装与注册避坑实战指南

【免费下载链接】mcp-chromeChrome MCP Server is a Chrome extension-based Model Context Protocol (MCP) server that exposes your Chrome browser functionality to AI assistants like Claude, enabling complex browser automation, content analysis, and semantic search.项目地址: https://gitcode.com/gh_mirrors/mc/mcp-chrome

在扩展里点了 Connect,却弹出一句Native host has exited;或者 Chrome 压根找不到com.chromemcp.nativehost这个清单文件——这两个报错,基本都指向同一件事:Chrome MCP Server 的本地 Native Messaging 主机没装好、没注册成功。

Chrome 扩展跑在浏览器沙箱里,碰不到本地文件和 Node.js 进程。为了让 AI 助手(比如 Claude)借助 Chrome MCP Server 获得浏览器自动化、内容分析、语义搜索能力,扩展必须通过 Native Messaging 协议以stdio方式拉起一个本地进程来通信。这个进程就是mcp-chrome-bridge:一条 npm 包形式的本地主机,装在机器上,再把"清单 + 启动脚本"注册给浏览器,扩展端的chrome.runtime.connectNative就能接通它。

好消息是:注册这件事,90% 的情况下一条命令就能自动完成。下面我们把"装 → 注册 → 验证 → 排错"这条链路拆成可跳读的几节,按你的问题直接定位。

30 秒速览:它是什么,装完得到什么

这一节帮你建立心智模型,先知道装完之后系统里多了哪些东西。

问题答案
它是什么mcp-chrome-bridge:Chrome MCP Server 的本地 Native Messaging 主机(Node.js 实现),负责在扩展和本机服务之间做 stdio 双向通信
装完得到什么全局可用的三个命令:mcp-chrome-bridge(注册/诊断管理入口)、chrome-mcp-bridge(同入口别名)、mcp-chrome-stdio(MCP stdio 服务端)
关键产物 1:清单文件com.chromemcp.nativehost.json,告诉浏览器"去哪里、用什么命令拉起主机"
关键产物 2:启动脚本run_host.sh(macOS/Linux)或run_host.bat(Windows),负责锁定 Node 版本并启动index.js
关键产物 3:注册表项(仅 Windows)HKCU\Software\Google\Chrome\NativeMessagingHosts\com.chromemcp.nativehost等键,指向清单文件
运行前提Node.js >= 20.0.0;依赖中含better-sqlite3原生模块,对 Node ABI 敏感,这正是"锁 Node 版本"存在的原因

一条命令上手:安装并自动完成用户级注册

这一节给你最小可运行路径,装完即可用doctor验证。

先确认环境:

node -v && npm -v

Node 版本必须 >= 20,否则后面doctor会直接报 ERROR。

然后全局安装:

npm install -g mcp-chrome-bridge

这一条命令背后,postinstall钩子(src/scripts/postinstall.ts)会替你做完四件事:

  1. 修复执行权限:给index.js、run_host.sh(Windows 为run_host.bat)、cli.js设置 755 权限(Windows 下改为移除只读属性并验证可读性);
  2. 写入 Node 路径:把当前process.execPath写进node_path.txt,供启动脚本锁定 Node 版本;
  3. 检测安装方式:区分 npm 全局、pnpm 全局(PNPM_HOME、~/.local/share/pnpm/global/等特征)与局部安装。局部安装不会自动注册,只会打印npx mcp-chrome-bridge register的手动指引;
  4. 尝试用户级注册:成功则收工;失败则提示你改跑mcp-chrome-bridge register --system。

一个容易踩的坑:如果你用sudo安装,脚本检测到 UID 0 后会故意跳过自动注册——否则清单会写进 root 的主目录,你的普通账户根本用不上。它会提示你装完后以普通用户身份执行:

mcp-chrome-bridge register

装完立刻跑一次体检(下一节详述):

mcp-chrome-bridge doctor

三种注册场景:用户级、系统级、多浏览器

这一节回答"我到底该用哪种注册方式",以及 Chrome 之外的 Chromium 怎么办。

场景一:用户级注册(默认,推荐)

无需管理员权限,写入当前用户目录下的清单文件:

平台Chrome 清单位置
Windows%APPDATA%\Google\Chrome\NativeMessagingHosts\com.chromemcp.nativehost.json
macOS~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.chromemcp.nativehost.json
Linux~/.config/google-chrome/NativeMessagingHosts/com.chromemcp.nativehost.json

自动注册失败时手动补一次:

mcp-chrome-bridge register

Windows 上还会额外创建用户级注册表项:HKCU\Software\Google\Chrome\NativeMessagingHosts\com.chromemcp.nativehost,默认值指向清单路径,并回读校验一致性(实现见 src/scripts/utils.ts)。

场景二:系统级注册(权限不足时的两条路)

需要管理员/root 权限,写入系统目录,对所有用户生效:

平台Chrome 系统级清单位置
Windows%ProgramFiles%\Google\Chrome\NativeMessagingHosts\
macOS/Library/Google/Chrome/NativeMessagingHosts/
Linux/etc/opt/chrome/native-messaging-hosts/

两种等价玩法:

# 方式 A:显式 --system(推荐) sudo mcp-chrome-bridge register --system # macOS/Linux mcp-chrome-bridge register --system # Windows(管理员终端) # 方式 B:直接以提权身份跑 sudo mcp-chrome-bridge register # macOS/Linux mcp-chrome-bridge register # Windows(管理员终端)

注意一个 CLI 细节(src/cli.ts):它会自动检测当前是否已提权(Unix 看 UID 0,Windows 用is-admin)。只要已提权,即使不带--system也会走系统级分支——所以"管理员终端里直接 register"和"带--system"结果一样。用户级注册失败时,CLI 会明确打印上面两种补救命令。

场景三:多浏览器注册(Chrome + Chromium)

默认只针对 Chrome。注册命令支持--browser与--detect两个参数来显式控制目标(src/scripts/browser-config.ts):

mcp-chrome-bridge register --browser chromium # 只注册 Chromium mcp-chrome-bridge register --browser all # Chrome + Chromium 都注册 mcp-chrome-bridge register --detect # 自动探测已安装浏览器

探测逻辑:Windows 查注册表HKLM\SOFTWARE\Google\Chrome与HKLM\SOFTWARE\Chromium;macOS 检查/Applications/下是否有对应.app;Linux 用which google-chrome/google-chrome-stable/chromium/chromium-browser。一个都没探测到时,默认两者都注册。Chromium 在 Linux 的用户级/系统级位置分别是~/.config/chromium/NativeMessagingHosts/和/etc/chromium/native-messaging-hosts/,Windows 下对应HKCU/HKLM\Software\Chromium\NativeMessagingHosts\注册表键。

注册到底写了什么:manifest、run_host 与安全边界

这一节拆开注册的三个核心产物,看懂它们,绝大多数"注册了却不生效"的问题都能自行定位。

manifest.json:五个字段定生死

清单内容全部由 src/scripts/utils.ts 的createManifestContent()生成,字段与 src/scripts/constant.ts 的常量一一对应:

字段值作用
namecom.chromemcp.nativehostChrome 靠它定位清单
descriptionNode.js Host for Browser Bridge Extension主机描述
pathrun_host.sh(Windows 为run_host.bat)的绝对路径浏览器实际拉起的入口
typestdio固定为 stdio 通信
allowed_origins["chrome-extension://hbdgbgagpkpjffpklnamcljpakneikee/"]白名单:只有这个扩展 ID 能连上主机

清单 JSON 以 2 空格缩进写入(JSON.stringify(manifest, null, 2))。核对安装时,重点看这四个:name/type/path/allowed_origins,path必须真实存在且指向当前安装目录下的包装脚本。

run_host 包装脚本:为什么 path 不直接指向 index.js

清单path指向的不是 Node 脚本本身,而是 run_host.sh。原因很实际:better-sqlite3这类原生模块绑定 Node ABI 版本,如果 Chrome 拿系统 PATH 里"另一个版本"的 Node 来拉起主机,NODE_MODULE_VERSION不匹配直接崩。

所以 run_host 内置了一套多优先级 Node 发现算法(run_host.bat 在 Windows 上做同样逻辑):

优先级来源
0环境变量CHROME_MCP_NODE_PATH(显式覆盖,最高优先)
1node_path.txt(注册时写入的 Node 绝对路径)
1.5相对路径回退(dist 上溯三级bin/node)
2Volta($VOLTA_HOME/bin/node)
3asdf(installs/nodejs最新版本目录)
4fnm(node-versions最新版本目录)
5NVM(先alias/default,再最新版本)
6常见路径(/opt/homebrew/bin/node、/usr/local/bin/node、/usr/bin/node)
7command -v node
8遍历PATH

找到 Node 后,脚本把它所在 bin 目录注入PATH,然后exec "${NODE_EXEC}" "${NODE_SCRIPT}"启动index.js。所有探测过程都写进包装日志,并内置日志轮转(LOG_RETENTION_COUNT=5,只留最近 5 份)。

Node 版本锁定与 allowed_origins 安全边界

两个设计值得单独强调:

  • 版本锁定:register命令执行前会先调writeNodePathFile(),把安装时刻的 Node 绝对路径写进node_path.txt。这就是为什么升级 Node 管理工具后偶尔要重新register一次——它只是刷新这份锁定文件。
  • 安全边界:allowed_origins只放了扩展 IDhbdgbgagpkpjffpklnamcljpakneikee一个来源。本机其他任何扩展/网页都无法连这个主机,这是整条 stdio 通道的信任锚点。

一键体检:doctor 诊断项与 report 报告导出

这一节给你"出问题先跑什么"的标准动作:mcp-chrome-bridge doctor。

doctor 诊断项一览

doctor命令(实现见 src/scripts/doctor.ts)按 ID 输出逐项状态(OK / WARN / ERROR)与修复建议:

检查 ID检查什么
installation包名、版本、平台架构、Node 版本
host.filesrun_host.sh/bat、index.js、mcp/stdio-config.json三个关键文件是否存在
host.permissionsUnix 下run_host.sh是否可执行(Windows 标记 N/A)
node按 run_host 同一套搜索顺序预演会选中哪个 Node,并跑node -v校验主版本 >= 20
manifest.<browser>逐浏览器检查清单:存在、JSON 可解析、name/type/path/allowed_origins与预期一致,path指向当前安装的包装脚本
registry.<browser>Windows 下注册表项是否存在、值指向的清单文件是否真实存在
port.config/port.constantstdio-config.json的 URL 端口是否为12306,并与NATIVE_SERVER_PORT常量比对
connectivity向http://<host>:<port>/ping发 GET,验证本地服务是否在线(未启动时提示先点扩展里的 Connect 再重试)
logs日志目录是否已创建

常用参数:

  • --json:输出结构化报告,供脚本消费
  • --fix:先自动修复再体检(见下)
  • -b chrome|chromium|all:指定目标浏览器

因为doctor的 Node 解析逻辑与 run_host完全镜像,跑一次它就知道 Chrome 实际会选中哪个 Node、什么版本——比事后翻日志快得多。

--fix 自动修复的四个动作

mcp-chrome-bridge doctor --fix

按顺序尝试并逐项报告成功与否:

  1. 创建日志目录;
  2. 重写node_path.txt(锁定当前 Node);
  3. 修复index.js/run_host/cli.js执行权限;
  4. 重新执行用户级注册。

report:把现场打包给 issue

问题复现不了、需要报 issue 时,用report导出脱敏诊断报告(src/scripts/report.ts):

mcp-chrome-bridge report # Markdown 到 stdout(默认附带包装日志尾部 200 行) mcp-chrome-bridge report --json --output diag.json mcp-chrome-bridge report --include-logs full # 附带完整日志 mcp-chrome-bridge report --copy # 复制剪贴板

默认会对用户名、路径、token 做脱敏(--no-redact可关闭),提交前建议先跑这条命令。

排错速查:权限、路径、注册表、Node 版本对照清单

这一节把常见故障压成一张对照表,按报错特征对号入座。

症状大概率原因动作
Native host has exited/Permission denied(macOS/Linux)run_host.sh缺执行权限(pnpm 安装尤其常见,npm 一般会保留权限位)mcp-chrome-bridge fix-permissions,或doctor --fix;手动方案:chmod +x <包目录>/run_host.sh(npm list -g mcp-chrome-bridge定位路径)
用户级注册失败用户目录写入受限换系统级:sudo mcp-chrome-bridge register --system
Node.js executable not found(包装日志)run_host 十级搜索全部落空设环境变量CHROME_MCP_NODE_PATH指向 Node 绝对路径,或doctor --fix重写node_path.txt
NODE_MODULE_VERSION不匹配 / 原生模块崩溃Chrome 用了与安装时不同版本的 Node重新register(刷新node_path.txt),确保node -v>= 20
Node 版本低于 20engines.node要求 >= 20.0.0升级 Node 后重装:npm install -g mcp-chrome-bridge
Windows "Access denied" / 文件只读文件被标记只读mcp-chrome-bridge fix-permissions(会移除只读属性并验证可读性);或文件资源管理器里检查run_host.bat属性
Windows 扩展找不到主机注册表项缺失或指向已不存在的清单reg query "HKCU\Software\Google\Chrome\NativeMessagingHosts\com.chromemcp.nativehost" /ve核对值;重新mcp-chrome-bridge register
清单存在但字段不对手动改过、或装过多个版本核对name/type/path/allowed_origins,重新register --force
端口/连通性异常stdio-config.json端口不是 12306,或服务未启动mcp-chrome-bridge update-port 12306;在扩展里点 Connect 后重跑doctor

排查到这一步还没好,最后两个动作:

  • 看包装日志:每次 Chrome 拉起主机都会生成一份,含完整 Node 探测轨迹。
    • macOS:~/Library/Logs/mcp-chrome-bridge/native_host_wrapper_unix_<时间戳>.log
    • Linux:${XDG_STATE_HOME:-~/.local/state}/mcp-chrome-bridge/logs/
    • Windows:%LOCALAPPDATA%\mcp-chrome-bridge\logs\native_host_wrapper_windows_<时间戳>.log
  • 导报告报 issue:mcp-chrome-bridge report --include-logs tail,附上 OS、Node 版本与安装命令。

接下来还能做什么

装通之后,这条 stdio 通道只是起点:扩展点 Connect 之后,本地服务(端口12306)会把浏览器能力暴露给 MCP 客户端。建议顺着这三处源码继续往下看:

  • 本地主机与消息循环的实现:src/native-messaging-host.ts
  • MCP 服务端与工具注册:src/mcp/
  • 完整管理命令(register/doctor/report/update-port/fix-permissions)的选项细节:src/cli.ts,安装与注册手册见 app/native-server/install.md

跑通安装只是第一步,把浏览器的自动化能力真正接进你的 AI 工作流,才是这套组合的目标。

【免费下载链接】mcp-chromeChrome MCP Server is a Chrome extension-based Model Context Protocol (MCP) server that exposes your Chrome browser functionality to AI assistants like Claude, enabling complex browser automation, content analysis, and semantic search.项目地址: https://gitcode.com/gh_mirrors/mc/mcp-chrome

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进