better-playwright-mcp 是一个更出色的 Playwright MCP(模型上下文协议)服务器,采用客户端 - 服务器架构实现浏览器自动化。它通过创新的语义快照算法,能将页面内容减少多达 90%,同时保留所有有意义的元素,有效解决了传统浏览器自动化工具常面临的令牌限制问题。
npm install -g better-playwright-mcp
MCP 服务器需要 HTTP 服务器运行。你需要启动这两个服务器: 步骤 1:启动 HTTP 服务器
npx better-playwright-mcp server
步骤 2:在另一个终端中,启动 MCP 服务器
npx better-playwright-mcp
MCP 服务器将:
你也可以独立运行 HTTP 服务器(这对于调试或自定义集成很有用):
npx better-playwright-mcp server
选项:
-p, --port - 服务器端口(默认:3102)--host - 服务器主机(默认:localhost)--headless - 以无头模式运行浏览器--chromium - 使用 Chromium 而不是 Chrome--no-user-profile - 不使用持久用户配置文件--user-data-dir
- 用户数据目录--snapshot-dir
- 保存快照的目录npm install -g better-playwright-mcp
// MCP 工具使用
{
"tool": "createPage",
"arguments": {
"name": "shopping",
"description": "Amazon shopping page",
"url": "https://amazon.com"
}
}
// 返回: { pageId: "uuid", snapshot: "..." }
// 使用 xp 标识符点击元素
{
"tool": "browserClick",
"arguments": {
"pageId": "uuid",
"ref": "3fa2b8c1" // 快照中的 xp 属性值
}
}
// 在输入字段中输入文本
{
"tool": "browserType",
"arguments": {
"pageId": "uuid",
"ref": "xp456",
"text": "search query",
"submit": true // 输入后按 Enter 键
}
}
// 获取语义快照
{
"tool": "getPageSnapshot",
"arguments": {
"pageId": "uuid"
}
}
// 截图
{
"tool": "getScreenshot",
"arguments": {
"pageId": "uuid",
"fullPage": true,
"type": "png"
}
}
当与 AI 助手一起使用时,可使用以下工具:
createPage - 创建一个带有名称和描述的新浏览器页面。activatePage - 通过 ID 激活特定页面。closePage - 关闭特定页面。listPages - 列出所有管理的页面及其标题和 URL。closeAllPages - 关闭所有管理的页面。listPagesWithoutId - 列出未管理的浏览器页面。closePagesWithoutId - 关闭所有未管理的页面。closePageByIndex - 按索引关闭页面。browserClick - 使用元素的 xp 标识符点击元素。browserType - 在元素中输入文本。browserHover - 悬停在元素上。browserSelectOption - 在下拉菜单中选择选项。browserPressKey - 按下键盘键。browserFileUpload - 上传文件到文件输入框。browserHandleDialog - 处理浏览器对话框(警告、确认、提示)。browserNavigate - 导航到 URL。browserNavigateBack - 返回上一页。browserNavigateForward - 前进到下一页。scrollToBottom - 滚动到页面/元素底部。scrollToTop - 滚动到页面/元素顶部。waitForTimeout - 等待指定的毫秒数。waitForSelector - 等待元素出现。getPageSnapshot - 获取带有 xp 标识符的语义 HTML 快照。getScreenshot - 截图(PNG/JPEG)。getPDFSnapshot - 生成页面的 PDF。getElementHTML - 获取特定元素的 HTML。downloadImage - 从 URL 下载图像。captureSnapshot - 通过自动滚动捕获全页。原始 HTML
<div class="wrapper" style="padding: 20px; margin: 10px;">
<div class="container">
<div class="inner">
<button class="btn btn-primary" onclick="handleClick()"
style="background: blue; color: white;">
Click me
button>
div>
div>
div>
语义快照
button xp=3fa2b8c1 Click me
该算法:
xp 属性) - 元素 XPath 的哈希值。为了减少数据传输和令牌使用:
浏览器实例配置了:
我们的核心创新是一种多阶段修剪算法,它:
xp 属性,该属性源自其 XPath,用于精确目标定位。display:none、零尺寸或隐藏父元素的元素。href、value、placeholder。结果:一个简洁、语义化的表示,通常只使用原始令牌的 10%,同时保持完整功能。
本项目实现了独特的两层架构:
AI 助手 <--[MCP 协议]--> MCP 服务器 <--[HTTP]--> HTTP 服务器 <---> 浏览器
这种设计允许 MCP 服务器保持轻量级,同时将浏览器控制委托给专用的 HTTP 服务。
# 克隆仓库
git clone https://github.com/yourusername/better-playwright-mcp.git
cd better-playwright-mcp
# 安装依赖
npm install
# 构建项目
npm run build
# 在开发模式下运行
npm run dev
better-playwright-mcp/
├── src/
│ ├── index.ts # MCP 模式入口点
│ ├── server.ts # HTTP 服务器模式入口点
│ ├── playwright-mcp.ts # MCP 服务器实现
│ ├── client/
│ │ └── playwright-client.ts # MCP→HTTP 通信的 HTTP 客户端
│ ├── server/
│ │ └── playwright-server.ts # 控制浏览器的 HTTP 服务器
│ ├── extractor/
│ │ ├── parse2.ts # 生成 xp 标识符的 HTML 解析
│ │ ├── simplify-html.ts # HTML 简化
│ │ └── utils.ts # 提取实用工具
│ └── utils/
│ └── token-limiter.ts # 令牌计数和限制
├── bin/
│ └── cli.js # CLI 入口点
├── package.json
├── tsconfig.json
├── CLAUDE.md # AI 助手说明
└── README.md
MCP 服务器无法连接
DEBUG=* npx better-playwright-mcp 运行。浏览器无法启动
--chromium 标志。令牌限制超出
启用详细日志记录:
DEBUG=* npx better-playwright-mcp
操作记录保存到:
/tmp/playwright-records/%TEMP%\playwright-records\每个页面都有自己的目录,其中包含带时间戳的操作日志。
欢迎贡献!请随时提交拉取请求。
MIT