今日开源[第30期]Chrome DevTools MCP

Chrome DevTools MCP 项目分析报告

分析日期:2026-07-06


一、项目介绍

1.1 项目概述

Chrome DevTools MCP(chrome-devtools-mcp)是 Google Chrome DevTools 团队官方推出的 Model Context Protocol (MCP) 服务器。它让 AI 编程助手(如 Claude Code、Cursor、GitHub Copilot、Gemini CLI 等)能够直接控制和检查实时运行的 Chrome 浏览器,将 Chrome DevTools 的全部能力——性能追踪、网络请求分析、控制台调试、内存快照、Lighthouse 审计、浏览器扩展管理等——以 MCP 工具的形式暴露给 AI Agent [1]。

这不是一个社区维护的 MCP 适配层,而是 Google 官方把整个 Chrome DevTools 的能力拆解为 44+ 个 MCP 工具,直接喂给所有 AI Agent [2]。项目从 2025 年 9 月首次发布至 2026 年 7 月,仅用 10 个月就达到 45,000+ Stars,成为史上增长最快的 MCP 项目之一。

1.2 项目信息

项目 详情
项目名称 Chrome DevTools MCP
项目地址 https://github.com/ChromeDevTools/chrome-devtools-mcp
NPM 包 https://www.npmjs.com/package/chrome-devtools-mcp
项目官网 NPM 页面作为主页
作者/组织 Google LLC / ChromeDevTools 组织
Stars 45,700+(截至 2026 年 7 月)
当前版本 v1.5.0(2026 年 7 月 3 日发布)
开源协议 Apache-2.0
主要语言 TypeScript 100%
仓库创建 2025 年 9 月 11 日
提交数 903 次 commits
NPM 版本数 57 个版本

1.3 项目示意图

项目 README 展示了以下关键能力场景:

  • 性能分析闭环:Agent 调用 performance_start_trace 录制页面加载 → performance_stop_trace 停止 → performance_analyze_insight 获取语义化洞察(如 "LCP 为 3.2s"、"最大的阻塞资源是 main.js,耗时 1.8s")
  • 调试闭环:Agent 自动化操作页面后,如遇异常,可依次调用 list_console_messages(查看 JS 错误)、get_console_message(获取 source-mapped 堆栈)、list_network_requests(查看网络请求状态)、get_network_request(展开响应详情),在一次对话中完成完整诊断 [2]
  • 多客户端支持:支持 20+ 种 MCP 客户端,包括 Claude Code、Cursor、VS Code/Copilot、Gemini CLI、JetBrains AI Assistant、Windsurf、Warp 等

二、项目亮点

2.1 官方 DevTools 深度集成

底层调用 Chrome DevTools 的原生 trace engineaccessibility treeCDP(Chrome DevTools Protocol),而非简单的 DOM 操作封装。Performance 工具录制的是完整的 DevTools Performance 面板追踪数据——Main thread task breakdown、Layout、Recalculate Style、Composite Layers、JS 执行时间线、网络瀑布图等全部数据 [2]。

2.2 Token-Optimized 设计原则

不把原始数据(如 5 万行 JSON trace)直接扔给 Agent,而是先提炼成语义化摘要。例如 performance_analyze_insight 返回 "LCP 是 3.2 秒" 而非原始 trace 数据 [2]。

2.3 CrUX 真实用户数据集成

Performance 工具默认将 trace URL 发送到 Google CrUX API,获取真实用户的现场性能数据(field data),与 lab data 做对比。Agent 可以看到 "全球用户的 75 分位 LCP 是 4.5s,你的页面比 60% 的同类页面慢" 这样的洞察 [2]。这是第三方浏览器自动化工具无法做到的,因为 CrUX API 是 Google 独有的。

2.4 Agent 感知-决策-执行闭环

take_snapshot 基于 accessibility tree 返回紧凑的结构化文本快照,可交互元素带 ref ID,Agent 可直接用 click 工具点击。形成 "看一眼页面 → 判断状态 → 决定操作 → 执行 → 再看结果" 的完整闭环 [2]。

2.5 渐进复杂度(Progressive Complexity)

