Playwright MCP server with per-tool tab_index support for parallel agent use
Strong tool naming (verb_noun pattern) and comprehensive parameter schemas with type definitions. All 16 tools have descriptions and input schemas. Tab reference pattern (tab_index vs tab_id) is well-designed for parallel agents. However, output schemas are not documented, LLMs cannot predict return structure. Error handling lacks recovery guidance. Some descriptions are generic (e.g., browser_run_code: 'Run a Playwright JavaScript function'). Missing parameter constraints (e.g., timeout ranges, selector format hints). No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels.
Click an element. Use force:true to bypass actionability checks when overlays block; trial:true to verify hit target without clicking.
Close the browser and all tabs.
Describe the shared browser context: all tabs, origins, and a note that cookies/storage are per-origin (localhost vs 127.0.0.1 are different).
Upload one or multiple files in the specified tab.
Fill multiple form fields at once.
Hover over an element.
Install Playwright browsers (chromium, firefox, webkit).
Output schemas not documented. LLMs cannot predict return structure (fields, types, pagination). Forces agents to guess what data is available after each call.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools marked with Risk levels (WRITE, DESTRUCTIVE, READ_ONLY) in metadata but not exposed to LLM via schema annotations.
Error handling lacks recovery guidance. No examples of error responses or actionable next steps. LLMs cannot self-correct on failures.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Navigate to a URL in the specified tab. Relative paths like /foo require base_url or PLAYWRIGHT_MCP_BASE_URL.
Press a keyboard key.
Run a Playwright JavaScript function against the specified tab.
Select an option in a <select> element.
Accessibility snapshot (structured DOM text). Use root_selector to narrow scope; max_chars avoids huge MCP payloads.
List, create, or close browser tabs.
Take a screenshot of the specified tab. Returns a base64 PNG image.
Type text into a focused or selected input element.
Wait for a selector to appear or disappear, or wait for navigation.
Parameter constraints missing. Numeric params (timeout, max_chars) lack min/max bounds. Selector params lack format hints. LLMs may pass invalid values.
browser_run_code description is vague ('Run a Playwright JavaScript function'). Does not explain what context is available, what the function should return, or error handling.