Claude Code 配置 Playwright MCP 浏览器自动化踩坑记录
缘起
事情的初衷很朴素:让 Claude Code 通过浏览器自动化操作网页,替我完成一些重复性的表单填写工作。从技术构想到真正跑通,中间隔着五个坑,排列整齐,像是有人预先埋好的。环境是 Windows 10 64 位加 Git Bash——一个看似寻常的组合,实则暗藏了不少 POSIX 与 Windows 之间古老的领土纠纷。
最初的方案是 Chrome 集成,最终落脚在 Playwright MCP。路径的转折本身就是一种教育。
坑 1:Chrome 32 位卡在 109,无法装扩展
原装 Chrome 109.0.5414.120(32 位),尝试安装 Claude in Chrome 扩展时提示不兼容。
原因:Google 已停止 32 位 Chrome 更新,版本永远定格在 109。像一座被遗弃的驿站,再也等不到新的包裹。现代扩展需要较新版本,对这个老版本视而不见。
解决:卸载 32 位,安装 64 位 Chrome 企业版 MSI。
额外的坑:Git Bash 下 msiexec 命令行为异常(退出码 67/83/103),需要绕道 PowerShell 执行:
| |
坑 2:Chrome 集成需要 Claude 订阅
费力将 Chrome 升级到 145 后才发现,Claude in Chrome 扩展需要 Anthropic 直接订阅(Pro/Max/Teams/Enterprise)。没有订阅,/chrome 命令不可用。辛苦搬来的砖,砌不了这堵墙。
替代方案:使用开源的 Playwright MCP Server(@playwright/mcp),通过 MCP 协议控制浏览器,无需任何订阅。开源世界的好处是,门虽然窄,但至少不上锁。
坑 3:Git Bash 把 /c 转换为 C:/
使用 claude mcp add 命令时:
| |
Git Bash 的 POSIX 路径转换机制会把 cmd /c 中的 /c 自动转为 C:/,导致命令变成 cmd C:/ npx ...——一个精心构造的命令,被中间人悄悄篡改了关键字符。这是两套路径哲学在同一个终端里短兵相接的结果。
解决:放弃命令行添加,直接编辑 .claude.json 配置文件。或者直接用 npx 作为 command,跳过 cmd 包装。有时候最可靠的方式,就是不经过翻译,直接写原文。
坑 4:--headed 参数不存在
配置中添加了 --headed 参数,MCP 启动报错:
error: unknown option '--headed'
(Did you mean --headless?)
原因:Playwright MCP 默认就是有头模式(弹出浏览器窗口),只有 --headless 参数用于无头模式。不存在 --headed。你以为需要特意点亮的灯,其实一直亮着。
坑 5:Playwright Chromium 浏览器未安装
去掉错误参数后仍然连接失败。
原因:Playwright MCP 使用自己的 Chromium 二进制,不使用系统安装的 Chrome。它有自己的一套行李,不借用房东的家具。首次使用需要单独下载:
| |
下载后保存在 ~/AppData/Local/ms-playwright/chromium-<version>/。
最终可用配置
在 .claude.json 对应项目的 mcpServers 中添加:
| |
余论
五个坑踩完,回头看这条路,每一步都不算难,难的是你不知道下一步踩的是实地还是空洞。几条经验,留作以后翻检:
--user-data-dir参数持久化浏览器登录态,首次手动登录后无需重复登录- Playwright MCP 自带 Chromium,与系统 Chrome 无关
- Git Bash 下配置 MCP 避免用命令行,直接编辑 JSON 配置文件更可靠
- 排查 MCP 启动失败时,用管道手动喂 JSON-RPC 消息可以看到真实报错:
echo '{"jsonrpc":"2.0",...}' | npx -y @playwright/mcp@latest [args] 2>&1
自动化许诺的是省力,实际交付的往往是另一种劳作。但这些弯路走过之后,路就在那里了,下次经过时可以不假思索地通过。这大概就是踩坑记录存在的全部意义。