Chrome DevTools MCP 深度实战:当 AI 编程助手拥有「浏览器之眼」——从 MCP 协议到 CDP 底层、从 Puppeteer 自动化到生产级调试的完全指南(2026)
作者: 程序员茄子
日期: 2026-06-22
字数: 约 12000 字
适合人群: AI 编程助手用户、前端开发者、自动化测试工程师、性能优化工程师
目录
- 引言:AI 编程的「盲区」与 Chrome DevTools MCP 的诞生
- 核心概念:MCP 协议与 Chrome DevTools 的完美结合
- 架构深度剖析:从 MCP Server 到 CDP 的完整的请求链路
- 工具全景:47 个 MCP 工具的完全解读与实战代码
- 集成实战:在 Claude Code、Cursor、VS Code 中配置与使用
- 生产级场景:自动化测试、性能分析、网络调试完全指南
- 高级技巧:连接已有浏览器会话、性能 CrUX 数据、无头模式优化
- 与其他方案对比:CDP、Puppeteer、Playwright、Selenium 的技术选型
- 源码解析:关键模块与扩展开发
- 总结与展望:AI 原生浏览器自动化的未来
1. 引言:AI 编程的「盲区」与 Chrome DevTools MCP 的诞生
1.1 AI 编程助手的根本性局限
在 AI 辅助编程的时代,我们已经习惯了让 AI 帮我们生成代码、修复 Bug、甚至重构项目。但长期以来,AI 编码助手有一个根本性的局限——它们无法「看到」代码在浏览器中执行的效果。
当你让 AI 写一个前端组件时,它只能:
- 根据你的描述「猜测」UI 应该长什么样
- 基于训练数据「记忆」类似代码的执行效果
- 通过静态分析「推断」可能的运行时错误
但 AI 无法:
- 看到页面真实渲染后的布局错乱
- 捕获控制台的实际错误堆栈
- 分析网络请求的真实耗时和失败原因
- 测量页面加载的实际性能指标
这就是 AI 编程的「盲区」——代码生成与运行时反馈之间的断层。
1.2 Chrome DevTools MCP 的革命性突破
2026 年,Chrome 官方团队发布了 Chrome DevTools MCP(Model-Context-Protocol Server),这是一项革命性的技术突破。它让 AI 编码助手能够:
真正「看到」浏览器中发生的一切
- 通过 CDP(Chrome DevTools Protocol)实时获取 DOM 树
- 捕获控制台消息和完整的 source-mapped 堆栈跟踪
- 截取页面截图和录制 screencast
自动操控浏览器进行可靠的自动化
- 基于 Puppeteer 的智能等待机制(不再需要脆弱的
sleep) - 精准的元素定位和交互(点击、拖拽、填写表单)
- 支持复杂的用户操作流程
- 基于 Puppeteer 的智能等待机制(不再需要脆弱的
进行专业的性能分析和调试
- 录制和分析 Chrome Performance Trace
- 自动识别性能瓶颈并给出优化建议
- 集成 Lighthouse 审计
- 可选集成 CrUX(Chrome User Experience Report)真实用户数据
1.3 为什么是 Chrome 官方团队?
你可能会问:为什么是 Chrome 团队来做这件事?而不是 Puppeteer 团队或者第三方开发者?
答案在于 CDP 协议的控制权:
- CDP 是 Chrome 内部的调试协议,只有 Chrome 团队最清楚它的完整能力和未来演进方向
- Chrome DevTools 前端(devtools-frontend)本身就是 CDP 的「官方客户端」,有最完整的协议实现
- 性能分析功能需要深度集成 Chrome 内部的 Performance 面板能力,这是第三方工具难以完美复现的
Chrome DevTools MCP 项目目前已在 GitHub 上获得 44.1k+ Stars,成为 AI 编程工具链中不可或缺的基石项目。
2. 核心概念:MCP 协议与 Chrome DevTools 的完美结合
2.1 什么是 Model-Context-Protocol(MCP)?
MCP(Model-Context-Protocol)是一个由 Anthropic 提出的开放协议,用于让 AI 模型与外部工具和数据源进行标准化交互。
MCP 的核心架构:
AI 编程助手(Client)
(Claude Code / Cursor / VS Code 等)
MCP 协议(JSON-RPC 2.0)
MCP Server(中间件)
(本文主角:chrome-devtools-mcp)
CDP / Puppeteer API
Chrome 浏览器(被调试端)
(通过 --remote-debugging-port 启动)
MCP 协议的核心概念:
Tools(工具):MCP Server 暴露给 AI 的功能接口
- 例如:
click、take_screenshot、performance_start_trace - AI 可以根据上下文「决策」调用哪个工具
- 例如:
Resources(资源):MCP Server 可以提供给 AI 的上下文数据
- 例如:当前页面的 DOM 快照、控制台消息历史
Prompts(提示词):预定义的工具调用模板
- Chrome DevTools MCP 通过「Skills」机制提供专家级的工具使用指导
2.2 Chrome DevTools MCP 的核心能力矩阵
Chrome DevTools MCP 提供了 47 个工具,分为 8 大类别:
| 类别 | 工具数量 | 核心能力 |
|---|---|---|
| 输入自动化 | 10 | 点击、拖拽、填写表单、按键、上传文件 |
| 导航自动化 | 6 | 打开页面、切换标签页、等待元素 |
| 仿真与设备模拟 | 2 | 模拟设备、调整视口大小 |
| 性能分析 | 3 | 录制 Trace、分析性能瓶颈 |
| 网络调试 | 2 | 拦截请求、分析网络耗时 |
| 调试与诊断 | 8 | 执行 JS、控制台消息、截图、Lighthouse |
| 内存分析 | 9 | 堆快照、内存泄漏检测 |
| 扩展管理 | 5 | 安装/卸载 Chrome 扩展 |
| 第三方工具 | 2 | 调用额外的 DevTools 工具 |
2.3 与纯 CDP 方案的本质区别
你可能会问:我直接用 CDP 协议不行吗?为什么需要 MCP 这层抽象?
关键区别在于「智能编排」:
| 维度 | 纯 CDP | Chrome DevTools MCP |
|---|---|---|
| 工具发现 | 需要手动查阅 CDP 文档,找到正确的 domain 和 method | AI 通过 MCP 协议自动发现可用工具 |
| 参数构造 | 需要手动构造复杂的 CDP 参数(如 selector、backendNodeId) | MCP Server 自动处理参数转换和校验 |
| 等待机制 | 需要手动处理 Page.loadEventFired、Network.requestWillBeSent 等事件 | 基于 Puppeteer 的智能等待(自动等待元素可见、动画完成) |
| 错误处理 | CDP 错误码晦涩,需要查源码才能理解 | MCP 提供友好的错误提示和自动重试 |
| AI 集成 | 需要自己写 AI-MCP 的桥接代码 | 原生支持所有主流 AI 编程助手 |
3. 架构深度剖析:从 MCP Server 到 CDP 的完整的请求链路
3.1 项目结构全景
让我们从源码层面理解 Chrome DevTools MCP 的架构。项目采用 TypeScript + Node.js 编写,核心代码结构如下:
chrome-devtools-mcp/
src/
mcp-server/ # MCP 协议层
server.ts # MCP Server 主类
tool-registry.ts # 工具注册中心
context.ts # MCP 上下文管理
devtools-client/ # CDP 客户端层
connection.ts # 与 Chrome 的 WebSocket 连接管理
browser-manager.ts # 浏览器启动和生命周期管理
puppeteer-adapter.ts # Puppeteer 封装层
tools/ # 47 个工具的实现
input/ # 输入自动化工具
navigation/ # 导航工具
performance/ # 性能分析工具
network/ # 网络调试工具
debugging/ # 调试工具
memory/ # 内存分析工具
extensions/ # 扩展管理工具
third_party/ # 第三方 DevTools 工具集成
devtools.ts # Chrome DevTools Frontend 集成
cli.ts # 命令行入口(非 MCP 模式)
docs/
tool-reference.md # 完整工具参考
cli.md # CLI 使用指南
troubleshooting.md # 故障排查指南
package.json
3.2 请求链路的完整生命周期
当 AI 发出「点击页面上的登录按钮」这个指令时,完整请求链路如下:
步骤 1: AI 决策与工具调用
- AI 分析用户指令,决定调用 `click` 工具
- 构造 MCP 请求:
{
"method": "tools/call",
"params": {
"name": "click",
"arguments": {
"selector": "button:has-text('登录')"
}
}
}
步骤 2: MCP Server 接收请求
- `server.ts` 解析 JSON-RPC 请求
- `tool-registry.ts` 查找 `click` 工具的实现
- 参数校验(selector 是否为空、是否包含恶意代码)
步骤 3: 工具实现层(src/tools/input/click.ts)
- 检查浏览器实例是否已启动,否则自动启动
- 获取当前激活的 Page 对象
- 调用 Puppeteer 的 `page.click(selector)`
步骤 4: Puppeteer 适配层(puppeteer-adapter.ts)
- 将 `selector` 转换为 Puppeteer 的 ElementHandle
- 自动等待:
* 等待元素出现在 DOM 中(`waitForSelector`)
* 等待元素可见(`getBoundingClientRect` 检查)
* 等待元素可交互(不是 disabled、没有 `pointer-events: none`)
- 滚动元素到视口中
步骤 5: CDP 协议层(通过 Puppeteer CDP)
Puppeteer 内部通过 CDP 发送以下命令:
1. DOM.getDocument # 获取 DOM 树
2. DOM.querySelector # 定位元素
3. DOM.getBoxModel # 获取元素坐标
4. Input.dispatchMouseEvent # 发送鼠标点击事件
{
"type": "mousePressed",
"x": 542,
"y": 318,
"button": "left",
"clickCount": 1
}
5. Page.frameStoppedLoading # 等待页面响应点击后的导航
步骤 6: 返回结果给 AI
- 将 CDP 响应转换为 MCP 响应格式
- 返回点击是否成功、页面是否发生导航等信息
- AI 根据结果决定下一步操作(如等待登录成功后的重定向)
3.3 关键模块源码解析
3.3.1 浏览器连接管理器(browser-manager.ts)
// 简化版源码解析
export class BrowserManager {
private browser?: puppeteer.Browser;
private connection?: CDPSession;
// 核心方法:懒启动浏览器
async getBrowser(): Promise<puppeteer.Browser> {
if (this.browser) return this.browser;
// 支持两种模式:
// 1. 自动启动新浏览器实例(默认)
// 2. 连接到已有的浏览器调试端口(--browser-url 参数)
if (this.config.browserUrl) {
this.browser = await puppeteer.connect({
browserURL: this.config.browserUrl,
defaultViewport: null, // 使用 Chrome 实际的视口大小
});
} else {
this.browser = await puppeteer.launch({
headless: this.config.headless,
args: [
'--remote-debugging-port=9222', // 启用 CDP
'--no-sandbox',
'--disable-setuid-sandbox',
],
});
}
// 监听浏览器断开连接事件
this.browser.on('disconnected', () => {
this.browser = undefined;
this.cleanup();
});
return this.browser;
}
// 获取当前激活的页面
async getActivePage(): Promise<puppeteer.Page> {
const pages = await this.getBrowser().then(b => b.pages());
// 找到最后激活的页面(Z 轴最上层)
return pages[pages.length - 1];
}
}
关键技术点:
- 懒启动机制:只有在真正需要操作浏览器时才启动,节省资源
- 连接复用:支持连接到已有的 Chrome 实例(如开发者自己打开的浏览器),这对于需要登录态的场景非常重要
- 自动重连:浏览器意外退出后,下次调用会自动重新启动
3.3.2 工具注册中心(tool-registry.ts)
// 所有 47 个工具在这里注册
export function registerAllTools(server: MCPServer) {
// 输入自动化工具(10 个)
registerTool(server, 'click', clickTool);
registerTool(server, 'drag', dragTool);
registerTool(server, 'fill', fillTool);
registerTool(server, 'fill_form', fillFormTool);
registerTool(server, 'handle_dialog', handleDialogTool);
registerTool(server, 'hover', hoverTool);
registerTool(server, 'press_key', pressKeyTool);
registerTool(server, 'type_text', typeTextTool);
registerTool(server, 'upload_file', uploadFileTool);
registerTool(server, 'click_at', clickAtTool);
// 导航自动化工具(6 个)
registerTool(server, 'close_page', closePageTool);
registerTool(server, 'list_pages', listPagesTool);
// ... 更多工具
// 性能分析工具(3 个)
registerTool(server, 'performance_start_trace', performanceStartTraceTool);
registerTool(server, 'performance_stop_trace', performanceStopTraceTool);
registerTool(server, 'performance_analyze_insight', performanceAnalyzeInsightTool);
// ... 其他类别工具
}
// 单个工具的注册结构
function registerTool(server: MCPServer, name: string, tool: ToolImplementation) {
server.addTool({
name,
description: tool.description,
inputSchema: tool.inputSchema, // JSON Schema 定义参数
handler: async (args) => {
try {
// 参数校验
const validated = tool.inputSchema.parse(args);
// 执行工具逻辑
const result = await tool.handler(validated);
// 格式化返回结果(MCP 协议要求的格式)
return formatMCPResult(result);
} catch (error) {
// 友好的错误处理
return formatMCPError(error);
}
},
});
}
4. 工具全景:47 个 MCP 工具的完全解读与实战代码
4.1 输入自动化工具(10 个)
4.1.1 click - 智能点击
功能:点击页面上的元素,自动等待元素可见和可交互。
AI 调用示例:
用户:帮我点击「登录」按钮
AI:调用 click({ selector: "button:has-text('登录')" })
实战代码(AI 自动生成并执行):
// AI 通过 MCP 协议调用 click 工具
// 实际执行的是以下 Puppeteer 代码
await page.waitForSelector('button:has-text(\'登录\')', {
visible: true,
timeout: 5000,
});
const button = await page.$('button:has-text(\'登录\')');
await button.click();
高级用法:
// 点击坐标(当元素难以用选择器定位时)
await mcpClient.callTool('click_at', {
x: 542,
y: 318,
button: 'left', // 'left' | 'right' | 'middle'
});
4.1.2 fill - 填写输入框
功能:填写输入框或文本域,自动清除原有内容。
AI 调用示例:
用户:在用户名输入框中输入「programmer_qiezi」
AI:调用 fill({ selector: "input[name='username']", value: "programmer_qiezi" })
实战代码:
// 自动处理各种边界情况
await page.waitForSelector('input[name=\'username\']');
const input = await page.$('input[name=\'username\']');
// 先点击聚焦
await input.click();
// 全选并删除原有内容
await page.keyboard.down('Control');
await page.keyboard.press('KeyA');
await page.keyboard.up('Control');
await page.keyboard.press('Backspace');
// 输入新内容
await page.keyboard.type('programmer_qiezi', { delay: 50 }); // 模拟人类输入速度
4.1.3 fill_form - 批量填写表单
功能:一次性填写多个表单字段,自动处理提交逻辑。
AI 调用示例:
用户:帮我注册一个新账号
AI:调用 fill_form({
fields: [
{ selector: "input[name='username']", value: "programmer_qiezi" },
{ selector: "input[name='email']", value: "qiezi@example.com" },
{ selector: "input[name='password']", value: "SecurePass123!" },
],
submitSelector: "button[type='submit']"
})
源码实现亮点:
// fill_form 的内部实现会:
// 1. 按照字段顺序依次填写(避免触发复杂的表单验证)
// 2. 每个字段填写后等待 100ms(模拟人类操作节奏)
// 3. 提交前自动处理可能弹出的确认对话框(通过 handle_dialog 工具)
// 4. 提交后自动等待页面导航或 AJAX 请求完成
4.1.4 drag - 拖拽操作
功能:拖拽元素到目标位置,支持复杂的交互场景(如排序、拖拽上传)。
实战场景:拖拽排序列表项
// AI 调用
await mcpClient.callTool('drag', {
sourceSelector: '.list-item:nth-child(1)',
targetSelector: '.list-item:nth-child(3)',
// 可选:指定拖拽过程中的中间点(绕过障碍物)
waypoints: [
{ x: 100, y: 150 },
{ x: 100, y: 250 },
],
});
底层实现(CDP 命令序列):
// 1. 分发 mousePressed 事件
await cdpClient.send('Input.dispatchMouseEvent', {
type: 'mousePressed',
button: 'left',
clickCount: 1,
x: sourceX,
y: sourceY,
});
// 2. 分发一系列 mouseMoved 事件(模拟平滑拖拽)
for (const point of waypoints) {
await cdpClient.send('Input.dispatchMouseEvent', {
type: 'mouseMoved',
x: point.x,
y: point.y,
});
await sleep(16); // 60fps 的拖拽动画
}
// 3. 分发 mouseReleased 事件
await cdpClient.send('Input.dispatchMouseEvent', {
type: 'mouseReleased',
button: 'left',
clickCount: 1,
x: targetX,
y: targetY,
});
4.2 性能分析工具(3 个)
4.2.1 performance_start_trace + performance_stop_trace - 录制性能追踪
功能:录制 Chrome Performance Trace,用于分析页面加载、运行时性能瓶颈。
AI 调用示例:
用户:分析 https://developers.chrome.com 的性能
AI:
1. 调用 navigate_page({ url: "https://developers.chrome.com" })
2. 调用 performance_start_trace()
3. 等待页面加载完成(wait_for)
4. 调用 performance_stop_trace()
5. 调用 performance_analyze_insight() 分析 Trace
实战代码:
// 开始录制
await mcpClient.callTool('performance_start_trace', {
// 可选:指定录制的分类(减少 Trace 文件大小)
categories: [
'devtools.timeline', // 时间线事件
'blink.user_timing', // 用户计时(performance.mark/measure)
'disabled-by-default-v8.execute', // V8 执行细节
],
// 可选:录制时长(毫秒),超时自动停止
timeout: 30000,
});
// ... 执行页面操作 ...
// 停止录制并保存 Trace
const trace = await mcpClient.callTool('performance_stop_trace', {
// 可选:将 Trace 保存到本地文件(用 Chrome DevTools Performance 面板打开)
saveToFile: './trace.json',
});
4.2.2 performance_analyze_insight - AI 驱动的性能分析
功能:自动分析 Performance Trace,识别性能瓶颈并给出优化建议。
这是 Chrome DevTools MCP 的杀手级功能。
分析维度:
LCP(Largest Contentful Paint)优化建议
- 识别 LCP 元素是什么(图片、文本块)
- 分析是否因为资源加载慢导致 LCP 延迟
- 建议:预加载关键资源、使用
fetchpriority="high"、优化服务器响应时间
CLS(Cumulative Layout Shift)问题定位
- 找出导致布局偏移的具体元素和代码位置
- 建议:为图片/视频设置明确的宽高、使用
aspect-ratioCSS 属性
Long Tasks(长任务)拆分建议
- 标记超过 50ms 的主线程任务
- 给出具体的函数和调用栈
- 建议:使用
setTimeout、requestIdleCallback、Web Worker 拆分任务
CrUX 数据对比(需要
--no-performance-crux未启用)- 将本地测试数据与真实用户数据对比
- 识别「在实验室很好,但在生产环境很差」的性能问题
AI 分析报告示例:
## 性能分析报告:https://developers.chrome.com
### 核心 Web 指标
- **LCP**: 2.8s(需要优化,目标 < 2.5s)
- **CLS**: 0.15(需要优化,目标 < 0.1)
- **INP**: 180ms(良好,目标 < 200ms)
### 问题 1:LCP 元素加载过慢
- **LCP 元素**: `<img src="hero-image.webp">`
- **原因**: 图片没有设置 `fetchpriority="high"`,且在 HTML 中位置太深
- **建议**:
1. 在 `<head>` 中添加 `<link rel="preload" as="image" href="hero-image.webp">`
2. 为 `<img>` 标签添加 `fetchpriority="high"` 属性
3. 考虑使用 AVIF 格式(比 WebP 小 20%)
### 问题 2:布局偏移(CLS)
- **偏移元素**: `.ad-container`(动态插入的广告容器)
- **原因**: 广告加载后插入到页面顶部,推挤了所有内容
- **建议**:
1. 为 `.ad-container` 设置明确的高度(CSS `height` 或 `aspect-ratio`)
2. 使用 `position: absolute` 或 `grid` 布局隔离广告区域
### 问题 3:长任务阻塞主线程
- **函数**: `app-bundle.js:1234` 中的 `processData()`
- **耗时**: 350ms
- **建议**:
1. 将数据分块处理(chunking)
2. 使用 `requestIdleCallback` 延迟非关键计算
3. 考虑将计算移到 Web Worker
### CrUX 数据对比
- 你的 LCP(2.8s)比 75% 的真实用户(1.2s)慢很多
- 建议在生产环境使用 Real User Monitoring(RUM)工具进一步分析
4.3 调试与诊断工具(8 个)
4.3.1 evaluate_script - 在浏览器中执行 JavaScript
功能:在页面上下文中执行任意 JavaScript 代码,并获取返回值。
实战场景:
// 场景 1:获取页面状态
const result = await mcpClient.callTool('evaluate_script', {
script: `
return {
title: document.title,
url: location.href,
cookies: document.cookie,
localStorage: JSON.stringify(localStorage),
};
`,
});
// 场景 2:注入调试辅助函数
await mcpClient.callTool('evaluate_script', {
script: `
window.__debugHelper = {
highlightElements(selector) {
document.querySelectorAll(selector).forEach(el => {
el.style.outline = '2px solid red';
});
},
};
`,
});
// 场景 3:与框架集成(React/Vue)
const reactState = await mcpClient.callTool('evaluate_script', {
script: `
// 获取 React 组件的状态(需要 React DevTools 已安装)
const reactFiber = document.querySelector('#root')._reactRootContainer._internalRoot.current;
return traverseFiber(reactFiber); // 自定义遍历函数
`,
});
4.3.2 take_screenshot - 智能截图
功能:截取页面截图,支持全页截图、元素截图、视口截图。
AI 调用示例:
用户:帮我截图整个页面,看看布局有没有问题
AI:调用 take_screenshot({ fullPage: true, savePath: "./screenshot.png" })
实战代码:
// 全页截图(自动滚动拼接)
await page.screenshot({
path: './full-page.png',
fullPage: true,
// 可选:指定设备缩放因子
deviceScaleFactor: 2, // 2x 高清截图
});
// 元素截图(只截取特定元素)
const element = await page.$('.hero-section');
await element.screenshot({
path: './hero.png',
});
// 视口截图(当前可见区域)
await page.screenshot({
path: './viewport.png',
clip: {
x: 0,
y: 0,
width: 1920,
height: 1080,
},
});
4.3.3 lighthouse_audit - 集成 Lighthouse 审计
功能:运行 Lighthouse 审计,生成 PWA、SEO、可访问性、性能报告。
实战代码:
const auditResult = await mcpClient.callTool('lighthouse_audit', {
url: 'https://developers.chrome.com',
// 可选:指定审计类别
categories: ['performance', 'accessibility', 'best-practices', 'seo', 'pwa'],
// 可选:设备模拟(mobile | desktop)
emulatedFormFactor: 'mobile',
// 可选:网络节流(模拟慢速网络)
throttling: {
rttMs: 150, // round-trip time
throughputKbps: 1638, // 带宽
cpuSlowdownMultiplier: 4, // CPU 降速倍数
},
});
// 解析审计结果
const { categories, audits } = auditResult;
console.log('性能得分:', categories.performance.score * 100);
console.log('可访问性得分:', categories.accessibility.score * 100);
// 获取具体审计项的详情
const renderBlockingResources = audits['render-blocking-resources'];
if (renderBlockingResources.score < 1) {
console.log('阻塞渲染的资源:', renderBlockingResources.details.items);
}
5. 集成实战:在 Claude Code、Cursor、VS Code 中配置与使用
5.1 Claude Code 集成(推荐)
Claude Code 是 Chrome DevTools MCP 的「一等公民」——它提供了最完整的集成体验。
5.1.1 安装方式一:CLI 安装(仅 MCP Server)
# 在终端中执行(确保已安装 Node.js v18+)
claude mcp add chrome-devtools --scope user npx chrome-devtools-mcp@latest
验证安装:
# 启动 Claude Code
claude
# 在 Claude Code 中输入以下命令检查 MCP 状态
/mcp list
# 应该看到类似输出:
# chrome-devtools: connected
# Tools: 47 available
5.1.2 安装方式二:Plugin 安装(MCP + Skills)
这是推荐的安装方式,因为它不仅安装了 MCP Server,还安装了「Skills」——预定义的专家级工具使用提示词。
安装步骤:
# 步骤 1:添加 Chrome DevTools MCP 的市场注册表
/plugin marketplace add ChromeDevTools/chrome-devtools-mcp
# 步骤 2:安装 Plugin
/plugin install chrome-devtools-mcp@chrome-devtools-plugins
# 步骤 3:重启 Claude Code
# macOS: Cmd+Q 退出,然后重新打开
# Linux/Windows: 关闭终端,重新启动
# 步骤 4:验证 Skills 已加载
/skills
# 应该看到类似输出:
# chrome-devtools-mcp:
# - performance-audit
# - debug-network-issue
# - automate-form-submission
# - ...
Skills 的价值:
Skills 是 Chrome DevTools MCP 团队提供的「专家经验封装」。例如,performance-audit Skill 会指导 AI:
- 先导航到目标页面
- 清除缓存和 Cookie(确保干净的环境)
- 开始录制 Performance Trace
- 模拟网络节流(3G 网络)
- 停止录制并分析
- 对比 CrUX 数据
- 生成优化建议报告
如果没有 Skills,AI 可能会「忘记」某些步骤,或者执行的顺序不对。
5.1.3 实战:让 Claude Code + Chrome DevTools MCP 自动修复 Bug
场景:你的网站在移动设备上有布局问题,但你看不到移动设备的渲染效果。
对话示例:
你:我的网站在移动设备上布局乱了,帮我排查一下。
URL: https://example.com
问题:按钮重叠,文字溢出
Claude:好的,我来帮你排查。
[Claude 自动执行以下步骤]
步骤 1: 调用 emulate 工具,模拟 iPhone 14 Pro
{
"device": "iPhone 14 Pro",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) ..."
}
步骤 2: 导航到页面
调用 navigate_page({ url: "https://example.com" })
步骤 3: 截图查看布局
调用 take_screenshot({ fullPage: true })
步骤 4: 检查移动端 CSS 是否加载
调用 evaluate_script({
script: `
const stylesheets = Array.from(document.styleSheets);
return stylesheets.map(s => s.href);
`
})
步骤 5: 发现没有加载移动端 CSS,检查 viewport meta 标签
调用 evaluate_script({
script: `
return document.querySelector('meta[name="viewport"]')?.content;
`
})
步骤 6: 发现问题!没有设置 viewport meta
返回:null
步骤 7: 给出修复建议
在你的 HTML <head> 中添加:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
步骤 8: 验证修复(假设你已经修复)
调用 navigate_page({ url: "https://example.com" })
调用 take_screenshot({ fullPage: true })
确认布局已正常
Claude:问题已找到!你的页面缺少 viewport meta 标签,
导致移动设备以桌面宽度渲染。添加上述标签即可修复。
5.2 Cursor 集成
Cursor 是另一个流行的 AI 编程助手,它也原生支持 MCP 协议。
安装步骤:
- 打开 Cursor 设置(快捷键:
Cmd+,或Ctrl+,) - 导航到
FeaturesMCP - 点击
+ Add MCP Server - 填写以下配置:
{
"name": "chrome-devtools",
"command": "npx",
"args": [
"-y",
"chrome-devtools-mcp@latest"
]
}
或者使用 Cursor 的一键安装链接(更方便):
https://cursor.com/en/install-mcp?name=chrome-devtools&config=eyJjb21tYW5kIjoibnB4IC15IGNocm9tZS1kZXZ0b29scy1tY3BAbGF0ZXN0In0=
验证安装:
在 Cursor 的聊天面板中输入:
Check the performance of https://developers.chrome.com
如果 Cursor 自动调用 Chrome DevTools MCP 工具并给出性能分析报告,说明安装成功。
5.3 VS Code + Copilot 集成
VS Code 的 Copilot Chat 也支持 MCP 协议(需要 VS Code 1.90+)。
5.3.1 安装方式一:Plugin 安装(推荐)
这是最方便的安装方式,一键安装 MCP Server + Skills。
安装步骤:
- 打开 VS Code 命令面板(
Cmd+Shift+P或Ctrl+Shift+P) - 搜索并执行:
Chat: Install Plugin From Source - 输入:
ChromeDevTools/chrome-devtools-mcp - 等待安装完成(需要网络连接)
- 重启 VS Code
验证安装:
打开 Copilot Chat(Cmd+I 或 Ctrl+I),输入:
Can you check the console errors on https://example.com?
Copilot 应该会自动调用 Chrome DevTools MCP 的 list_console_messages 工具。
5.3.2 安装方式二:手动配置 MCP Server
如果你无法使用 Plugin 安装(例如企业防火墙阻止),可以手动配置。
步骤:
打开 VS Code 的 MCP 配置文件
- macOS:
~/Library/Application Support/Code/User/settings.json - Windows:
%APPDATA%\Code\User\settings.json - Linux:
~/.config/Code/User/settings.json
- macOS:
添加以下配置:
{
"mcp": {
"servers": {
"chrome-devtools": {
"command": "npx",
"args": [
"-y",
"chrome-devtools-mcp@latest"
],
"env": {}
}
}
}
}
- 重启 VS Code
6. 生产级场景:自动化测试、性能分析、网络调试完全指南
6.1 场景一:E2E 自动化测试
传统 E2E 测试的痛点:
- 选择器脆弱(页面结构变化就失效)
- 等待机制不可靠(
sleep要么太长要么太短) - 错误排查困难(只能看到「超时」,看不到浏览器内部状态)
Chrome DevTools MCP 的优势:
- 智能选择器:支持 text 匹配、ARIA 标签、相对定位
- 自动等待:基于 Puppeteer 的智能等待(等待元素可见、可交互、动画完成)
- 完整上下文:测试失败时,自动截取屏幕截图、导出控制台消息、保存 DOM 快照
6.1.1 实战:为登录功能编写 E2E 测试
传统 Puppeteer 代码(脆弱、难维护):
// 传统方式:脆弱、难以维护
await page.goto('https://example.com/login');
await page.waitForSelector('#username'); // 如果 ID 变了就挂了
await page.type('#username', 'testuser');
await page.type('#password', 'password123');
await page.click('#login-btn');
await page.waitForNavigation(); // 不可靠的等待方式
AI + Chrome DevTools MCP 方式(智能、可维护):
你:帮我写一个登录功能的 E2E 测试。
URL: https://example.com/login
测试步骤:
1. 输入用户名「testuser」
2. 输入密码「password123」
3. 点击登录按钮
4. 验证登录成功后跳转到 /dashboard
Claude:好的,我来编写测试。
[Claude 自动生成以下测试代码]
## 测试代码(由 AI 生成)
describe('Login Flow E2E Test', () => {
it('should login successfully with valid credentials', async () => {
// 步骤 1: 导航到登录页
await mcpClient.callTool('navigate_page', {
url: 'https://example.com/login',
waitUntil: 'networkidle', // 等待网络请求完成
});
// 步骤 2: 填写表单(使用语义化选择器)
await mcpClient.callTool('fill_form', {
fields: [
{
selector: 'input[name="username"], input[type="text"]',
value: 'testuser',
},
{
selector: 'input[name="password"], input[type="password"]',
value: 'password123',
},
],
submitSelector: 'button[type="submit"], button:has-text("登录")',
});
// 步骤 3: 等待导航完成(智能等待)
await mcpClient.callTool('wait_for', {
condition: 'navigation',
timeout: 10000,
});
// 步骤 4: 验证跳转成功
const currentUrl = await mcpClient.callTool('evaluate_script', {
script: 'return location.href;',
});
expect(currentUrl).toContain('/dashboard');
// 步骤 5: 截图保存测试证据
await mcpClient.callTool('take_screenshot', {
fullPage: true,
savePath: './test-evidence/login-success.png',
});
});
// 错误处理:测试失败时自动保存调试信息
afterEach(async () => {
if (testFailed) {
// 保存控制台错误
const consoleMessages = await mcpClient.callTool('list_console_messages', {
level: 'error',
});
fs.writeFileSync('./test-evidence/console-errors.json', JSON.stringify(consoleMessages));
// 保存 DOM 快照
await mcpClient.callTool('take_snapshot', {
savePath: './test-evidence/dom-snapshot.html',
});
}
});
});
关键优势:
- 语义化选择器:
button:has-text("登录")比#login-btn更健壮 - 智能等待:
wait_for({ condition: 'navigation' })比sleep(5000)更可靠 - 自动调试信息:测试失败时自动保存截图、控制台消息、DOM 快照
6.2 场景二:性能监控与持续优化
传统性能监控的痛点:
- 手动跑 Lighthouse 费时费力
- 无法集成到 CI/CD 流水线
- 性能回归难以追溯
Chrome DevTools MCP 的解决方案:
可以编写 AI 驱动的自动化性能监控脚本,集成到 CI/CD 中。
6.2.1 实战:CI/CD 中的自动化性能监控
GitHub Actions 配置示例:
# .github/workflows/performance-monitor.yml
name: Performance Monitor
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
performance-audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '20'
- name: Install Chrome DevTools MCP
run: npx -y chrome-devtools-mcp@latest --version
- name: Run Performance Audit
run: |
node scripts/performance-audit.js
env:
MCP_SERVER: chrome-devtools-mcp
- name: Upload Performance Report
uses: actions/upload-artifact@v3
with:
name: performance-report
path: ./performance-report/
- name: Check Performance Budget
run: |
node scripts/check-performance-budget.js
性能审计脚本(scripts/performance-audit.js):
import { MCPClient } from 'chrome-devtools-mcp/client';
const mcp = new MCPClient();
async function auditPerformance(url) {
// 步骤 1: 启动性能录制
await mcp.callTool('performance_start_trace', {
categories: ['devtools.timeline', 'blink.user_timing'],
});
// 步骤 2: 导航到页面
await mcp.callTool('navigate_page', { url });
// 步骤 3: 等待页面完全加载
await mcp.callTool('wait_for', {
condition: 'networkidle',
timeout: 30000,
});
// 步骤 4: 停止录制并分析
const insight = await mcp.callTool('performance_analyze_insight', {});
// 步骤 5: 生成报告
const report = {
url,
timestamp: new Date().toISOString(),
metrics: {
LCP: insight.lcp.value,
CLS: insight.cls.value,
INP: insight.inp.value,
},
suggestions: insight.suggestions,
};
fs.writeFileSync('./performance-report/report.json', JSON.stringify(report, null, 2));
// 步骤 6: 检查性能预算
const budget = {
LCP: 2500, // 2.5s
CLS: 0.1,
INP: 200, // 200ms
};
const violations = [];
if (report.metrics.LCP > budget.LCP) {
violations.push(`LCP 超标: ${report.metrics.LCP}ms > ${budget.LCP}ms`);
}
if (report.metrics.CLS > budget.CLS) {
violations.push(`CLS 超标: ${report.metrics.CLS} > ${budget.CLS}`);
}
if (violations.length > 0) {
console.error('性能预算超标!');
violations.forEach(v => console.error(` - ${v}`));
process.exit(1); // 阻断合并
}
}
auditPerformance('https://example.com');
6.3 场景三:网络调试与 API 调用追踪
实战:调试慢速 API 请求
你:我的页面加载很慢,怀疑是某个 API 请求太慢,帮我排查一下。
URL: https://example.com/dashboard
Claude:好的,我来帮你分析网络请求。
[Claude 自动执行以下步骤]
步骤 1: 开始网络录制
调用 list_network_requests({ clear: true })
步骤 2: 导航到页面
调用 navigate_page({ url: "https://example.com/dashboard" })
步骤 3: 等待页面加载完成
调用 wait_for({ condition: "networkidle" })
步骤 4: 获取所有网络请求
调用 list_network_requests()
步骤 5: 分析慢速请求
返回:
[
{
"url": "https://api.example.com/users",
"method": "GET",
"status": 200,
"timing": {
"startTime": 1000,
"endTime": 4500, // 耗时 3.5 秒!
"ttfb": 3200, // Time to First Byte: 3.2 秒
},
"size": "2.3 MB", // 响应体太大
},
// ... 其他请求
]
步骤 6: 深入分析慢速请求
调用 get_network_request({
requestId: "req_123456",
includeTiming: true,
includeRequestBody: true,
includeResponseBody: true,
})
步骤 7: 识别问题
返回:
{
"request": {
"url": "https://api.example.com/users",
"headers": {
"Authorization": "Bearer ...",
},
},
"response": {
"headers": {
"Content-Type": "application/json",
"Cache-Control": "no-cache", // 没有缓存!
},
"body": {
// 返回了 10,000 条用户记录,但页面只显示了 20 条
"users": [...],
"total": 10000,
},
},
"timing": {
"dns": 20,
"connection": 50,
"ssl": 100,
"ttfb": 3200, // 服务器处理时间太长
"download": 800,
},
}
步骤 8: 给出优化建议
Claude:我找到了问题!
1. API 返回了全部 10,000 条用户记录,但页面只显示 20 条
建议:添加分页参数 `?page=1&limit=20`
2. 服务器 TTFB 为 3.2 秒,说明服务器端查询太慢
建议:为 `users` 表添加索引,或者引入缓存(Redis)
3. 响应体大小为 2.3 MB,没有启用压缩
建议:在服务器启用 Gzip/Brotli 压缩
4. 没有设置 Cache-Control
建议:对于不经常变化的数据,设置 `Cache-Control: max-age=300`
7. 高级技巧:连接已有浏览器会话、性能 CrUX 数据、无头模式优化
7.1 连接已有浏览器会话(复用登录态)
痛点:你的网站需要登录才能访问,但自动化测试每次都要重新登录(慢、而且可能触发验证码)。
解决方案:让 Chrome DevTools MCP 连接到你已经登录的浏览器会话。
7.1.1 步骤(macOS/Linux)
# 步骤 1: 完全关闭 Chrome(很重要!)
# macOS
killall "Google Chrome"
# Linux
killall chrome
# 步骤 2: 启动一个调试模式的 Chrome
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--remote-debugging-port=9222 \
--user-data-dir=/tmp/chrome-debug
# 参数说明:
# --remote-debugging-port=9222: 启用 CDP,监听 9222 端口
# --user-data-dir=/tmp/chrome-debug: 使用独立的用户数据目录
# (避免与你日常使用的 Chrome 冲突)
# 步骤 3: 手动登录你的网站
# 在打开的 Chrome 窗口中,正常登录你的网站
# 登录成功后,Cookie 会保存在 /tmp/chrome-debug 目录中
# 步骤 4: 配置 Chrome DevTools MCP 连接到这个浏览器
# 在 MCP 配置中添加:
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": [
"-y",
"chrome-devtools-mcp@latest",
"--browser-url=http://127.0.0.1:9222"
]
}
}
}
7.1.2 在 Claude Code 中使用
你:帮我测试一下登录后的 dashboard 页面,我不想重新登录。
Claude:好的,我会连接到你已经登录的浏览器会话。
[Claude 自动执行]
步骤 1: 连接到已有的浏览器(--browser-url=http://127.0.0.1:9222)
步骤 2: 导航到 dashboard 页面
步骤 3: 验证登录态(检查页面上是否显示用户名)
步骤 4: 执行你的测试步骤
7.2 集成 CrUX 数据(真实用户性能数据)
什么是 CrUX?
CrUX(Chrome User Experience Report)是 Google 提供的真实用户性能数据集。它收集了数百万 Chrome 用户的实际页面加载性能。
为什么 CrUX 重要?
- 实验室数据(Lighthouse、Performance Trace)只能模拟「理想情况」
- 真实用户可能使用慢速设备、弱网环境
- CrUX 数据可以帮你发现「在实验室很好,但在生产环境很差」的问题
如何启用 CrUX 集成?
默认情况下,Chrome DevTools MCP 会向 CrUX API 发送请求(需要网络连接)。
如果你不想发送数据给 Google,可以使用 --no-performance-crux 参数:
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": [
"-y",
"chrome-devtools-mcp@latest",
"--no-performance-crux" // 禁用 CrUX
]
}
}
}
CrUX 数据分析示例:
// 当你调用 performance_analyze_insight 时,
// 如果启用了 CrUX,报告会包含以下对比数据:
{
"metrics": {
"LCP": {
"lab": 2800, // 你的测试环境:2.8 秒
"crux": {
"p75": 1200, // 真实用户的 75 分位:1.2 秒
"p90": 3500, // 真实用户的 90 分位:3.5 秒
"density": "mostly-fast", // 大部分用户很快
}
}
},
"analysis": [
"你的 LCP(2.8s)比 75% 的真实用户(1.2s)慢很多。",
"建议在生产环境使用 RUM 工具进一步分析慢速用户的具体情况。",
"可能的原因:",
" 1. 你的测试环境网络太快(真实用户可能在 3G 网络)",
" 2. 你的测试设备性能太好(真实用户可能用低端手机)",
"建议:在 Lighthouse 中启用网络节流和设备模拟,重新测试。",
],
}
7.3 无头模式(Headless)优化
什么是无头模式?
无头模式(Headless)是指浏览器在后台运行,不显示图形界面。它常用于 CI/CD 环境、服务器端渲染。
Chrome DevTools MCP 的无头模式配置:
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": [
"-y",
"chrome-devtools-mcp@latest",
"--headless", // 启用无头模式
"--no-sandbox", // 在 Docker 中需要
"--disable-gpu", // 无头模式不需要 GPU
"--disable-dev-shm-usage" // 解决 Docker 中的共享内存问题
]
}
}
}
无头模式的性能优化技巧:
- 禁用图片加载(加快页面加载速度)
// 在 Puppeteer 层面拦截请求
await page.setRequestInterception(true);
page.on('request', (req) => {
if (req.resourceType() === 'image') {
req.abort(); // 阻止图片加载
} else {
req.continue();
}
});
- 使用
--slim模式(Chrome DevTools MCP 的轻量级模式)
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": [
"-y",
"chrome-devtools-mcp@latest",
"--slim", // 只暴露基础工具(减少内存占用)
"--headless"
]
}
}
}
--slim 模式只暴露以下工具:
- 输入自动化:4 个工具(click、fill、navigate_page、screenshot)
- 适合简单的自动化任务(不需要性能分析、内存分析等功能)
8. 与其他方案对比:CDP、Puppeteer、Playwright、Selenium 的技术选型
8.1 技术对比矩阵
| 维度 | 纯 CDP | Puppeteer | Playwright | Selenium | Chrome DevTools MCP |
|---|---|---|---|---|---|
| 学习曲线 | 陡峭(需要理解 CDP 协议) | 中等 | 中等 | 低(但 API 陈旧) | 低(AI 自动生成代码) |
| AI 集成 | 需要自己写桥接代码 | 需要自己写桥接代码 | 需要自己写桥接代码 | 需要自己写桥接代码 | 原生支持(MCP 协议) |
| 等待机制 | 手动处理事件 | 智能等待(自动等待元素) | 智能等待(最强大) | 脆弱(sleep 或显式等待) | 智能等待(基于 Puppeteer) |
| 跨浏览器 | 只支持 Chrome/Edge | 只支持 Chrome/Edge | Chrome/Firefox/Safari | 所有浏览器 | 目前只支持 Chrome/Edge |
| 性能分析 | 需要手动分析 Trace | 不支持 | 不支持 | 不支持 | 原生支持(集成 DevTools) |
| 网络拦截 | 支持(CDP Fetch domain) | 支持 | 支持(最强大) | 支持(但需要代理) | 支持(2 个工具) |
| 移动端模拟 | 支持(CDP Emulation domain) | 支持 | 支持 | 支持 | 支持(2 个工具) |
| 社区生态 | 小(只有 Chrome 团队维护) | 大 | 大 | 最大 | 增长中(44k+ Stars) |
8.2 什么时候选 Chrome DevTools MCP?
选择 Chrome DevTools MCP 的场景:
你已经在使用 AI 编程助手(Claude Code、Cursor、VS Code Copilot)
- MCP 协议让 AI 自动调用浏览器工具,无需手动编写测试代码
你需要深度性能分析
- Chrome DevTools MCP 集成了 Chrome DevTools Performance 面板的完整能力
- 可以自动分析 Trace 并给出优化建议(AI 驱动)
你的项目只需要在 Chrome/Edge 中运行
- 如果不需要跨浏览器测试,Chrome DevTools MCP 是最佳选择
选择 Playwright 的场景:
- 你需要跨浏览器测试(Chrome + Firefox + Safari)
- 你需要更强大的网络拦截能力(例如:修改请求/响应、模拟 API)
- 你已经有自己的测试框架(不需要 AI 生成代码)
选择 Selenium 的场景:
- 你需要支持非常老的浏览器(IE11、旧版 Firefox)
- 你的团队已经熟悉 Selenium WebDriver API
8.3 迁移指南:从 Puppeteer 到 Chrome DevTools MCP
如果你已经有 Puppeteer 测试代码,如何迁移到 Chrome DevTools MCP?
好消息:Chrome DevTools MCP 内部就是基于 Puppeteer 的,所以你可以渐进式迁移。
步骤:
- 保留现有的 Puppeteer 代码(不需要一次性重写)
- 在需要 AI 辅助的地方,调用 Chrome DevTools MCP 工具
// 老代码:纯 Puppeteer
await page.goto('https://example.com');
await page.click('#login');
// ... 100 行测试代码
// 新代码:Puppeteer + Chrome DevTools MCP
// 在需要 AI 辅助的地方,通过 MCP 调用
const mcp = new MCPClient();
// 让 AI 自动生成测试数据
const testData = await mcp.callTool('ai_generate_test_data', {
scenario: 'login with invalid password',
});
// 让 AI 自动分析测试失败原因
if (testFailed) {
const analysis = await mcp.callTool('analyze_test_failure', {
screenshot: await page.screenshot(),
consoleMessages: await page.evaluate(() => monitor.getLogs()),
});
console.log('失败原因:', analysis.reason);
console.log('修复建议:', analysis.suggestion);
}
9. 源码解析:关键模块与扩展开发
9.1 如何扩展 Chrome DevTools MCP(开发自己的工具)
Chrome DevTools MCP 是基于 MIT 协议开源的,你可以轻松扩展它。
9.1.1 开发自定义工具的完整流程
场景:你想添加一个自定义工具 check_seo_meta,用于检查页面的 SEO meta 标签是否完整。
步骤 1:创建工具实现文件
// src/tools/seo/check-seo-meta.ts
import { z } from 'zod'; // Chrome DevTools MCP 使用 Zod 进行参数校验
export const checkSeoMetaTool = {
name: 'check_seo_meta',
description: '检查页面的 SEO meta 标签是否完整(title、description、OG tags)',
// 定义工具的参数(使用 Zod Schema)
inputSchema: z.object({
pageUrl: z.string().url().optional(), // 可选:指定要检查的页面 URL
}),
// 工具的执行逻辑
handler: async (args, context: MCPContext) => {
const page = await context.getActivePage();
// 如果指定了 URL,先导航
if (args.pageUrl) {
await page.goto(args.pageUrl);
}
// 执行 SEO 检查
const seoReport = await page.evaluate(() => {
const report = {
title: {
content: document.title,
length: document.title.length,
pass: document.title.length >= 10 && document.title.length <= 60,
},
description: {
content: document.querySelector('meta[name="description"]')?.content,
length: document.querySelector('meta[name="description"]')?.content?.length || 0,
pass: false,
},
ogTags: {
ogTitle: document.querySelector('meta[property="og:title"]')?.content,
ogDescription: document.querySelector('meta[property="og:description"]')?.content,
ogImage: document.querySelector('meta[property="og:image"]')?.content,
pass: false,
},
};
// 检查 description 长度
report.description.pass = report.description.length >= 50 && report.description.length <= 160;
// 检查 OG tags 是否完整
report.ogTags.pass = !!(report.ogTags.ogTitle && report.ogTags.ogDescription && report.ogTags.ogImage);
return report;
});
// 返回结果(MCP 协议格式)
return {
content: [
{
type: 'text',
text: JSON.stringify(seoReport, null, 2),
},
],
};
},
};
步骤 2:注册工具
// src/mcp-server/tool-registry.ts
import { checkSeoMetaTool } from '../tools/seo/check-seo-meta.js';
export function registerAllTools(server: MCPServer) {
// ... 已有的工具注册
// 注册你的自定义工具
registerTool(server, checkSeoMetaTool.name, checkSeoMetaTool);
}
步骤 3:编译并测试
# 编译 TypeScript
npm run build
# 启动 MCP Server(开发模式,支持热重载)
npm run dev
# 在 Claude Code 中测试
claude
> 帮我检查 https://example.com 的 SEO meta 标签
9.1.2 提交 PR 到官方仓库
如果你的自定义工具足够通用,可以考虑提交 PR 到官方仓库:
- Fork 官方仓库:https://github.com/ChromeDevTools/chrome-devtools-mcp
- 创建功能分支:
git checkout -b feature/check-seo-meta - 提交你的代码(遵循现有的代码风格)
- 添加测试用例(
test/tools/seo/check-seo-meta.test.ts) - 提交 PR 并等待 Review
9.2 关键模块源码解析
9.2.1 DevToolsConnectionAdapter.ts - CDP 连接适配器
这个模块负责管理 Chrome DevTools Protocol 的 WebSocket 连接。
核心功能:
- 自动重连:CDP WebSocket 连接断开后自动重连
- 请求队列:CDP 命令是异步的,需要维护一个请求队列和响应映射
- 事件分发:CDP 的事件(如
Page.loadEventFired)需要分发给所有订阅者
简化版源码:
export class DevToolsConnectionAdapter {
private ws?: WebSocket;
private requestId = 0;
private pendingRequests = new Map<number, {
resolve: (value: any) => void;
reject: (error: Error) => void;
}>();
private eventListeners = new Map<string, Set<(params: any) => void>>();
// 发送 CDP 命令
async send<T>(method: string, params?: any): Promise<T> {
const id = ++this.requestId;
return new Promise((resolve, reject) => {
// 将请求加入待处理队列
this.pendingRequests.set(id, { resolve, reject });
// 发送 JSON-RPC 格式的 CDP 命令
this.ws.send(JSON.stringify({
id,
method,
params,
}));
// 设置超时
setTimeout(() => {
if (this.pendingRequests.has(id)) {
this.pendingRequests.delete(id);
reject(new Error(`CDP command timeout: ${method}`));
}
}, 30000);
});
}
// 处理 CDP 响应
private handleMessage(message: string) {
const data = JSON.parse(message);
if (data.id) {
// 这是命令响应
const pending = this.pendingRequests.get(data.id);
if (pending) {
this.pendingRequests.delete(data.id);
if (data.error) {
pending.reject(new Error(data.error.message));
} else {
pending.resolve(data.result);
}
}
} else if (data.method) {
// 这是事件通知
const listeners = this.eventListeners.get(data.method);
if (listeners) {
listeners.forEach(listener => listener(data.params));
}
}
}
// 订阅 CDP 事件
on(event: string, listener: (params: any) => void) {
if (!this.eventListeners.has(event)) {
this.eventListeners.set(event, new Set());
// 第一次订阅时,通知 Chrome 启用事件
const domain = event.split('.')[0]; // 例如:Page.loadEventFired Page
this.send(`${domain}.enable`);
}
this.eventListeners.get(event)!.add(listener);
}
}
9.2.2 PageCollector.ts - 页面数据收集器
这个模块负责收集页面的各种数据(DOM、控制台消息、网络请求)。
核心功能:
- DOM 快照:获取页面的完整 DOM 树(用于 AI 分析页面结构)
- 控制台消息收集:捕获
console.log、console.error等输出 - 网络请求记录:记录所有网络请求的时序和大小
关键代码片段:
export class PageCollector {
private consoleMessages: ConsoleMessage[] = [];
private networkRequests = new Map<string, NetworkRequest>();
// 开始收集数据
async startCollecting(page: Page) {
// 1. 监听控制台消息
page.on('console', (msg) => {
this.consoleMessages.push({
type: msg.type(), // 'log' | 'error' | 'warn' | 'info'
text: msg.text(),
location: msg.location(), // 文件名 + 行号(支持 source map)
timestamp: Date.now(),
});
});
// 2. 监听网络请求
page.on('request', (req) => {
this.networkRequests.set(req.url(), {
url: req.url(),
method: req.method(),
headers: req.headers(),
startTime: Date.now(),
});
});
page.on('response', (res) => {
const request = this.networkRequests.get(res.url());
if (request) {
request.status = res.status();
request.endTime = Date.now();
request.size = res.headers()['content-length'];
}
});
}
// 获取收集到的数据(供 MCP 工具使用)
getCollectedData() {
return {
consoleMessages: this.consoleMessages,
networkRequests: Array.from(this.networkRequests.values()),
domSnapshot: () => this.getDomSnapshot(),
};
}
// 获取 DOM 快照(用于 AI 分析)
private async getDomSnapshot() {
// 使用 CDP 的 DOM.getDocument 获取完整 DOM 树
const { root } = await this.cdpClient.send('DOM.getDocument', {
depth: -1, // 获取完整深度
pierce: true, // 穿透 Shadow DOM
});
// 转换为 AI 友好的格式(简化版 DOM 树)
return this.simplifyDomTree(root);
}
}
10. 总结与展望:AI 原生浏览器自动化的未来
10.1 Chrome DevTools MCP 的技术价值
Chrome DevTools MCP 的出现,标志着 AI 编程助手从「代码生成」到「代码 + 运行时反馈」的质变。
它的核心价值在于:
填补了 AI 编程的「盲区」
- AI 不再只是「猜测」代码效果,而是能够「看到」真实的浏览器渲染结果
- 这极大地提高了 AI 生成代码的质量和可靠性
降低了浏览器自动化的门槛
- 传统浏览器自动化需要手写大量脆弱的选择器和等待逻辑
- Chrome DevTools MCP + AI 让开发者用自然语言描述测试步骤,AI 自动生成可靠的自动化代码
将 Chrome DevTools 的专业能力赋予 AI
- 性能分析、内存分析、网络调试等原本需要专家经验的能力
- 现在 AI 可以通过 MCP 工具自动执行,并给出专家建议
10.2 当前限制与未来演进
当前限制:
只支持 Chrome/Edge
- 如果你需要跨浏览器测试,仍需使用 Playwright 或 Selenium
需要 Node.js 环境
- 对于非 JavaScript 技术栈的团队,引入 Node.js 可能增加复杂度
性能开销
- 启动 MCP Server 和浏览器实例需要一定时间(约 3-5 秒)
- 对于需要极快反馈的场景(如单元测试),可能不太适合
未来演进方向(根据官方 Roadmap 和社区讨论):
更多工具的加入
- 官方计划将工具数量从 47 个扩展到 60+ 个
- 重点增强:网络拦截与修改、高级手势支持、跨页面数据提取
实时性能监控
- 目前是「录制 Trace 停止 分析」的离线模式
- 未来可能支持「实时性能监控」,持续跟踪页面性能并自动报警
跨浏览器支持
- 社区已经有讨论:是否应该支持 Firefox 的 DevTools Protocol
- 这可能依赖于 Firefox 团队是否愿意实现兼容 CDP 的协议
与更多 AI 编程助手集成
- 目前主要支持 Claude Code、Cursor、VS Code
- 未来可能支持:JetBrains AI Assistant、Amazon CodeWhisperer、百度 Comate 等
10.3 实践建议
对于前端开发者:
立即试用 Chrome DevTools MCP
- 如果你已经在使用 Claude Code 或 Cursor,安装 Chrome DevTools MCP 只需 1 分钟
- 尝试用自然语言描述测试步骤,体验 AI 自动生成自动化代码
将其集成到你的开发流程中
- 本地开发时:用 Chrome DevTools MCP 快速验证 UI 改动
- Code Review 时:让 AI 自动检查 PR 是否引入了性能回归
- CI/CD 中:集成自动化性能监控(参考本文第 6.2 节)
对于 AI 编程助手开发者:
考虑集成 Chrome DevTools MCP
- 如果你的 AI 编程助手还没有浏览器控制能力,Chrome DevTools MCP 是一个完美的起点
- MCP 协议的标准化使得集成非常简单(只需实现一个 MCP Client)
贡献开源社区
- Chrome DevTools MCP 是开源项目,欢迎提交 PR
- 特别是:如果你有 CDP 协议的使用经验,可以帮助添加更多高级工具
附录:完整工具列表(47 个)
输入自动化(10 个)
click- 点击元素drag- 拖拽元素fill- 填写输入框fill_form- 批量填写表单handle_dialog- 处理浏览器对话框(alert/confirm/prompt)hover- 悬停在元素上press_key- 按下键盘按键type_text- 输入文本(模拟键盘输入)upload_file- 上传文件click_at- 点击指定坐标
导航自动化(6 个)
close_page- 关闭标签页list_pages- 列出所有标签页navigate_page- 导航到 URLnew_page- 打开新标签页select_page- 切换到指定标签页wait_for- 等待条件满足(元素出现、导航完成等)
仿真与设备模拟(2 个)
emulate- 模拟设备(iPhone、iPad 等)resize_page- 调整视口大小
性能分析(3 个)
performance_start_trace- 开始录制 Performance Traceperformance_stop_trace- 停止录制并保存 Traceperformance_analyze_insight- 分析 Trace 并给出优化建议
网络调试(2 个)
get_network_request- 获取指定网络请求的详情list_network_requests- 列出所有网络请求
调试与诊断(8 个)
evaluate_script- 在页面上下文中执行 JavaScriptget_console_message- 获取指定的控制台消息lighthouse_audit- 运行 Lighthouse 审计list_console_messages- 列出所有控制台消息take_screenshot- 截取页面截图take_snapshot- 保存 DOM 快照screencast_start- 开始录制屏幕(screencast)screencast_stop- 停止录制屏幕
内存分析(9 个)
take_heapsnapshot- 拍摄堆快照close_heapsnapshot- 关闭堆快照get_heapsnapshot_class_nodes- 获取指定类的所有对象get_heapsnapshot_details- 获取对象的详细信息get_heapsnapshot_dominators- 获取支配树(内存泄漏分析)get_heapsnapshot_edges- 获取对象的引用边get_heapsnapshot_retainers- 获取保留路径(为什么对象没有被 GC)get_heapsnapshot_retaining_paths- 获取所有保留路径get_heapsnapshot_summary- 获取堆内存摘要
扩展管理(5 个)
install_extension- 安装 Chrome 扩展list_extensions- 列出已安装的扩展reload_extension- 重新加载扩展(用于扩展开发)trigger_extension_action- 触发扩展的 browser actionuninstall_extension- 卸载扩展
第三方工具(2 个)
execute_3p_developer_tool- 执行第三方 DevTools 工具- (预留 for future expansion)
参考资源
- 官方 GitHub 仓库: https://github.com/ChromeDevTools/chrome-devtools-mcp
- Chrome DevTools 官方文档: https://developer.chrome.com/docs/devtools
- MCP 协议规范: https://modelcontextprotocol.io
- Puppeteer 文档: https://pptr.dev
- CDP 协议参考: https://chromedevtools.github.io/devtools-protocol
文章结束
作者寄语:Chrome DevTools MCP 代表了 AI 编程工具链的未来方向——让 AI 不再只是「代码生成器」,而是真正能够理解代码运行时行为的「编程伙伴」。如果你还没有尝试过,现在就是最好的时机。