Skip to main content

MCP server that bridges clients to a real browser through CDP and a companion extension.

Project description

CDP Bridge MCP Icon

CDP Bridge MCP

PyPI Python MCP GitHub

CDP Bridge MCP 是一个连接 MCP 客户端与真实浏览器会话的桥接服务。它通过配套的 Chromium 扩展接入浏览器页面,让大模型客户端可以读取标签页、扫描页面、执行 JavaScript、截图、导航和读取 Cookie。

中文 | English

演示视频

查询小红书平台 Anthropic 最新动态 读取 CSDN 网站作者后台数据分析
观看视频 观看视频

项目介绍

CDP Bridge MCP 适合需要让大模型操作真实浏览器的场景。和无状态 HTTP 抓取不同,它连接的是你已经登录、已经打开的浏览器页面,因此可以复用真实浏览器里的登录态、Cookie、页面状态和前端渲染结果。

代码仓库:https://github.com/Unagi-cq/cdp-bridge-mcp

本项目使用 Python 编写并发布。MCP 支持 stdiostreamable-http 两种传输模式。

项目优势

为什么用 CDP Bridge MCP,而不是 Playwright MCP、Kimi Bridge 或 Chrome DevTools MCP?

Playwright MCP 和 Chrome DevTools MCP 都很强,但它们更偏向“自动化测试 / 调试协议 / 新开浏览器实例”的工作流。Kimi Bridge 的功能权限有限,倾向于通过截图发给视觉模型来完成任务。

CDP Bridge MCP 的目标不同:它更关注让 LLM 或 Agent 产品接管用户正在使用的真实浏览器会话。

  • 复用真实登录态:CDP Bridge MCP 连接的是你已经打开、已经登录的浏览器标签页,可以直接使用现有 Cookie、登录状态、页面上下文和前端渲染结果。很多需要账号态的网站,不需要重新登录或额外搬运 Cookie。
  • 更适合日常浏览器协作:Playwright 更适合可重复、可脚本化的自动化流程,而 CDP Bridge MCP 更适合 LLM 在用户当前页面上做读取、分析、点击前判断、执行脚本、截图等交互式任务。
  • 页面内容更适合 LLM 消费browser_scan 会对页面 HTML 做简化,过滤脚本、样式和不可见元素,尽量保留对模型有用的正文、控件和结构信息,减少 token 浪费。
  • 启动链路轻量:服务端发布到 PyPI 后可直接 uvx cdp-bridge 启动,浏览器端加载扩展即可连接,不需要编写 Playwright 脚本,也不需要为每个浏览器实例单独配置调试参数。
  • 适合远端部署和 Agent 产品开发:如果使用 streamable-http 模式,cdp-bridge 可以作为一个常驻服务部署在远端服务器上。Agent 后端通过 MCP HTTP 端点连接服务,用户浏览器里的扩展通过 WebSocket 连接同一个服务。这样产品侧不需要托管用户的浏览器,也不需要把账号态搬到云端;用户只要安装扩展并配置 Bridge HostPort,Agent 就能在用户授权的真实浏览器会话里完成读取、分析和自动化操作。
  • 个人使用和团队产品都能覆盖:个人用户可以用默认 stdio + 127.0.0.1:18765 快速接入本机浏览器;团队或产品开发者可以用 streamable-http + 远端域名 + WebSocket 搭建浏览器控制通道,把真实浏览器能力集成进自己的 Agent 产品、客服工作台、数据采集后台或内部自动化系统。

典型部署形态如下:

Agent 产品 / MCP 客户端  --streamable-http-->  远端 cdp-bridge MCP 服务
用户浏览器扩展           --WebSocket------->  同一个 cdp-bridge MCP 服务
cdp-bridge              --chrome.scripting / CDP--> 用户真实浏览器标签页

因此,如果你的目标是“让模型控制一个专门启动的自动化浏览器”,Playwright MCP 很合适;如果你的目标是“调试 Chrome 或精细操作 DevTools 协议”,Chrome DevTools MCP 很合适;如果你的目标是“让模型或 Agent 产品读取和操作用户当前正在使用的真实浏览器页面”,CDP Bridge MCP 更贴近这个场景。

系统架构

CDP Bridge MCP 系统架构图

