MCP server for fetching website content in multiple formats (HTML, Markdown, plain text, JSON)
Four tools with complete input schemas and basic descriptions, but significant gaps in parameter documentation and output schema specification. All tools share identical parameter sets (url, headers, max_length, start_index) with minimal differentiation in descriptions. No output schemas documented. Parameter descriptions are generic and lack constraints (e.g., no guidance on max_length bounds, start_index behavior, or header format). Error handling is present but not documented in tool descriptions. Tools follow verb_noun naming convention (fetch_*) which is positive, but descriptions are brief (34-48 chars) and lack context on when to use each variant or what data structures are returned.
Fetch a website and return the content as HTML
Fetch a JSON file from a URL
Fetch a website and return the content as Markdown
Fetch a website, return the content as plain text (no HTML)
No output schemas documented. LLMs cannot infer what fields are returned (e.g., does fetch_html return {content, status, url} or just a string?). This forces agents to guess downstream field names and risks broken tool chains.
Parameter descriptions lack constraints and context. 'max_length' and 'start_index' have no guidance on valid ranges, behavior at boundaries, or why an agent would use them. 'headers' description does not specify format (object of strings?) or security implications.
Tool descriptions are too brief (34 - 48 chars, below 50-char baseline for clarity). 'Fetch a website and return the content as HTML' does not explain when to use fetch_html vs fetch_markdown vs fetch_txt, or what the agent should expect in return.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
No error handling guidance in tool descriptions. Fetcher.ts includes private IP checks and error handling, but tool descriptions do not document what errors are possible (network timeout, invalid URL, private IP blocked) or how agents should recover.
All four tools accept identical parameters with no semantic differentiation. The 'headers' parameter is optional but undocumented, agents cannot know if it accepts {'Authorization': 'Bearer token'} or only safe headers, or whether secrets should ever be passed here.