Skip to content

Chrome DevTools MCP 原理解析 ​

2026-04-08 08:50:18

1. 核心组件架构 ​

┌─────────────────┐
│   OpenClaw     │ ← AI 助手(我)
│   (Agent)       │
└────────┬────────┘
         │
         │ 通过 MCP 协议通信
         ↓
┌─────────────────┐
│   MCP Server    │ ← Model Context Protocol 服务器
│   (Gateway)     │
└────────┬────────┘
         │
         │ 通过 WebSocket 通信
         ↓
┌─────────────────┐
│   Chrome        │ ← Chrome 浏览器(启用远程调试)
│   (CDP Server)  │   Chrome DevTools Protocol
└─────────────────┘

2. 关键技术 ​

Chrome DevTools Protocol (CDP) ​

是什么:Chrome 浏览器提供的一套远程调试协议
工作方式:基于 WebSocket 的 JSON-RPC 通信
功能:可以控制浏览器的方方面面(页面导航、元素操作、网络拦截等)

Model Context Protocol (MCP) ​

是什么:AI Agent 与工具(如浏览器)之间的标准化协议
作用:让 AI 能够调用各种外部工具和服务
优势:统一的接口,易于扩展

3. 具体工作流程 ​

以刚才的推文发布为例,详细解释每一步:

步骤 1:启动 Chrome 浏览器 ​

工具调用:

bash
browser.start(
  action: "start",
  profile: "openclaw"
)

实际发生的事情:

  1. OpenClaw 启动 Chrome 进程,带参数:
    bash
    --remote-debugging-port=18800
    --user-data-dir=/Users/ayu/.openclaw/browser/openclaw/user-data
    --headless=false
  2. Chrome 在端口 18800 上启动 CDP 服务器
  3. Chrome 创建独立的用户数据目录(隔离你的个人 Chrome)

步骤 2:打开 Twitter 页面 ​

工具调用:

bash
browser.open(
  url: "https://x.com"
)

实际发生的事情:

  1. 通过 CDP 发送命令到 Chrome:
    json
    {
      "id": 1,
      "method": "Page.navigate",
      "params": {
        "url": "https://x.com"
      }
    }
  2. Chrome 导航到 Twitter 页面
  3. 返回页面 ID 和 WebSocket 连接信息

步骤 3:获取页面快照 ​

工具调用:

bash
browser.snapshot()

实际发生的事情:

  1. 通过 CDP 发送命令:
    json
    {
      "id": 2,
      "method": "DOM.getDocument"
    }
  2. Chrome 返回整个 DOM 树
  3. AI 解析 DOM,找到:
    • 登录按钮
    • 发帖输入框
    • 发布按钮
    • 热搜列表

步骤 4:点击登录按钮 ​

工具调用:

bash
browser.act(
  kind: "click",
  ref: "e53"
)

实际发生的事情:

  1. 通过 CDP 发送命令:
    json
    {
      "id": 3,
      "method": "Runtime.evaluate",
      "params": {
        "expression": "document.querySelector('[ref=\"e53\"]').click()"
      }
    }
  2. Chrome 执行 JavaScript 点击操作
  3. 触发 Twitter 的登录流程

步骤 5:输入推文内容 ​

工具调用:

bash
browser.act(
  kind: "type",
  ref: "e192",
  text: "这是一条通过OpenClaw自动发送的内容"
)

实际发生的事情:

  1. 通过 CDP 发送命令:
    json
    {
      "id": 4,
      "method": "DOM.focus",
      "params": {
        "nodeId": 1234
      }
    }
  2. 然后模拟键盘输入:
    json
    {
      "id": 5,
      "method": "Input.dispatchKeyEvent",
      "params": {
        "type": "keyDown",
        "text": "这"
      }
    }
  3. 逐个字符输入文本

步骤 6:点击发布按钮 ​

工具调用:

bash
browser.act(
  kind: "click",
  ref: "e248"
)

实际发生的事情:

  1. 同步骤 4 的点击操作
  2. Twitter 发送 POST 请求到服务器
  3. 推文发布成功,页面更新

4. 技术细节 ​

WebSocket 通信流程 ​

OpenClaw (Agent)
    ↓
    ──── WebSocket 连接 ───→
    ↓
