同一句「点那个登录按钮」,截图路线要模型从一张图里算出它在 (412, 318);快照路线只要它说出 ref=e47。一个在赌,一个在指。
文档检索类 MCP 只往上下文里搬文本;浏览器自动化类给出去的是一双能点、能填、能提交的手。这是所有 MCP 类别里权限跨度最大的一类,也是最容易看着很酷、装完没用上的一类。
主角是 Playwright MCP(据 GitHub 仓库页 2026-09 约 3.7 万 star,Apache-2.0)。但真正值得你花三分钟搞懂的不是它的装法,而是它和一切「截图 + 坐标」方案的分野:它交给模型的是无障碍树,不是像素。下面九个条目都能今天装上,最后一节回答那个最该问的问题——什么时候这些一个都别装。
# ① 装(官方 README 给的就是这条)
claude mcp add playwright npx @playwright/mcp@latest
# ② 更克制的装法:profile 只留在内存里,不落盘,指定浏览器
npx @playwright/mcp@latest --isolated --browser chrome
# ③ 第一句话这么说(先起好本地服务,再让它自己看):
打开 http://localhost:5173,先 browser_snapshot 看一眼页面结构,
点「登录」,填 demo / demo,提交后把 console 里的报错原样贴给我。
注意这句话里没有「截个图给我看」。官方给 browser_snapshot 写的工具描述是一句大白话:「Capture accessibility snapshot of the current page, this is better than screenshot」;而 browser_take_screenshot 的描述直接堵死了另一条路:「You can't perform actions based on the screenshot, use browser_snapshot for actions」。截图在这套设计里只负责给人看,不负责给模型指路。
webapp-testing skill 里 with_server.py 存在的全部理由。ref 找不到会当场报错。前者悄悄产出假结论,后者停下来。无障碍树是文本,模型能在后续每一步里直接引用其中的节点;截图是图片,既要 vision 能力,又无法被 grep、无法被下一句话指名。省 token 只是结果,可引用才是原因。
canvas、WebGL、纯图形的画布、以及「这两个元素有没有对齐」这类视觉回归问题,无障碍树里根本没有对应节点。这就是 --caps=vision(坐标交互)和截图工具至今还在的原因——它们是补集,不是备份。chrome-devtools-mcp 同时提供 take_snapshot 与 take_screenshot,也是同一个分工。
vision / pdf / devtools / config / network / storage / testing 全是 opt-in,用 --caps= 按需开,默认只给核心那一组。什么时候别装:你没有能在本地跑起来的页面时,它是纯占位。npx -y chrome-devtools-mcp@latest,需 Node LTS + Chrome 稳定版;独有工具是 performance_start_trace / performance_stop_trace / performance_analyze_insight / list_network_requests / get_network_request / lighthouse_audit / emulate(CPU 与网络降速)。什么时候别装:只想点页面的话别装——它的 click / fill / navigate_page / take_snapshot 和上一个大面积重叠,两个常驻就是让模型抛硬币。另有两条要知情:默认会上报使用统计(--no-usage-statistics 关掉),性能工具可能把 trace 相关 URL 发给 Google CrUX API。--extension 模式(Playwright 扩展,Chrome/Edge)。替你干掉:为了让 agent 看到登录后的页面而重新走一遍登录流程。怎么装:装扩展后 npx @playwright/mcp@latest --extension,直接接管你正在用的那个浏览器实例。什么时候别装:那个浏览器里还开着网银和公司后台的时候——它接管的是整个实例,不是一个标签页。npx playwright init-agents --loop=claude(另有 vscode / codex / opencode),生成三个角色——planner 探索应用产出 Markdown 测试计划、generator 把计划变成 Playwright 测试文件、healer 跑测试并自动修复失败用例,落在 specs/ 与 tests/ 里。什么时候别用:一次性排查、根本不打算留下回归测试时,这套是负担。/plugin install example-skills@anthropic-agent-skills;核心是 scripts/with_server.py(--server "npm run dev" --port 5173 起服务再跑脚本)和一棵决策树:静态 HTML 直接读文件找选择器,动态应用先 page.wait_for_load_state('networkidle') 再 inspect。什么时候别用:你要跨多轮对话保持同一个浏览器上下文时,server 形态更省事。uv add browser-use 做库用,或 browser-use skill install 把它作为 skill 装给现有 agent——又一个同一能力做成 skill 而非 server 的例子。什么时候别装:可控性要求高的场景。自主 agent 的长处是完成率,短处正是你无法预知它点了什么。npm i @browserbasehq/stagehand;三件套 act() 执行自然语言动作、observe() 找可操作元素、extract() 按 Zod schema 取结构化数据,可以和普通 Playwright locator 混写。什么时候别装:选择器本来就稳定时,直接写 locator 更快、更便宜、更可复现。https://mcp.browserbase.com/mcp,六个工具 start / end / navigate / act / observe / extract)。替你干掉:本地没有、也不想装浏览器时的那台机器。怎么装:托管端点需 BROWSERBASE_API_KEY + BROWSERBASE_PROJECT_ID。什么时候别装:先知情——它的开源仓库已于 2026-07-20 归档,README 自称不代表其现行生产服务。要用就用托管端点并去官网核当前文档,别照着归档仓库配。npx -y firecrawl-mcp 配 FIRECRAWL_API_KEY;工具 firecrawl_scrape / firecrawl_search / firecrawl_crawl / firecrawl_map / firecrawl_interact。什么时候别装:你要的是「在我自己的应用里点一遍」——那是测试,不是抓取,用第一层。npx -y @modelcontextprotocol/server-puppeteer——照抄博客不看仓库状态的典型代价。你的应用、你有源码、需要断言 → 第一层或第二层,产出应该是一个能重跑的 .spec.ts。别人的站、只要数据、没有断言 → 第三层,产出是数据。判断标准很简单:这次跑完,有没有东西值得留下来明天再跑一次?有就是测试,没有就是抓取。
playwright-mcp 的 browser_navigate、chrome-devtools-mcp 的 navigate_page、Browserbase 的 navigate、Firecrawl 的 firecrawl_scrape 全在候选里,模型每次挑一个。同一层里只留一个,这是上一期就给过的纪律。browser_run_code_unsafe(在 server 进程里执行任意 JavaScript)——默认不开,也别去开。--isolated:profile 只留在内存,不落盘;要登录态就配 --storage-state 显式给一份。--allowed-origins / --blocked-origins:分号分隔的白/黑名单,把浏览器能访问的域钉死。--allow-unrestricted-file-access:它放开的是工作区之外的文件。--caps= 只开这次要用的那一组。七个能力分组全是 opt-in,这个默认值本身就是一条建议。npx playwright codegen:你自己点一遍,它录成代码。一次性验证用它比接 server 快得多。.spec.ts 的理由。webapp-testing 的决策树第一问就是它。先装这三个:① claude mcp add playwright npx @playwright/mcp@latest(先不加 --caps,核心组够用);② 要看性能和网络那天才加 npx -y chrome-devtools-mcp@latest,且不与 ① 同时常驻;③ npx playwright init-agents --loop=claude,把探索沉淀成 tests/ 里的 .spec.ts。
按需再加:npx @playwright/mcp@latest --extension(需要登录态的那一天)· https://mcp.browserbase.com/mcp(本地跑不动浏览器时)· npx -y firecrawl-mcp(抓别人的站)· @browserbasehq/stagehand(一次性结构化提取)· browser-use skill install(要的是自主完成率而非可控性)。
明确别装:@modelcontextprotocol/server-puppeteer(2025-05-29 已归档)· 第一层和第三层同时常驻 · --allow-unrestricted-file-access · 为「万一要截个图」而开的 --caps=vision。
一句话判据:能用 ref 指的就别用坐标点;这次跑完有东西值得明天再跑一次,就把它写成测试,别每次让模型重走一遍。
e47)。模型后续动作引用它而不是坐标;它失效时会当场报错,而不是静默点空。--caps)claude mcp add 命令、三条 Key Features 原话、browser_snapshot 与 browser_take_screenshot 的工具描述、七个 --caps 分组、--isolated / --extension / --storage-state / --allowed-origins 等 flag,以及「not a security boundary」那句;据 GitHub 仓库页 2026-09 约 3.7 万 star、Apache-2.0npx -y chrome-devtools-mcp@latest、Node LTS + Chrome 稳定版要求、使用统计与 CrUX 上报的说明、暴露浏览器内容的免责原文;据 GitHub 仓库页 2026-09 约 5.17 万 star / 3.6 千 fork、Apache-2.0performance_* 与 lighthouse_audit 出处npx playwright init-agents --loop= 的四个取值、生成的 specs/ 与 tests/ 结构with_server.py 的多服务用法、静态/动态决策树、networkidle 那条硬规矩uv add browser-use 与 browser-use skill install 两种形态;据 GitHub 仓库页 2026-09 约 11.4 万 star、MITact() / observe() / extract() 的 API 与 Zod schema 用法、与原生 Playwright locator 混写的做法;据 GitHub 仓库页 2026-09 约 2.42 万 star、MITfirecrawl_scrape / search / crawl / map / interact 与 key 的配置方式;据 GitHub 仓库页 2026-09 约 7.4 千 star、MITpuppeteer_* 工具名留作对照