MCP Server for searching via DuckDuckGo and fetching web content
This server exhibits significant gaps across naming, descriptions, and schemas. Of 5 tools, only 3 have non-trivial descriptions (search, fetch_content, get_tech_news). The 'add' and 'multiply' tools lack any description, a critical violation of pattern:tool-description. Naming is inconsistent: 'search' and 'fetch_content' are verb_noun style, but 'add', 'multiply' are bare verbs without object context. Parameter descriptions are present for search and fetch_content but missing entirely for math tools. Output schemas are undocumented for all tools, a requirement for LLM planning and chaining. The mixing of unrelated domains (DuckDuckGo search + math operations + tech news) in a single server signals poor composition design. Error handling is minimal: the code logs errors to stderr but provides no recovery guidance to the LLM.
Fetch and parse content from a webpage URL.
Fetches the latest news from a specific tech news source.
Search DuckDuckGo and return formatted results.
Missing descriptions for 2 of 5 tools (add, multiply). Pattern:tool-description requires every tool to have a description explaining WHAT it does, WHEN to use it, and any prerequisites. LLMs cannot determine when to select these tools without descriptions.
Output schemas are completely undocumented. The code shows return types (e.g., List[SearchResult], str) but the MCP tool definitions do not expose structured output schemas. LLMs cannot plan downstream chaining without knowing what fields are returned. This violates pattern:response-shaper.
No error recovery guidance. The code catches exceptions and logs them (ctx.error, ctx.info) but returns opaque errors or empty lists on failure. E.g., search() returns [] on timeout with only a logged message. LLMs have no actionable feedback to retry with modified parameters or select an alternative tool. Violates pattern:recovery-guide.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 40 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 27 | - | v1 |
Bare verb naming for 'add' and 'multiply'. The rubric requires verb_noun style (e.g., calculate_sum, compute_product). Bare verbs lack object context and are ambiguous when multiple tools are present. An LLM seeing 'add' and 'multiply' alone cannot infer they perform arithmetic without reading parameter descriptions.
Tool cohesion broken: DuckDuckGo search, math operations, and tech news are three unrelated domains in one server. Violates pattern:tool (each tool should do exactly one thing) and suggests poor server design. This increases LLM confusion and makes the server hard to maintain.
Parameter descriptions for math tools are missing. Input schema for 'add' defines 'a' and 'b' as integers but provides no description of what they represent (operands? coefficients?). Parameter descriptions are mandatory per pattern:tool-description.
Pagination and result limits not explicitly documented. The 'search' tool accepts max_results (default 10) but does not state whether limits are enforced, what the max cap is, or how to handle large result sets. fetch_content truncates at 8000 chars silently. Pattern:paginated-result requires explicit limit documentation.
No idempotency guarantees documented. The fetch_content and search tools call external services without idempotency keys or conflict detection. If an agent retries on a transient error, duplicate results or duplicate fetches may occur. Pattern:idempotent-operation requires stateful operations to be idempotent.