A TypeScript-based MCP server that provides DuckDuckGo search functionality.
Single tool with well-structured schema and reasonable description. Tool naming follows verb_noun convention (duckduckgo_web_search). Input schema is properly defined with type constraints, defaults, and enums. However, the description lacks strategic guidance on when to use this tool vs alternatives, and the output format is unstructured text rather than documented JSON. Rate limiting logic exists in code but is not exposed in tool documentation. No per-parameter descriptions beyond basic labels. Error handling returns text strings rather than structured error objects with recovery guidance.
Performs a web search using the DuckDuckGo, ideal for general queries, news, articles, and online content. Use this for broad information gathering, recent events, or when you need diverse web sources. Supports content filtering and region-specific searches. Maximum 20 results per request.
Output schema is undocumented. Tool returns formatted Markdown text ('# DuckDuckGo 搜索结果...') but the agent cannot know what structure to expect. LLM must parse unstructured text, wasting tokens and risking extraction errors.
Tool description lacks strategic context. It explains WHAT (web search) but not WHEN to use it vs other search tools or which results are included. Description should state: 'Use for current events, news, and general web content; DuckDuckGo may have different coverage than Google or Bing.'
Parameter descriptions are minimal labels, not actionable guidance. 'SafeSearch level (strict, moderate, off)' tells the LLM the option names but not what each does. Expand: 'SafeSearch=strict filters adult content; moderate filters explicit content only; off shows all results.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | 2026-07-28+ | v2 |
| 2026-03-09 | C | 61 | - | v1 |
Error handling returns plain text in 'isError: true' responses. No structured error classification (retryable, user-fixable, fatal) or recovery guidance. Rate limit errors say 'Rate limit exceeded' but do not advise whether to retry, wait, or escalate.
Rate limiting is enforced in code (1 req/sec, 15000 req/month) but not documented in the tool description. Agents have no visibility into these limits and may be surprised by throttling. Either document the limits or expose them via a describe_limits tool.