Same sentence — "click the login button." The screenshot route makes the model compute that it sits at (412, 318). The snapshot route only asks it to say ref=e47. One is a bet, the other is a pointer.
Docs-retrieval servers only move text into context. Browser-automation servers hand out a pair of hands that can click, type and submit. It is the widest permission jump of any MCP category — and the category most likely to look impressive and then never get used.
The subject is Playwright MCP (per its GitHub repo page, 2026-09: about 37.0k stars, Apache-2.0). But the part worth three minutes of your attention is not the install line — it is what separates it from every "screenshot plus coordinates" approach: it hands the model an accessibility tree, not pixels. Nine installable items below, and a last section on the question that matters most: when to install none of them.
# (1) Install — this is the command from the official README
claude mcp add playwright npx @playwright/mcp@latest
# (2) A more restrained install: profile stays in memory, never hits disk
npx @playwright/mcp@latest --isolated --browser chrome
# (3) Say this first (start your dev server before you do):
Open http://localhost:5173, take a browser_snapshot first to see the
structure, click "Log in", fill demo / demo, then paste me the console
errors verbatim after submit.
Notice what that prompt does not say: "show me a screenshot." The official tool description for browser_snapshot is blunt — "Capture accessibility snapshot of the current page, this is better than screenshot" — and browser_take_screenshot closes the other road outright: "You can't perform actions based on the screenshot, use browser_snapshot for actions." In this design screenshots are for humans to look at, not for the model to navigate by.
with_server.py exists inside the official webapp-testing skill.ref throws on the spot. One quietly manufactures a false conclusion, the other stops.An accessibility tree is text, so the model can cite a node from it in every later step. A screenshot is an image: it demands vision capability, cannot be grepped, and cannot be referred to by name in the next sentence. Saving tokens is the side effect; being citable is the cause.
Canvas, WebGL, pure graphics, and "are these two elements aligned?" visual-regression questions have no corresponding nodes in the tree at all. That is exactly why --caps=vision (coordinate interaction) and the screenshot tools still exist — they are a complement, not a backup. chrome-devtools-mcp ships both take_snapshot and take_screenshot on the same division of labour.
vision / pdf / devtools / config / network / storage / testing are all opt-in via --caps=; the default gives you the core group only. When not to install: when you have no page you can run locally, it is pure shelf-ware.npx -y chrome-devtools-mcp@latest, needs Node LTS and current stable Chrome. Its distinctive tools are performance_start_trace / performance_stop_trace / performance_analyze_insight / list_network_requests / get_network_request / lighthouse_audit / emulate (CPU and network throttling). When not to install: not if you only want to click things — its click / fill / navigate_page / take_snapshot overlap heavily with the item above, and running both resident means the model flips a coin every time. Two things to know: usage statistics are reported by default (--no-usage-statistics turns that off), and the performance tools may send trace-related URLs to Google's CrUX API.--extension mode (Playwright extension, Chrome/Edge). Kills: re-doing a login flow just so the agent can see the page behind it. Install: add the extension, then npx @playwright/mcp@latest --extension to take over the browser instance you are already using. When not to use: when that same browser has your bank and your company admin panel open — it attaches to the whole instance, not one tab.npx playwright init-agents --loop=claude (also vscode / codex / opencode), which sets up three roles — planner explores the app and produces a Markdown test plan, generator turns that plan into Playwright test files, healer runs the suite and repairs failing tests — landing in specs/ and tests/. When not to use: a one-off investigation you never intend to keep as a regression test. Then it is overhead./plugin install example-skills@anthropic-agent-skills. The core is scripts/with_server.py (--server "npm run dev" --port 5173 starts the server, then runs your script) plus a decision tree: for static HTML read the file and pick selectors, for dynamic apps call page.wait_for_load_state('networkidle') before inspecting. When not to use: if you need one browser context to survive across many turns, the server form is less work.uv add browser-use as a library, or browser-use skill install to attach it to an existing agent as a skill — another case of the same capability shipped as a skill rather than a server. When not to install: anywhere you need control. An autonomous agent's strength is completion rate; its weakness is that you cannot predict what it clicked.npm i @browserbasehq/stagehand. The trio is act() for natural-language actions, observe() to find actionable elements, extract() for structured data against a Zod schema — and it mixes with ordinary Playwright locators. When not to install: when your selectors are already stable, a plain locator is faster, cheaper and more reproducible.https://mcp.browserbase.com/mcp, six tools: start / end / navigate / act / observe / extract). Kills: needing a machine to run the browser on when you have none. Install: the hosted endpoint wants BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID. When not to install: know this first — its open-source repo was archived on 2026-07-20 and its README says it should not be read as representative of the company's current production service. Use the hosted endpoint and check the vendor's live docs; do not configure from the archived repo.npx -y firecrawl-mcp with FIRECRAWL_API_KEY; tools are firecrawl_scrape / firecrawl_search / firecrawl_crawl / firecrawl_map / firecrawl_interact. When not to install: if what you want is "click through my own app," that is testing, not scraping — use layer 1.npx -y @modelcontextprotocol/server-puppeteer — the standard price of copying a blog without checking the repo's status.Your app, your source, assertions needed → layer 1 or 2, and the output should be a re-runnable .spec.ts. Someone else's site, data only, no assertions → layer 3, and the output is data. The test is simple: after this run, is there anything worth running again tomorrow? If yes, it was testing. If no, it was scraping.
browser_navigate from playwright-mcp, navigate_page from chrome-devtools-mcp, navigate from Browserbase and firecrawl_scrape all sit in the candidate list, and the model picks one each time. Keep exactly one per layer — the same discipline as last issue.browser_run_code_unsafe, which runs arbitrary JavaScript in the server process. Off by default — leave it off.--isolated: keep the profile in memory, never on disk; pass an explicit --storage-state when you do need a logged-in session.--allowed-origins / --blocked-origins: semicolon-separated allow/deny lists that pin down which origins the browser may request.--allow-unrestricted-file-access: what it opens up is files outside your workspace roots.--caps= only the group this task needs. All seven capability groups being opt-in is itself the recommendation.npx playwright codegen: you click through once, it records the code. For one-off verification this beats wiring up a server..spec.ts.webapp-testing decision tree.Install these three first: (1) claude mcp add playwright npx @playwright/mcp@latest — no --caps at first, the core group is enough; (2) add npx -y chrome-devtools-mcp@latest only on the day you need performance and network data, and do not keep it resident alongside (1); (3) npx playwright init-agents --loop=claude to settle exploration into .spec.ts files under tests/.
Add as needed: npx @playwright/mcp@latest --extension (the day you need a logged-in session) · https://mcp.browserbase.com/mcp (when you cannot run a browser locally) · npx -y firecrawl-mcp (scraping other people's sites) · @browserbasehq/stagehand (one-off structured extraction) · browser-use skill install (when you want completion rate, not control).
Do not install: @modelcontextprotocol/server-puppeteer (archived 2025-05-29) · layer 1 and layer 3 resident at the same time · --allow-unrestricted-file-access · --caps=vision enabled "in case I need a screenshot."
One-line rule: if you can point with a ref, never click a coordinate; if anything from this run is worth running again tomorrow, write it as a test instead of having the model walk it again.
e47) a snapshot assigns to each interactive node. Later actions cite it instead of coordinates, and a stale ref throws immediately rather than clicking empty space.--caps)claude mcp add command, the three Key Features verbatim, the tool descriptions for browser_snapshot and browser_take_screenshot, the seven --caps groups, the --isolated / --extension / --storage-state / --allowed-origins flags, and the "not a security boundary" line; per its GitHub repo page, 2026-09: about 37.0k stars, Apache-2.0npx -y chrome-devtools-mcp@latest, the Node LTS + stable Chrome requirement, the usage-statistics and CrUX notes, and the disclaimer about exposing browser content; per its GitHub repo page, 2026-09: about 51.7k stars / 3.6k forks, Apache-2.0performance_* and lighthouse_audit names cited herenpx playwright init-agents --loop= values, and the generated specs/ and tests/ layoutwith_server.py, the static/dynamic decision tree, and the networkidle ruleuv add browser-use and browser-use skill install forms; per its GitHub repo page, 2026-09: about 114.3k stars, MITact() / observe() / extract() API, Zod schemas, and mixing with native Playwright locators; per its GitHub repo page, 2026-09: about 24.2k stars, MITfirecrawl_scrape / search / crawl / map / interact and how the key is configured; per its GitHub repo page, 2026-09: about 7.4k stars, MITpuppeteer_* tool names are kept here for contrast