工具默认简单(高层操作),但提供高级可选参数。同时提供 --slim 模式(仅 3 个工具:navigate_pageevaluate_scripttake_screenshot)用于轻量场景 [2]。

2.6 多 Agent 并行支持

通过 pageId 路由机制支持并行多 Agent 工作流(v0.19.0 引入),不同的 Agent 可以同时操作不同的页面。支持 isolatedContext 参数,不同上下文完全隔离 cookies 和 storage [3]。

2.7 7 条设计原则

原则 说明
Agent-Agnostic API 使用 MCP 标准协议,不锁定单一 LLM
Token-Optimized 返回语义摘要,"LCP 为 3.2s" 优于 5 万行 JSON
Small, Deterministic Blocks 给 Agent 可组合的工具(Click, Screenshot),而非魔法按钮
Self-Healing Errors 返回包含上下文和潜在修复方案的可操作错误
Human-Agent Collaboration 输出同时可被机器(结构化)和人类(摘要)阅读
Progressive Complexity 默认简单,为高级用户提供可选参数
Reference over Value 对于重资产(截图、trace、视频),返回文件路径或资源 URI

2.8 与同类项目的差异化优势

维度 chrome-devtools-mcp Playwright MCP browser-use
开发者 Google Chrome 官方 Microsoft 社区
控制方式 CDP + Puppeteer + DevTools 前端 Playwright Playwright + Python
跨浏览器 仅 Chrome/Chromium Chromium, Firefox, WebKit 主要 Chromium
快照方式 Accessibility tree 文本快照 Accessibility tree 快照 视觉 + 截图辅助
性能分析 DevTools 原生 trace engine + CrUX 无深度集成
内存分析 堆快照、类节点、retaining paths、对比
Lighthouse 内置集成
扩展管理 安装/卸载/重载/触发扩展
Stars ~45,700 ~20,000 ~70,000
设计目标 为 AI Agent 设计的调试+自动化 通用浏览器自动化 Agent 驱动的自然语言浏览

核心差异化:chrome-devtools-mcp 不是给开发者写的,是给 Agent 写的。传统工具(Selenium、Puppeteer、Playwright)的 API 为"确定性脚本"设计,而 chrome-devtools-mcp 的目标是:Agent 自己决定做什么,工具帮它看懂浏览器状态,执行指令,再帮它看懂结果 [2]。


三、项目运行环境

3.1 硬件要求

  • 无特殊硬件要求,标准开发机器即可
  • 需足够磁盘空间供 Chrome 浏览器及其用户数据目录

3.2 操作系统支持

平台 支持状态 备注
Windows 完整支持 含 Windows 11 特殊配置
macOS 完整支持
Linux 完整支持 支持 X Server 显示检测,支持 WSL
无头模式 支持 --headless 可在无 GUI 的服务器/CI 环境运行

3.3 软件依赖

依赖 版本要求
Node.js ^20.19.0^22.12.0>=23(LTS 版本)
Chrome 当前稳定版或更新(仅支持 Google Chrome 和 Chrome for Testing)
npm 随 Node.js 附带
Puppeteer 25.2.1(项目依赖)
Lighthouse 13.4.0(项目依赖)
chrome-devtools-frontend 1.0.1652307(项目依赖)
@modelcontextprotocol/sdk 1.29.0(项目依赖)

3.4 安装步骤

通用安装(适用于所有 MCP 客户端):

{
  "mcpServers": {
    "chrome-devtools": {
      "command": "npx",
      "args": ["-y", "chrome-devtools-mcp@latest"]
    }
  }
}

Slim 模式(轻量级,仅 3 个工具):加 --slim --headless 参数。

各客户端快速安装:

客户端 安装命令
Claude Code claude mcp add chrome-devtools --scope user npx chrome-devtools-mcp@latest
VS Code/Copilot 命令面板 → Chat: Install Plugin From Source → 输入 ChromeDevTools/chrome-devtools-mcp
Gemini CLI gemini mcp add chrome-devtools npx chrome-devtools-mcp@latest
Cursor Settings → MCP → New MCP Server → 使用标准配置
Codex CLI codex mcp add chrome-devtools -- npx chrome-devtools-mcp@latest

验证安装:

