A community-driven registry for Claude, Cursor, Windsurf, Cline & more. Not affiliated with Anthropic.
Are you the author? Sign in to claim
MCP server that bridges clients to a real browser through CDP and a companion extension.
CDP Bridge MCP 是一个连接 MCP 客户端与真实浏览器会话的桥接服务,通过配套的 Chromium 插件接入浏览器页面,让任何大模型客户端都可以丝滑、轻易地读取标签页、扫描页面、执行自动化操作、截图和导航。
中文 | English
CDP Bridge MCP 适合需要让大模型操作真实浏览器的场景。和无状态 HTTP 抓取不同,它连接的是你已经登录、已经打开的浏览器页面,因此可以复用真实浏览器里的登录态、Cookie、页面状态和前端渲染结果。
CDP Bridge MCP 还支持在单台电脑多Profile操作,也支持多用户操作。
代码仓库:https://github.com/Unagi-cq/cdp-bridge-mcp
本项目使用 Python 编写并发布。MCP 支持
stdio和streamable-http两种传输模式。
为什么用 CDP Bridge MCP,而不是 Playwright MCP、Kimi Bridge 或 Chrome DevTools MCP?
Playwright MCP 和 Chrome DevTools MCP 都很强,但它们更偏向“自动化测试 / 调试协议 / 新开浏览器实例”的工作流。Kimi Bridge 的功能权限有限,倾向于通过截图发给视觉模型来完成任务。
CDP Bridge MCP 的目标不同:它更关注让 LLM 或 Agent 产品接管用户正在使用的真实浏览器会话。
browser_scan 会对页面 HTML 做简化,过滤脚本、样式和不可见元素,尽量保留对模型有用的正文、控件和结构信息,减少 token 浪费。uvx cdp-bridge 启动,浏览器端加载扩展即可连接,不需要编写 Playwright 脚本,也不需要为每个浏览器实例单独配置调试参数。streamable-http 模式,cdp-bridge 可以作为一个常驻服务部署在远端服务器上。Agent 后端通过 MCP HTTP 端点连接服务,用户浏览器里的扩展通过 WebSocket 连接同一个服务。这样产品侧不需要托管用户的浏览器,也不需要把账号态搬到云端;用户只要安装扩展并配置 Bridge Host、Port 和 Token,Agent 就能在用户授权的真实浏览器会话里完成读取、分析和自动化操作。streamable-http 服务,只要各自使用不同 token,就能并行工作且互不干扰。适合客服坐席、运营团队、数据采集节点或远程协作场景。stdio + 127.0.0.1:18765 快速接入本机浏览器;团队或产品开发者可以用 streamable-http + 远端域名 + WebSocket + token 搭建浏览器控制通道,把真实浏览器能力集成进自己的 Agent 产品、客服工作台、数据采集后台或内部自动化系统。因此,如果你的目标是“让模型控制一个专门启动的自动化浏览器”,Playwright MCP 很合适;如果你的目标是“调试 Chrome 或精细操作 DevTools 协议”,Chrome DevTools MCP 很合适;如果你的目标是“让模型或 Agent 产品读取和操作用户当前正在使用的真实浏览器页面”,CDP Bridge MCP 更贴近这个场景。
graph TB
subgraph Client["🖥️ MCP 客户端 / Agent"]
ClientA["客户端 A<br/>Bearer token_a"]
ClientB["客户端 B<br/>Bearer token_b"]
end
subgraph Server["⚙️ cdp-bridge MCP 服务 (Python)"]
FastMCP["FastMCP<br/>stdio / streamable-http"]
Middleware["Token Middleware<br/>Authorization Bearer"]
TokenManager["TokenManager<br/>按 token 隔离用户上下文"]
TMWD["TMWebDriver<br/>会话管理器"]
WS["Extension WebSocket<br/>默认 127.0.0.1:18765"]
HTTP["Extension HTTP Fallback<br/>默认 127.0.0.1:18766"]
FastMCP --- Middleware
Middleware --- TokenManager
TokenManager --- TMWD
TMWD --- WS
TMWD --- HTTP
end
subgraph DeviceA["💻 同一台电脑(多个 Browser Profile)"]
ProfileA1["Profile A1<br/>账号 A / token_a"]
ProfileA2["Profile A2<br/>账号 B / token_b"]
end
subgraph DeviceB["🧑💻 另一台电脑(另一位用户)"]
ProfileB1["Profile B1<br/>账号 C / token_c"]
end
subgraph BrowserRuntime["🌐 浏览器扩展与页面"]
BG["background.js<br/>Service Worker"]
CT["content.js<br/>Content Script"]
Tabs["浏览器标签页<br/>真实登录态 / 多账号页面"]
end
ClientA <-->|"MCP 协议\nstreamable-http / stdio"| FastMCP
ClientB <-->|"MCP 协议\nstreamable-http"| FastMCP
ProfileA1 <-->|"扩展连接\ntoken_a"| WS
ProfileA2 <-->|"扩展连接\ntoken_b"| WS
ProfileB1 <-->|"扩展连接\ntoken_c"| WS
WS <-->|"WebSocket (ext_ws)"| BG
HTTP <-->|"HTTP 长轮询"| BG
BG <-->|"chrome.scripting<br/>CDP Runtime.evaluate"| Tabs
BG <-->|"chrome.runtime.sendMessage"| CT
CT -->|"DOM 访问"| Tabs
数据流简述:
cdp-bridge 服务;在 streamable-http 模式下,客户端可通过 Authorization: Bearer <token> 指定自己的用户上下文。Token Middleware 负责提取 token,TokenManager 负责按 token 隔离会话;同一个 token 下的 MCP 请求和浏览器扩展连接会被路由到同一个上下文。ext_ws 模式);服务端据此把不同 profile、不同账号、不同用户的真实浏览器页面隔离开来。browser_execute_js),服务端只会把 JS 代码发送到当前 token 对应的浏览器会话;扩展的 background.js 优先使用 chrome.scripting.executeScript 在页面 MAIN world 执行,若页面有 CSP 限制则自动降级为 CDP Runtime.evaluate。MCP 服务当前暴露以下 9 个工具:
| 工具名 | 参数 | 说明 |
|---|---|---|
browser_get_tabs | 无 | 获取所有已连接的浏览器标签页,返回标签页 ID、URL 和标题列表,以及当前活动标签页 |
browser_scan | tabs_only (bool), switch_tab_id (str), text_only (bool) | 扫描活动标签页内容。tabs_only 仅返回标签页列表节省 token;text_only 返回纯文本而非简化 HTML;switch_tab_id 在扫描前先切换到指定标签页 |
browser_execute_js | script (str, 必填), switch_tab_id (str), no_monitor (bool) | 在浏览器中执行 JavaScript 并捕获返回值及 DOM 变更 diff。no_monitor 跳过 DOM 监控可提速;switch_tab_id 先切换到目标标签页再执行 |
browser_switch_tab | tab_id (str, 必填) | 切换 MCP 侧的活动标签页(不改变用户在 Chrome 中看到的标签页),后续工具调用将作用于该标签页 |
browser_focus_tab | tab_id (str, 必填) | 将 Chrome 标签页置于前台并聚焦窗口,使标签页对用户可见。区别于 browser_switch_tab(仅切换 MCP 侧会话),此工具会实际激活 Chrome 窗口和标签页 |
browser_batch | commands (list[dict], 必填), tab_id (str), timeout (float) | 一次请求批量执行多个扩展/CDP 命令,适合需要复用 CDP 上下文的复杂操作链 |
browser_wait | condition_js (str, 必填), timeout (float), interval (float), switch_tab_id (str) | 轮询等待 JavaScript 条件表达式返回真值。timeout 最长等待秒数(默认 10);interval 检查间隔秒数(默认 0.5) |
browser_navigate | url (str, 必填) | 导航活动标签页到指定 URL |
browser_screenshot | tab_id (str) | 对活动标签页截图,返回 base64 编码的 PNG 图片数据 |
下面是默认配置下最快的使用流程:
uv。chrome://extensions/,开启“开发者模式”。src/cdp_bridge/tmwd_cdp_bridge 文件夹。cdp-bridge。在任意客户端配置MCP:
{
"mcpServers": {
"cdp-bridge": {
"command": "uvx",
"args": ["cdp-bridge@latest"]
}
}
}
配置完成后,在浏览器里打开任意页面,然后在大模型客户端让模型执行网页操作即可。扩展会自动连接 MCP 进程启动的 WebSocket 服务;如果首次看到 ERR_CONNECTION_REFUSED,等待几秒自动重连即可。
src/cdp_bridge/tmwd_cdp_bridge 文件夹加载到 Chrome 或其他 Chromium 浏览器。然后就可以正常使用了。下面详细介绍上述安装步骤。
首次使用:加载扩展后首次连接 WebSocket 会产生
ERR_CONNECTION_REFUSED报错,这是正常的。扩展内置自动重连机制(每 ~5 秒探测一次),当检测到后端服务启动后会自动恢复连接,无需手动重启扩展。
browser_get_tabs),MCP 服务启动后 WebSocket 服务会自动就绪在 Chrome 或其他 Chromium 浏览器中加载:
chrome://extensions/。src/cdp_bridge/tmwd_cdp_bridge 文件夹。默认情况下,扩展会连接本地 WebSocket 服务 127.0.0.1:18765。
扩展弹窗里可以修改连接配置:
Bridge Host:可填写 127.0.0.1、localhost 或域名。填写域名时可以不填端口,例如 bridge.example.com。Port:WebSocket 端口。使用本地默认配置时是 18765;如果 MCP 启动时使用了 --ws-port,这里需要填同一个端口。域名接入并且服务走默认 WebSocket 端口时,可以留空。Token:streamable-http 多用户模式下用于把浏览器扩展和 MCP 客户端绑定到同一个用户上下文。留空时扩展会自动写入默认值 __default__。如果你使用 Bearer token 访问远端 MCP 服务,这里必须填写和客户端完全一致的 token。先确认电脑上已安装 uv。CDP Bridge MCP 通过 uvx cdp-bridge@latest 启动。
CDP Bridge 支持两种 MCP 传输模式,可根据使用场景选择:
| 模式 | 原理 | 适用场景 |
|---|---|---|
stdio(默认) | MCP 客户端以子进程启动服务,通过标准输入/输出通信 | Claude Desktop、Claude Code、Codex 等本地客户端 |
streamable-http | 服务以独立 HTTP 进程运行,客户端通过 HTTP 请求连接 | 多客户端共享、Docker 部署、服务常驻 |
| 参数 | 默认值 | 适用模式 | 说明 |
|---|---|---|---|
--transport | stdio | 两种模式 | MCP 传输模式。可选 stdio 或 streamable-http。 |
--ws-port | 18765 | 两种模式 | 浏览器扩展连接的 WebSocket 端口。无论使用 stdio 还是 streamable-http,都可以配置。 |
--port | 8000 | 仅 streamable-http | MCP HTTP 服务端口。只在 --transport streamable-http 时使用,客户端连接地址是 http://127.0.0.1:<port>/mcp。 |
--tokens | 空 | 仅 streamable-http | 允许接入的 token 白名单,多个 token 用英文逗号分隔;为空时接受任意 token。 |
| --host | 127.0.0.1 | 仅 streamable-http | 默认streamable-http启动时监听的是127.0.0.1,无法进行远程访问。通过增加该参数,可指定监听的ip,可配置为0.0.0.0监听所有网卡的ip。 |
注意:--ws-port 是浏览器扩展连接后端的端口;--port 是 MCP 客户端连接后端的 HTTP 端口。两者不是同一个端口。
# stdio 模式(默认)
uvx cdp-bridge@latest
# stdio 模式,指定 WebSocket 端口
uvx cdp-bridge@latest --ws-port 18767
# streamable-http 模式,指定 MCP HTTP 端口
uvx cdp-bridge@latest --transport streamable-http --port 8000
# streamable-http 模式,同时指定 MCP HTTP 端口和浏览器扩展 WebSocket 端口
uvx cdp-bridge@latest --transport streamable-http --port 8000 --ws-port 18767
# streamable-http 模式,只允许指定 token 接入
uvx cdp-bridge@latest --transport streamable-http --port 8000 --tokens "team_alice,team_bob"
# streamable-http 模式,同时指定 MCP HTTP 端口和监听的ip,远程机器可通过172.25.240.1:8000访问运行的MCP Server
uvx cdp-bridge@latest --transport streamable-http --host 172.25.240.1 --port 8000
# 也可以通过环境变量传入 token 白名单
CDP_BRIDGE_TOKENS="team_alice,team_bob" uvx cdp-bridge@latest --transport streamable-http --port 8000
不传 --transport 时默认使用 stdio。stdio 模式没有 MCP HTTP 端口;streamable-http 模式的 MCP 服务地址为 http://127.0.0.1:<port>/mcp。
streamable-http 模式下,服务端会按 token 隔离浏览器会话空间。
Authorization: Bearer <token>Token 字段传同一个 token__default__--tokens,任何 token 都可以接入;配置了 --tokens 后,只允许白名单中的 tokenstreamable-http 服务,并通过不同 token 实现隔离stdio 模式:
{
"mcpServers": {
"cdp-bridge": {
"command": "uvx",
"args": ["cdp-bridge@latest"]
}
}
}
如果需要修改浏览器扩展连接的 WebSocket 端口,把 --ws-port 加到 args 里:
{
"mcpServers": {
"cdp-bridge": {
"command": "uvx",
"args": ["cdp-bridge@latest", "--ws-port", "18767"]
}
}
}
streamable-http 模式:
先启动服务:
uvx cdp-bridge@latest --transport streamable-http --port 8000
如果同时要修改浏览器扩展连接的 WebSocket 端口:
uvx cdp-bridge@latest --transport streamable-http --port 8000 --ws-port 18767
再配置客户端连接:
{
"mcpServers": {
"cdp-bridge": {
"type": "streamableHttp",
"url": "http://127.0.0.1:8000/mcp"
}
}
}
如果你启用了多用户隔离,客户端应显式携带 Bearer token:
{
"mcpServers": {
"cdp-bridge": {
"type": "streamableHttp",
"url": "http://127.0.0.1:8000/mcp",
"headers": {
"Authorization": "Bearer team_alice"
}
}
}
}
此时浏览器扩展弹窗中的 Token 也要填写成 team_alice。
# stdio 模式
claude mcp add cdp-bridge uvx cdp-bridge@latest
# streamable-http 模式(先启动服务,再注册)
claude mcp add cdp-bridge --transport streamable-http http://127.0.0.1:8000/mcp
# stdio 模式
codex mcp add cdp-bridge uvx cdp-bridge@latest
# streamable-http 模式
codex mcp add cdp-bridge --transport streamable-http --url http://127.0.0.1:8000/mcp
在 ~/.config/opencode/opencode.json 里配置:
stdio 模式:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cdp-bridge": {
"type": "local",
"command": [
"uvx",
"cdp-bridge@latest"
],
"enabled": true
}
}
}
streamable-http 模式:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cdp-bridge": {
"type": "remote",
"url": "http://127.0.0.1:8000/mcp",
"enabled": true
}
}
}
可以使用 OpenClaw CLI 写入 MCP 配置:
# stdio 模式
openclaw mcp set cdp-bridge '{"command":"uvx","args":["cdp-bridge@latest"]}'
# streamable-http 模式
openclaw mcp set cdp-bridge '{"transport":"streamable-http","url":"http://remoteip:8000/mcp"}'
等价的 stdio 配置结构:
{
"mcp": {
"servers": {
"cdp-bridge": {
"command": "uvx",
"args": ["cdp-bridge@latest"]
}
}
}
}
本项目的浏览器插件和部分代码参考并来源于 GenericAgent。感谢原项目作者的开源工作。
mcp-language-server gives MCP enabled clients access semantic tools like get definition, references, rename, and diagnos
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots