A TypeScript implementation of an MCP server that fetches web content using Puppeteer and converts it to markdown
Single-tool server with moderately well-defined schema and descriptions. Tool naming is clear and verb-based ('fetch_url'), parameter descriptions are present with reasonable detail, and input schema uses Zod for validation with types. However, output schema is not documented, error handling lacks recovery guidance for LLMs, and composition patterns are not leveraged. The tool description (67 chars) meets baseline but could be more prescriptive about when/why to use it. Parameters are properly typed but lack usage examples and edge-case guidance.
Fetch a URL using Puppeteer and return the content as markdown
Output schema not documented for LLM planning. The tool returns {content: [{type, text}], isError?: boolean} but this structure is not exposed in the tool definition, forcing LLMs to infer the response shape. This violates the documented output schema requirement and prevents proper chaining.
Error handling lacks recovery guidance. When the tool returns an error (e.g., invalid URL, timeout, invalid selector), the error text is plain 'Error fetching {url}: {message}' with no actionable next steps. LLMs receive no guidance on whether to retry, call a different tool, or ask the user for clarification.
Missing parameter constraints and edge-case guidance. 'timeout' accepts any positive integer but no upper bound is enforced or documented (e.g., max 120000ms). 'waitForSelector' has no validation that the selector is valid CSS. Users passing absurd timeouts or malformed selectors receive cryptic Puppeteer errors rather than clear feedback.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 45 | - | v1 |
Resource template (fetch://{url}) is partially implemented but not integrated with tool discovery. The resource template's list() returns an empty array, making it impossible for LLMs or clients to discover what resources are available. The template is also never actually used in practice, it shadows the tool functionality without clear added value.