Check the performance of https://developers.chrome.com

四、项目代码介绍

4.1 代码架构图

chrome-devtools-mcp/
├── src/                          # 核心源代码
│   ├── bin/                      # CLI 入口 (chrome-devtools-mcp, chrome-devtools)
│   ├── index.ts                  # 主入口 (createMcpServer)
│   ├── browser.ts                # 浏览器启动与连接管理
│   ├── McpContext.ts             # MCP 核心上下文 (~31KB)
│   ├── McpPage.ts                # 页面封装 (~12KB)
│   ├── McpResponse.ts            # 响应处理 (~47KB)
│   ├── SlimMcpResponse.ts        # Slim 模式响应
│   ├── ToolHandler.ts            # 工具处理器 (~9KB)
│   ├── TextSnapshot.ts           # 文本快照 (~10KB)
│   ├── PageCollector.ts          # 页面数据收集器 (~11KB)
│   ├── HeapSnapshotManager.ts    # 堆快照管理器 (~11KB)
│   ├── WaitForHelper.ts          # 等待辅助 (~6KB)
│   ├── tools/                    # 所有 MCP 工具定义
│   │   ├── ToolDefinition.ts     # 工具定义接口
│   │   ├── categories.ts         # 工具分类(11 个类别)
│   │   ├── tools.ts              # 工具创建工厂
│   │   ├── pages.ts              # 页面操作工具
│   │   ├── input.ts              # 输入自动化工具
│   │   ├── performance.ts        # 性能分析工具
│   │   ├── network.ts            # 网络调试工具
│   │   ├── console.ts            # 控制台工具
│   │   ├── emulation.ts          # 模拟工具
│   │   ├── screenshot.ts         # 截图工具
│   │   ├── script.ts             # 脚本执行工具
│   │   ├── memory.ts             # 内存分析工具
│   │   └── extensions.ts         # 扩展管理工具
│   ├── devtools/                 # DevTools 前端集成
│   ├── trace-processing/         # 性能追踪处理
│   ├── formatters/               # 输出格式化器
│   ├── telemetry/                # 遥测/使用统计
│   ├── third_party/              # 第三方依赖封装
│   └── utils/                    # 工具函数
├── docs/                         # 文档
│   ├── tool-reference.md         # 工具参考
│   ├── design-principles.md      # 设计原则
│   ├── troubleshooting.md        # 故障排除
│   └── cli.md                    # CLI 文档
├── skills/                       # Agent Skills(指导 Agent 使用工具)
├── scripts/                      # 构建/测试脚本
├── tests/                        # 测试
├── .claude-plugin/               # Claude Code 插件配置
├── .cursor-plugin/               # Cursor 插件配置
├── .gemini/                      # Gemini 扩展配置
└── package.json                  # 项目配置

4.2 核心模块介绍

模块 职责 大小
index.ts 主入口,createMcpServer() 函数:创建 MCP Server、注册工具、管理浏览器生命周期
McpContext.ts 核心上下文,管理浏览器实例、页面列表、DevTools 集成、路径验证、roots 管理 ~31KB
McpPage.ts 页面封装,提供对话框处理、事件等待、action 结果等待等页面级操作 ~12KB
McpResponse.ts 响应构建器,将工具执行结果格式化为 MCP 兼容的文本/结构化响应 ~47KB
ToolHandler.ts 工具处理器,负责工具注册、参数验证、mutex 锁、遥测记录、错误处理 ~9KB
TextSnapshot.ts 基于 accessibility tree 的页面文本快照生成 ~10KB
HeapSnapshotManager.ts 堆快照管理,支持内存分析、类节点查询、retaining paths 等 ~11KB
PageCollector.ts 页面数据收集,包括网络请求、控制台消息、性能问题等 ~11KB
browser.ts 浏览器启动/连接逻辑,支持无头模式、channel 选择、CDP 连接等

4.3 工具分类(44+ 个工具,11 个类别)