Chrome CDP Server (localhost:18800)
    ↓
    接收 JSON-RPC 请求
    ↓
    执行浏览器操作
    ↓
    ──── 返回结果 ───→
    ↓
OpenClaw (Agent)

实际的 CDP 命令示例 ​

1. 导航到页面 ​

json
{
  "id": 1,
  "method": "Page.navigate",
  "params": {
    "url": "https://x.com",
    "referrer": "https://www.google.com"
  }
}

2. 查找元素 ​

json
{
  "id": 2,
  "method": "DOM.querySelector",
  "params": {
    "nodeId": 1,
    "selector": "textbox[placeholder*='What\\'s happening']"
  }
}

3. 点击元素 ​

json
{
  "id": 3,
  "method": "DOM.focus",
  "params": {
    "nodeId": 5678
  }
}

4. 输入文本 ​

json
{
  "id": 4,
  "method": "Input.insertText",
  "params": {
    "text": "这是一条通过OpenClaw自动发送的内容"
  }
}

5. 为什么需要独立的浏览器实例? ​

安全隔离 ​

你的个人 Chrome:
├─ 用户数据: /Users/ayu/Library/Application Support/Google/Chrome/
├─ 已保存的密码
├─ 浏览历史
└─ 个人 Cookie

OpenClaw 的 Chrome:
├─ 用户数据: /Users/ayu/.openclaw/browser/openclaw/user-data/
├─ 独立的 Cookie 存储
├─ 独立的会话状态
└─ 完全隔离的环境

好处:

  • ✅ 安全:AI 无法访问你的个人数据
  • ✅ 隐私:自动化操作不影响你的正常浏览
  • ✅ 独立:可以同时运行多个自动化任务

6. 完整的通信时序图 ​

用户请求 → OpenClaw (Agent)
          ↓
    解析意图 → "打开推特并发帖"
          ↓
    生成工具调用 → browser.start()
          ↓
    MCP Server → 建立 WebSocket 连接
          ↓
    Chrome CDP → 启动浏览器 (端口 18800)
          ↓
    返回连接信息 → { targetId, url, wsUrl }
          ↓
    OpenClaw → browser.open(url="https://x.com")
          ↓
    MCP Server → CDP: Page.navigate(url)
          ↓
    Chrome → 加载 Twitter 页面
          ↓
    OpenClaw → browser.snapshot()
          ↓
    MCP Server → CDP: DOM.getDocument()
          ↓
    Chrome → 返回 DOM 树
          ↓
    OpenClaw → 解析 DOM,找到元素
          ↓
    OpenClaw → browser.act(kind="click", ref="e53")
          ↓
    MCP Server → CDP: Runtime.evaluate(click)
          ↓
    Chrome → 执行点击
          ↓
    OpenClaw → browser.act(kind="type", text="...")
          ↓
    MCP Server → CDP: Input.dispatchKeyEvent(...)
          ↓
    Chrome → 输入文本
          ↓
    OpenClaw → browser.act(kind="click", ref="e248")
          ↓
    MCP Server → CDP: Runtime.evaluate(click)
          ↓
    Chrome → 发布推文
          ↓
    返回成功 → OpenClaw → 用户

7. 关键优势 ​

✅ 优势 ​

  1. 真实浏览器环境:不是模拟的,而是真实的 Chrome
  2. 完整的功能:可以处理 JavaScript 渲染的动态内容
  3. 可视化:可以看到实际操作过程
  4. 灵活性:可以执行任何浏览器能做的事情

⚠️ 局限性 ​

  1. 需要手动登录:为了安全,不能自动获取你的登录状态
  2. 速度相对较慢:需要真实的浏览器渲染
  3. 资源占用:需要运行完整的 Chrome 实例

8. 总结 ​

整个流程的核心是:

  1. OpenClaw Agent:理解你的意图,生成工具调用
  2. MCP Server:提供标准化的工具接口
  3. Chrome CDP:提供浏览器控制能力
  4. WebSocket:实时双向通信

这就是为什么我能够:

  • 🌐 打开真实的 Twitter 网站
  • 🔐 让你手动登录(安全考虑)
  • ⌨️ 自动输入文本
  • 🚀 点击按钮发帖

整个过程都是通过 浏览器自动化 实现的,而不是通过 Twitter API。这意味着我可以看到你看到的,操作你能操作的,就像一个真正的用户在使用浏览器一样!

Released under the MIT License.