Web search and scraping MCP server with multi-engine search, URL discovery, content scraping, and RAG indexing capabilities
Five tools with basic verb-noun naming (search_web, scrape_url_chromium, discover_urls, index_scrapes, search_engine_drilldown). Descriptions present but generic and under 200 chars. Input schemas visible with type declarations but parameter descriptions are minimal or missing context. No output schemas documented. Error handling absent, no recovery guidance or actionable error messages. Tool composition is reasonable (each does one thing), but parameter naming lacks consistency (query vs seed_url) and no enum constraints on engine selection despite known set of 8 engines.
Discover a domain's URL set (robots/sitemap/navtree feeders); writes a pipe_scraper --url-file input.
Index previously-scraped URLs into a RAG collection (reads each URL's own sidecar).
Scrape URL to filtered markdown (PruningContentFilter, full content, no length cap).
Show URL list for a specific engine from cached search results (or re-runs search on cache miss).
Search across 7 engines. Returns engine breakdown table — use search_engine_drilldown to see URLs per engine.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., does search_web return URLs, snippets, engine breakdown?). Violates pattern:tool requirement.
search_engine_drilldown accepts 'engine' as free-form string with 8 known valid values (google, duckduckgo, mojeek, startpage, brave, bing, yandex, openalex) but no enum constraint. LLMs will hallucinate invalid engine names. Violates pattern:constrained-input.
Parameter descriptions are minimal or absent. 'query' in search_web says '(2-5 keywords)' but no description of what the tool returns or when to use search_engine_drilldown instead. Violates pattern:tool-description.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 45 | <=2025-11-25 | v2 |
No error handling or recovery guidance. If scrape_url_chromium fails on a URL, what should the LLM do? Retry? Call a different tool? No actionable error messages visible. Violates pattern:recovery-guide.
discover_urls writes to a file path provided by the LLM (url_file parameter). No validation, sanitization, or path traversal protection visible. LLM could be tricked into writing to /etc/passwd or other sensitive locations. Violates pattern:tool-gateway.