类别 工具示例 用途
页面导航 navigate_pagenew_pageclose_pagelist_pages 管理浏览器标签页
输入自动化 clickfillpress_keydraghover 模拟用户交互
可访问性快照 take_snapshotwait_for 获取页面结构供 Agent 理解
性能分析 performance_start_traceperformance_stop_traceperformance_analyze_insight 录制并分析 Core Web Vitals
网络调试 list_network_requestsget_network_request 查看网络请求/响应详情
控制台调试 list_console_messagesget_console_message 获取 JS 错误和日志
内存分析 take_heap_snapshotquery_heap_snapshot_nodescompare_heap_snapshots 堆快照、类节点查询、差异对比
模拟 emulateset_geolocationset_device_metrics_override 设备/网络/地理模拟
截图 take_screenshottake_screenshot_of_element 页面和元素截图
脚本执行 evaluate_script 在页面中执行 JavaScript
扩展管理 install_extensionuninstall_extensionreload_extension Chrome 扩展生命周期管理

4.4 核心代码解析

4.4.1 MCP Server 创建与工具注册(src/index.ts

export async function createMcpServer(
  serverArgs: ReturnType<typeof parseArguments>,
  options: { logFile?: fs.WriteStream },
) {
  // 初始化 MCP Server
  const server = new McpServer(
    {
      name: 'chrome_devtools',
      title: 'Chrome DevTools MCP server',
      version: VERSION,
    },
    { capabilities: { logging: {} } },
  );

  // 浏览器连接/启动逻辑
  async function getContext(): Promise<McpContext> {
    const browser = serverArgs.browserUrl || serverArgs.wsEndpoint || serverArgs.autoConnect
      ? await ensureBrowserConnected({ /* 连接已有浏览器 */ })
      : await ensureBrowserLaunched({   /* 启动新浏览器 */
          headless: serverArgs.headless,
          executablePath: serverArgs.executablePath,
          channel: serverArgs.channel as Channel,
          isolated: serverArgs.isolated ?? false,
        });
    if (context?.browser !== browser) {
      context = await McpContext.from(browser, logger, { /* ... */ });
    }
    return context;
  }

  // 工具注册
  function registerTool(tool: ToolDefinition | DefinedPageTool): void {
    const toolHandler = new ToolHandler(tool, serverArgs, getContext, toolMutex);
    if (!toolHandler.shouldRegister) return;
    server.registerTool(
      tool.name,
      {
        description: tool.description,
        inputSchema: toolHandler.registeredInputSchema,
        annotations: tool.annotations,
      },
      async (params): Promise<CallToolResult> => {
        return await toolHandler.handle(params);
      },
    );
  }

  // 批量注册所有工具
  const tools = createTools(serverArgs);
  for (const tool of tools) {
    registerTool(tool);
  }
  return { server };
}

关键设计:支持两种浏览器模式——连接已有浏览器--browserUrl/--wsEndpoint)或自动启动新浏览器。通过 createTools(serverArgs) 工厂函数根据参数(如 --slim--categoryExtensions 等)动态生成工具列表。每个工具注册时通过 ToolHandler 统一管理参数验证、mutex 锁、遥测记录 [6]。

