Experimental MCP server for browser automation using Puppeteer (inspired by @modelcontextprotocol/server-puppeteer)
Puppeteer MCP server has 8 tools with basic schemas and descriptions, but significant gaps limit production readiness. All tools have descriptions (10-50 chars, mostly short), and input schemas are present with type definitions. However, descriptions are generic and lack LLM-optimization guidance (e.g., 'Navigate to a URL' vs 'Navigate to a URL and wait for page load; returns page title and final URL'). Parameters lack detailed constraints, format specifications, and dependency documentation. No output schemas are documented. Error handling is minimal, handlers catch errors but provide no recovery guidance or categorization. Tool composition is reasonable (single responsibility), but descriptions don't explain when to use each tool vs alternatives. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications in metadata.
Click an element on the page
Connect to an existing Chrome instance with remote debugging enabled
Execute JavaScript in the browser console
Fill out an input field
Hover an element on the page
Navigate to a URL
Take a screenshot of the current page or a specific element
Descriptions are too short and lack LLM-optimization guidance. Most are 10-50 chars (baseline 194 chars). 'Navigate to a URL' and 'Click an element on the page' don't explain what the tool returns, when to use it vs alternatives, or prerequisites. LLMs cannot determine tool selection from these minimal descriptions.
No output schemas documented. Handlers return TextContent or ImageContent, but LLMs don't know what fields to expect (e.g., does navigate return page title, URL, load time?). This forces agents to guess and breaks downstream tool chaining.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 45 | <=2025-11-25 | v2 |
Select an element on the page with Select tag
Parameters lack format constraints and validation guidance. 'selector' is a CSS selector but no description says so. 'debugPort' has a default (9222) but no min/max bounds. 'width' and 'height' have no range constraints. LLMs will pass invalid values without guidance.
Error handling provides no recovery guidance. handlers.ts catches errors but returns raw error messages without categorization (retryable vs fatal) or actionable next steps. E.g., 'Failed to connect to browser' doesn't tell the LLM whether to retry, check the port, or ask the user.
Tool annotations missing. Metadata declares risk classifications (READ_ONLY, WRITE) but tools are not registered with readOnlyHint/destructiveHint/idempotentHint. This prevents clients from applying safety policies or warning users before destructive operations.