graph TB
    subgraph Client["🖥️ MCP 客户端"]
        LLM["LLM (Claude、Codex 等)"]
    end

    subgraph Server["⚙️ cdp-bridge MCP 服务 (Python)"]
        FastMCP["FastMCP<br/>stdio / streamable-http"]
        TMWD["TMWebDriver<br/>会话管理器"]
        WS["Extension WebSocket<br/>默认 127.0.0.1:18765"]
        HTTP["Extension HTTP Fallback<br/>默认 127.0.0.1:18766"]
        FastMCP --- TMWD
        TMWD --- WS
        TMWD --- HTTP
    end

    subgraph Browser["🌐 Chrome / Chromium 浏览器"]
        subgraph Extension["扩展 (tmwd_cdp_bridge)"]
            BG["background.js<br/>Service Worker"]
            CT["content.js<br/>Content Script"]
        end
        Tabs["浏览器标签页<br/>(用户真实会话)"]
    end

    LLM <-->|"MCP 协议 (stdio)"| FastMCP
    LLM <-->|"MCP 协议 (streamable-http)"| FastMCP
    WS <-->|"WebSocket (ext_ws)"| BG
    HTTP <-->|"HTTP 长轮询"| BG
    BG <-->|"chrome.scripting<br/>CDP Runtime.evaluate"| Tabs
    BG <-->|"chrome.runtime.sendMessage"| CT
    CT -->|"DOM 访问"| Tabs

数据流简述:

  1. MCP 客户端通过 stdio(子进程)或 streamable-http(HTTP 端点)连接 cdp-bridge 服务。
  2. TMWebDriver 启动供浏览器扩展连接的 WebSocket(默认 :18765)和内部 HTTP fallback(默认 :18766)。
  3. 浏览器扩展通过 WebSocket 连接服务端,上报所有已打开标签页(ext_ws 模式),服务端为每个标签页创建 Session。
  4. 当 MCP 工具被调用(如 browser_execute_js),服务端将 JS 代码通过 WebSocket 发送到扩展。
  5. 扩展的 background.js 优先使用 chrome.scripting.executeScript 在页面 MAIN world 执行;若页面有 CSP 限制,自动降级为 CDP Runtime.evaluate
  6. 执行结果通过 WebSocket 返回服务端,再由 MCP 协议返回给 LLM 客户端。

可用工具

MCP 服务当前暴露以下工具:

工具名 说明
browser_get_tabs 获取已连接标签页列表
browser_scan 扫描当前页面内容,可返回简化 HTML 或纯文本
browser_execute_js 在当前标签页执行 JavaScript
browser_switch_tab 切换 MCP 活动标签页,不改变用户当前可见的 Chrome 标签页
browser_batch 批量执行扩展/CDP 命令,适合需要复用 CDP 上下文的复杂操作
browser_wait 轮询 JavaScript 条件直到返回真值或超时
browser_navigate 跳转当前标签页到指定 URL
browser_screenshot 获取页面截图
browser_cookies 读取 Cookie

快速使用

下面是默认配置下最快的使用流程:MCP 使用 stdio,浏览器扩展连接本机 WebSocket 127.0.0.1:18765

  1. 安装 uv
  2. 在 Chrome 或其他 Chromium 浏览器中打开 chrome://extensions/,开启“开发者模式”。
  3. 点击“加载已解压的扩展程序”,选择 src/cdp_bridge/tmwd_cdp_bridge 文件夹。
  4. 在 MCP 客户端里添加 cdp-bridge

以 Codex 为例:

codex mcp add cdp-bridge uvx cdp-bridge@latest

以 Claude Code 为例:

claude mcp add cdp-bridge uvx cdp-bridge@latest

配置完成后,在浏览器里打开任意页面,然后在 MCP 客户端调用 browser_get_tabsbrowser_scan。扩展会自动连接 MCP 进程启动的 WebSocket 服务;如果首次看到 ERR_CONNECTION_REFUSED,等待几秒自动重连即可。

如何使用

安装步骤

  1. 将项目中提供的浏览器插件 src/cdp_bridge/tmwd_cdp_bridge 文件夹加载到 Chrome 或其他 Chromium 浏览器。
  2. 在 MCP 客户端配置 CDP Bridge MCP。

然后就可以正常使用了。下面详细介绍上述安装步骤。

首次使用:加载扩展后首次连接 WebSocket 会产生 ERR_CONNECTION_REFUSED 报错,这是正常的。扩展内置自动重连机制(每 ~5 秒探测一次),当检测到后端服务启动后会自动恢复连接,无需手动重启扩展。

