MCP server with web_search and web_fetch tools. Searches Brave and DuckDuckGo simultaneously with deduplication. Supports HTTP proxy for users behind firewalls.
Two tools with clear naming and reasonable descriptions, but critical gaps in schema documentation and error handling. Tool definitions exist in source code (streamable-http/netlify/mcp-server/index.ts) and are registered with McpServer. Both tools have verb-noun naming (web_search, web_fetch) and descriptions present. However, input parameter schemas are inferred from code rather than explicitly documented in a machine-readable format. Descriptions are adequate (86-146 chars) but lack detail on output format, error cases, and when to use each tool relative to alternatives. No output schema documentation visible. Error handling is minimal, generic fetch failures are logged but no actionable recovery guidance provided to agents. Ad filtering and captcha detection exist in code but are not surfaced in tool descriptions, limiting the LLM's understanding of what the tool actually does.
Fetch the full content of a web page and optionally convert it to Markdown format
Search the web using Brave and DuckDuckGo search engines simultaneously with result deduplication
Input schemas not explicitly documented in tool registration. Schemas inferred from code (query as string, url as string, markdown as boolean) rather than formally declared in McpServer.tool() calls or JSON Schema. This violates the HARD SCORING RULE: if schemas are not visible in the actual tool definition, cap schema score.
Output schema not documented. web_search returns SearchItem objects (url, title, summary) deduplicated, but this structure is never surfaced in tool description or formal output schema. Agents cannot plan downstream operations without knowing what fields to expect. web_fetch returns HTML or Markdown content, but character limits, pagination behavior (if any), and handling of very large pages is undocumented.
Error handling is silent and non-actionable. DuckDuckGo captcha detection (isDuckDuckGoCaptchaHtml) is handled internally but no error is returned to the agent, the tool appears to fail silently or return empty results. Brave/DDG fallback URLs are tried on failure, but agents receive no signal that a retry happened or why results might be stale. No guidance on retry-ability or manual intervention.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 56 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 26 | - | v1 |
Description lacks guidance on when to use web_search vs web_fetch. No hint that web_search finds URLs but web_fetch retrieves full content. Agents may not understand the two-step pattern (search then fetch) and may attempt to fetch before searching. Composition is broken without explicit dependency hints.
web_fetch markdown parameter is optional with no default specified in description. Agents won't know whether to pass true, false, or omit it. Best practice: 'markdown (optional, defaults to false), if true, convert HTML to Markdown; otherwise return raw HTML.' Current description is ambiguous: 'Whether to convert HTML content to Markdown format (optional, defaults to false)', the phrase 'defaults to false' is tucked at the end and easy to miss.
No result limits or pagination documented. web_search returns deduplicated results but no description of how many results to expect, maximum results per call, or whether pagination is supported. Returning unbounded lists risks exhausting context windows. Baseline expectation: 'Returns up to 20 results' or similar cap.
web_search parameter 'query' lacks format guidance. No hints on search syntax (Boolean operators, phrase quotes, site:domain filters, etc.). Agents will pass natural language queries which may not yield optimal results. Actionable improvement: 'Search query string. Supports site:domain.com, "exact phrase", -exclude operators'.
web_fetch parameter 'url' has no validation guidance. Should specify: valid URLs only, HTTP/HTTPS required, no data: or javascript: URLs, URL character limits. Current description is minimal: 'URL of the web page to fetch'. Agents may pass invalid URLs causing opaque errors.