MCP Server for searching via DuckDuckGo
Two tools with basic schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. Both tools have action-verb names (search, fetch_content) and non-empty descriptions (47 and 50 chars respectively), meeting minimum bars. However, parameter descriptions are minimal, output schemas are not formally documented, and error handling lacks recovery guidance. The server implements rate limiting and timeout handling internally, but does not expose these constraints to the LLM via parameter documentation. No tool annotations (readOnlyHint, idempotentHint) despite both being read-only operations.
Fetch and parse content from a webpage URL.
Search DuckDuckGo and return formatted results.
Output schemas not documented. Neither tool declares what fields are returned or their types. LLMs cannot plan downstream operations or extract structured data without knowing response shape.
Parameter descriptions lack format/constraint details. 'query' and 'url' parameters have minimal guidance on expected format, length limits, or valid patterns.
Error responses lack recovery guidance. Code catches timeouts and HTTP errors but returns generic messages ('Search request timed out', 'HTTP error occurred'). Per pattern:recovery-guide, errors should suggest next steps (e.g., 'Try rephrasing the query' or 'Verify the URL is accessible').
No tool annotations despite read-only semantics. Both tools are safe to retry and have no side effects, but lack readOnlyHint annotation. This forces LLMs to reason about safety instead of relying on explicit metadata.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | <=2025-11-25 | v2 |
Result limits not documented in tool descriptions. search() caps at max_results (default 10) and fetch_content() truncates at 8000 chars, but these constraints are not mentioned in descriptions. Per mxe:enforce-result-limits, limits should be explicit.