An MCP server that provides internet search capabilities using DuckDuckGo and web content fetching
Two tools with basic schemas and descriptions, but significant gaps in parameter documentation and output structure. Both tools have descriptions (10-20 chars baseline met), but lack depth on WHEN to use them and error recovery guidance. Schemas present but incomplete: max_results has a default but no min/max bounds; fetch_content lacks any parameter constraints. No output schema documented. Error handling returns plain strings rather than structured guidance. Rate limiting and timeout handling are implemented but not exposed to the LLM via tool descriptions.
Fetch and parse content from a webpage URL.
Search DuckDuckGo and return formatted results.
Output schemas not documented. Both tools return plain strings; LLMs cannot plan downstream calls or extract structured data. Should return JSON with fields like {results: [{title, url, snippet}], total_count, next_cursor} for search and {content, word_count, truncated} for fetch_content.
Parameter descriptions lack actionable constraints. max_results has no min/max bounds (baseline: 1 - 100); fetch_content URL parameter has no format hint (should specify http/https, max length). LLMs will pass invalid values without guidance.
Error responses are plain strings without recovery guidance. E.g., 'Search request timed out' tells the LLM nothing about retry strategy or alternatives. Should return structured errors like {error: 'timeout', retryable: true, suggestion: 'Try a simpler query or wait 60 seconds'}.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | <=2025-11-25 | v2 |
Tool descriptions do not explain WHEN to use each tool or dependencies. search() description is 47 chars; fetch_content is 52 chars. Should clarify: 'Use search() to find URLs, then fetch_content() to extract full text from a specific page.' Current descriptions are too terse for LLM selection.
No pagination support documented. search() accepts max_results but no offset/page parameter. If an LLM needs results 11 - 20, it must re-query with a different query string. Should add page/offset and return total_count or next_cursor.