Skip to content

Browser engines

QA My App is browser-engine agnostic. The two browser-driving subagents (qa-page-analyzer, qa-test-runner) talk to a browser through a Model Context Protocol (MCP) server declared inline in each agent’s frontmatter. Swapping that one mcpServers block swaps the engine — the agent prompts are written in capability terms (navigate, click, fill, snapshot, screenshot, evaluate, read console/network), so the same task catalog runs on any supported engine.

The engine is selected with the browser_engine setting in /plugin. /qa-catalog:init Phase 0 writes the matching mcpServers block into .claude/agents/ when it installs the two browser agents. If you change browser_engine later, re-run /qa-catalog:init (or edit the mcpServers: block by hand and commit).

| Engine (browser_engine) | MCP server | Browsers | Runs where | Best for | |---|---|---|---|---| | playwright (default) | @playwright/mcp | Chromium, Chrome, Edge, Firefox, WebKit | Local OS process per spawn | Default. Full screenshot / console / network fidelity, cross-browser, isolated local processes. | | chrome-devtools | chrome-devtools-mcp | Google Chrome / Chrome for Testing only | Local OS process per spawn | DevTools-grade performance traces, Lighthouse audits, deep network + source-mapped console. | | stagehand | Browserbase MCP (Stagehand) | Cloud (Browserbase) | Remote cloud session per spawn | AI-driven act / observe / extract; no local browser install. Experimental — see caveats. |

Plugin-shipped subagents cannot declare inline mcpServers — Claude Code silently ignores the field for security (docs). That is exactly why the two browser agents live at project scope in .claude/agents/. Declaring the engine inline gives every parallel spawn its own browser process/session, so runners never share cookies, localStorage, or auth state. Whichever engine you pick, keep that one-process-per-spawn property — it is what makes parallel_test_runners safe.

The agent prompts describe what to do; each engine names the how differently.

| Capability | Playwright MCP | Chrome DevTools MCP | Stagehand (Browserbase) | |---|---|---|---| | Navigate | browser_navigate | navigate_page / new_page | navigate | | Click | browser_click | click | act("click …") | | Type / fill | browser_type / browser_fill_form | fill / fill_form / type_text | act("type …") | | Inspect / snapshot | browser_snapshot | take_snapshot | observe / extract | | Screenshot to file | browser_take_screenshot | take_screenshot | — (not exposed) | | Evaluate JS | browser_evaluate | evaluate_script | — (use act/extract) | | Console messages | browser_console_messages | list_console_messages | — | | Network requests | browser_network_requests | list_network_requests | — |