MCP服务器桥接器

一个高性能的Rust桥接器,通过HTTP + SSE(服务器发送事件)将基于标准输入输出的模型上下文协议(MCP)服务器暴露在网络上,专为远程AI代理和IDE访问Chrome DevTools MCP服务器而设计。

  • by csplus3013
  • Rust
  • 本地部署
  • 更新于
在 GitHub 查看 csplus3013/chrome-devtool-mcp-bridge

使用说明

🌉 MCP服务器网桥(V17)

高性能 铁锈桥 这暴露了基于stdio的 模型上下文协议(MCP) 网络上的服务器使用 HTTP+SSE (服务器发送的事件)。

专为制造 Chrome DevTools MCP服务器 远程AI代理和IDE可以访问,绕过客户端的本地Docker要求。


🚀 版本17核心功能

  • Stdin EOF比赛修复: chrome-devtools-mcp v1.1.0+在其stdin达到EOF时立即退出(#2117).之前的写作任务已经终止 child_stdin 当内部mpsc通道返回时 None 在会话拆除期间,发送虚假的EOF并杀死孩子。已修复:写入程序现在将stdin保持打开状态,并在中断之前等待显式取消信号。
  • 主动僵尸会话清理:当子进程意外退出(stdout EOF)时,读取器任务现在会立即取消会话令牌。以前,死会话在商店中一直持续到SSE客户端超时,导致MCP客户端静默挂起。已修复:观察器任务会立即触发并删除僵尸条目,因此客户端会看到流结束并可以重新连接。
  • 置顶 chrome-devtools-mcp 版本: Dockerfile.devtool 现在固定到 1.2.0 而不是 @latest 以防止上游运输变化造成的无声破坏。

以前推出(V16)

  • 保证孤儿清理:在会议上拆除桥梁执行 docker exec <container> pkill -f chrome-devtools-mcp 以确保终止任何分离的节点MCP进程。
  • 不再有“节点军”:防止怠速累积 chrome-devtools-mcp 即使客户端在工具执行过程中崩溃,也会进行处理。
  • 快速恢复:清理是轻量级的(无需重新启动容器),因此重新连接是即时的,容器内存是稳定的。

以前推出(V11)

  • 确定性会话清理:修复了SSE生命周期边缘情况,即客户端断开连接可能导致孤立 chrome-devtools-mcp 节点进程正在运行。会话现在保证在SSE流结束时丢弃,从而确保子进程被终止。
  • 不再有“节点军”:防止客户端重复重新连接时累积空闲的MCP进程。

以前推出(V10)

  • SSE多路复用:产卵独特、孤立 docker exec 每个客户端的会话数。
  • 自动清理:当会话结束时,桥接部队会清除任何孤儿 chrome-devtools-mcp 容器内的流程使用 docker exec pkill -f chrome-devtools-mcp,防止了经典的“节点军”问题。
  • 超稳健的会话处理:通过以下方式支持会话ID X-Session-ID 标题、查询参数(?session_id=...),或标准MCP endpoint 活动。
  • 跨平台就绪:完全支持Windows(主机)到Docker(Linux)的通信。
  • 许可CORS:允许所有的起源、方法和标头--从 localhost、LAN IP和没有CORS飞行前故障的远程机器。
  • Chrome主机头修复:自动解析 host.docker.internal (以及任何主机名)在启动时连接到其IP。Chrome的DevTools协议HTTP服务器拒绝非IP Host HTTP 500的头文件——此修复程序可确保工具执行始终正常。
  • Smart 410消失了:过期会话POST返回 410 Gone + X-MCP-Reconnect: true 而不是令人困惑 404,因此客户知道要重新建立SSE流。

🛠 先决条件

1.配置Chrome浏览器(在Windows/主机上)

Chrome的远程调试器非常严格。你 必须 使用以下标志启动它,以便Docker能够访问它:

start chrome.exe --remote-debugging-port=9322 --remote-allow-origins=* --remote-debugging-address=0.0.0.0

[!重要] 在运行此命令之前,请关闭所有现有的Chrome窗口,否则新的标志将被忽略。

2.网络

  • Docker到主机:大桥使用 host.docker.internal,在启动时自动解析为IP。
  • 客户到桥:两者都有 localhost:3000 (本地机器)和 <LAN-IP>:3000 (远程机器)工作。

📦 部署

通过Docker Compose(推荐)

docker compose down
docker image rm mcp-server-bridge  # Clear cache
docker compose up -d --build mcp-bridge

⚠️ 重要提示:内存限制

由于底层内存随着时间的推移而积累 chrome-devtools-mcp 节点进程,强烈建议在您的 docker-compose.yml.

示例片段:

  mcp-server:
    image: chrome-devtools-mcp
    deploy:
      resources:
        limits:
          memory: 2048M  # Caps memory to 2GB to prevent background Node leak from crashing host

Rust桥本身非常轻便,可以安全地加盖 256M.

环境变量

变量 默认值 用途
MCP_ARGS "" 争论传递到内部进程。例子: --browser-url=http://host.docker.internal:9322
MCP_CONTAINER chrome-mcp-server 目标容器 docker exec.
PORT 3000 桥接监听端口

🤖 客户端配置

根据您的客户端应用程序,在您的应用程序中使用以下JSON块之一 mcp_config.json:

本地(与网桥相同的机器)

{
  "mcpServers": {
    "chrome-devtools": {
      "type": "sse",
      "url": "http://localhost:3000/mcp"
    }
  }
}

远程(局域网上的不同机器)

{
  "mcpServers": {
    "chrome-devtools": {
      "type": "sse",
      "url": "http://<windows-host-ip>:3000/mcp"
    }
  }
}

严格客户端(例如游标/反重力IDE)

如果你得到一个 "serverURL missing" 错误,使用 serverURL 按键:

{
  "mcpServers": {
    "chrome-devtools": {
      "type": "sse",
      "serverURL": "http://<windows-host-ip>:3000/mcp"
    }
  }
}

🔍 验证与调试

第一步:健康检查

curl http://localhost:3000/health
# Response: {"status":"ok"}

步骤2:流测试

curl -v -N -H "Accept: text/event-stream" http://localhost:3000/mcp

成功: 你应该看看 event: endpoint 绝对URL包含 session_id.

步骤3:检查启动日志

docker compose logs -f mcp-bridge

步骤3.5:检查Chrome是否直接运行devtool容器

docker exec chrome-mcp-server node -e "const dns=require('dns');dns.lookup('host.docker.internal',(_,ip)=>{require('http').get('http://'+ip+':9322/json/version',r=>{let d='';r.on('data',c=>d+=c);r.on('end',()=>console.log(d))}).on('error',e=>console.log('ERROR:',e.message))})"
docker compose logs -f chrome-mcp-server

确认V17正在运行:

@@@ MCP BRIDGE VERSION 17 - STDIN-EOF FIX FOR chrome-devtools-mcp v1.1.0+ @@@
Resolved hostname to IP  original=http://host.docker.internal:9322  resolved=http://192.168.65.254:9322
mcp-server-bridge listening  addr=0.0.0.0:3000  mcp_args=["--browser-url=http://192.168.65.254:9322"]

[!注意] 你总会看到一个 POST rejected: missing session_id 警告每个客户端连接。这是 正常 --它是客户端在打开SSE之前探测现有会话。这不是一个错误。

步骤4:工具执行失败?

如果发现工具但调用失败:

  • 验证Chrome是否正在运行 --remote-debugging-port=9322 --remote-debugging-address=0.0.0.0

  • 检查一下 mcp_args 在启动日志中显示已解析的IP,而不是主机名

  • 在MCP容器内运行调试DNS测试:

    docker exec chrome-mcp-server node -e "require('http').get('http://<resolved-ip>:9322/json/version', r => { let d=''; r.on('data', c=>d+=c); r.on('end', ()=>console.log(d)) })"
    

🏗 从源代码构建

# Inside mcp-server-bridge directory
cargo build --release
cp target/release/mcp-server-bridge bin/mcp-server-bridge