DuckDuckGo search implementation for Model Context Protocol (MCP)
Single tool 'search' with basic schema and generic description. Tool naming is correct (starts with verb), but description lacks clarity on when to use it vs. other search tools, prerequisites, and what makes results useful for LLM decision-making. Input schema is present and properly typed (via Zod → JSON Schema), but parameter descriptions are missing entirely from the schema. Output is structured JSON but not formally documented in tool definition. Error handling returns structured JSON with suggestions (in Chinese), which is helpful but not integrated into the schema or documentation. No tool annotations present. Overall functional but below production baseline due to missing parameter documentation and lack of schema composition best practices.
Search the web using DuckDuckGo
Parameter descriptions completely missing from input schema. The Zod schema defines query, region, safeSearch, and numResults, but SearchArgsSchema lacks description metadata that would be extracted to the JSON Schema. LLMs cannot determine parameter constraints or purpose from names alone.
Tool description is generic (18 chars: 'Search the web using DuckDuckGo'). Does not state WHEN to use it, WHAT it returns, prerequisites, or how results structure helps LLM reasoning. Lacks dependency hints (e.g., 'Use this to find URLs, not for realtime data'). Does not explain that results include title, url, description, and metadata.
Output schema not documented in tool definition. The tool returns a custom structure with 'type', 'data' array, and 'metadata' fields, but this is not part of the inputSchema or a declared outputSchema. LLMs cannot predict what fields to extract or how to chain to other tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 37 | - | v1 |
Default region hardcoded to 'zh-cn' with no explanation. If the agent is English-speaking or in a different region, this default will produce suboptimal results. Should detect or accept region as a first-class parameter or provide intelligent defaults.
No input validation guidance. The schema specifies numResults as a number with default 50, but does not document min/max bounds. An LLM could pass 10000 results, causing timeouts or excessive token usage. Should specify 'numResults: 1 - 100' in description.
No tool annotations. Missing readOnlyHint, destructiveHint, or idempotentHint metadata. The search tool is read-only (no side effects), but this is not declared, forcing LLMs to infer it.