mcpField
S
Siftdog

Siftdog

本地服务
siftdog.com搜索与检索23 周前更新

关于 Siftdog

Siftdog 是面向 AI Agent 和 LLM 应用的可自托管网页搜索与提取 API,兼容 Tavily 的核心端点。它还通过 MCP 提供搜索、提取、爬取和站点地图工具。

主要功能

  1. 01兼容 Tavily 的搜索、提取、爬取和映射 API
  2. 02基于 SearXNG 搜索,无需搜索 API 密钥
  3. 03将网页提取为 Markdown 或文本
  4. 04BM25 相关性排序及高级页面分块
  5. 05按深度、广度和路径筛选爬取
  6. 06保护抓取目标,阻止 SSRF 请求

适用场景

  1. 01在自有基础设施运行兼容 Tavily 的网页检索
  2. 02让 AI Agent 通过 MCP 搜索、提取或爬取
  3. 03用高级搜索收集相关页面片段
  4. 04按指定路径和域名生成站点地图或爬取

MCP 相关

提供四个只读 MCP 工具:siftdog_search、siftdog_extract、siftdog_crawl 和 siftdog_map。客户端可通过 /mcp 的 HTTP 接口连接,也可运行 siftdog mcp 使用 stdio。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"khsarvar-siftdog": {
"command": "uvx",
"args": [
"siftdog"
],
"env": {
"SEARXNG_URL": "<SEARXNG_URL>"
}
}
}
}
启动命令uvx siftdog
需要配置的环境变量
SEARXNG_URLURL of a SearXNG instance with JSON output enabled. Needed only for siftdog_search; extract, crawl and map work without it.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypisiftdog0.3.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Siftdog — 开源、可自托管的 Tavily 替代方案

CI License: MIT PyPI Python 3.11+

网站 · 基准测试 · 博客 · 托管服务候补名单

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 的比较

SiftdogTavilyFirecrawlcrw
许可证MIT专有(托管服务)AGPL-3.0AGPL-3.0
可自托管是否是是(也提供托管 API)
兼容 Tavily API是—否(自有 API)否(自有 API)
搜索来源SearXNG 元搜索专有—SearXNG(内置)
JavaScript 渲染否(静态 HTML)—是是(Lightpanda,Chrome 回退)
MCP 服务是(HTTP 和 stdio)是是是
语言Python—TypeScriptRust

测量结果: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” 名称由单独的 商标政策 保护:代码可自由使用,但分支和托管服务需要使用不同的名称。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。