MCP Server for website2markdown — convert URLs to Markdown for AI agents
The server exposes a single tool, convert_url, with a clear action verb and reasonable description. The tool has a properly structured input schema with four parameters, all typed and described. However, several definition quality gaps prevent a higher score: (1) The output schema is completely undocumented, the response structure is not specified anywhere in the visible code, forcing LLMs to infer what fields will be returned. (2) Parameter descriptions, while present, are minimal (10 - 30 chars) and lack actionable detail, e.g., 'CSS selector to extract specific content' doesn't explain the expected format or selector syntax, and 'Force browser rendering for JS-heavy pages' doesn't explain when this is necessary or its performance implications. (3) No error handling guidance is visible, the tool provides no recovery hints if the URL is invalid, inaccessible, or malformed. (4) The tool description (92 chars) is adequate but generic; it doesn't explain which output format to prefer or when to use selector vs. force_browser. (5) No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present, though this tool is read-only and idempotent and should declare both. The implementation delegates to convertUrl() in convert.js, which is not shown, so the actual output shape and error behavior are opaque. Baseline comparison: tool description length is below the p10 (34 chars minimum), parameter descriptions lack the 50 - 100 char range typical of A+ tools, and there is no documented return schema (baseline: 100% of A+ tools document return types).
Convert a web page URL to clean Markdown. Supports any public URL including Chinese platforms (WeChat, Zhihu, CSDN, etc.)
Output schema is completely undocumented. The tool description and parameter list are visible, but the response structure (fields, types, and format) is not declared anywhere in the code. LLMs cannot plan downstream steps or validate results without knowing what fields to expect.
Parameter descriptions are minimal and lack actionable constraints. E.g., 'CSS selector to extract specific content' (30 chars) does not specify valid selector syntax (e.g., CSS 3 selectors), what to do if no match, or how selectors interact with force_browser. 'Force browser rendering for JS-heavy pages' (47 chars) doesn't explain when it's necessary, its latency cost, or failure modes. Baseline: A+ tools average 50 - 100 chars per parameter description.
No tool annotations present. The tool is read-only (it does not modify state) and idempotent (same input always produces same result). These properties should be declared via readOnlyHint and idempotentHint in the tool schema so LLMs can infer safety and retry logic without guessing.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
No error recovery guidance. The tool may fail due to invalid URLs, network errors, unsupported content, or invalid selectors. The visible code provides no recovery hints (e.g., 'If the URL is invalid, check that it is a valid HTTP(S) URL'). Error responses should guide the LLM's next step.
Undocumented format enum behavior. The 'format' parameter accepts 'markdown', 'html', 'text', 'json' with a default of 'markdown', but the description does not explain when to use each format, what the output structure is for each, or what the 'json' format contains.