4.4.2 ToolHandler 工具处理核心(src/ToolHandler.ts

export class ToolHandler {
  readonly inputSchema: zod.ZodRawShape;
  readonly registeredInputSchema: zod.ZodTypeAny;
  readonly shouldRegister: boolean;
  private readonly disabledReason?: string;

  constructor(
    private readonly tool: ToolDefinition | DefinedPageTool,
    private readonly serverArgs: ReturnType<typeof parseArguments>,
    private readonly getContext: () => Promise<McpContext>,
    private readonly toolMutex: Mutex,
  ) {
    const { disabled, reason } = getToolStatusInfo(tool, serverArgs);
    this.disabledReason = reason;
    this.shouldRegister = !(disabled && !serverArgs.viaCli);
    // pageId 路由:为 page-scoped 工具自动注入 pageId 参数
    this.inputSchema = 'pageScoped' in tool && tool.pageScoped &&
      serverArgs.experimentalPageIdRouting && !serverArgs.slim
        ? { ...pageIdSchema, ...tool.schema }
        : tool.schema;
    this.registeredInputSchema = zod.object(this.inputSchema).passthrough();
  }

  async handle(params: Record<string, unknown>): Promise<CallToolResult> {
    // 1. 检查工具是否被禁用
    if (this.disabledReason) { /* 返回错误 */ }

    // 2. 检查未知参数
    const unknownArgumentNames = this.unknownArgumentNames(params);
    if (unknownArgumentNames.length) { /* 返回友好错误提示 */ }

    // 3. 获取互斥锁(保证工具串行执行)
    const guard = await this.toolMutex.acquire();

    try {
      const context = await this.getContext();
      await context.detectOpenDevToolsWindows();

      // 4. 选择响应模式(Slim vs Full)
      const response = this.serverArgs.slim
        ? new SlimMcpResponse(this.serverArgs)
        : new McpResponse(this.serverArgs);

      // 5. 执行工具逻辑
      if (isPageScopedTool(this.tool)) {
        const page = /* 根据 pageId 选择页面 */;
        response.setPage(page);
        if (this.tool.blockedByDialog) {
          page.throwIfDialogOpen();  // 对话框打开时主动拒绝操作
        }
        await this.tool.handler({ params, page }, response, context);
      } else {
        await this.tool.handler({ params }, response, context);
      }

      // 6. 构建响应
      const { content, structuredContent } = await response.handle(/* ... */);
      return { content, isError: !!response.error };
    } finally {
      // 7. 记录遥测
      ClearcutLogger.get()?.logToolInvocation({ /* ... */ });
      guard.dispose();
    }
  }
}

关键设计 [7]:

  • Mutex 互斥锁:确保同一时间只有一个工具在执行,避免竞态条件
  • pageId 路由:通过 experimentalPageIdRouting 支持多 Agent 并行操作不同页面
  • 对话框检测blockedByDialog 标记的工具在对话框打开时主动拒绝,返回友好错误
  • 未知参数检测:当 Agent 传入不存在的参数时,返回精确的错误提示(列出已知参数)
  • 遥测:每次工具调用后记录工具名、参数、成功/失败、延迟等指标

4.4.3 浏览器启动与连接管理(src/browser.ts

// 两种浏览器模式:

// 模式 1:连接已有浏览器实例
async function ensureBrowserConnected(options: {
  browserUrl?: string;
  wsEndpoint?: string;
  wsHeaders?: Record<string, string>;
}): Promise<Browser> {
  if (options.browserUrl) {
    // 通过 HTTP 获取 WebSocket 端点
    const { webSocketDebuggerUrl } = await fetch(
      `${options.browserUrl}/json/version`
    ).then(r => r.json());
    return puppeteer.connect({
      browserWSEndpoint: webSocketDebuggerUrl,
      headers: options.wsHeaders,
    });
  }
  return puppeteer.connect({
    browserWSEndpoint: options.wsEndpoint,
    headers: options.wsHeaders,
  });
}

// 模式 2:自动启动新浏览器
async function ensureBrowserLaunched(options: {
  headless: boolean;
  executablePath?: string;
  channel?: Channel;
  isolated: boolean;
  // ...
}): Promise<Browser> {
  return puppeteer.launch({
    headless: options.headless,
    executablePath: options.executablePath,
    channel: options.channel,
    args: [
      ...(options.isolated ? [`--user-data-dir=${tmpDir}`] : []),
      '--remote-debugging-port=0',  // 随机端口避免冲突
      // ...
    ],
  });
}

关键设计:支持两种部署模式——连接用户正在使用的浏览器(保留登录态、扩展等)或启动全新隔离的浏览器实例(适合 CI/CD 和自动化测试)。隔离模式使用临时 user-data-dir,session 结束后自动清理。

4.4.4 文本快照生成(src/TextSnapshot.ts

// 基于 accessibility tree 的页面文本快照
// 不是原始 DOM,而是结构化文本,每个可交互元素带唯一 ref ID

// 快照示例:
// [1] Heading "Welcome to RomM"
// [2] Button "Login"
// [3] Textbox placeholder="Username"
// [4] Textbox type="password" placeholder="Password"
// [5] Link "Register"

// Agent 调用 click(ref=2) 即可点击 Login 按钮
// 相比传统 CSS selector 或 XPath,这种方式对 LLM 更友好

关键设计:基于 accessibility tree 而非原始 DOM 生成快照,天然过滤了不可见元素和装饰性节点。每个可交互元素带数字 ref ID,Agent 只需返回数字即可精确定位,大幅降低 LLM 生成 selector 的出错概率。


五、项目应用与评价

5.1 应用场景

场景 说明
AI 驱动的 E2E 测试 Agent 自动执行测试流程,遇到失败时自检 console、自检 network、自检 memory,自己给出失败原因,形成闭环诊断 [2]
前端性能优化 Agent 录制性能 trace,获取 LCP/INP/CLS 等 Core Web Vitals 指标,结合 CrUX 真实用户数据,给出优化建议 [2]
Web 调试与故障排查 Agent 自动检查控制台错误(含 source-mapped 堆栈)、分析网络请求(含请求/响应体)、定位 JavaScript 运行时错误 [2]
内存泄漏检测 Agent 拍摄堆快照、按类筛选节点、对比两个快照差异、追踪 retaining paths,定位 Detached DOM 节点和意外闭包引用 [2]
可访问性审计 结合 Lighthouse 审计和 accessibility tree 快照,检测并修复可访问性问题 [3]
Chrome 扩展开发与调试 安装/卸载/重载扩展、触发扩展 Action、查看 Service Worker 日志 [3]
网页内容抓取与分析 Agent 导航页面、获取文本快照、执行 JavaScript 提取数据、截图保存 [2]
CI/CD 流水线集成 无头模式 + 隔离的临时 user data dir,每个 session 结束后自动清理 [2]

5.2 项目优点

  1. 官方背书与生态整合:由 Google Chrome 团队维护,与 Chrome DevTools、CrUX、Lighthouse 深度集成,数据权威性无可替代。
  2. Agent 优先设计:工具粒度、Token 优化、错误自愈、渐进复杂度等设计原则,均围绕 Agent 的实际工作方式设计,而非传统开发者视角。
  3. 调试+自动化一体化:将传统分离的自动化操作和诊断调试统一在同一个 MCP server 中,Agent 可自主完成诊断闭环。
  4. 多客户端支持:支持 20+ 种 MCP 客户端(Claude Code、Cursor、Copilot、Gemini CLI、JetBrains、Windsurf 等),配置方式统一。
  5. Slim 模式:轻量场景下仅暴露 3 个工具(navigate_pageevaluate_scripttake_screenshot),避免 token 浪费。
  6. 多 Agent 并行:通过 pageId 路由支持多个 Agent 同时操作不同页面,适合复杂并行工作流。
  7. 活跃迭代:903 次提交,57 个版本,从 v0.1.0 到 v1.5.0 仅用 10 个月,功能快速丰富。
  8. Apache-2.0 协议:商业友好,无 copyleft 限制。

5.3 项目不足

  1. 仅支持 Chrome:不支持 Firefox、Safari/WebKit 等其他浏览器,跨浏览器测试场景受限。
  2. Node.js 技术栈锁定:仅支持 TypeScript/Node.js 环境,Python 等生态的 Agent 需通过子进程调用,增加复杂度。
  3. 无头模式功能受限:部分 DevTools 功能(如 screencast 录制)在无头模式下可能受限或不可用。
  4. 隐私数据收集:默认开启使用统计(含工具调用成功率、延迟、环境信息),需手动 --no-usage-statistics 关闭。Performance 工具默认向 CrUX API 发送 trace URL [1]。
  5. Token 消耗:全量 44+ 工具注册到 MCP 客户端后,tool list 会占用 Agent 的 context window。Slim 模式可缓解但功能受限。
  6. 远程调试配置门槛:连接已有浏览器实例需要手动开启 Chrome 的 remote debugging 端口(--remote-debugging-port=9222),对非技术用户有门槛。
  7. 实验性功能稳定性:部分功能标记为 experimental(如 click_atpageId 路由、TOON 格式、WebMCP 等),API 可能变动。
  8. Chrome 版本依赖:需要当前稳定版或更新的 Chrome,企业环境中受限于 IT 策略的旧版本 Chrome 可能不兼容。

参考来源

posted @ 2026-07-06 23:36  zhang-yd  阅读(46)  评论(0)    收藏  举报