Self-contained web search MCP server. 14 unkeyed backends with automatic fallback. Mwmbl and Marginalia answer from any IP. Brave HTML may rate-limit. Works from any IP. Pure Rust.
14 unkeyed backends run each query. Results merge by relevance. Mwmbl → Brave → Marginalia → Bing RSS → Bing → Google News → HN → Google → Wikipedia → StackOverflow → GitHub → Wiby → DDG Instant → DuckDuckGo HTML.
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-inspector, Office documents via anydoc. Responses classified as Html, Pdf, Document, Text, or Binary before Markdown conversion.
Mwmbl, Marginalia, 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? |
|---|---|---|---|
| Mwmbl | Public JSON API | None | Always |
| Brave | HTML scraping | None | Sometimes |
| Marginalia | Public JSON API | None / MARGINALIA_API_KEY | Always |
| Bing RSS | RSS | None | Always |
| Bing | HTML scraping | None | Sometimes |
| Google News | News RSS | None | Always |
| Hacker News | Algolia JSON | None | Always |
| HTML scraping | None | Rarely | |
| 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