Self-contained web search MCP server. 9 backends with automatic fallback. Readability HTML extraction, PDF text extraction, circuit breakers. Works from any IP. Pure Rust.
9 backends tried in order: Serper → Tavily → Bing → Wikipedia → StackOverflow → GitHub → Wiby → DDG Instant → DuckDuckGo HTML. First success wins.
Per-backend circuit breakers and governor keyed rate limits. Transient errors get classified exponential-backoff retry; CAPTCHA and rate limits fail fast.
visit_page: HTML via dom_smoothie Readability, PDF via infer + pdf-extract. Responses classified as Html, Pdf, or Binary before Markdown conversion.
Wikipedia, StackExchange, GitHub, Wiby, and DDG Instant always work — even from datacenter/VPS IPs where Google, Bing, and DDG HTML are CAPTCHA-blocked.
Drop-in MCP for Claude, Cursor, pawan, or any MCP client. STDIO and SSE transports. Tools: web_search, visit_page, crawl_site (search_duckduckgo alias).
No Docker. No Python. Single binary. Async I/O, connection pooling, moka response caching. Daedra IS the search infrastructure.
| Backend | Type | API Key | Works from VPS? |
|---|---|---|---|
| Serper.dev | Google JSON API | SERPER_API_KEY | Yes |
| Tavily | AI-optimized API | TAVILY_API_KEY | Yes |
| Bing | HTML scraping | None | Sometimes |
| Wikipedia | OpenSearch API | None | Always |
| StackExchange | Public API | None | Always |
| GitHub | Public API | None / GITHUB_TOKEN | Always |
| Wiby | Indie web search | None | Always |
| DDG Instant | Knowledge graph API | None | Always |
| DuckDuckGo | HTML scraping | None | Rarely |
{
"mcpServers": {
"daedra": {
"command": "daedra",
"args": ["serve", "--transport", "stdio", "--quiet"]
}
}
}
daedra search "rust async runtime" --num-results 5
daedra fetch https://rust-lang.org
daedra check