Siftdog について
Siftdogは、AIエージェントやLLMアプリ向けのセルフホスト可能なウェブ検索・抽出APIです。Tavilyの主要エンドポイントに互換性があり、MCP経由で検索、抽出、クロール、サイトマップ作成も利用できます。
主な機能
- 01Tavily互換の検索・抽出・クロール・マップAPI
- 02SearXNGによるAPIキー不要の検索
- 03ウェブページをMarkdownまたはテキストで抽出
- 04BM25による関連度順位付けと詳細検索のチャンク
- 05深度・範囲・パスを指定したクロール
- 06取得先URLへのSSRFリクエストを防止
活用シーン
- 01自前のインフラでTavily互換のウェブ検索を運用
- 02MCP経由でAIエージェントに検索や抽出を提供
- 03詳細検索で関連するページの区間を収集
- 04指定したパスやドメインのサイトをクロール、マップ化
MCP 対応
siftdog_search、siftdog_extract、siftdog_crawl、siftdog_mapの4つの読み取り専用MCPツールを提供します。クライアントは/mcpのHTTP接続、またはsiftdog mcpコマンドによるstdio接続を利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Siftdog — オープンソースでセルフホスト可能な Tavily の代替
Web サイト · ベンチマーク · ブログ · ホスト版の利用登録
Siftdog は、AI エージェントや LLM アプリ向けのオープンソースでセルフホスト可能なウェブ検索 API であり、Tavily API のドロップイン置換です。 同じリクエストとレスポンス形式で、同じ /search、
/extract、/crawl、/map エンドポイントを提供します。そのため、Tavily 向けに書かれたコード(公式 Python SDK と LangChain 統合を含む)は、ベース URL を変更するだけで、自分のサーバーに対して動作します。検索 API キーは不要です。
- 検索:検索 API キー不要で、SearXNG メタ検索インスタンスを使用します
- 抽出:trafilatura でウェブページから整形済みの Markdown またはテキストを抽出します
- ランキング:BM25 による関連度と上流エンジンの順序を組み合わせます。
advanced深度では各ページを取得し、最も関連性の高いチャンクを返します - 回答(
include_answer):取得した結果をもとに Claude が作成します - クロールとサイトマップ:深度、範囲、上限、正規表現によるパス/ドメインのフィルターに対応します
- Claude Code、Claude Desktop、Cursor、その他の MCP クライアント向けの MCP サーバー。
/mcpでの HTTP、またはsiftdog mcpによる stdio に対応します - SSRF 保護:リダイレクトや DNS リバインディングを介した場合も含め、プライベートアドレスと内部アドレスをブロックします
- MIT ライセンス
ドロップインの Tavily 代替として使う
公式 Tavily クライアントの api_base_url に 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-tavily 経由の LangChain:
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"})
t a v i l y - p y t h o n 0.8.4(search、extract、crawl、map。同期・非同期)および
langchain-tavily 0.2.18(search、extract)でテスト済みです。
クイックスタート
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 は、読み取り専用の 4 つのツール siftdog_search、siftdog_extract、siftdog_crawl、siftdog_map を備えた MCP サーバーでもあります。
起動中の 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 を使ってローカルで stdio 経由で実行します。サーバーは不要です。
SEARXNG_URL が必要なのは siftdog_search の場合のみです:
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 はログに残る可能性があるため、ヘッダーの使用を推奨します)。MCP_ALLOWED_HOSTS にホスト名を指定しない限り、HTTP エンドポイントは localhost 宛てのリクエストにのみ応答します。
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 を使いたいチーム向けです。
FAQ
Siftdog とは何ですか?
Siftdog は、AI エージェント向けのオープンソースのウェブ検索・抽出 API です。SearXNG で検索結果を取得し、trafilatura でコンテンツを抽出、BM25 で関連性をランク付けすることで、Tavily API(/search、/extract、/crawl、/map)を自分で運用するインフラ上に再現します。
Siftdog は Tavily のドロップイン置き換えとして使えますか?
4 つのコアエンドポイントについては、はい。リクエストとレスポンスのフィールドは 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 パッケージを通じて利用できます。上記の例のように、Siftdog サーバーを指す api_base_url を指定してください。
Siftdog に MCP サーバーはありますか?
はい。API サーバーは /mcp で Streamable HTTP 経由の MCP を公開し、uvx siftdog mcp を実行すると、Claude Desktop や Cursor などのローカルクライアント向けに stdio 経由で実行できます。MCP クライアントでの使用をご覧ください。
/search が 502「failing engines」を返すのはなぜですか?
SearXNG は、公開検索エンジン(Brave、DuckDuckGo、Google など)に問い合わせて検索結果を取得します。これらのエンジンは、多数の検索を送信する IP アドレスにレート制限をかけたり、CAPTCHA を表示したりします。すべてのエンジンが失敗している場合、Siftdog は空の結果リストを返すのではなく、エンジン名と理由を含む 502 を返します。これにより、エージェントが「何も見つからなかった」と誤解するのを防ぎます。たとえば、failing engines: brave (Suspended: too many requests), duckduckgo (CAPTCHA) のように表示されます。エンジンは数分から約 1 日で自動的に復旧します。一部のエンジンが引き続き動作している場合は、その検索結果が返され、停止しているエンジンはサーバーログに記録されます。ブロックを減らすには、docker/searxng/settings.yml で有効にするエンジンを増やし、同じ検索を短時間に繰り返し送信しないようにしてください。
Siftdog を公開サーバーで公開しても安全ですか?
クライアントだけが呼び出せるように API_KEYS を設定してください。/extract と /crawl は呼び出し元が指定した URL を取得するため、Siftdog はプライベート、ループバック、リンクローカルのアドレスへのアクセスを拒否します。各リダイレクト時と接続時に、実際に使用される正確なアドレスを確認するため、DNS リバインディングも防止できます。
Docker を使わずに実行できますか?
はい。pip install siftdog を実行し、JSON 出力形式が有効になっている任意の SearXNG インスタンスを SEARXNG_URL に指定して siftdog を実行してください。/extract、/crawl、/map は SearXNG なしでも動作します。
ローカルでの開発
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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。