A Model Context Protocol server for Playwright browser automation, providing tools for web scraping, testing, and interaction via MCP or HTTP REST API
The server defines 21 browser automation tools with visible schemas and descriptions in BrowserAutomation.cs. However, quality is uneven: most tool descriptions are 20-50 chars (below the 50-200 char baseline for LLM optimization), parameter descriptions are sparse or generic, and output schemas are completely undocumented. Tools like browser_navigate, browser_click, browser_type have basic descriptions but lack guidance on when to use them vs. similar tools. Parameter names are mostly clear (e.g., 'ref' for CSS selector), but many lack detailed constraints. Error handling is minimal, no recovery guidance, no categorization of retryable vs. fatal errors. The composition is good (each tool does one thing), but the definitions themselves fall short of production baseline.
Click on an element
Close browser and cleanup resources
Get collected console messages from the page
Drag an element to another location
Execute JavaScript code in the page context
Upload file(s) to a file input element
Fill form fields with values
Tool descriptions are too short (average 25-50 chars) to guide LLM selection. Baseline is 50-200 chars. Examples: 'Get accessibility snapshot of the current page' (43 chars), 'Hover over an element' (21 chars), 'Close browser and cleanup resources' (34 chars). These lack context on when to use the tool vs. similar ones, and do not hint at prerequisites or side effects.
Output schemas are completely undocumented. No tool declares what fields it returns, what types they are, or what the LLM should expect. This forces the LLM to guess the response structure and breaks tool chaining. Example: browser_navigate returns what? A success boolean? The final URL? A page title? Completely unclear.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 46 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | 2024-11-05+ | v1 |
Handle browser dialogs (alert, confirm, prompt)
Hover over an element
Install Playwright browser binaries
Navigate to a URL
Navigate back in browser history
Get recorded network requests
Press a keyboard key
Resize browser window
Select option(s) from a select element
Get accessibility snapshot of the current page
Manage browser tabs (list, switch, close, new)
Take a screenshot of the current page or element
Type text into an element
Wait for an element, navigation, or timeout
Parameter descriptions are generic or missing. Example: browser_click 'ref' param says 'CSS selector or locator string (required)' but does not explain the difference between the two, when to use each, or what format is expected. No examples or constraints. Parameter 'element' is described only as 'Element identifier', ambiguous.
No error handling guidance. The HTTP server (HttpServer.cs) catches generic exceptions and returns JSON like '{ "error": ex.Message }', but does not categorize errors or suggest recovery steps. An LLM receiving 'Timeout waiting for element' has no idea if it should retry, adjust the timeout, or try a different selector. No recovery patterns.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). The server marks tools with Risk levels (READ_ONLY, WRITE, DESTRUCTIVE) in the metadata, but these are not exposed in the MCP tool definition. An LLM cannot see that browser_close is destructive or browser_snapshot is read-only from the MCP schema alone.
Parameter 'action' in browser_tabs and browser_handle_dialog is described as a free-form string (e.g. 'Tab action: list, switch, close, new') but not declared as an enum. This invites the LLM to hallucinate invalid actions like 'close_all' or 'refresh'. Should use JSON Schema enum constraint.
No pagination support. Tools like browser_console_messages and browser_network_requests return unstructured lists with no limit, offset, or cursor. If a page logs thousands of messages, the entire list is returned, blowing the context window. No indication of result size or available pagination.
No confirmation or dry-run for destructive operations. browser_close permanently closes the browser with no warning, preview, or confirmation step. An LLM in an error loop could accidentally shut down the session. Should support --dry-run or require explicit confirmation.