MCP server for Cloudflare Search API - Aggregated search across multiple engines (Google, Brave, DuckDuckGo, Bing)
The server defines 2 search tools with identical schemas and reasonable descriptions. However, there are significant issues: (1) naming duplication, 'web_search' and 'search' are synonymous, forcing LLM reasoning overhead with no functional distinction; (2) descriptions are adequate but generic, missing actionable guidance on WHEN to use each tool or what differentiates them; (3) parameter documentation is present but minimal, no guidance on query length, language support, timeout behavior, or what 'engines' do if unresponsive; (4) output schema is not formally documented, the code returns formatted text rather than structured data, forcing LLM to parse plain-text results; (5) error handling returns only text messages with no recovery guidance; (6) no tool annotations (readOnlyHint present via Risk field, but not in MCP schema). Both tools are READ_ONLY (appropriate for search), but this is not declared in the tool definitions. The implementation is functional but lacks production-grade documentation and composition clarity.
Search across multiple search engines (Google, Brave, DuckDuckGo, Bing) and return aggregated results. This tool provides comprehensive search results from multiple sources, with source attribution for each result.
Search the web for current information, news, or any topic. Uses multiple engines (Brave, DuckDuckGo, Google, Bing) simultaneously and returns aggregated results with source URLs. Use this when you need real-time information not in your training data.
Duplicate tool definitions with identical behavior. 'web_search' and 'search' are functionally identical (same schema, same API call), forcing the LLM to reason about which to use despite no functional difference. This violates the single-responsibility principle and wastes LLM reasoning cycles.
No output schema documentation. The code returns formatted text (plain-text summary with title, description, URL per result) rather than structured JSON. LLMs cannot reliably parse the text format, and downstream tools cannot chain on structured fields. No documented return type.
Parameter descriptions lack actionable constraints. The 'query' parameter has no guidance on min/max length, character restrictions, or language support. The 'engines' array has no explanation of what happens if an engine is unresponsive (code shows unresponsive_engines in response, but this is not documented in the parameter description).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 54 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 49 | - | v1 |
Error handling provides no recovery guidance. Errors return plain text like 'Search failed: API request failed: 500 ...' without suggesting next steps (retry, check URL, try different engines). LLM cannot self-correct.
Tool annotations missing from MCP schema. Risk field indicates READ_ONLY status, but MCP tool definitions do not include readOnlyHint or destructiveHint annotations. The annotation should be explicit in the tool schema.