A Model Context Protocol server that provides web content fetching and conversion capabilities
This server provides four web-fetching tools with clear naming (verb_noun pattern) and decent descriptions. All tools have explicit input schemas with proper type definitions and descriptions. However, there are significant gaps: output schemas are completely undocumented, error handling is minimal with no recovery guidance, and the tools lack defensive parameter validation. The descriptions are adequate (averaging ~190 chars) but could be more specific about edge cases and failure modes. No tool annotations are present (readOnlyHint, idempotentHint). The implementation uses axios and playwright but offers no guidance on timeout behavior, SSL/TLS validation, or handling of redirects and authentication.
Converts web page content to well-formatted Markdown, preserving structural elements like tables and definition lists. Recommended as the default tool for web content extraction when a clean, readable text format is needed while maintaining document structure.
Extracts and converts the main content area of a web page to Markdown format, automatically removing navigation menus, headers, footers, and other peripheral content. Perfect for capturing the core content of articles, blog posts, or documentation pages.
Retrieves raw text content directly from a URL without browser rendering. Ideal for structured data formats like JSON, XML, CSV, TSV, or plain text files. Best used when fast, direct access to the source content is needed without processing dynamic elements.
Fetches fully rendered HTML content using a headless browser, including JavaScript-generated content. Essential for modern web applications, single-page applications (SPAs), or any content that requires client-side rendering to be complete.
Output schemas are completely undocumented. The tools return {content: [{type: 'text', text: string}]} but the LLM has no visibility into what data structure is returned, what fields are available, or what format the text content takes (HTML, markdown, plaintext, etc.).
No error handling or recovery guidance. The code catches errors (e.g., 'Failed to fetch HTML for {url}') and returns empty strings on failure, but the LLM receives no indication that a failure occurred or what to do next. No distinction between retryable (timeout) vs terminal (invalid URL) errors.
No input validation. The 'url' parameter is accepted as any string with no URL format validation, no restriction on schemes (http/https only?), no check for malformed URLs. An LLM could pass 'javascript:alert(1)' or a local file path and cause unexpected behavior.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 49 | - | v1 |
Parameter descriptions lack format constraints. The 'url' parameter description says 'URL of the target resource' but does not specify: required scheme (http/https), max length, handling of redirects, or behavior on missing resources. LLMs cannot infer these constraints.
No tool annotations. All four tools are READ_ONLY operations but no readOnlyHint annotation is present. The LLM cannot automatically determine safety/idempotency from the tool definition alone.
Missing documentation of timeout behavior. The code sets a TIMEOUT constant of 20000ms but this is not mentioned in any tool description. LLMs do not know when to expect a timeout or how long to wait before considering a request failed.