MCP server for extracting and converting articles from URLs to markdown format
Single-tool server with moderate quality. Tool has a clear verb-based name (get_article-as-markdown) and adequate description (41 chars, within baseline 34-392 range). Input schema is present with proper Zod validation (z.string().url()). However, critical gaps exist: parameter description is minimal (only 'URL to fetch and convert to markdown'), no output schema documentation in code, error handling is generic ('Failed to retrieve article: ' + error), and no guidance on failure recovery. The tool is directly visible in src/index.ts, so no inference cap applies. No pagination, structured output documentation, or per-item error breakdown. Error messages concatenate raw exception text rather than providing actionable recovery guidance.
Get article as markdown from URL
Parameter description is too brief (23 chars). Rubric baseline for parameter annotations is 72 chars average. Should include expected format, URL constraints, and retry guidance.
No output schema documented. Tool returns structured text content but does not explicitly document the shape of markdown output, expected length constraints, or failure scenarios. Rubric requires 100% of A+ tools have documented return types.
Error handling is generic and non-actionable. Responses concatenate raw exception text ('Failed to retrieve article: ' + error) instead of categorizing errors (retryable vs user-fixable vs fatal) or guiding recovery (e.g., 'Invalid URL. Ensure the domain is reachable and returns HTML content.').
No timeout or rate-limit safeguards visible. Tool calls JSDOM.fromURL() without explicit timeout, risking agent starvation on slow/hanging servers. Rubric requires setting explicit timeouts for external service calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 36 | - | v1 |
Tool description (41 chars) is brief but not deeply problematic. However, it lacks WHEN/WHY context. Should state: 'Fetches and converts web articles to markdown, extracting main content while removing ads and navigation. Use when you need to save or quote article text. Fails gracefully if content is paywalled or requires authentication.'
No input validation before external call. Tool accepts any valid URL (via z.string().url()) but does not validate against local/private IPs, overly large responses, or dangerous URL schemes (file://, data://, javascript://). An LLM could be tricked into fetching sensitive internal services.