
HY
折腾进行时
Hello, I'm HY.








之前让 AI 帮我干活,流程一直是这样的:我在浏览器里打开后台,截图,把关键信息复制出来贴给它,它给方案,我再切回浏览器操作。
来回几次就烦了。
无头浏览器我早就试过。Playwright 自带一个干净的 Chromium,跑起来很省事——问题是那个浏览器里什么都没有:没有我的登录态,没有我的 Cookie,没装我要用的扩展。你让它打开一个需要登录的后台,它只能停在登录页,然后告诉你”需要登录”。
我真正想要的是:让 AI 直接操作我正在用的这个 Chrome,带着我全部的登录态和已打开的标签页。
折腾了一晚上跑通了,顺便踩了五个坑。记一下。
能让 AI 碰到真实 Chrome 的路线我试出来三条:
| 路线 | 原理 | 弹授权框 | 能看到真实标签页 |
|---|---|---|---|
| Playwright CLI 扩展模式 | chrome.debugger API,不碰调试端口 | ❌ 不弹 | ⚠️ 有条件 |
| chrome-devtools-mcp(调试端口) | CDP,走 chrome://inspect 开的口子 | ✅ 每连接弹一次 | ✅ 可以 |
| 无头 Chromium | Playwright 自带浏览器 | — | ❌ 完全隔离 |
结论:想要”能操作真实标签页”,目前只有第二条路走得通。 但它的代价是那个弹窗,下面细说。
第一条路的坑更隐蔽,我最后会讲。
这是 Google 官方的 MCP 服务器,工具很全:点击、填表、导航、截图、看控制台报错、抓网络请求、跑性能 trace,一共 30 个工具。
新版 Chrome 加了一个机制,不用重启浏览器、也不用加启动参数就能开远程调试(我这边是 154.0.8037.98)。地址栏输入:
1chrome://inspect/#remote-debugging把那个开关打开。注意这个口子和老的 --remote-debugging-port 启动参数不是一回事——新版 Chrome 对那个端口做了限制,直接访问 /json/version 会返回 404,拿不到调试地址。所以必须走这个开关。
1npm install -g chrome-devtools-mcp@latest我装到的版本是 1.10.1。
我用的是 WorkBuddy,配置文件在 ~/.workbuddy-ai/mcp.json。其他客户端路径不一样(Claude Code 是 .mcp.json,Cursor 在设置界面里填),但格式都是标准的 MCP 配置。
1{2 "mcpServers": {3 "chrome-devtools": {4 "command": "C:\\Users\\你的用户名\\.workbuddy-ai\\binaries\\node\\versions\\22.22.2-3\\node.exe",5 "args": [6 "C:\\Users\\你的用户名\\.workbuddy-ai\\binaries\\node\\versions\\22.22.2-3\\node_modules\\chrome-devtools-mcp\\build\\src\\bin\\chrome-devtools-mcp.js",7 "--autoConnect",8 "--no-usage-statistics",9 "--no-performance-crux"10 ]11 }12 }13}几个参数值得说:
--autoConnect:自动连本机正在跑的 Chrome,不用自己找调试端口--no-usage-statistics:关掉 Google 的用量上报--no-performance-crux:这个建议加上。默认它会把你访问的 URL 发到 Google 的 CrUX 接口,换取真实用户的性能数据。考虑到这是你的日常浏览器,不想让浏览记录外流就关掉command 我直接写了 node 的绝对路径。用 npx 也能跑,但 MCP 服务器是常驻进程,绝对路径启动更稳定,也避免 npx 每次去解析包。
这一步最容易漏。改完配置文件不会自动生效,而且应用一般只在启动时读一次 mcp.json,所以:
chrome-devtools,点「信任」不点这个,AI 那边看到的工具列表里根本没有这些浏览器工具。
信任之后,让它列一下当前打开的页面。我第一次跑出来的结果是这样:
1{2 "content": [3 {4 "type": "text",5 "text": "## Pages\n1: https://www.bilibili.com/video/BV1GHHn6NEnZ/ [selected]\n2: 首页-个性推荐-哔哩哔哩\n3: [74%][50%] SamplerCustomAdvanced (http://127.0.0.1:8188/)"6 }7 ]8}看到自己真实开着的标签页那一刻还是挺爽的。
第一次连上,Chrome 会弹一个「要允许远程调试吗?」的框,只有「取消」和「允许」两个按钮。点允许,连上了。
问题是它不是只弹一次。
我一开始写了个脚本,每次执行一批操作就起一个新的 MCP 进程——结果连着弹了四五次,我在终端这边等,那边满屏幕找弹窗,非常难受。
查了一下,这是 Chrome 较新版本的设计行为:按连接弹窗,官方没有提供「永远允许」的选项。
所以:
正确做法是让客户端托管 MCP 进程(就是上面第四步的”信任”)。客户端会启动一次 MCP 服务器并保持长连接,Chrome 只在最开头弹一次,之后所有操作复用这条连接。
如果你自己写脚本调,那就把一批操作合并进同一次连接,别一次操作起一个进程。
Playwright 也有官方扩展路线,走的是 chrome.debugger API,完全不碰调试端口,所以 Chrome 永远不会弹那个框。听起来完美。
我装上试了,结果 tab-list 只返回一个页面——扩展自己的中继页 connect.html,看不到我任何真实标签页。
翻了扩展源码才搞明白。它 v0.4.0 的代码里写着:
1PLAYWRIGHT_GROUP_TITLE = "Playwright"2PLAYWRIGHT_GROUP_TITLE_PREFIX = `${PLAYWRIGHT_GROUP_TITLE} · `3// 只列出该组内的标签4tabs.query({ groupId: g.id })它只共享处于名为 Playwright 的 Chrome 标签组里的标签。 组外的标签它一概看不见。
而且断开连接时,扩展会把这个组里的标签全部解组(源码里的状态消息是 "All controlled tabs detached"),下次连接得重新挑。
扩展的弹窗里提示可以设一个环境变量绕过连接对话框:
1export PLAYWRIGHT_MCP_EXTENSION_TOKEN=你的token我设了,确实不弹了,4 秒就连接成功。但一个标签页都共享不到。
原因很反直觉:那个”连接对话框”正是让你挑选要共享哪些标签的步骤。你把对话框绕过去了,就等于没挑标签,自然什么都看不到。
所以这个 token 的定位很尴尬——它省掉的恰好是你需要的那一步。想用扩展路线,就别用 token,老老实实走对话框挑标签。
这个坑跟浏览器无关,但排查过程被它带偏了很久。
我本机设了 http_proxy,用 curl 去探测 Chrome 的调试端口时一直返回 404,我一度以为”端口没开”。实际上请求走了代理,返回的是代理给的 404。
所有本地端口的探测都要加 --noproxy '*':
1curl -s -D - -o /dev/null --noproxy '*' http://127.0.0.1:9222/json/version同理,查 DNS 也一样——本机的 DNS 可能被透明代理劫持成 fake-ip(198.18.x.x),想看真实解析结果得走 DoH:
1curl -s --noproxy '*' "https://dns.google/resolve?name=www.example.com&type=CNAME"如果你用命令行工具(比如 playwright-cli)而不是 MCP,要注意它的守护进程会随发起命令的 shell 一起退出。
也就是说你没法”先 attach,然后下一条命令再操作”——每次都得在同一次调用里把 attach 和后续命令串起来:
1playwright-cli attach --extension=chrome && playwright-cli -s=chrome tab-list这个设计挺反直觉的,我一开始分成两条命令跑,第二条永远报 Browser 'chrome' is not open。
这条路等于把你整个浏览器交给 AI——包括所有登录态。
我自己的判断标准是:
--no-performance-crux 记得加上,不然你访问的 URL 会外流如果你只想快点跑通:
chrome://inspect/#remote-debugging,开启开关npm install -g chrome-devtools-mcp@latestmcp.json,命令加 --autoConnect --no-usage-statistics --no-performance-cruxlist_pages,能看到你的标签页就成功了三条路线试下来,chrome-devtools-mcp 是唯一能真正操作到真实标签页的,代价是那个躲不掉的授权弹窗——但只要你让客户端托管进程、保持长连接,它一辈子只弹一次。
Playwright 扩展那条路看起来更干净,但”只共享 Playwright 标签组内的标签”这个限制,加上那个会绕过挑标签步骤的 token,实际用起来比看起来麻烦。
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
部分内容可能已过时
分享你的想法,与大家交流讨论