Try Tools · Dev
Playwright MCP: what happened when we tested it
An MCP server that lets an AI agent drive a real browser (click, type, fill forms) by reading the page as a text accessibility tree instead of screenshots.
Score
8.8/10
claims that held up
Verdict
V1 · Partly works31
Access needed
L0 Public web onlyTested 2026-10-26
Rule set before testing: the worst of C1-C4. C2 (an LLM working from snapshots) was V1 because the pre-registered model got 6/8 fields; C1, C3 and C4 were V2, so the verdict is V1. Score = mean of 10, 5, 10, 10.
Scope. One local test page, Chromium only (installed Chrome), headless. One pre-registered model run plus one extra; both free models. We did not test a real logged-in site, the browser extension mode, tabs, uploads, or a machine without Chrome.
Ran from the one-line npx config, filled our 8-field form perfectly in 3/3 scripted runs with identical page snapshots, and most actions took about 20 ms. But two text-only AI models both lost the radio button the same way: the fill-form tool silently unchecks a radio unless you pass "true", and that value isn't documented.
3/3
scripted runs 8/8 fields
identical snapshots, decoy button never hit
6/8
fields by a free text-only model
late field missed; radio silently unchecked
23 ms
median action
clicks ~0.56 s (500 ms settle wait)
450 vs 16.5K
snapshot tokens
our form vs a Wikipedia article
Claim by claim
LLMs can work from accessibility snapshots, no screenshots or vision modelPartly
The snapshot held everything needed (our script went 8/8 three times, and a second model found every field). But the free text-only model we pre-registered got 6/8: it snapshotted before a late field appeared, and fill_form silently unchecked the radio. Our pass mark for V2 was 8/8 from the model.
Deterministic tool application, avoids ambiguityWorks
Identical snapshots and refs in 3/3 fresh runs, and the right one of two "Submit" buttons every time (0 decoy posts). Caveat: fill_form's undocumented radio value means a plausible wrong value does nothing, without an error.
Fast and lightweightWorks
Median 23 ms across 27 type/select/click calls (max 614 ms; clicks include a 500 ms settle wait). Size is page-dependent: 450 tokens for our form, 16,500 for one Wikipedia article.
Standard npx config works, Node 18+, any MCP clientWorks
Worked first time with the official MCP SDK client, from an empty cache, in under 2 s (Chrome was already installed).
Open a claim to see what we measured.
The full report
Full result
Mostly works as claimed. Started by the one-line config, the server read our form as compact text, picked the right one of two identical "Submit" buttons every time, gave identical snapshots across runs, and most actions took about 20 ms. The weak spot showed up when an actual AI model drove it: two different free models both tried to pick a radio button through the fill-form tool with the option's name, and the tool silently unchecked it instead, because only "true" works and that isn't documented. One model also read the page before a late field loaded and never noticed.
The test task and exact input
Fixed before running (plan committed 08:46 UTC+8, commit ced302f). Our own local page with an order form and a decoy newsletter form; both have a button called exactly "Submit", and the Part number field only appears 1.5 s after load. Fill the order form with 8 known values (name, email, country Japan, quantity 7, Express shipping, gift checked, notes, part AX-4471-B), submit, and read back the confirmation code. Ground truth: one POST to /order with those 8 values, none to /newsletter, code BA36DB1F (computed beforehand). Core claims and pass marks: C1 standard npx config starts and loads the page with no extra setup = V2. C2 snapshots are enough for an LLM: our script 8/8 and a free text-only model 8/8 + correct code = V2; script 8/8 and model 6-7/8 or wrong code = V1. C3 deterministic: identical snapshots and refs in 3 fresh runs, decoy never clicked = V2; a wrong element acted on = F. C4 fast: median type/click/select call <= 500 ms = V2, <= 2 s = V1.
Go to http://127.0.0.1:8767/ and fill in the ORDER form (not the newsletter form) with exactly these values, then submit it: Full name: Mariana Okafor-Lindqvist Email: m.okafor@example.org Country: Japan Quantity: 7 Shipping speed: Express Gift: yes (check "This is a gift") Notes: Leave at reception, ask for Kenji. Part number: AX-4471-B After submitting, reply with the confirmation code shown on the page, in the form CODE: <code>. Server config: npx @playwright/mcp@latest --headless --isolated
What happened, step by step7 steps
- Captured the README and tool schemas; wrote the test page, server, values, expected code and pass marks; committed them (08:46)
Observed: The README lists 25 tools. Their schemas add up to about 20,000 characters (~5,000 tokens) that an agent sends with every request; the README itself suggests the Playwright CLI for coding agents for that reason. - C1: started the server with the vendor's standard config (npx @playwright/mcp@latest, plus --headless --isolated) from an empty npm cache
Observed: Downloaded 0.0.83 and connected in 1.9 s, listed 25 tools, loaded our page in 0.9 s. It used the Chrome already on our computer; we did not test a machine without Chrome. - C2a/C3/C4: our script read element refs from the snapshot text by label and filled the form, 3 fresh sessions
Observed: 8/8 fields and code BA36DB1F in 3/3 runs; 0 posts to the newsletter form. The starting snapshot (1,802 characters) was byte-identical in all 3 runs, with the same refs. Typing and selecting took a median 20 ms; clicks about 0.55-0.61 s, because each click waits a default 500 ms for the page to settle. - C2b: a free text-only model (NVIDIA Nemotron 3 Ultra) got the task and the tools; images dropped; max 25 turns
Observed: Finished in 6 turns (40K prompt tokens) and reported code 4DDF8A80, not BA36DB1F: 6/8 fields. It took its snapshot about 1.4 s after loading, before the Part number field appeared, and submitted without it. It set shipping with fill_form type radio, value "Express"; the server turned that into .uncheck() and reported no error. - Extra, not scored: same task with a second free model (Dots3-Note Preview); a third (Gemma 4 31B) was rate-limited upstream
Observed: 7/8: it used browser_find to locate the late Part number field, but lost Express shipping exactly the same way. - Checked browser_fill_form with a radio button directly
Observed: value "true" checks the radio. "Express" and "yes" both generate .uncheck() and return success. The schema only explains true/false for checkboxes, so a model has no way to know. - Extra: snapshot size vs screenshot
Observed: Our page: 1,802 characters (~450 tokens) vs a 28 KB PNG. A Wikipedia article: 66,150 characters (~16,500 tokens) vs a 163 KB PNG, so 'lightweight' depends heavily on the page.
Failure modes seen4 items
- browser_fill_form with a radio button: any value except "true" (for example the option's name) silently unchecks it and reports success; the schema only documents true/false for checkboxes. Two different models fell into this.
- After browser_navigate the response links to a snapshot file instead of returning it, so the agent must call browser_snapshot; one model did that before a late-loading field appeared and submitted without it.
- Clicks wait a default 500 ms to settle (adjustable with --timeout-settle).
- Big pages make big snapshots (~16,500 tokens for one Wikipedia article), and the 25 tool schemas add ~5,000 tokens to every request.
Evidence files13 files
- File: Test plan, values, expected code and pass marks, committed before running
- File: Vendor claims and version as captured
- File: Our test page (decoy form, late field)
- File: Local server that logs every submission
- Log: C1: standard config first run, tool list, first snapshot
- Log: 3 scripted runs: refs, timings, server posts
- File: The snapshot the agent sees (identical in 3/3 runs)
- Log: C2b: full model trace (Nemotron 3 Ultra)
- Log: What the server received from the model runs
- Log: Extra model run (Dots3-Note), not scored
- Log: fill_form radio: "true" checks, "Express"/"yes" uncheck
- Log: Snapshot vs screenshot sizes
- File: Agent loop used for the model runs
Vendor claims, as quoted
- "This server enables LLMs to interact with web pages through structured accessibility snapshots, bypassing the need for screenshots or visually-tuned models." / "LLM-friendly. No vision models needed, operates purely on structured data." (source)
- "Deterministic tool application. Avoids ambiguity common with screenshot-based approaches." (source)
- "Fast and lightweight. Uses Playwright's accessibility tree, not pixel-based input." (source)
- "Standard config works in most of the tools": npx @playwright/mcp@latest (Node.js 18 or newer, any MCP client) (source)
Lowest-access way to try it
L0. Add {"command": "npx", "args": ["@playwright/mcp@latest"]} to your MCP client and ask it to fill a test form. If it uses fill_form on radio buttons, tell it to pass value "true" (or use browser_click). Add --headless on servers.
Details: vendor, pricing, environment, time, cost
Not sponsored. No affiliate links. Vendors do not see results before they are published.
How to cite
TriedAgents, "Playwright MCP: tool test", partly works, tested 2026-10-26, https://triedagents.com/tools/playwright-mcp/
Get one re-run case every weekday
One agent use case we actually re-ran, every weekday. Free.
We only store your email address. Every issue has a one-click unsubscribe link. Privacy