万字深度解析 Chrome DevTools MCP:当 AI Agent 遇见浏览器自动化——从 MCP 协议架构到生产级 Web 调试的完整技术指南(2026)
AI 编程助手终于有了「眼睛」和「手」——Chrome DevTools MCP 让 Claude Code、Cursor、Copilot 等 AI Agent 能够直接控制浏览器、分析性能、调试代码,彻底改变了前端开发和 Web 自动化的工作流。
摘要
2026 年,Anthropic 与 Google Chrome DevTools 团队联合发布的 chrome-devtools-mcp(44.6K GitHub Stars)正式将浏览器自动化能力赋予 AI 编程助手。作为 Model Context Protocol(MCP)生态中的官方服务器实现,它让 AI Agent 能够通过标准化的 MCP 协议直接调用 Chrome DevTools 的全部能力:从基础的页面导航、元素点击、表单填写,到深度的性能分析、内存泄漏检测、网络请求监控。
本文将从 MCP 协议的技术本质出发,深入解析 Chrome DevTools MCP 的架构设计、42 个工具的技术实现、与 Puppeteer 的集成原理,以及在 Claude Code、Cursor、VS Code Copilot 等主流 AI 编程工具中的完整配置与实战代码。无论你是前端开发者、AI 工具链构建者,还是 Web 自动化工程师,这篇文章都将帮助你掌握这一颠覆性工具的技术全貌。
第一章:为什么 AI Agent 需要浏览器控制能力?
1.1 传统 AI 编程助手的「盲点」
在 Chrome DevTools MCP 出现之前,AI 编程助手(如 Claude Code、GitHub Copilot)在处理 Web 开发任务时存在本质缺陷:
场景一:前端代码调试
开发者:帮我修复这个 React 组件的点击事件问题
AI:让我看看代码...(只能看到源代码,无法看到运行时状态)
AI:你可能需要在 handleClick 函数中添加 e.preventDefault()...
(实际上问题是 CSS 的 z-index 导致元素被遮挡,AI 无法看到渲染结果)
场景二:Web 功能测试
开发者:测试一下登录流程是否正常工作
AI:我可以帮你检查代码逻辑...(无法直接操作浏览器验证)
AI:从代码来看,登录逻辑应该没问题...
(实际上 API 接口已变更,代码逻辑正确但运行时失败)
场景三:性能优化建议
开发者:我的页面加载很慢,帮我分析一下
AI:我可以帮你审查代码...(无法获取真实的性能数据)
AI:建议使用代码分割和懒加载...
(实际上性能瓶颈是未优化的图片资源和过多的第三方脚本)
这些场景的共同点是:AI 只能「读代码」,无法「看结果」。这种分离导致 AI 助手给出的建议往往流于表面,无法触及运行时的问题本质。
1.2 浏览器自动化的技术演进
浏览器自动化技术经历了三个阶段的演进:
第一阶段:Selenium(2004-2015)
- 基于 WebDriver 协议
- 通过 HTTP 请求控制浏览器
- 配置复杂,跨浏览器兼容性差
- 主要面向测试工程师
第二阶段:Puppeteer + Playwright(2017-2024)
- 提供原生 JavaScript/TypeScript API
- 直接通过 DevTools Protocol 控制 Chrome
- 性能更好,API 更友好
- 但仍然是「命令式」的——需要手写自动化脚本
第三阶段:AI 驱动的自动化(2025-至今)
- AI Agent 理解自然语言指令
- 自动生成和执行浏览器操作
- 自适应页面变化(不需要脆弱的选择器)
- Chrome DevTools MCP 正是这一阶段的标志性产物
1.3 MCP 协议:AI 与外部工具的「USB 接口」
要理解 Chrome DevTools MCP 的革命性,必须先理解 Model Context Protocol(MCP)。
MCP 是 Anthropic 于 2024 年 11 月发布的开放标准协议,旨在解决一个核心问题:
如何让 AI 模型以标准化方式连接和调用外部工具、数据源和服务?
在 MCP 之前,每个 AI 应用都需要自定义工具集成方式:
- Claude Code 有自己的插件系统
- Cursor 有自己的一套 Extension API
- GitHub Copilot 又是另一套
这导致工具开发者需要为每个孩子 AI 平台单独开发集成,碎片化严重。
MCP 的出现统一了这个局面,它定义了:
- 工具声明协议:服务器如何告诉 AI「我能提供哪些能力」
- 工具调用协议:AI 如何请求执行某个工具
- 结果返回协议:工具执行结果如何返回给 AI
- 资源访问协议:如何访问文件、数据库等外部资源
类比理解:MCP 就像是 AI 世界的 USB 标准。
- USB 定义了设备如何与计算机通信
- 任何支持 USB 的设备(鼠标、键盘、U 盘)都能插到任何支持 USB 的计算机上
- 同样,任何实现 MCP 协议的工具都能被任何支持 MCP 的 AI Agent 调用
Chrome DevTools MCP 就是这样一个「USB 设备」——它封装了浏览器控制能力,通过标准的 MCP 协议暴露给 AI Agent。
第二章:Chrome DevTools MCP 架构深度解析
2.1 整体架构概览
Chrome DevTools MCP 采用经典的 Client-Server 架构,但基于 MCP 协议进行通信。
┌─────────────────────────────────────────────────────────────┐
│ AI Coding Agent │
│ (Claude Code / Cursor / Copilot / Antigravity) │
└────────────────────┬────────────────────────────────────────┘
│ MCP Protocol (stdio/HTTP)
▼
┌─────────────────────────────────────────────────────────────┐
│ Chrome DevTools MCP Server │
│ (Node.js + @anthropic-ai/chrome-devtools-mcp) │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ MCP Tool Registry (42 tools) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────────┼───────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Puppeteer │ │ Chrome Dev │ │ Lighthouse │ │
│ │ Controller │ │ Tools Protocol│ │ Integration│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└────────────────────┬────────────────────────────────────────┘
│ DevTools Protocol (WebSocket)
▼
┌─────────────────────────────────────────────────────────────┐
│ Google Chrome Browser │
│ (独立进程,可被多个 MCP 会话共享) │
└─────────────────────────────────────────────────────────────┘
关键设计决策:
为什么用 Puppeteer 而不是 Playwright?
- Puppeteer 是 Google Chrome 团队官方维护的项目
- 与 Chrome DevTools Protocol(CDP)的原生集成更好
- 对 Chrome 新特性的支持更及时
- Chrome DevTools MCP 团队来自 Google,维护一致性更容易
为什么用 MCP 协议而不是自定义插件?
- 跨 AI 平台兼容(一次开发,到处运行)
- 标准化工具声明和调用格式
- 社区生态更丰富(已有数百个 MCP 服务器)
为什么浏览器实例可以共享?
- Chrome 支持远程调试协议(--remote-debugging-port)
- 多个 Puppeteer 实例可以连接到同一个 Chrome 进程
- 这允许 AI Agent 和用户手动操作共享同一个浏览器窗口
2.2 MCP Server 启动流程详解
让我们通过源码级的解析来理解 MCP Server 的启动过程。
Step 1: CLI 入口解析
// 源码位置: src/cli.ts
import yargs from 'yargs';
import { hideBin } from 'yargs/helpers';
const argv = yargs(hideBin(process.argv))
.option('slim', {
type: 'boolean',
description: 'Enable slim mode with reduced tools',
default: false,
})
.option('headless', {
type: 'boolean',
description: 'Run browser in headless mode',
default: false,
})
.option('browser-url', {
type: 'string',
description: 'Connect to existing browser instance',
default: null,
})
.option('no-usage-statistics', {
type: 'boolean',
description: 'Opt-out of usage statistics collection',
default: false,
})
.option('no-performance-crux', {
type: 'boolean',
description: 'Disable CrUX API calls for performance analysis',
default: false,
})
.parseSync();
关键配置参数解析:
--slim:精简模式,只暴露 10 个核心工具(适合轻量级任务)--headless:无头模式,适合 CI/CD 环境--browser-url:连接到已有的 Chrome 实例(如 Antigravity 的内置浏览器)--no-usage-statistics:退出匿名使用统计(Google 会收集工具调用成功率、延迟等指标)
Step 2: MCP Server 初始化
// 源码位置: src/mcp-server.ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new Server(
{
name: 'chrome-devtools-mcp',
version: '0.31.1',
},
{
capabilities: {
tools: {},
},
}
);
// 注册工具处理器
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: getToolDefinitions(), // 返回 42 个工具的定义
};
});
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
return executeTool(name, args);
});
MCP 协议交互流程:
初始化阶段:
AI Agent → MCP Server: initialize request MCP Server → AI Agent: 返回 server 能力(支持 tools) AI Agent → MCP Server: initialized notification工具发现阶段:
AI Agent → MCP Server: tools/list request MCP Server → AI Agent: 返回 42 个工具的完整定义 (包括工具名称、描述、输入参数 schema)工具调用阶段:
AI Agent → MCP Server: tools/call request { "name": "click", "arguments": { "pageId": "page-123", "selector": "#submit-button" } } MCP Server → AI Agent: 执行结果 { "content": [ { "type": "text", "text": "Successfully clicked element #submit-button" } ] }
2.3 42 个工具的技术分类与实现原理
Chrome DevTools MCP 提供了 42 个工具,分为 6 大类。让我们深入每一类的技术实现。
2.3.1 输入自动化工具(10 个)
这类工具模拟用户在页面上的交互操作。
1. click - 智能点击
// 源码位置: src/tools/input.ts
export async function click(args: {
pageId: string;
selector: string;
offsetX?: number;
offsetY?: number;
}) {
const page = getPageById(args.pageId);
const element = await page.waitForSelector(args.selector, {
visible: true,
timeout: 5000,
});
// 自动滚动到元素可见位置
await element.scrollIntoViewIfNeeded();
// 计算点击坐标(支持偏移量)
const boundingBox = await element.boundingBox();
const x = boundingBox.x + (args.offsetX ?? boundingBox.width / 2);
const y = boundingBox.y + (args.offsetY ?? boundingBox.height / 2);
// 执行点击(支持等待导航完成)
await Promise.all([
element.click(),
page.waitForNavigation({ timeout: 10000 }).catch(() => {}),
]);
return { success: true, selector: args.selector };
}
技术亮点:
- 自动等待元素可见(不需要手写
sleep) - 自动滚动到元素(处理懒加载页面)
- 支持偏移量点击(点击元素内部的特定位置)
- 自动等待导航完成(处理 SPA 路由跳转)
2. fill - 智能表单填写
export async function fill(args: {
pageId: string;
selector: string;
value: string;
}) {
const page = getPageById(args.pageId);
const input = await page.waitForSelector(args.selector, {
visible: true,
});
// 先聚焦,再清空,再填写(模拟真实用户输入)
await input.focus();
await input.click({ clickCount: 3 }); // 全选
await input.press('Backspace'); // 删除
await input.type(args.value, { delay: 50 }); // 逐字输入(触发 input 事件)
return { success: true };
}
为什么不用 element.value = xxx?
- 直接设置
value不会触发input和change事件 - 很多前端框架(React、Vue)依赖这些事件来更新状态
- 逐字输入可以绕过一些反机器人检测
3. fill_form - 批量表单填写
这个功能特别适合自动化测试场景:
// 使用示例
await mcpClient.callTool('fill_form', {
pageId: 'page-123',
fields: [
{ selector: '#username', value: 'testuser' },
{ selector: '#email', value: 'test@example.com' },
{ selector: '#password', value: 'SecurePass123!' },
{ selector: '#accept-terms', type: 'checkbox', checked: true },
],
});
实现原理:
- 自动识别输入框类型(text/email/password/checkbox/radio)
- 对于 checkbox,调用
element.click()切换选中状态 - 对于 select,使用
element.selectOption(value) - 支持字段间的依赖等待(如填写验证码需要先获取验证码)
4. drag - 拖拽操作
export async function drag(args: {
pageId: string;
sourceSelector: string;
targetSelector: string;
}) {
const page = getPageById(args.pageId);
const source = await page.waitForSelector(args.sourceSelector);
const target = await page.waitForSelector(args.targetSelector);
// 获取坐标
const sourceBox = await source.boundingBox();
const targetBox = await target.boundingBox();
// 使用 Puppeteer 的拖拽 API
await page.mouse.move(
sourceBox.x + sourceBox.width / 2,
sourceBox.y + sourceBox.height / 2
);
await page.mouse.down();
await page.mouse.move(
targetBox.x + targetBox.width / 2,
targetBox.y + targetBox.height / 2,
{ steps: 10 } // 分 10 步移动(模拟真实拖拽轨迹)
);
await page.mouse.up();
return { success: true };
}
应用场景:
- 拖拽排序(如 Trello 卡片)
- 文件上传(拖拽文件到上传区域)
- 画图应用(拖拽形状)
5. hover - 悬停触发
很多前端组件依赖 mouseenter 事件(如下拉菜单、Tooltip)。
export async function hover(args: {
pageId: string;
selector: string;
}) {
const page = getPageById(args.pageId);
const element = await page.waitForSelector(args.selector);
await element.hover();
// 等待悬停触发的 UI 变化(如下拉菜单展开)
await page.waitForTimeout(300);
return { success: true };
}
6. press_key - 键盘操作
// 支持所有键盘事件
await mcpClient.callTool('press_key', {
pageId: 'page-123',
key: 'Enter', // 也支持组合键:'Control+A', 'Shift+Tab'
});
实现细节:
- 使用 Puppeteer 的
keyboard.press(key) - 支持修饰键(Control、Shift、Alt、Meta)
- 支持功能键(F1-F12、ArrowUp/Down/Left/Right、Escape)
- 支持可打印字符(自动处理大小写和特殊字符)
7. type_text - 逐字输入
与 fill 不同,type_text 不清空现有内容,而是在光标位置继续输入。
// 适合富文本编辑器场景
await mcpClient.callTool('type_text', {
pageId: 'page-123',
text: 'Hello, World!',
delay: 100, // 每个字符间隔 100ms(模拟真人输入)
});
8. upload_file - 文件上传
export async function uploadFile(args: {
pageId: string;
selector: string;
filePath: string;
}) {
const page = getPageById(args.pageId);
const input = await page.waitForSelector(args.selector);
// Puppeteer 特殊处理:文件上传需要设置文件路径
// 这不会真的触发文件选择对话框,而是直接设置文件
await input.setInputFiles(args.filePath);
// 等待上传完成(假设有上传进度条)
await page.waitForSelector('.upload-success', { timeout: 30000 });
return { success: true };
}
技术限制与解决方案:
- 问题:无法与系统的文件选择对话框交互(这是浏览器安全限制)
- 解决:直接设置
<input type="file">的files属性 - 适用场景:所有基于 HTML5 File API 的上传组件
9. handle_dialog - 对话框处理
// 自动处理 JavaScript 对话框(alert/confirm/prompt)
await mcpClient.callTool('handle_dialog', {
pageId: 'page-123',
action: 'accept', // 'accept' | 'dismiss'
promptText: 'user input', // 仅对 prompt 对话框有效
});
实现原理:
- 监听 Puppeteer 的
dialog事件 - 在对话框出现时自动调用
dialog.accept()或dialog.dismiss() - 对于
prompt对话框,可以传入用户输入文本
10. click_at - 坐标点击
当没有可靠的选择器时(如 Canvas 绘图应用),可以通过坐标点击。
await mcpClient.callTool('click_at', {
pageId: 'page-123',
x: 500,
y: 300,
});
注意事项:
- 坐标相对于页面视口(viewport)
- 不考虑页面滚动偏移
- 适合 Canvas、WebGL 等图形应用
2.3.2 导航自动化工具(6 个)
这类工具管理页面的生命周期和导航行为。
1. navigate_page - 页面导航
export async function navigatePage(args: {
pageId: string;
url: string;
waitUntil?: 'load' | 'domcontentloaded' | 'networkidle0' | 'networkidle2';
}) {
const page = getPageById(args.pageId);
// 导航并等待特定条件
await page.goto(args.url, {
waitUntil: args.waitUntil ?? 'networkidle2',
timeout: 30000,
});
return {
success: true,
finalUrl: page.url(),
title: await page.title(),
};
}
waitUntil 参数详解:
load:等待window.onload事件(所有资源加载完成)domcontentloaded:等待 DOM 解析完成(不等待图片、样式表)networkidle0:等待 500ms 内没有任何网络连接networkidle2:等待 500ms 内网络连接数不超过 2 个
最佳实践:
- 对于 SPA(单页应用),使用
domcontentloaded或networkidle2 - 对于传统多页应用,使用
load - 对于性能测试,使用
networkidle0(确保完全加载)
2. new_page - 新建页面
// 在新的标签页打开页面
const result = await mcpClient.callTool('new_page', {
url: 'https://example.com',
background: false, // 是否后台打开(不切换到该标签页)
});
console.log(result.pageId); // 返回新页面的 ID
3. close_page - 关闭页面
await mcpClient.callTool('close_page', {
pageId: 'page-123',
});
4. list_pages - 列出所有页面
const result = await mcpClient.callTool('list_pages', {});
console.log(result.pages);
// [
// { pageId: 'page-123', url: 'https://example.com', title: 'Example Domain', isActive: true },
// { pageId: 'page-456', url: 'https://google.com', title: 'Google', isActive: false },
// ]
5. select_page - 切换活跃页面
await mcpClient.callTool('select_page', {
pageId: 'page-456',
});
6. wait_for - 智能等待
// 等待特定条件满足
await mcpClient.callTool('wait_for', {
pageId: 'page-123',
condition: 'selector', // 'selector' | 'function' | 'timeout'
value: '#success-message', // 等待该选择器出现
timeout: 10000,
});
高级用法:等待自定义 JavaScript 函数返回 true
await mcpClient.callTool('wait_for', {
pageId: 'page-123',
condition: 'function',
value: '() => window.__appReady === true',
timeout: 30000,
});
2.3.3 仿真与响应式测试工具(2 个)
这类工具模拟不同的设备和网络条件。
1. emulate - 设备仿真
// 模拟 iPhone 14 Pro
await mcpClient.callTool('emulate', {
pageId: 'page-123',
device: 'iPhone 14 Pro',
// 或者自定义
viewport: { width: 393, height: 852, deviceScaleFactor: 3 },
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)...',
hasTouch: true,
});
内置设备列表(部分):
- iPhone 14 Pro / Pro Max
- Samsung Galaxy S23
- iPad Pro 12.9"
- MacBook Pro 16"
- Surface Pro 8
2. resize_page - 视口调整
// 测试响应式布局
await mcpClient.callTool('resize_page', {
pageId: 'page-123',
width: 1920,
height: 1080,
});
// 执行响应式测试
const breakpoints = [320, 768, 1024, 1920];
for (const width of breakpoints) {
await mcpClient.callTool('resize_page', {
pageId: 'page-123',
width,
height: 800,
});
await takeScreenshot({ pageId, label: `breakpoint-${width}px` });
}
2.3.4 性能分析工具(3 个)
这类工具是 Chrome DevTools MCP 的「杀手级功能」,让 AI Agent 能够获取专业的性能数据。
1. performance_start_trace - 开始性能录制
await mcpClient.callTool('performance_start_trace', {
pageId: 'page-123',
categories: [
'devtools.timeline',
'v8.execute',
'blink.user_timing',
'disabled-by-default-v8.cpu_profiler',
],
});
关键类别解释:
devtools.timeline:所有 DevTools Timeline 事件v8.execute:V8 引擎的执行事件(JavaScript 编译、执行)blink.user_timing:用户自定义的 Performance Mark/Measuredisabled-by-default-v8.cpu_profiler:V8 CPU Profiler 数据(默认禁用,因为开销大)
2. performance_stop_trace - 停止录制并分析
const result = await mcpClient.callTool('performance_stop_trace', {
pageId: 'page-123',
});
console.log(result.insights);
// [
// {
// id: 'LCP',
// title: 'Largest Contentful Paint',
// value: 2450,
// unit: 'ms',
// score: 'needs-improvement',
// description: '...',
// },
// {
// id: 'CLS',
// title: 'Cumulative Layout Shift',
// value: 0.15,
// score: 'poor',
// description: '...',
// },
// ]
返回的性能指标:
- LCP(Largest Contentful Paint):最大内容绘制时间
- FCP(First Contentful Paint):首次内容绘制时间
- CLS(Cumulative Layout Shift):累计布局偏移
- TBT(Total Blocking Time):总阻塞时间
- INP(Interaction to Next Paint):交互到下一次绘制的时间
3. performance_analyze_insight - 深度性能分析
这个功能会调用 Lighthouse 和 Chrome UX Report(CrUX)API 来提供综合性的性能报告。
const result = await mcpClient.callTool('performance_analyze_insight', {
url: 'https://example.com',
strategy: 'mobile', // 'mobile' | 'desktop'
categories: ['performance', 'accessibility', 'best-practices', 'seo'],
});
AI Agent 可以这样使用:
开发者:帮我分析 https://example.com 的性能
AI:(调用 performance_analyze_insight)
AI:我发现了以下问题:
1. LCP 为 3.2 秒,超过推荐的 2.5 秒
- 原因:Hero 图片未优化,大小为 2.3MB
- 建议:使用 WebP 格式,并添加 srcset 属性
2. CLS 得分为 0.25,超过推荐的 0.1
- 原因:页面加载时广告位导致布局偏移
- 建议:为广告容器设置固定高度
3. 未使用的 JavaScript 占总体积的 40%
- 建议:启用代码分割,使用动态 import()
2.3.5 网络监控工具(2 个)
1. list_network_requests - 列出网络请求
const result = await mcpClient.callTool('list_network_requests', {
pageId: 'page-123',
filter: {
type: 'fetch', // 'fetch' | 'xhr' | 'script' | 'stylesheet' | 'image' | ...
statusCode: 200,
urlPattern: '*/api/*',
},
});
console.log(result.requests);
// [
// {
// requestId: 'req-123',
// url: 'https://api.example.com/users',
// method: 'GET',
status: 200,
// timing: {
// startTime: 1234.5,
// endTime: 1236.8,
// duration: 2300, // ms
// ttfb: 450, // Time to First Byte
// },
// size: 12345, // bytes
// fromCache: false,
// },
// ]
2. get_network_request - 获取请求详情
const result = await mcpClient.callTool('get_network_request', {
pageId: 'page-123',
requestId: 'req-123',
});
console.log(result.request);
// {
// url: 'https://api.example.com/users',
// method: 'GET',
// headers: { 'Authorization': 'Bearer ...', ... },
// postData: null,
// response: {
// status: 200,
// headers: { 'Content-Type': 'application/json', ... },
// body: '[{"id":1,"name":"..."}]',
// },
// }
应用场景:
- API 调试:检查请求和响应的具体内容
- 性能分析:找出慢请求
- 安全审计:检查敏感数据是否泄露
2.3.6 调试工具(8 个)
这类工具提供深度调试能力。
1. take_snapshot - 获取页面快照
const result = await mcpClient.callTool('take_snapshot', {
pageId: 'page-123',
includeScreenshot: true,
});
console.log(result.snapshot);
// {
// url: 'https://example.com',
// title: 'Example Domain',
// screenshot: 'data:image/png;base64,...', // 页面截图
// dom: '<html>...', // 页面 HTML
// accessibilityTree: [/* 可访问性树,AI 可以理解页面结构 */],
// }
accessibilityTree 的价值:
- 这是 AI Agent 理解页面结构的「秘密武器」
- 它提取了页面的语义结构(类似 DOM 树,但更简洁)
- AI 可以基于它生成可靠的选择器(不依赖易变的 class 和 id)
2. evaluate_script - 执行 JavaScript
const result = await mcpClient.callTool('evaluate_script', {
pageId: 'page-123',
script: `
// 可以在页面上下文中执行任意 JavaScript
const users = Array.from(document.querySelectorAll('.user-card'))
.map(card => ({
name: card.querySelector('.name').textContent,
email: card.querySelector('.email').textContent,
}));
return users;
`,
});
console.log(result.result);
// [
// { name: 'Alice', email: 'alice@example.com' },
// { name: 'Bob', email: 'bob@example.com' },
// ]
安全限制:
- 不能访问 Node.js 全局对象(如
process、require) - 不能执行跨域请求(受同源策略限制)
- 但可以通过
page.setBypassCSP(true)绕过 CSP(内容安全策略)
3. take_screenshot - 截图
const result = await mcpClient.callTool('take_screenshot', {
pageId: 'page-123',
type: 'png', // 'png' | 'jpeg' | 'webp'
quality: 80, // 仅对 jpeg/webp 有效
fullPage: true, // 截取整页(不只是视口)
clip: { x: 0, y: 0, width: 800, height: 600 }, // 可选:截取特定区域
});
console.log(result.screenshot); // Base64 编码的图片数据
4. get_console_messages - 获取控制台消息
const result = await mcpClient.callTool('get_console_messages', {
pageId: 'page-123',
level: 'error', // 'log' | 'warn' | 'error' | 'debug' | 'info'
limit: 50,
});
console.log(result.messages);
// [
// {
// level: 'error',
// text: 'Uncaught TypeError: Cannot read property "length" of null',
// source: 'main.js:123',
// timestamp: 1719834000000,
// },
// ]
AI Agent 可以这样使用:
开发者:我的页面报错了,帮我看看
AI:(调用 get_console_messages)
AI:我发现了 3 个错误:
1. main.js:123 - TypeError: Cannot read property "length" of null
- 原因:假设 `users` 数组一定存在,但实际为 null
- 修复:在访问 `.length` 之前添加 null 检查
2. api.js:45 - Failed to load resource: net::ERR_CONNECTION_REFUSED
- 原因:后端 API 服务器未启动
- 建议:检查 API 服务器是否运行在 localhost:3000
5. lighthouse_audit - Lighthouse 审计
const result = await mcpClient.callTool('lighthouse_audit', {
pageId: 'page-123',
categories: ['performance', 'accessibility', 'best-practices', 'seo', 'pwa'],
});
console.log(result.report);
// Lighthouse 完整报告(JSON 格式)
// 包括:
// - 每个审计项的得分和详情
// - 优化建议
// - 性能预算对比
6. screencast_start / screencast_stop - 录屏
// 开始录屏(用于复现 bug)
await mcpClient.callTool('screencast_start', {
pageId: 'page-123',
outputPath: '/tmp/bug-reproduction.webm',
fps: 30,
});
// 执行一系列操作...
await mcpClient.callTool('click', { pageId, selector: '#button1' });
await mcpClient.callTool('fill', { pageId, selector: '#input1', value: 'test' });
// 停止录屏
await mcpClient.callTool('screencast_stop', { pageId });
2.3.7 内存分析工具(11 个)
这类工具用于检测内存泄漏和优化内存使用。
1. take_heap_snapshot - 获取堆快照
const result = await mcpClient.callTool('take_heapsnapshot', {
pageId: 'page-123',
});
console.log(result.snapshotId); // 'snapshot-123'
2. compare_heapsnapshots_summary - 对比两个快照
// 执行操作前
const snapshot1 = await mcpClient.callTool('take_heapsnapshot', { pageId });
// 执行一系列操作(如打开/关闭模态框)
for (let i = 0; i < 10; i++) {
await mcpClient.callTool('click', { pageId, selector: '#open-modal' });
await mcpClient.callTool('click', { pageId, selector: '#close-modal' });
}
// 执行操作后
const snapshot2 = await mcpClient.callTool('take_heapsnapshot', { pageId });
// 对比
const comparison = await mcpClient.callTool('compare_heapsnapshots_summary', {
snapshotId1: snapshot1.snapshotId,
snapshotId2: snapshot2.snapshotId,
});
console.log(comparison);
// {
// addedObjects: [
// { constructorName: 'Array', count: 10, sizeDelta: 480 },
// { constructorName: 'HTMLDivElement', count: 5, sizeDelta: 1024 },
// ],
// removedObjects: [...],
// summary: '发现可能的内存泄漏:打开/关闭模态框 10 次后,Array 对象增加了 10 个',
// }
AI Agent 可以这样使用:
开发者:我的应用用久了会变卡,怀疑有内存泄漏
AI:(引导开发者执行操作,并在每个步骤之间拍摄堆快照)
AI:我发现了内存泄漏!
问题:每次打开用户资料弹窗,都会泄漏 2 个 EventListener 和 1 个 Array。
原因:在 componentWillUnmount 中没有正确清理事件监听器。
修复建议:
```javascript
// 错误代码
componentDidMount() {
this.handleScroll = this.handleScroll.bind(this);
window.addEventListener('scroll', this.handleScroll);
}
// 正确代码
componentDidMount() {
this.handleScroll = this.handleScroll.bind(this);
window.addEventListener('scroll', this.handleScroll);
}
componentWillUnmount() {
window.removeEventListener('scroll', this.handleScroll);
}
---
## 第三章:在主流 AI 编程工具中配置 Chrome DevTools MCP
### 3.1 Claude Code 配置(最完整的集成)
Claude Code 是第一个官方支持 Chrome DevTools MCP 的 AI 编程助手。
**方式一:作为 MCP Server(仅工具)**
```bash
# 使用 Claude Code CLI 安装
claude mcp add chrome-devtools --scope user npx chrome-devtools-mcp@latest
方式二:作为 Plugin(MCP + Skills)
Plugin 不仅包含 MCP Server,还包含 Skills(预定义的提示词模板,教 Claude 如何使用工具)。
# 添加 Plugin 市场
/plugin marketplace add ChromeDevTools/chrome-devtools-mcp
# 安装 Plugin
/plugin install chrome-devtools-mcp@chrome-devtools-plugins
# 重启 Claude Code
/restart
验证安装:
# 检查 MCP Server 是否运行
/cli mcp list
# 检查 Skills 是否加载
/skills
# 应该看到:
# - chrome-devtools:navigate_and_analyze
# - chrome-devtools:performance_audit
# - chrome-devtools:debug_console_errors
实际使用场景:
你:帮我测试一下登录功能
Claude:(自动调用 chrome-devtools-mcp 工具)
1. 打开 https://yourapp.com/login
2. 填写用户名和密码
3. 点击登录按钮
4. 等待导航完成
5. 检查是否有错误提示
6. 截图保存测试结果
Claude:登录功能正常工作!我已经在 /tmp/login-test.png 保存了截图。
3.2 Cursor 配置
Cursor 使用 .cursor/mcp.json 配置文件。
方式一:点击安装按钮
访问 Chrome DevTools MCP 的 GitHub README,点击「Install in Cursor」按钮。
方式二:手动配置
// .cursor/mcp.json
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": ["-y", "chrome-devtools-mcp@latest"],
"env": {
"DISPLAY": ":0", // Linux 需要
"PROGRAMFILES": "C:\\Program Files" // Windows 需要
}
}
}
}
Cursor 特有的优化:
Cursor 的 Agent Mode 可以「多步推理」——它会自动规划一系列工具调用:
你:帮我买一张从北京到上海的火车票
Cursor Agent:
1. 打开 12306.cn
2. 填写出发地「北京」
3. 填写目的地「上海」
4. 选择日期
5. 点击查询
6. 分析查询结果
7. 选择最合适的车次
8. 点击预订
...
3.3 VS Code Copilot 配置
VS Code Copilot 支持两种方式:Plugin 和 MCP Server。
方式一:安装 Plugin(推荐)
- 打开 Command Palette(
Cmd+Shift+P或Ctrl+Shift+P) - 搜索「Chat: Install Plugin From Source」
- 输入:
ChromeDevTools/chrome-devtools-mcp
方式二:手动配置 MCP Server
// .vscode/mcp.json
{
"servers": {
"chrome-devtools": {
"type": "stdio",
"command": "npx",
"args": ["-y", "chrome-devtools-mcp@latest"]
}
}
}
验证配置:
# 在 VS Code 中打开 Command Palette
# 搜索「MCP: List Servers」
# 应该看到 chrome-devtools 显示为「Running」
3.4 其他 AI 工具配置
Gemini CLI:
# 项目级别
gemini mcp add chrome-devtools npx chrome-devtools-mcp@latest
# 全局
gemini mcp add -s user chrome-devtools npx chrome-devtools-mcp@latest
Windsurf:
// ~/.codeium/windsurf/mcp_config.json
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": ["-y", "chrome-devtools-mcp@latest"]
}
}
}
OpenCode:
// ~/.config/opencode/opencode.json
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"chrome-devtools": {
"type": "local",
"command": ["npx", "-y", "chrome-devtools-mcp@latest"]
}
}
}
第四章:生产级实战代码示例
4.1 场景一:自动化 UI 测试
需求:为电商网站的结账流程编写自动化测试。
// tests/checkout-flow.test.ts
import { MCPClient } from '@anthropic-ai/mcp-client';
async function testCheckoutFlow() {
const mcp = new MCPClient();
await mcp.connect('chrome-devtools');
// Step 1: 打开网站
const page = await mcp.callTool('new_page', {
url: 'https://shop.example.com',
});
// Step 2: 搜索商品
await mcp.callTool('fill', {
pageId: page.pageId,
selector: '#search-input',
value: 'Wireless Headphones',
});
await mcp.callTool('press_key', {
pageId: page.pageId,
key: 'Enter',
});
// Step 3: 等待搜索结果加载
await mcp.callTool('wait_for', {
pageId: page.pageId,
condition: 'selector',
value: '.product-card',
});
// Step 4: 点击第一个商品
await mcp.callTool('click', {
pageId: page.pageId,
selector: '.product-card:first-child',
});
// Step 5: 添加到购物车
await mcp.callTool('click', {
pageId: page.pageId,
selector: '#add-to-cart',
});
// Step 6: 等待购物车更新
await mcp.callTool('wait_for', {
pageId: page.pageId,
condition: 'function',
value: '() => document.querySelector(".cart-count").textContent === "1"',
});
// Step 7: 进入结账页面
await mcp.callTool('click', {
pageId: page.pageId,
selector: '.cart-icon',
});
await mcp.callTool('click', {
pageId: page.pageId,
selector: '#checkout-button',
});
// Step 8: 填写结账表单
await mcp.callTool('fill_form', {
pageId: page.pageId,
fields: [
{ selector: '#name', value: 'John Doe' },
{ selector: '#email', value: 'john@example.com' },
{ selector: '#address', value: '123 Main St' },
{ selector: '#card-number', value: '4242424242424242' },
{ selector: '#card-expiry', value: '12/26' },
{ selector: '#card-cvc', value: '123' },
],
});
// Step 9: 提交订单
await mcp.callTool('click', {
pageId: page.pageId,
selector: '#place-order',
});
// Step 10: 验证订单成功
await mcp.callTool('wait_for', {
pageId: page.pageId,
condition: 'selector',
value: '.order-success',
timeout: 10000,
});
const snapshot = await mcp.callTool('take_snapshot', {
pageId: page.pageId,
});
console.log('Order placed successfully!');
console.log('Screenshot saved to:', snapshot.screenshot);
await mcp.disconnect();
}
testCheckoutFlow().catch(console.error);
与传统测试框架的对比:
| 特性 | Chrome DevTools MCP | Selenium | Playwright |
|---|---|---|---|
| 设置复杂度 | 低(一条命令) | 高(需要 WebDriver) | 中 |
| AI 集成 | 原生支持 | 需要自定义 | 需要自定义 |
| 性能分析 | 内置 | 不支持 | 部分支持 |
| 自适应能力 | 高(AI 可理解页面变化) | 低(依赖固定选择器) | 中 |
4.2 场景二:Web scraping with AI
传统爬虫的痛点是:选择器易变。
使用 Chrome DevTools MCP + AI,可以实现「自适应爬虫」——即使页面结构变化,AI 也能理解如何提取数据。
async function scrapeProducts(pageUrl: string) {
const mcp = new MCPClient();
await mcp.connect('chrome-devtools');
const page = await mcp.callTool('new_page', { url: pageUrl });
// 获取页面快照(包含 accessibilityTree)
const snapshot = await mcp.callTool('take_snapshot', {
pageId: page.pageId,
});
// 将快照发送给 AI,让它理解页面结构
const extractionPlan = await ai.analyze({
prompt: `
从这个页面的 accessibilityTree 中,找出:
1. 所有商品的容器元素
2. 每个商品的价格元素
3. 每个商品的名称元素
accessibilityTree: ${JSON.stringify(snapshot.accessibilityTree)}
`,
});
// 根据 AI 的分析结果,提取数据
const products = [];
for (const item of extractionPlan.productElements) {
const name = await mcp.callTool('evaluate_script', {
pageId: page.pageId,
script: `
return document.querySelector('${item.nameSelector}').textContent;
`,
});
const price = await mcp.callTool('evaluate_script', {
pageId: page.pageId,
script: `
return document.querySelector('${item.priceSelector}').textContent;
`,
});
products.push({ name: name.result, price: price.result });
}
return products;
}
4.3 场景三:性能监控与告警
async function monitorPerformance(url: string) {
const mcp = new MCPClient();
await mcp.connect('chrome-devtools');
const page = await mcp.callTool('new_page', { url });
// 开始性能录制
await mcp.callTool('performance_start_trace', {
pageId: page.pageId,
});
// 等待页面完全加载
await mcp.callTool('wait_for', {
pageId: page.pageId,
condition: 'function',
value: '() => window.performance.timing.loadEventEnd > 0',
});
// 停止录制
const performanceReport = await mcp.callTool('performance_stop_trace', {
pageId: page.pageId,
});
// 分析性能指标
const insights = performanceReport.insights;
// 检查是否超过预算
const budget = {
LCP: 2500, // ms
FID: 100, // ms
CLS: 0.1, // 无单位
};
const violations = [];
for (const metric of insights) {
if (metric.value > budget[metric.id]) {
violations.push({
metric: metric.title,
actual: metric.value,
budget: budget[metric.id],
severity: metric.value > budget[metric.id] * 1.5 ? 'critical' : 'warning',
});
}
}
if (violations.length > 0) {
// 发送告警
await sendAlert({
url,
violations,
screenshot: performanceReport.screenshot,
});
}
return { insights, violations };
}
4.4 场景四:视觉回归测试
async function visualRegressionTest(pageUrl: string, baselineScreenshotPath: string) {
const mcp = new MCPClient();
await mcp.connect('chrome-devtools');
const page = await mcp.callTool('new_page', { url: pageUrl });
// 等待页面稳定
await mcp.callTool('wait_for', {
pageId: page.pageId,
condition: 'networkidle0',
});
// 截图
const screenshot = await mcp.callTool('take_screenshot', {
pageId: page.pageId,
fullPage: true,
});
// 与基线对比(使用像素级对比)
const diff = await compareScreenshots({
baseline: baselineScreenshotPath,
current: screenshot.screenshot,
threshold: 0.01, // 允许 1% 的像素差异
});
if (diff.pixelDifference > 0) {
console.log(`Visual regression detected! ${diff.pixelDifference} pixels changed.`);
console.log(`Diff screenshot saved to: ${diff.diffPath}`);
// 使用 AI 分析差异是否是「预期内」的
const analysis = await ai.analyze({
prompt: `
对比这两张截图,分析差异是否是 bug:
Baseline: ${baselineScreenshotPath}
Current: ${screenshot.screenshot}
Diff: ${diff.diffPath}
`,
});
return {
passed: false,
diffPixels: diff.pixelDifference,
analysis: analysis.result,
};
}
return { passed: true };
}
第五章:高级主题与最佳实践
5.1 多标签页协同工作
Chrome DevTools MCP 支持同时控制多个标签页,适合复杂的端到端测试场景。
async function testRealTimeCollaboration() {
const mcp = new MCPClient();
await mcp.connect('chrome-devtools');
// 打开两个标签页(模拟两个用户)
const page1 = await mcp.callTool('new_page', {
url: 'https://collab.example.com/document/123',
background: false,
});
const page2 = await mcp.callTool('new_page', {
url: 'https://collab.example.com/document/123',
background: true, // 后台打开
});
// 在第一个标签页中输入文本
await mcp.callTool('click', {
pageId: page1.pageId,
selector: '.editor',
});
await mcp.callTool('type_text', {
pageId: page1.pageId,
text: 'Hello from User 1!',
});
// 切换到第二个标签页
await mcp.callTool('select_page', {
pageId: page2.pageId,
});
// 等待实时同步
await mcp.callTool('wait_for', {
pageId: page2.pageId,
condition: 'function',
value: '() => document.querySelector(".editor").textContent.includes("Hello from User 1")',
});
console.log('Real-time collaboration working!');
}
5.2 处理身份验证
很多 Web 应用需要登录才能测试。以下是几种处理身份验证的策略。
策略一:使用测试账号
async function login(pageId: string, mcp: MCPClient) {
await mcp.callTool('navigate_page', {
pageId,
url: 'https://app.example.com/login',
});
await mcp.callTool('fill_form', {
pageId,
fields: [
{ selector: '#email', value: process.env.TEST_USER_EMAIL },
{ selector: '#password', value: process.env.TEST_USER_PASSWORD },
],
});
await mcp.callTool('click', {
pageId,
selector: '#login-button',
});
// 等待登录完成(检查是否存在登出按钮)
await mcp.callTool('wait_for', {
pageId,
condition: 'selector',
value: '.logout-button',
});
}
策略二:重用已有的浏览器会话
# 启动 Chrome 并开启远程调试
google-chrome --remote-debugging-port=9222 \
--user-data-dir=/tmp/chrome-test-profile
# 手动登录一次
# 然后配置 chrome-devtools-mcp 连接到这个已有的 Chrome 实例
// MCP 配置
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": [
"-y",
"chrome-devtools-mcp@latest",
"--browser-url=http://127.0.0.1:9222"
]
}
}
}
5.3 处理反机器人检测
很多网站使用反机器人检测(如 Cloudflare、reCAPTCHA)。以下是一些应对策略。
策略一:使用真实浏览器指纹
Chrome DevTools MCP 使用的是真实 Chrome 浏览器,所以大部分指纹检测都能通过。
策略二:控制请求速率
// 在操作中添加随机延迟
async function humanLikeDelay() {
const delay = 500 + Math.random() * 1500; // 500-2000ms
await new Promise(resolve => setTimeout(resolve, delay));
}
await mcp.callTool('fill', { /* ... */ });
await humanLikeDelay();
await mcp.callTool('click', { /* ... */ });
策略三:使用住宅代理
// Puppeteer 启动参数
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": [
"-y",
"chrome-devtools-mcp@latest",
"--",
"--proxy-server=http://residential-proxy.example.com:8080"
]
}
}
}
5.4 调试 Chrome DevTools MCP 本身
有时候,Chrome DevTools MCP 可能会出现问题。以下是调试方法。
启用调试日志:
# 设置环境变量
export DEBUG=chrome-devtools-mcp:*
export LOG_LEVEL=debug
# 启动 AI Agent
claude
检查 MCP Server 状态:
# 列出所有运行的 MCP Server
/cli mcp list
# 查看 chrome-devtools 的日志
/cli mcp logs chrome-devtools
手动测试 MCP Server:
# 直接运行 MCP Server(不通过 AI Agent)
npx chrome-devtools-mcp@latest
# 在另一个终端,使用 mcptools 测试
npx @modelcontextprotocol/inspector
第六章:与竞争对手的对比分析
6.1 Chrome DevTools MCP vs Playwright
| 维度 | Chrome DevTools MCP | Playwright |
|---|---|---|
| 目标用户 | AI Agent + 开发者 | 开发者 |
| API 风格 | 工具调用(MCP 协议) | 命令式编程 |
| 浏览器支持 | Chrome only(官方支持) | Chromium、Firefox、WebKit |
| AI 集成 | 原生(通过 MCP) | 需要自定义封装 |
| 性能分析 | 深度集成(Lighthouse、CrUX) | 基础支持 |
| 学习曲线 | 低(AI 自动生成调用代码) | 中(需要学习 API) |
| 跨平台兼容 | 高(任何支持 MCP 的 AI 工具) | 低(绑定到特定测试框架) |
结论:如果你正在构建 AI 驱动的自动化工具,Chrome DevTools MCP 是更好的选择。如果你是传统测试工程师,Playwright 可能更适合。
6.2 Chrome DevTools MCP vs Selenium
Selenium 是浏览器自动化的「老前辈」,但已经显得过时。
Selenium 的主要问题:
- 配置复杂(需要下载 WebDriver)
- API 繁琐(很多操作需要多行代码)
- 性能差(通过 HTTP 通信,延迟高)
- 对现代 Web 框架支持不好(Shadow DOM、Shadow Tree)
Chrome DevTools MCP 的优势:
- 零配置(一条命令启动)
- 高性能(通过 WebSocket 直接连接 Chrome)
- 原生支持现代 Web 特性
- AI 友好(工具声明清晰,AI 可以自动学习和使用)
6.3 Chrome DevTools MCP 的局限性
尽管 Chrome DevTools MCP 很强大,但它也有局限性:
- 只支持 Chrome:如果你需要测试 Firefox 或 Safari,仍然需要 Playwright。
- 依赖 Chrome 的稳定性:如果 Chrome 崩溃,MCP Server 也会崩溃。
- 性能开销:启动整个 Chrome 浏览器实例需要较多资源(相对于 headless Chromium)。
- MCP 协议限制:目前 MCP 协议还不支持流式响应(streaming),所以对于长时间运行的工具(如录屏),无法实时返回进度。
第七章:未来展望与生态发展
7.1 MCP 协议的发展路线图
MCP 协议目前还在快速演进中。根据 Anthropic 的官方路线图,以下特性将在 2026 年下半年推出:
- 流式工具调用:允许工具在执行过程中逐步返回结果(如进度条)。
- 工具组合(Tool Composition):允许一个工具调用另一个工具(形成工具链)。
- 资源订阅(Resource Subscription):允许 AI 订阅文件变化、数据库更新等事件。
- 多模态工具结果:工具可以返回图片、音频、视频等多媒体内容(目前只支持文本)。
7.2 Chrome DevTools MCP 的计划特性
根据 GitHub 上的 Roadmap 和 Discord 社区的讨论,Chrome DevTools MCP 团队正在开发以下特性:
- Firefox 支持:通过 Gecko DevTools Protocol 支持 Firefox。
- 移动设备调试:通过 ADB 连接真实 Android 设备。
- WebAssembly 调试:支持调试 WASM 模块(设置断点、查看内存)。
- ** Accessibility 树增强**:提供更详细的可访问性树,帮助 AI 理解复杂的 ARIA 组件。
- 与 Chrome DevTools 双向同步:在 Chrome DevTools 中做的操作(如设置断点)可以同步到 MCP Server。
7.3 社区生态
自从 Chrome DevTools MCP 发布以来,社区已经围绕它构建了很多有趣的项目:
- chrome-devtools-mcp-extension(社区项目):为 Chrome DevTools MCP 添加图形化界面。
- mcp-browser-pool:管理多个 Chrome 实例的池子(适合高并发场景)。
- chrome-devtools-mcp-recorder:记录用户在浏览器中的操作,自动生成 MCP 工具调用序列。
第八章:总结与行动建议
8.1 核心要点回顾
Chrome DevTools MCP 是什么?
- 一个 MCP Server,让 AI Agent 能够控制 Chrome 浏览器。
- 提供 42 个工具,涵盖输入自动化、导航、性能分析、网络监控、调试、内存分析。
为什么它重要?
- 它弥补了 AI 编程助手的「最后一米」——让 AI 能够看到和操作 Web 页面。
- 它统一了 AI 工具链(一次集成,到处运行)。
如何开始使用?
- 安装:
npx chrome-devtools-mcp@latest - 配置:将 MCP Server 配置添加到你的 AI 工具(Claude Code、Cursor、VS Code Copilot 等)
- 使用:直接对你的 AI Agent 说「帮我测试登录功能」,它会自动调用相关工具。
- 安装:
8.2 行动建议
对于前端开发者:
- 如果你正在使用 Claude Code 或 Cursor,立即安装 Chrome DevTools MCP。
- 尝试用自然语言描述测试场景,让 AI 自动生成和执行测试。
- 将性能分析集成到你的 CI/CD 流程中(每次部署前自动检查性能指标)。
对于 AI 工具开发者:
- 如果你的工具还没有支持 MCP,立即开始集成。
- 参考 Chrome DevTools MCP 的实现,学习如何构建高质量的 MCP Server。
- 考虑为你的工具开发专属的 MCP Plugin(包含预定义的 Skills)。
对于 Web 自动化工程师:
- 评估是否可以从 Selenium/Playwright 迁移到 Chrome DevTools MCP。
- 利用 AI 的自适应能力,减少维护脆弱选择器的成本。
- 探索新的可能性(如 AI 驱动的视觉回归测试、自适应爬虫)。
8.3 最后的思考
Chrome DevTools MCP 不仅是一个技术工具,它代表了 AI 与原生能力集成的新范式。
在过去,AI 模型只能通过「文本输入输出」与外部环境交互。现在,通过 MCP 这样的协议,AI 可以:
- 看到屏幕(通过截图和可访问性树)
- 操作浏览器(通过 Puppeteer)
- 分析性能(通过 Lighthouse)
- 理解运行时错误(通过 Console API)
这种「感知-行动-反馈」的闭环,让 AI 从「代码助手」进化成了「全栈工程师」。
附录 A:完整工具列表(42 个)
输入自动化(10 个)
click- 点击元素drag- 拖拽元素fill- 填写输入框fill_form- 批量填写表单handle_dialog- 处理对话框hover- 悬停press_key- 按键type_text- 逐字输入upload_file- 文件上传click_at- 坐标点击
导航自动化(6 个)
close_page- 关闭页面list_pages- 列出所有页面navigate_page- 页面导航new_page- 新建页面select_page- 切换活跃页面wait_for- 智能等待
仿真(2 个)
emulate- 设备仿真resize_page- 视口调整
性能(3 个)
performance_analyze_insight- 深度性能分析performance_start_trace- 开始性能录制performance_stop_trace- 停止录制
网络(2 个)
get_network_request- 获取请求详情list_network_requests- 列出网络请求
调试(8 个)
evaluate_script- 执行 JavaScriptget_console_messages- 获取控制台消息lighthouse_audit- Lighthouse 审计list_console_messages- 列出控制台消息screencast_start- 开始录屏screencast_stop- 停止录屏take_screenshot- 截图take_snapshot- 获取页面快照
内存(11 个)
close_heapsnapshot- 关闭堆快照compare_heapsnapshots_class_nodes- 对比类节点compare_heapsnapshots_summary- 对比摘要get_heapsnapshot_class_nodes- 获取类节点get_heapsnapshot_details- 获取详情get_heapsnapshot_dominators- 获取支配者get_heapsnapshot_edges- 获取边get_heapsnapshot_paths- 获取路径get_heapsnapshot_retainers- 获取保留者get_heapsnapshot_stats- 获取统计take_heapsnapshot- 获取堆快照
附录 B:常用配置模板
模板 1:基础配置(所有 AI 工具通用)
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": ["-y", "chrome-devtools-mcp@latest"]
}
}
}
模板 2:精简模式(轻量级任务)
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": ["-y", "chrome-devtools-mcp@latest", "--slim", "--headless"]
}
}
}
模板 3:连接到已有 Chrome 实例
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": [
"-y",
"chrome-devtools-mcp@latest",
"--browser-url=http://127.0.0.1:9222"
]
}
}
}
模板 4:禁用使用统计和 CrUX
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": [
"-y",
"chrome-devtools-mcp@latest",
"--no-usage-statistics",
"--no-performance-crux"
]
}
}
}
参考资源
- 官方 GitHub 仓库:https://github.com/ChromeDevTools/chrome-devtools-mcp
- MCP 协议规范:https://modelcontextprotocol.io
- Chrome DevTools Protocol 文档:https://chromedevtools.github.io/devtools-protocol/
- Puppeteer 文档:https://pptr.dev/
- Lighthouse 文档:https://developer.chrome.com/docs/lighthouse/
- Anthropic MCP 公告:https://www.anthropic.com/news/model-context-protocol
作者注:本文基于 Chrome DevTools MCP v0.31.1 撰写,发布于 2026 年 7 月。如有更新,请参考官方文档。
文章字数:约 15,000 字
版权声明:本文为原创技术深度解析文章,转载请注明出处(程序员茄子 https://www.chenxutan.com)。