🐾 claw-stack

最后更新:2026 年 3 月 · 源码:chrome-devtools-mcp

Web 自动化操作器

一个将 Chrome DevTools 协议暴露给 AI 智能体的 MCP 服务器——在任何兼容 MCP 的客户端中实现可靠的浏览器自动化、网络检查、控制台调试、截图捕获和性能追踪。

← 模块概览

是什么

chrome-devtools-mcp 作为 MCP 服务器启动并连接到 Chrome 浏览器实例。它提供跨 6 个类别的 26 个工具,AI 智能体可调用这些工具与实时浏览器交互:点击元素、填写表单、导航页面、读取控制台输出、捕获性能追踪等。自动化底层使用 Puppeteer 在每次操作后等待页面状态。

隐私说明

此服务器将浏览器内容暴露给 MCP 客户端。性能工具可能会将追踪 URL 发送到 Google CrUX API 以获取真实用户字段数据。使用统计数据默认会被收集;两者均可通过服务器标志禁用。

为什么

AI 智能体的浏览器自动化有两种常见失败模式。Selenium 和 Playwright 专为确定性测试脚本设计:你事先知道要点击哪个元素以及顺序。AI 智能体需要观察、推理和适应——它事先不了解 DOM 结构,必须动态发现。纯截图方法通过让智能体"看到"页面来解决这个问题,但截图无法给出精确的元素引用,也无法将意图表达为工具调用。

Chrome DevTools 协议(CDP)暴露了开发者在 DevTools 中使用的相同原语:无障碍树、JavaScript 执行、网络流量、控制台输出和性能追踪。使用 CDP 的智能体可以精确检查页面结构,通过无障碍角色识别元素,执行任意 JavaScript,并读取浏览器记录的精确内容——所有这些都通过单一的 MCP 接口完成。

架构

三个层次协作处理单个智能体工具调用:

智能体
  → MCP 工具调用(如 click、fill、navigate_page)
  → chrome-devtools-mcp 服务器
    → Puppeteer(Chrome 管理 + 等待操作结果)
      → Chrome DevTools 协议(浏览器控制)
        → Chrome 实例

跨 6 个类别的 26 个工具:

输入自动化(8 个工具)

工具 说明
click通过 uid 点击元素(单击或双击)
drag将一个元素拖到另一个元素上
fill在输入框中输入文本或选择选项
fill_form一次调用填写多个表单元素
handle_dialog接受或关闭浏览器对话框
hover悬停在元素上
press_key按下键或组合键
upload_file通过文件输入元素上传本地文件

导航(6 个工具)

工具 说明
navigate_page导航到 URL
new_page打开新浏览器标签页
close_page通过页面 ID 关闭标签页
list_pages列出所有打开的标签页
select_page通过页面 ID 切换焦点到标签页
wait_for在继续之前等待条件满足

调试(5 个工具)

工具 说明
take_screenshot捕获当前页面的截图
take_snapshot捕获页面无障碍树快照(返回元素 UID)
evaluate_script在页面上下文中执行 JavaScript
get_console_message获取带有源映射堆栈追踪的特定控制台消息
list_console_messages列出当前页面的所有控制台消息

网络(2)、性能(3)、模拟(2)

工具 说明
list_network_requests列出页面发出的所有网络请求
get_network_request获取特定请求的详细信息,包括请求头和正文
performance_start_trace启动 DevTools 性能追踪
performance_stop_trace停止追踪并返回原始数据
performance_analyze_insight从追踪中提取可操作的洞察(可选包含 CrUX 字段数据)
emulate模拟设备(移动端、平板等)
resize_page调整浏览器视口大小

关键设计决策

无障碍树 UID——先快照,再操作

与元素交互的工具接受 uid 参数。UID 来自 take_snapshot 返回的无障碍树。智能体总是先调用 take_snapshot 获取当前 UID,然后将目标 UID 传递给操作工具。这避免了在 DOM 变更时失效的脆弱 CSS 选择器和 XPath 表达式。

Puppeteer 等待操作结果——无需轮询循环

每次交互(点击、填写、导航)后,Puppeteer 会等待页面稳定后再将控制权返回给智能体。智能体不需要显式轮询页面是否就绪。这消除了一类常见的时序错误——智能体在 JavaScript 完成更新之前就对页面采取行动。

CDP 优于 Selenium/Playwright

CDP 提供比 Playwright 更低级的访问。智能体可以读取带有源映射堆栈追踪的控制台消息、拦截网络请求、执行任意 JavaScript,并记录 DevTools 级别的性能追踪——这些都无法通过 Playwright 的抽象层轻松访问。

托管 Chrome 与连接到现有实例

默认情况下,服务器使用专用配置文件启动自己的 Chrome。对于智能体需要维护会话状态(已登录账户)或与手动测试协同工作的情况,它可以连接到已启用远程调试的现有 Chrome 实例。

如何自行构建

1. 快照-然后-操作模式是基础

每个交互序列都从新快照开始。UID 是特定于页面状态的;导航或 DOM 变更后,来自先前快照的 UID 可能已过期。在操作之前总是先快照,尤其是在任何导航或表单提交之后。

2. 为每次交互实现等待操作结果

只有在页面稳定后才从工具调用返回——而不是在 DOM 事件触发后立即返回。Puppeteer 的 waitForNavigationwaitForSelector 是正确的原语。没有这个,智能体会在页面过渡中操作,得到不一致的结果。

3. 使用无障碍树操作元素,使用截图进行视觉验证

无障碍树提供精确的元素引用(角色、名称、状态、uid)。截图提供视觉上下文——对智能体验证页面外观是否正确很有用。两者结合使用:快照用于操作,截图用于确认视觉结果看起来正确。

4. 处理敏感站点时隔离用户数据

CDP 将浏览器会话的完整内容暴露给 MCP 客户端。如果智能体正在浏览已认证页面或处理凭据,请使用隔离模式(会话后清理的临时用户数据目录)以防止任务之间的交叉污染。

5. 结合实验室追踪与 CrUX 字段数据进行性能分析

单次实验室追踪显示一个用户的体验。CrUX 字段数据显示真实用户的百分位分布。performance_analyze_insight 工具在 URL 公开可访问时结合两者,为智能体提供更完整的实际用户体验与实验室条件对比。

常见问题

服务器启动前需要 Chrome 已在运行吗?

不需要。默认情况下,当第一次调用需要浏览器的工具时,服务器通过 Puppeteer 启动自己管理的 Chrome 实例。Chrome 不会在服务器启动时启动——只有在实际需要时才启动。

工具如何识别页面元素?

与元素交互的工具(click、fill、hover)接受 uid 参数。UID 来自 take_snapshot 返回的页面快照。智能体调用 take_snapshot,通过 uid 识别目标元素,然后将该 uid 传递给操作工具。

什么是 CrUX API,它何时向外部发送数据?

Chrome 用户体验报告(CrUX)API 为公开 URL 提供真实用户性能字段数据。它由 performance_analyze_insight 与实验室追踪数据一起使用。可以通过服务器标志禁用,以防止任何 URL 被发送到 Google 的 API。

Authors: Qiushi Wu & Orange 🍊