Web search for AI agents, on your own servers.
Siftdog is a self-hosted, Tavily-compatible API to search, extract, crawl and map the web. No search API key, no per‑search bill.
Python · Docker · MCP · works with the Tavily SDK
$ claude mcp add siftdog -- uvx siftdog mcp Added stdio MCP server siftdog with command: uvx siftdog mcp to local config $ claude mcp get siftdog siftdog: Status: ✔ Connected Type: stdio > Use siftdog to find what's new in Python 3.14 Called siftdog
- Claude Code
- Cursor
- Claude Desktop
- tavily-python
- LangChain
Features
Everything an agent needs from the web
The four Tavily endpoints, an MCP server and the safety checks for running it in public.
Search
Ranked web results through SearXNG, with no search API key. BM25 relevance blended with the engines' order.
Extract
Clean markdown or text from up to 20 pages per request, with trafilatura.
Crawl & map
Follow a site's links with depth, breadth, limit and regex filters, or just list its URLs.
MCP server
Four read-only tools for Claude Code, Cursor and other clients, over stdio or HTTP at /mcp.
Tavily-compatible
Same endpoints and response shapes. The official tavily-python SDK and LangChain work unchanged.
Safe to expose
API keys, plus private-address blocking on every redirect and at connect time (stops DNS rebinding).
Drop-in
Switch from Tavily by changing one line
Same /search, /extract, /crawl and /map endpoints, same request and response fields. Point the official client at your server and keep your code.
Tested with tavily-python 0.8.4 (search, extract, crawl, map) and langchain-tavily 0.2.18 (search, extract).
Python
from tavily import TavilyClient
client = TavilyClient(
api_key="your-siftdog-key",
api_base_url="http://localhost:8000",
)
results = client.search("latest python release", search_depth="advanced")MCP
Give your agent web tools in one command
Four read-only tools: siftdog_search, siftdog_extract, siftdog_crawl and siftdog_map. Listed in the official MCP Registry as io.github.khsarvar/siftdog.
Run locally over stdio with uv:
claude mcp add siftdog -- uvx siftdog mcpOr connect to a running server over HTTP:
claude mcp add --transport http siftdog http://localhost:8000/mcpBenchmark
Measured against Tavily
45 queries through the same client, 25 September 2026.
Quick start
Running in a minute
The Compose stack includes SearXNG for search. The image and the Python package work on their own for extract, crawl and map.
git clone https://github.com/khsarvar/siftdog
cd siftdog
docker compose upAPI on port 8000 with SearXNG. OpenAPI docs at /docs.
docker run -p 8000:8000 ghcr.io/khsarvar/siftdogAdd -e SEARXNG_URL=… to enable search. Images for amd64 and arm64.
pip install siftdog
siftdog --port 8000Python 3.11+. Configure with environment variables or a .env file.
Compare
Siftdog vs Tavily, Firecrawl and crw
Pick Tavily if you'd rather not run infrastructure, Firecrawl or crw if you need JavaScript rendering. Siftdog is the Tavily API on your own servers, MIT licensed.
| Siftdog | Tavily | Firecrawl | crw | |
|---|---|---|---|---|
| License | MIT | Proprietary (hosted service) | AGPL-3.0 | AGPL-3.0 |
| Self-hosted | Yes | No | Yes | Yes (also a managed API) |
| Tavily-compatible API | Yes | — | No (own API) | No (own API) |
| Search source | SearXNG metasearch | Proprietary | — | SearXNG (bundled) |
| JavaScript rendering | No (static HTML) | — | Yes | Yes (Lightpanda, Chrome fallback) |
| MCP server | Yes (HTTP and stdio) | Yes | Yes | Yes |
| Language | Python | — | TypeScript | Rust |
Don't want to run servers?
Hosted Siftdog is planned: the same API and MCP endpoint, licensed search sources and no infrastructure. Join the waitlist to hear when it opens.
What is Siftdog?
Siftdog is an open-source web search and extraction API for AI agents. It reproduces the Tavily API (/search, /extract, /crawl, /map) on infrastructure you run yourself, using SearXNG for search results, trafilatura for content extraction and BM25 for relevance ranking.
Is Siftdog a drop-in replacement for Tavily?
For the four core endpoints, yes. Request and response fields match Tavily's, and the official tavily-python SDK and langchain-tavily work by setting api_base_url. Relevance scores come from BM25 rather than a neural reranker, and Tavily's /research endpoint isn't implemented.
Do I need a search API key?
No. Search results come from SearXNG, which queries public search engines. The only optional key is ANTHROPIC_API_KEY, used when a request sets include_answer.
Does Siftdog have an MCP server?
Yes. The API server exposes MCP over Streamable HTTP at /mcp, and uvx siftdog mcp runs it over stdio for local clients such as Claude Desktop, Claude Code and Cursor. It provides four tools: siftdog_search, siftdog_extract, siftdog_crawl and siftdog_map.
Is it safe to expose Siftdog on a public server?
Set API_KEYS so only your clients can call it. Because /extract and /crawl fetch caller-supplied URLs, Siftdog refuses private, loopback and link-local addresses, checked on every redirect and at connect time against the exact address used, which also stops DNS rebinding.