关于 Siftdog
Siftdog 是面向 AI Agent 和 LLM 应用的可自托管网页搜索与提取 API,兼容 Tavily 的核心端点。它还通过 MCP 提供搜索、提取、爬取和站点地图工具。
主要功能
- 01兼容 Tavily 的搜索、提取、爬取和映射 API
- 02基于 SearXNG 搜索,无需搜索 API 密钥
- 03将网页提取为 Markdown 或文本
- 04BM25 相关性排序及高级页面分块
- 05按深度、广度和路径筛选爬取
- 06保护抓取目标,阻止 SSRF 请求
适用场景
- 01在自有基础设施运行兼容 Tavily 的网页检索
- 02让 AI Agent 通过 MCP 搜索、提取或爬取
- 03用高级搜索收集相关页面片段
- 04按指定路径和域名生成站点地图或爬取
MCP 相关
提供四个只读 MCP 工具:siftdog_search、siftdog_extract、siftdog_crawl 和 siftdog_map。客户端可通过 /mcp 的 HTTP 接口连接,也可运行 siftdog mcp 使用 stdio。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Siftdog — 开源、可自托管的 Tavily 替代方案
Siftdog 是面向 AI Agent 和大模型应用的开源、可自托管 Web 搜索 API,也是 Tavily API 的即插即用替代方案。 它提供相同的 /search、
/extract、/crawl 和 /map 端点,且请求和响应格式相同,因此,只需更改基础 URL,为 Tavily 编写的代码(包括官方 Python SDK 和 LangChain 集成)即可连接到你自己的服务。它不需要搜索 API 密钥。
- 通过 SearXNG 元搜索实例进行搜索,无需搜索 API 密钥
- 使用 trafilatura 从网页中提取整洁的 Markdown 或文本
- 排序:结合 BM25 相关性与上游引擎的排序;
advanced深度会抓取每个页面并返回最相关的内容块 - 答案(
include_answer):Claude 根据检索到的结果撰写 - 抓取和站点地图,支持深度、广度、数量限制以及正则表达式路径/域名过滤器
- MCP 服务,可通过 HTTP 访问
/mcp,或使用siftdog mcp通过标准输入/输出连接 Claude Code、Claude Desktop、Cursor 和其他 MCP 客户端 - SSRF 防护:阻止私有和内部地址,包括通过重定向和 DNS 重绑定发起的请求
- MIT 许可
将其用作 Tavily 的即插即用替代方案
通过 api_base_url 将官方 Tavily 客户端指向你的 Siftdog 服务。禁用身份验证时,密钥可以是任意字符串;否则可使用 API_KEYS 中的密钥。
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", max_results=5)
pages = client.extract(urls=["https://en.wikipedia.org/wiki/Okapi_BM25"])
LangChain 通过 langchain-tavily 使用:
from langchain_tavily import TavilySearch
search = TavilySearch(
max_results=5, tavily_api_key="your-siftdog-key", api_base_url="http://localhost:8000"
)
search.invoke({"query": "what is BM25 ranking"})
已通过 tavily-python 0.8.4(搜索、提取、抓取、站点地图;同步和异步)以及
langchain-tavily 0.2.18(搜索、提取)测试。
快速开始
Docker Compose(包含 SearXNG)
使用已发布的镜像启动完整堆栈,其中包含用于 /search 的 SearXNG 实例:
git clone https://github.com/khsarvar/siftdog && cd siftdog
cp .env.example .env # optional: set API_KEYS and ANTHROPIC_API_KEY
docker compose up
试试搜索:
curl -s localhost:8000/search -H "Content-Type: application/json" \
-d '{"query": "latest python release", "search_depth": "advanced"}'
如果设置了 API_KEYS,请添加 -H "Authorization: Bearer <key>"。OpenAPI 文档位于
http://localhost:8000/docs。
仅使用 Docker 镜像
docker run -p 8000:8000 ghcr.io/khsarvar/siftdog
/extract、/crawl 和 /map 可独立运行。要使用 /search,请将其指向启用了 JSON 格式的 SearXNG 实例:-e SEARXNG_URL=http://your-searxng:8080。镜像已发布,支持
linux/amd64 和 linux/arm64,标签为 latest 和版本号(0.1.0、0.1)。
pip
pip install siftdog
SEARXNG_URL=http://your-searxng:8080 siftdog --port 8000
配置从环境变量或 .env 文件中读取(参见
配置)。
与 MCP 客户端搭配使用(Claude、Cursor 等)
Siftdog 也是一个 MCP 服务,提供四个只读工具:
siftdog_search、siftdog_extract、siftdog_crawl 和 siftdog_map。
连接到正在运行的 Siftdog 服务(通过 /mcp 使用 Streamable HTTP)。使用 Claude Code:
claude mcp add --transport http siftdog http://localhost:8000/mcp \
--header "Authorization: Bearer <key>" # omit the header if API_KEYS is empty
也可以使用 uv 在本地通过标准输入/输出运行,无需服务。
siftdog_search 才需要设置 SEARXNG_URL:
claude mcp add siftdog -e SEARXNG_URL=http://your-searxng:8080 -- uvx siftdog mcp
Claude Desktop(claude_desktop_config.json)、Cursor(.cursor/mcp.json)和大多数其他客户端可将相同命令作为 JSON 使用:
{
"mcpServers": {
"siftdog": {
"command": "uvx",
"args": ["siftdog", "mcp"],
"env": { "SEARXNG_URL": "http://your-searxng:8080" }
}
}
}
API 密钥的使用方式与 REST API 相同:发送 Authorization: Bearer <key>,或者对于无法设置请求头的客户端,在 URL 中附加 ?api_key=<key>(URL 可能会出现在日志中,因此建议使用请求头)。HTTP 端点只响应发往 localhost 的请求,除非你在 MCP_ALLOWED_HOSTS 中列出主机名。
Siftdog 与 Tavily、Firecrawl 和 crw 的比较
| Siftdog | Tavily | Firecrawl | crw | |
|---|---|---|---|---|
| 许可证 | MIT | 专有(托管服务) | AGPL-3.0 | AGPL-3.0 |
| 可自托管 | 是 | 否 | 是 | 是(也提供托管 API) |
| 兼容 Tavily API | 是 | — | 否(自有 API) | 否(自有 API) |
| 搜索来源 | SearXNG 元搜索 | 专有 | — | SearXNG(内置) |
| JavaScript 渲染 | 否(静态 HTML) | — | 是 | 是(Lightpanda,Chrome 回退) |
| MCP 服务 | 是(HTTP 和 stdio) | 是 | 是 | 是 |
| 语言 | Python | — | TypeScript | Rust |
测量结果:Siftdog 与 Tavily 搜索基准测试
(可通过 bench/ 复现)。
**适合选择其他方案的情况:**如果你不想运行基础设施,或者需要 Tavily 的神经网络重排序功能,请使用托管版 Tavily。如果你需要 JavaScript 渲染页面,或需要功能更丰富的抓取平台,可以考虑 Firecrawl 或 crw。Siftdog 适合希望在自己的服务器上使用 Tavily API,并采用宽松许可证的团队。
常见问题
什么是 Siftdog?
Siftdog 是面向 AI Agent 的开源网页搜索和提取 API。它在你自行运行的基础设施上复现 Tavily API(/search、/extract、/crawl、/map),使用 SearXNG 获取搜索结果、使用 trafilatura 提取内容,并使用 BM25 对相关性进行排序。
Siftdog 可以直接替代 Tavily 吗?
对于四个核心端点,可以。请求和响应字段与 Tavily 相符,官方 tavily-python SDK 和 langchain-tavily 只需设置 api_base_url 即可使用。区别在于:相关性分数来自 BM25,而非神经网络重排序器;instructions(crawl/map)和 include_image_descriptions(search)虽可接受,但会被忽略;此外,Tavily 的 /research 端点尚未实现。
我需要搜索 API 密钥吗?
不需要。搜索结果来自 SearXNG,它会查询公共搜索引擎。唯一可选的密钥是 ANTHROPIC_API_KEY,当请求设置了 include_answer 时会用到。
它支持 LangChain 吗?
支持,可通过官方 langchain-tavily 软件包使用。像上面的示例一样,将 api_base_url 指向你的 Siftdog 服务即可。
Siftdog 有 MCP 服务吗?
有。API 服务通过 /mcp 使用 Streamable HTTP 提供 MCP;运行 uvx siftdog mcp 则可通过 stdio 为 Claude Desktop 和 Cursor 等本地客户端提供服务。请参阅与 MCP 客户端搭配使用。
为什么 /search 会返回 502“failing engines”?
SearXNG 通过查询公共搜索引擎(Brave、DuckDuckGo、Google 等)获取结果;这些搜索引擎会对发送大量搜索请求的 IP 进行速率限制或触发 CAPTCHA。当所有引擎都不可用时,Siftdog 会返回 502,并附上引擎名称和原因,例如 failing engines: brave (Suspended: too many requests), duckduckgo (CAPTCHA),而不是返回一个空结果列表,以免你的 Agent 将其误判为“未找到任何内容”。引擎会自行恢复,所需时间从几分钟到大约一天不等。如果仍有部分引擎可用,你会收到它们的结果,服务日志也会记录哪些引擎不可用。为减少被拦截的情况,请在 docker/searxng/settings.yml 中启用更多引擎,并避免短时间内重复发送相同的搜索请求。
在公共服务器上公开 Siftdog 安全吗?
设置 API_KEYS,确保只有你的客户端可以调用它。/extract 和 /crawl 会获取调用方提供的 URL,因此 Siftdog 会拒绝私有、回环和链路本地地址,并在每次重定向时及连接时针对实际使用的确切地址进行检查,从而也能防止 DNS 重绑定。
不使用 Docker 可以运行吗?
可以:运行 pip install siftdog,然后运行 siftdog,并将 SEARXNG_URL 指向已启用 JSON 输出格式的任意 SearXNG 实例。不使用 SearXNG 也能使用 /extract、/crawl 和 /map。
本地开发
python3 -m venv .venv && .venv/bin/pip install -e ".[dev]"
docker compose up searxng -d # uncomment its `ports:` in docker-compose.yml first
.venv/bin/siftdog # http://127.0.0.1:8000, docs at /docs
.venv/bin/pytest # offline test suite
.venv/bin/ruff check . && .venv/bin/ruff format .
API
所有端点都接受 JSON POST 请求体和 Authorization: Bearer <key> 标头(也接受旧版
api_key 请求体字段)。如果 API_KEYS 为空,则不启用身份验证。
| 端点 | 用途 | 关键参数 |
|---|---|---|
/search | 网页搜索 | query、search_depth(basic/advanced)、topic(general/news)、time_range、max_results、chunks_per_source、include_answer、include_raw_content、include_images、include_domains、exclude_domains |
/extract | 从最多 20 个 URL 提取清理后的内容 | urls、extract_depth、format(markdown/text)、include_images |
/crawl | 抓取网站并返回页面内容 | url、max_depth、max_breadth、limit、select_paths、exclude_paths、select_domains、exclude_domains、allow_external、format |
/map | 列出网站的 URL,不含内容 | 与 /crawl 相同的遍历参数 |
与托管版 Tavily 的区别:接受 instructions(crawl/map)和 include_image_descriptions,但会忽略;相关性分数来自 BM25,而非神经重排器。
配置
环境变量(参见 .env.example):API_KEYS、SEARXNG_URL、ANSWER_ENABLED、
ANSWER_MODEL、ANSWER_EFFORT、FETCH_TIMEOUT、FETCH_CONCURRENCY、FETCH_MAX_BYTES、
ALLOW_PRIVATE_NETWORKS、CRAWL_MAX_LIMIT、MCP_ALLOWED_HOSTS。
MCP_ALLOWED_HOSTS 列出除 localhost 外,/mcp 端点响应的主机名,例如
search.example.com,search.example.com:*。发送到任何其他主机的请求都会收到
421,这可以保护本地服务免受网页发起的 DNS 重绑定攻击。
安全性: /extract 和 /crawl 会让服务获取调用者提供的 URL。除非
ALLOW_PRIVATE_NETWORKS=true,否则会阻止访问私有、环回和链路本地地址(包括通过重定向访问)。
该检查会在连接时针对实际连接的确切地址执行,因此 DNS 重绑定无法绕过此检查。获取用户提供的
URL 时会忽略 HTTP(S)_PROXY,因为代理会隐藏目标地址。作为对抗恶意多租户部署的纵深防御措施,
还应在网络层限制出站流量。
许可证
Siftdog 基于 MIT License 发布。“Siftdog” 名称由单独的 商标政策 保护:代码可自由使用,但分支和托管服务需要使用不同的名称。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。