MCP Server for searching via DuckDuckGo
The server implements three well-defined tools with clear action-verb naming (search, fetch_content, expand_link) and complete input schemas. All tools have descriptions and parameters are properly typed. However, output schemas are not documented in the source code, error handling lacks recovery guidance, and parameter descriptions could be more detailed regarding constraints and formats. The tools follow basic composition patterns (single responsibility, chainable) but lack the LLM-optimized refinement expected of A-grade implementations.
Expand a ref:// token returned by search results back to its original URL.
Fetch the full content of a webpage from a URL or ref:// token returned by search results.
Search DuckDuckGo for a given query and return a list of results.
Output schemas are not documented in source code. LLMs cannot plan downstream tool calls or extract data without knowing the structure of responses (e.g., search results return title/link/snippet fields, but this is not declared in tool definitions).
Error handling lacks recovery guidance. When expand_link receives an unknown token, the code returns a descriptive message, but search and fetch_content error modes are not visible in tool definitions. LLMs need to know: is the error retryable? Should they call a different tool? This forces agents to guess.
safe_search parameter should be declared as an enum constraint, not a free-form string with description. Current description lists 'strict', 'moderate', 'off' as examples, but JSON Schema allows any string. LLMs may hallucinate invalid values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 49 | - | v1 |
max_results and start_index/max_length parameters lack numeric bounds. Unbounded integers let LLMs pass absurd values (e.g., max_results=1000000) that could overwhelm the service or hit timeouts.
fetch_content description does not specify output format (HTML, plaintext, markdown) or handling of rich content (images, tables, scripts). LLMs must know the structure to use results effectively.
expand_link description does not explain that tokens expire when the server restarts, forcing agents to re-run search. This is a critical dependency that should be documented.