A minimal MCP server that provides web search and page fetching capabilities using DuckDuckGo
Two tools with clear verb-noun naming (web_search, fetch_page) and reasonable descriptions (118 - 145 chars, within baseline 34 - 392). Input schemas present with proper JSON Schema structure and required fields. However, parameter descriptions are minimal (6 - 11 chars: 'Search query', 'URL to fetch'), falling well below the 72-char baseline and providing no guidance on format, constraints, or error recovery. No output schema documented, LLMs cannot predict response structure or plan downstream calls. Error handling returns plain text without recovery guidance. No tool annotations (readOnlyHint, idempotentHint) despite both tools being read-only. Missing pagination, rate-limit guidance, and timeout documentation.
Fetch the text content of a web page. Returns plain text with HTML stripped. Use this to read the full content of a URL from search results.
Search the web using DuckDuckGo. Returns a list of result titles, URLs, and snippets. Use this when you need current information.
Parameter descriptions are minimal (6 - 11 chars) vs. baseline 72 chars. 'Search query' and 'URL to fetch' lack format guidance, constraints, or error recovery hints. LLMs cannot infer valid input ranges or expected formats.
No output schema documented. LLMs cannot predict response structure (e.g., does web_search return JSON, plain text, or structured objects?). Prevents planning of downstream tool calls and forces guessing.
Error responses lack recovery guidance. 'Missing or empty query parameter' and 'Invalid URL provided' do not suggest next steps (e.g., 'Try a different query' or 'Verify the URL format'). Agents cannot self-correct.
No tool annotations despite both tools being read-only. Missing readOnlyHint annotation prevents clients from optimizing caching, retry logic, or safety checks.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | 2026-07-28+ | v2 |
web_search lacks pagination and result-limit documentation. Returns up to 5 results hardcoded; no offset/limit parameters or next_cursor. Large result sets could exhaust context; no guidance on handling truncation.