MCP adapter for web search and page reading with SearXNG and Playwright
Five tools with complete input schemas and descriptions. Naming is clear and action-oriented (search, deep_search, navigate, screenshot, read_page). Descriptions are detailed (100-250 chars) and include usage guidance. Parameters have types and descriptions. However, output schemas are not formally documented, responses are free-text strings rather than structured objects. Error handling is present but generic. No tool annotations (readOnlyHint, idempotentHint). Instructions are comprehensive but belong in system prompt, not tool definitions.
Deep web search: finds links via SearXNG, then reads the full rendered content of each page with a headless browser. Use when snippets are not enough.
Navigate to a URL and return its content.
Unified page reader for small-model routing.
Take a screenshot of a web page and return it as an image.
Quick web search: returns titles, URLs, and text snippets from SearXNG. Fast (~1s). Use this by default. Use deep_search when you need full page content.
Output schemas not documented. All tools return free-text strings instead of structured JSON objects. LLMs cannot parse results reliably or chain tools without manual text parsing.
No tool annotations. Tools lack readOnlyHint, idempotentHint, or destructiveHint. LLMs cannot determine which tools are safe to retry or have side effects.
Error messages are generic ('ERROR: search failed: ...') without recovery guidance. LLMs cannot determine whether to retry, adjust parameters, or escalate.
Verbose instructions embedded in tool definition. The 400+ character routing guide and call budget rules should be in system prompt or agent configuration, not in the MCP tool description.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Parameter 'mode' in read_page uses string enum without formal constraint. Description lists valid values but no JSON Schema enum field enforces them.