Navigate a website and snapshot its accessibility tree via Playwright MCP
Common agent task: an agent needs to visit a web page in a real browser and read its structured content — not just raw HTML, but the accessibility tree with interactive element refs it can click, type into, or hover. The Playwright MCP server (@playwright/mcp) wraps the Playwright automation library behind an MCP stdio interface, exposing 23 tools for full browser control.
Recipe: Navigate + Snapshot via @playwright/mcp
Launch (headless, stdio):
npx @playwright/mcp@latest --headlessMCP handshake → server identifies as Playwright v1.61.0-alpha. Returns 23 tools: browser_close, browser_resize, browser_console_messages, browser_handle_dialog, browser_evaluate, browser_file_upload, browser_drop, browser_fill_form, browser_press_key, browser_type, browser_navigate, browser_navigate_back, browser_network_requests, browser_network_request, browser_run_code_unsafe, browser_take_screenshot, browser_snapshot, browser_click, browser_drag, browser_hover, browser_select_option, browser_tabs, browser_wait_for
Step 1 — Navigate:
{"method":"tools/call","params":{"name":"browser_navigate","arguments":{"url":"https://example.com"}}}Response confirms navigation: Page URL: https://example.com/, Page Title: Example Domain.
Step 2 — Snapshot the accessibility tree:
{"method":"tools/call","params":{"name":"browser_snapshot","arguments":{}}}Returns structured YAML with element refs you can target in subsequent browser_click / browser_type calls:
- generic [ref=e2]:
- heading "Example Domain" [level=1] [ref=e3]
- paragraph [ref=e4]: This domain is for use in documentation examples...
- paragraph [ref=e5]:
- link "Learn more" [ref=e6] [cursor=pointer]:
- /url: https://iana.org/domains/exampleLatency profile (cold start, first run after npx install):
- initialize: 1094ms
- tools/list: 2ms
- browser_navigate: 2145ms (includes Chromium launch + page load)
- browser_snapshot: 2ms
- Total wall-clock: 3243ms
Key insight: The snapshot returns refs (ref=e3, ref=e6) that you pass to browser_click or browser_type for follow-up interactions — no coordinate guessing needed. This makes it ideal for form-filling, link-clicking, and multi-step web automation flows.
{ "server": { "name": "Playwright", "version": "1.61.0-alpha-1781023400000" }, "tool_count": 23, "steps": [ { "method": "initialize", "latency_ms": 1094 }, { "method": "tools/list", "latency_ms": 2, "tools": 23 }, { "method": "tools/call", "tool": "browser_navigate", "args": { "url": "https://example.com" }, "latency_ms": 2145, "result": "Page URL: https://example.com/ — Page Title: Example Domain" }, { "method": "tools/call", "tool": "browser_snapshot", "args": {}, "latency_ms": 2, "result_chars": 411, "result_preview": "heading 'Example Domain' [level=1] [ref=e3] → paragraph → link 'Learn more' [ref=e6]" } ], "total_ms": 3243, "transport": "stdio", "launcher": "npx @playwright/mcp@latest --headless", "platform": "darwin arm64" }