MCP (Model Context Protocol) server for web search using multiple engines and web page browsing
Web Search Tool has clear, action-verb naming conventions (search, browse) and documented schemas with type definitions and basic constraints (enum formats, min/max for num_results). However, tool descriptions are generic (under 100 chars) and lack context on when to use each tool or what to do with results. Parameter descriptions exist but are minimal. Output schemas are not explicitly documented, only inferred from the code. Error handling is absent: no guidance on recovery if a search fails or a URL is unreachable. The server uses STDIO transport (hard cap 50 for protocol readiness). Compositions are reasonable (search and browse are separate concerns), but the tool interface does not provide IDs for chaining downstream operations.
Browse a web page and extract its content
Search the web and return results
Tool descriptions are too generic and lack actionable context. 'Search the web and return results' does not explain when to prefer search over browse, what format to pick, or what a 'result' contains. Minimum 50-100 char descriptions required by pattern:tool-description.
Output schemas are not documented. The code infers dict returns but does not specify fields, types, or pagination. LLMs cannot plan downstream operations (e.g., extracting URLs from search results) without knowing the response structure. pattern:tool and pattern:response-shaper require documented output schemas.
No error handling or recovery guidance. If search returns zero results or browse fails on a 404, the code returns a dict with an 'error' key but provides no guidance to the LLM on what to try next (retry, use a different engine, adjust query). pattern:recovery-guide requires actionable error messages.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 56 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 45 | - | v1 |
Parameter descriptions are minimal and lack format/constraint details. 'search_engine' has no enum constraint in the description, only 'duckduckgo or brave'. The 'format' parameter description does not explain the difference between text, json, and json-compact outputs. pattern:constrained-input requires explicit enums and format guidance.
Missing tool composition support. search() returns a list of results with 'title', 'link', 'snippet' but browse() requires a 'url' parameter. No guidance that 'link' from search == 'url' for browse. If downstream tools need result IDs or references, search does not return them. pattern:tool-chain requires chaining IDs.
STDIO transport only. Server is not remotely accessible and cannot be used by hosted MCP clients. This is a hard architectural limitation, not a quality issue with definitions, but it blocks production use.