FastMCP 3.2 server for Playwright browser automation — browse, click, screenshot, extract
9 tools with basic schemas and descriptions, but significant gaps in parameter documentation and error handling. Most tools have 1-3 parameters with type info, but lack depth in descriptions (many under 100 chars). No output schemas documented. Error responses return generic dicts without recovery guidance. Tool names are action-verb based (browse_, click_, extract_) which is good, but descriptions are terse and lack WHEN/WHY context. No tool annotations (readOnlyHint, destructiveHint). Composition is reasonable, tools are single-purpose, but chaining support is weak (no IDs returned for follow-up calls).
BROWSE_PAGE — Navigate to a URL and extract all visible text content.
BROWSE_URL_CLI — Navigate to a URL using headless CLI (no Playwright). Uses chrome --headless --dump-dom or firefox --screenshot for quick operations without the overhead of a full Playwright browser session.
CLICK_ELEMENT — Click an element on the current page by CSS selector.
CLOSE_BROWSER — Close the browser and release resources.
EXTRACT_TEXT — Extract inner text from a CSS selector.
FILL_INPUT — Type text into an input field (clears existing value first).
LIST_BROWSERS — Detect installed browsers and available profiles. Scans common installation paths for Chrome, Firefox, Edge, and Brave. Also reports Firefox profiles from profiles.ini.
No output schemas documented. Tools return dicts with 'success', 'error', 'error_type' fields, but LLMs cannot plan downstream calls without knowing what fields to expect. browse_page returns 'title', 'url', 'text', 'status', none of this is declared in a schema.
Error responses lack recovery guidance. All tools return {'success': False, 'error': str(exc), 'error_type': type(exc).__name__}. This tells the LLM nothing about whether to retry, ask the user, or give up. E.g., 'Timeout' vs 'Invalid selector' require different strategies.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | <=2025-11-25 | v2 |
PRESS_KEY — Press a keyboard key (Enter, Escape, ArrowDown, Tab, etc.).
SCREENSHOT — Take a PNG screenshot of the current viewport.
Descriptions are terse and lack WHEN/WHY context. E.g., 'SCREENSHOT, Take a PNG screenshot of the current viewport.' (50 chars) does not explain when to use screenshot vs browse_page, or what the LLM should do with the PNG. Baseline is 194 chars; these average ~80.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes. click_element, fill_input, press_key are WRITE operations but carry no hint. close_browser is REVERSIBLE but unmarked.
Parameter 'headless' is repeated across 7 tools but lacks clear guidance on when to set it False. Description says 'Run browser headless (default: True)' but does not explain the trade-off (speed vs visibility) or when an LLM should override the default.