使用流程

  1. 加载浏览器扩展(参考下方步骤)
  2. 配置 MCP 客户端(参考下方步骤)
  3. 使用任意浏览器工具(如 browser_get_tabs),MCP 服务启动后 WebSocket 服务会自动就绪
  4. 浏览器扩展会在数秒内自动连接,之后即可正常使用所有工具

加载浏览器

在 Chrome 或其他 Chromium 浏览器中加载:

  1. 打开 chrome://extensions/
  2. 开启“开发者模式”。
  3. 点击“加载已解压的扩展程序”。
  4. 选择 src/cdp_bridge/tmwd_cdp_bridge 文件夹。

默认情况下,扩展会连接本地 WebSocket 服务 127.0.0.1:18765

扩展弹窗里可以修改连接配置:

CDP Bridge 浏览器插件弹窗

  • Bridge Host:可填写 127.0.0.1localhost 或域名。填写域名时可以不填端口,例如 bridge.example.com
  • Port:WebSocket 端口。使用本地默认配置时是 18765;如果 MCP 启动时使用了 --ws-port,这里需要填同一个端口。域名接入并且服务走默认 WebSocket 端口时,可以留空。

配置 MCP

先确认电脑上已安装 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 传输模式。可选 stdiostreamable-http
--ws-port 18765 两种模式 浏览器扩展连接的 WebSocket 端口。无论使用 stdio 还是 streamable-http,都可以配置。
--port 8000 streamable-http MCP HTTP 服务端口。只在 --transport streamable-http 时使用,客户端连接地址是 http://127.0.0.1:<port>/mcp

注意:--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

不传 --transport 时默认使用 stdiostdio 模式没有 MCP HTTP 端口;streamable-http 模式的 MCP 服务地址为 http://127.0.0.1:<port>/mcp

标准配置

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"
    }
  }
}

Claude Code

# 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

Codex

# 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

opencode

~/.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

可以使用 OpenClaw CLI 写入 MCP 配置:

# stdio 模式
openclaw mcp set cdp-bridge '{"command":"uvx","args":["cdp-bridge@latest"]}'

# streamable-http 模式
openclaw mcp set cdp-bridge '{"type":"streamableHttp","url":"http://127.0.0.1:8000/mcp"}'

等价的 stdio 配置结构:

{
  "mcp": {
    "servers": {
      "cdp-bridge": {
        "command": "uvx",
        "args": ["cdp-bridge@latest"]
      }
    }
  }
}

注意事项

  • 本项目需要 Python 3.10 或更高版本。
  • 浏览器扩展内置自动重连机制:首次连接失败后会持续探测 WebSocket 服务(每 ~5 秒),当 MCP 服务启动后会自动恢复连接。如果看到 ERR_CONNECTION_REFUSED,等待数秒即可自动恢复。
  • 页面自动化会运行在你的真实浏览器会话中,请只连接你信任的 MCP 客户端。

致谢

本项目的浏览器插件和部分代码参考并来源于 GenericAgent。感谢原项目作者的开源工作。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cdp_bridge-0.1.14.tar.gz (181.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cdp_bridge-0.1.14-py3-none-any.whl (178.4 kB view details)

Uploaded Python 3

File details

Details for the file cdp_bridge-0.1.14.tar.gz.

File metadata

  • Download URL: cdp_bridge-0.1.14.tar.gz
  • Upload date:
  • Size: 181.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.9 {"installer":{"name":"uv","version":"0.11.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for cdp_bridge-0.1.14.tar.gz
Algorithm Hash digest
SHA256 bad7eecb74d45e1e401601af5d6e0aa0996fc20c081130a76bc26e021b8724fc
MD5 036db2f562c45e16ebffe69241804834
BLAKE2b-256 55a212f6cc056a792b3cdc95c58e2bb9c02a1df11e006ad0407826efdcbefc44

See more details on using hashes here.

File details

Details for the file cdp_bridge-0.1.14-py3-none-any.whl.

File metadata

  • Download URL: cdp_bridge-0.1.14-py3-none-any.whl
  • Upload date:
  • Size: 178.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.9 {"installer":{"name":"uv","version":"0.11.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for cdp_bridge-0.1.14-py3-none-any.whl
Algorithm Hash digest
SHA256 cb4751d73e74305b4521b3f7cd837d257f40a886ce50b8d261f75e4c3f86f196
MD5 f8cdbfbe38dbaeeefd28395b78710663
BLAKE2b-256 8469ae30f0104b4dcdfffa87d429055d2fcd2d0004bf5a2796a1b7dbb4bdc96e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page