mcpField
D
DeepSeek Search Everywhere

DeepSeek Search Everywhere

ローカル
github.com/radoxtech検索01 週間前に更新

DeepSeek Search Everywhere について

DeepSeek Search Everywhereは、DeepSeek Search & Fetch APIを使ってウェブ検索、ページ取得、調査を行うAIエージェント向けMCPサーバーです。重複排除、設定可能なコンテンツ上限、キャッシュ、リクエスト制御をAPIに加えています。

主な機能

  1. 01ページ本文付きウェブ検索
  2. 02単一URLと複数URLの取得
  3. 03複数クエリによる引用付き調査レポート
  4. 04スキーマに沿った構造化データ抽出
  5. 05重複排除とコンテンツ量の制限
  6. 06キャッシュとエンドポイント別のレート制限

活用シーン

  1. 01検索とページ本文の取得を一度に実行
  2. 02調査テーマの情報源を収集して取得
  3. 03複数の検索観点から引用付きレポートを作成
  4. 04ウェブページから項目を構造化して抽出

MCP 対応

標準のstdio、またはBearerトークンで保護された任意のStreamable HTTPを通じて、MCPクライアントに7つのツールを提供します。HTTPモードではBearerトークンが必須です。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"radoxtech-deepseek-search-everywhere": {
"command": "uvx",
"args": [
"deepseek-search-everywhere-mcp"
],
"env": {
"DEEPSEEK_API_KEY": "<DEEPSEEK_API_KEY>",
"DEEPSEEK_BASE_URL": "<DEEPSEEK_BASE_URL>"
}
}
}
}
起動コマンドuvx deepseek-search-everywhere-mcp
設定が必要な環境変数
DEEPSEEK_API_KEYシークレットDeepSeek API key used for the Search & Fetch API.
DEEPSEEK_BASE_URLOverride the DeepSeek API base URL.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypideepseek-search-everywhere-mcp2.0.2

ツール

6

掲載時のツール一覧 · 1 週間前に更新

パラメーター型必須説明
langanyいいえ
countintegerいいえ
querystringはい
dedupebooleanいいえ
refreshbooleanいいえ
rewritebooleanいいえ
need_contentbooleanいいえ
ori_questionanyいいえ
summary_charsanyいいえ
max_total_charsintegerいいえ
strip_boilerplatebooleanいいえ
max_chars_per_resultintegerいいえ

詳細

DeepSeek Search Everywhere MCP

CI License: MIT PyPI Python versions Glama score

AI エージェントに、公式の DeepSeek Search & Fetch API を通じてウェブ検索、ページ取得、複数ソースの調査機能を提供する MCP サーバーです。

この API を薄く慎重にラップしています。検索結果は重複排除され、コンテンツは設定した上限に収められ、繰り返しの呼び出しはメモリー内キャッシュから返され、送信リクエストはローカルのレートリミッターで制御されます。7 つのツールを備え、デフォルトでは stdio を使用し、オプションでベアラートークン保護付きのストリーミング可能な HTTP にも対応します。

標準的な MCP サーバーなので、Claude Code、Claude Desktop、Google Antigravity、Cursor、Windsurf、VS Code(GitHub Copilot)、Gemini CLI、Codex CLI、Zed、opencode など、MCP 互換のあらゆる AI クライアントやエージェントで動作します。ローカルクライアントは stdio 経由で起動し、リモート環境や共有環境では HTTP 経由で接続できます。

DeepSeek とは提携していません。コミュニティによって独立して保守されているプロジェクトです。

特長

  • 1 回のリクエストで検索とコンテンツ取得:need_content を指定するとページのテキストがインラインで返されるため、通常、結果ごとに別途取得する必要はありません。
  • 一括取得と調査:deepseek_fetch_many は最大 10 個の URL を並行して取得します。deepseek_research は 1 回の検索後、検索コンテンツがないページを直接取得し、1 回の処理でソースを集めます。繰り返し処理や要約は行いません。
  • 詳細な調査と構造化抽出:deepseek_deep_research はトピックをサブクエリに分解し、出典付きのブリーフィングレポートを合成します。deepseek_extract はスキーマまたはフィールドに一致する、検証済みの構造化 JSON を抽出します。
  • 結果の整理:正規 URL とタイトル/サイトによる重複排除、結果ごとおよび全体の文字数上限、Markdown のエスケープ解除。
  • 任意のクエリ書き換え:思考を無効にした deepseek-flash による英語への書き換えに加え、英語以外のクエリ向けに明示的な lang 演算子を利用できます。
  • キャッシュとリミッター:単一実行制御に対応した TTL + LRU キャッシュ、エンドポイントごとのトークンバケット、キャッシュを迂回する refresh。
  • デフォルトで安全:静的な SSRF チェック、シークレットの秘匿化、テレメトリーなし。詳しくはセキュリティをご覧ください。

要件

インストール

このサーバーは PyPI で公開されており、io.github.radoxtech/deepseek-search-everywhere-mcp として公式 MCP Registryにも登録されています。

# Run without installing (uv)
uvx deepseek-search-everywhere-mcp

# Or install with pip
pip install deepseek-search-everywhere-mcp

HTTP トランスポートには http エクストラが必要です(uvicorn がインストールされます)。

pip install "deepseek-search-everywhere-mcp[http]"

未リリースの最新コードを main から実行する場合、またはソースコードをチェックアウトして実行する場合:

uvx --from git+https://github.com/radoxtech/deepseek-search-everywhere-mcp deepseek-search-everywhere-mcp

git clone https://github.com/radoxtech/deepseek-search-everywhere-mcp.git
cd deepseek-search-everywhere-mcp
pip install -e ".[http]"

キーと接続が機能することを確認します(残高を表示して終了します)。

export DEEPSEEK_API_KEY=sk-...
deepseek-search-everywhere-mcp --check

クイックスタート

すべての例で stdio を使用します。sk-... をご自身のキーに置き換えてください。

このサーバーはクライアントに依存しません。以下の例では一般的なクライアントを紹介していますが、その他の MCP クライアント(Antigravity、Cursor、Windsurf、VS Code、Gemini CLI、Codex CLI、Zed など)でも、各クライアントの MCP 設定形式で同じコマンド、引数、環境変数を使用できます。

Claude Code
claude mcp add deepseek-search-everywhere -e DEEPSEEK_API_KEY=sk-... -- \
  uvx deepseek-search-everywhere-mcp
Claude Desktop

claude_desktop_config.json を編集します(Settings、Developer、Edit Config)。

{
  "mcpServers": {
    "deepseek-search-everywhere": {
      "command": "uvx",
      "args": ["deepseek-search-everywhere-mcp"],
      "env": { "DEEPSEEK_API_KEY": "sk-..." }
    }
  }
}
opencode

opencode.json で設定します。

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "deepseek-search-everywhere": {
      "type": "local",
      "command": ["uvx", "deepseek-search-everywhere-mcp"],
      "environment": { "DEEPSEEK_API_KEY": "{env:DEEPSEEK_API_KEY}" },
      "enabled": true
    }
  }
}
stdio クライアント全般

Antigravity、Cursor、Windsurf を含む多くのクライアントでは、mcpServers JSON ブロックを使用します。Claude Desktop の例にある uvx 形式を使うか、パッケージがすでにインストールされている場合は、クライアントからコンソールスクリプトを指定してください。

{
  "mcpServers": {
    "deepseek-search-everywhere": {
      "command": "deepseek-search-everywhere-mcp",
      "env": { "DEEPSEEK_API_KEY": "sk-..." }
    }
  }
}

python -m deepseek_search_everywhere_mcp も同等です。

Streamable HTTP

HTTP 経由で接続するクライアント向けです。ベアラートークンは常に必要です。トークンがない場合、サーバーは起動を拒否します。

pip install "deepseek-search-everywhere-mcp[http]"
export DEEPSEEK_API_KEY=sk-...
export MCP_BEARER_TOKEN="$(python -c 'import secrets; print(secrets.token_urlsafe(32))')"
deepseek-search-everywhere-mcp --transport streamable-http   # http://127.0.0.1:8000/mcp

オプション:--host(デフォルトは 127.0.0.1)、--port(デフォルトは 8000)、--path(デフォルトは /mcp)。トークンは環境変数からのみ読み込まれ、コマンドラインから読み込まれることはありません。サーバーはステートレスで動作し、JSON で応答します(SSE ストリームはありません)。クライアントの設定:

{
  "mcpServers": {
    "deepseek-search-everywhere": {
      "url": "http://127.0.0.1:8000/mcp",
      "headers": { "Authorization": "Bearer <MCP_BEARER_TOKEN>" }
    }
  }
}

Claude Code:claude mcp add --transport http deepseek-search-everywhere http://127.0.0.1:8000/mcp --header "Authorization: Bearer $MCP_BEARER_TOKEN"。 サーバーはプレーン HTTP を使用します。ループバック以外にバインドする場合は、手前に TLS を設定してください(SECURITY.md を参照)。

Docker

GitHub Container Registry(ghcr.io)で公式コンテナイメージを利用できます。

docker pull ghcr.io/radoxtech/deepseek-search-everywhere-mcp:latest

stdio モード(Claude Desktop、Cursor、ローカル IDE):

{
  "mcpServers": {
    "deepseek-search-everywhere": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "DEEPSEEK_API_KEY=sk-...",
        "ghcr.io/radoxtech/deepseek-search-everywhere-mcp:latest"
      ]
    }
  }
}

リモート HTTP ホスティング(Docker Compose、VPS、n8n、Dify、クラウドエージェント):

docker run -d --name deepseek-mcp -p 8000:8000 \
  -e DEEPSEEK_API_KEY="sk-..." \
  -e MCP_BEARER_TOKEN="your-secret-token" \
  ghcr.io/radoxtech/deepseek-search-everywhere-mcp:latest \
  --transport streamable-http --host 0.0.0.0 --port 8000

コンテナは、権限のない非 root ユーザー(UID 10001)として実行され、依存関係はホストから分離されています。

ツール

ツール用途パラメーター(デフォルト値)
deepseek_searchウェブを検索します。ページ本文をインラインで返します(デフォルト)。または、スニペットとメタデータを返しますquery、count=5(1-50)、ori_question、need_content=True、lang、max_chars_per_result=4000、max_total_chars=30000、dedupe=True、rewrite=False、after、before、include_domains、exclude_domains、refresh=False、summary_chars、strip_boilerplate=True
deepseek_fetch既知の URL を 1 つ取得し、Markdown として返します(語彙スニペット抽出とセクション単位の読み取りに対応)url、clean=True、max_chars=20000、query、section、max_snippets=3、refresh=False、strip_boilerplate=True
deepseek_fetch_many1~10 個の URL を同時に取得します(一度に最大 5 個)urls、max_chars_per_url=4000、max_total_chars=20000、clean=True、query、refresh=False、strip_boilerplate=True
deepseek_research1 回のパスで情報源を収集します。本文付きで検索し、内容が 200 文字未満のスタブページは自動取得します。反復処理や要約は行いませんquestion、max_pages=5(1-50)、per_page_chars=6000、total_chars=30000、after、before、include_domains、exclude_domains、lang、rewrite=False、dedupe=True、refresh=False、strip_boilerplate=True
deepseek_deep_researchトピックを複数の観点から調査します。サブクエリを分解して情報源を収集し、出典を引用したレポートを作成しますtopic、max_queries=3(2-4)、max_pages_per_query=3(1-5)、lang、dedupe=True、refresh=False、strip_boilerplate=True
deepseek_extract対象フィールドまたはスキーマに従って、ウェブページから構造化 JSON を抽出しますurl、fields=None、schema=None、instruction=None、clean=True、max_chars=40000、refresh=False、strip_boilerplate=True
deepseek_check_balanceアカウント残高とセッションの指標(上流へのクエリ数、キャッシュヒット数、推定コスト)を確認しますなし

パラメーターに関する注記:

  • queryとquestionは128文字までで、site:、-site:、"phrase"、lang:、 after:、before:に対応しています。ori_question(最大128文字)は自然言語での質問で、ランキングの精度を高めます。
  • after、before、include_domains、exclude_domainsは、検索ツール用の明示的なフィルターパラメーターです。 include_domainsはスペース区切りのsite:演算子に、exclude_domainsは-site:に、日付は after:YYYY-MM-DD/before:YYYY-MM-DDに変換されます。フィルターとクエリの合計がDeepSeekの 128文字制限を超えないよう、まとめて予算が管理されます。
  • deepseek_fetchとdeepseek_fetch_manyのqueryは、LLMを呼び出さずにBM25-liteスコアリングエンジンを使って、関連性の高い抜粋を順位付けして抽出します。section(1始まりのインデックス)を指定すると、has_moreとtotal_sectionsのページネーションメタデータを使って長いドキュメントをセクションごとに読み取れます。どちらのツールも、キャッシュ済みのページをメモリ上で処理します。
  • deepseek_deep_researchは、deepseek-flashを使ってトピックを2〜4個のサブクエリに分割し、並行して検索を行い、候補ソースを統合して重複を除去したうえで、番号付きの角括弧形式の引用[1]、[2]を含むレポートを作成します。ソースは最大6件、文字数は最大24,000文字です。合成の期限が迫ると、収集したソースを返す処理に円滑に切り替わります。
  • deepseek_extractは、ページ全体のテキストをクライアントのコンテキストに取り込まずに、deepseek-flashを使ってfields: list[str]またはschema: dictに一致する構造化JSONを抽出します。指定されたフィールドが見つからない場合はnullが設定され、読み取り可能なテキストがないページはLLMのトークンを消費せず即座に失敗します。
  • deepseek_check_balance(旧エイリアスのdeepseek_balanceも含む)には、稼働時間、処理したクエリの合計数、キャッシュヒット率、推定コストと節約額(リクエストあたり$0.00075)を含むsessionブロックがあります。
  • langは、es、de、ja、pt-BRなどの明示的な言語演算子です。指定しない場合、英語以外のクエリでは複数の言語の検索結果が混在する可能性があります。固有表現については、指定した場合と指定しない場合を比較してください。
  • dedupe=Trueの場合、検索では上流に対して少し多めの結果(max(2, ceil(count * 0.5))、最大50件)を要求し、重複を除去したあとにcount件まで絞り込みます。そのため、インデックスが重複を返してもcount件の結果を得られます。dedupe=Falseの場合は、ちょうどcount件を要求します。
  • need_contentを指定しない場合、各検索結果にはページ本文ではなく短いsummaryが含まれます。summaryの長さはsummary_chars(既定値は400)までで、max_chars_per_resultを超えることはありません。summary_chars=0の場合は省略されます。コンテンツを取得する場合、summaryはコンテンツが返されなかった結果の代わりとしてのみ使われ、その場合のsummary_charsの既定値はmax_chars_per_resultです。要約の文字数はmax_total_charsに含まれます。
  • rewrite=True(deepseek_researchでも使用可能)の場合、検索前にdeepseek-flashでクエリを英語に翻訳します。langが設定されている場合はスキップされ、翻訳に失敗した場合はエラーを出さずに元のクエリを使います。
  • clean=True(取得ツールと検索コンテンツ)の場合、すべてのASCII句読点文字のバックスラッシュエスケープ(\(、\-、\[、\/、\#など)を削除します。フェンス付きコードブロックとインラインコードスパンはそのまま残ります。
  • 検索結果(コンテンツ、snippet、summary、およびdeepseek_researchのソース)では、検索インデックスからページのテキストがJSONエスケープされたまま返された場合に、コード以外の部分のJSON文字列エスケープもデコードされます(Kr\u00f3tkieはKrótkieに、<\/p>は</p>になります)。スニペットや要約に残った属性のない単純なHTMLタグ(<p>、<br>、</h2>など)は、スペースに置き換えられます。
  • strip_boilerplate=True(キーワード専用で、ページコンテンツを返すすべてのツールで使用可能)の場合、既知のサイトインターフェースの行を削除します。DeepSeekは、スレッドの言語にかかわらず、RedditのスレッドをサイトUIが中国語にローカライズされた状態で返します。対象は、コメントの並べ替えメニュー(排序方式:、最佳、新など)、# 评论区域見出し、アーカイブ済み投稿のバナー、[已删除]という投稿者の行、登録を促すフッターです。ルールはサイトごとに定義されています(現時点ではRedditのみで、reddit.comとそのサブドメインに適用)。既知のラベルだけで構成された行のみを削除するため、中国語を含むユーザーのテキストやコードブロックは保持されます。すべてのサイトに適用されるルールもあります。コンテンツの冒頭にあるCookie同意(CMP)ダイアログ(「Informacje o prywatności」、「We value your privacy」、「Wir verwenden Cookies」など)は、最初の行が既知の同意フレーズで始まり、続く行にダイアログの操作項目(「Accept all」、「Zarządzaj preferencjami zgody」など)が含まれる場合に削除されます。ダイアログの一部ではない最初の行で削除を終了し、それより後のテキストには手を加えないため、プライバシーに関する記事は保持されます。取得したページがバナーだけの場合、contentは空になり、その旨を示す注記が返されます。この処理はcleanの後、文字数上限を適用する前に実行されるため、予算にはクリーニング後のテキストが計上されます。キャッシュには影響しません。strip_boilerplate=Falseの場合は、取得したコンテンツがそのまま返されます。
  • deepseek_fetch_manyは空のエントリーをスキップし、重複URL(正規化後のURLが同一のもの)は一度だけ取得します。入力順を維持し、取得に失敗したURLはバッチ全体を失敗させず、ok: falseの項目として報告します。すべての取得処理に共通の期限は120秒です。その時点で未処理のURLはdeadline_exceededとして報告されます。各ページの文字数は、min(max_chars_per_url, max_total_chars // number of URLs)以下になります。
  • deepseek_researchは、エージェントではなく、1回の処理でソースを収集します。検索を1回と、不足分を補う取得のみ行い、クエリの絞り込みや再検索はせず、要約もしません。検索と同じlang、rewrite、dedupeオプションを受け取ります。エンベロープのquery_usedには、実際に送信されたクエリが示されます。rewrite=Trueでない限り、要約もモデル呼び出しも行いません。呼び出し元が合成できるよう、ソースを返します。各ソースにはtitle、url、date、site(上流から提供されなかった場合はどちらもnull)、date_source、authority、rerank_scoreが含まれるため、ページを開かなくても古いソースやトピックに関連しないソースを確認できます。
  • deepseek_researchは、候補ソースを見つけるための予備調査用です。品質フィルターはないため、品質の低い二次資料(学生論文、アグリゲーター、クリックベイトなど)が結果に含まれることがあります。引用する前に、一次資料で事実を確認してください。一次資料を探すには、英語で「Xに関する原著研究(例:「original study on X, journal article」)」を指定し、ポーランド語などの現地の資料にはsite:(例:site:cbos.pl ...)を使用してください。
  • authorityは、上流のインデックスからそのまま渡される値です。その意味は文書化されておらず、信頼性を示すものでもありません(学生のPDFと参考資料データベースが同程度のスコアになることがあります)。そのため、ソースの評価や絞り込みには使用しないでください。 呼び出し例:
deepseek_search(query="rust async runtime comparison", count=5)
deepseek_search(query="gobierno de España presupuestos 2026", lang="es", need_content=False)
deepseek_fetch(url="https://docs.rs/tokio/latest/tokio/", max_chars=15000)
deepseek_fetch_many(urls=["https://example.com/a", "https://example.com/b"], max_total_chars=12000)
deepseek_research(question="how does HTTP/3 connection migration work", max_pages=4)
deepseek_deep_research(topic="comparing Raft vs Paxos consensus mechanisms in distributed systems")
deepseek_extract(url="https://news.ycombinator.com", fields=["top_story", "points", "author"])
deepseek_check_balance()
レスポンスの形式

すべてのツールは、ok を含む JSON オブジェクトを返します。

フィールド対象意味
okすべて成功時は true、失敗時は false
cachedbalance を除くすべてのツール。また、deepseek_fetch_many の各項目および deepseek_research の各ソースレスポンスがインメモリキャッシュから返された場合は true です。deepseek_fetch_many と deepseek_research では、上流へのリクエストが行われず、少なくとも1つのレスポンスがキャッシュから返された場合にのみ true になります
cached_countdeepseek_fetch_many、deepseek_researchこの呼び出しでキャッシュから返されたレスポンスの数
requests_useddeepseek_fetch_many、deepseek_research実際に行われた上流へのリクエスト数(キャッシュヒットは無料です)
elapsed_msエラーを含むすべてツール呼び出しの実時間(ミリ秒、単調時計)。キャッシュヒットでは、そのヒットにかかったほぼゼロの時間が報告されます
notesすべての成功時レスポンス重複排除の件数、書き換えの適用または失敗、適用された lang、切り捨て(「文字数の上限を守るため、一部のページコンテンツが切り捨てられました。」)などの、人が読める補足情報
error失敗時{ "code", "message", "status"? }。status は上流の HTTP ステータスがある場合に設定されます
partialdeepseek_fetch_many、deepseek_research一部の項目またはソースが失敗した場合は true です。失敗した各項目には個別の error が含まれます。トップレベルの ok は true のままなので、partial を確認してください
failed_countdeepseek_fetch_many、deepseek_research失敗した項目またはソースの数

検索結果には、title(上流のタイトルが空の場合は www. を除いた URL ホスト名。Reddit の X - X のように - を挟んでタイトルが繰り返される場合は X にまとめられます)、url、date、authority(0~4、不明の場合は -1。上流のフィールドであり、信頼性スコアではありません)、rerank_score、site、snippet、および利用可能な場合は chars または summary を含む content が含まれます。上流から date が提供されない場合は、タイトルまたはテキストの先頭600文字にある YYYY-MM-DD の日付(有効な暦日で、年は1990年から翌年まで)を使用します。そのような日付がない場合は、年の横にある英語またはポーランド語の月名(September 2025、wrzesień 2025、PubMed 形式の 2025 September)からその月の1日を、日付も併記されている場合(15 września 2025、September 15, 2025)はその日を使用します。ポーランド語の月名は主格と属格に一致し、略称と年のみの表記は無視されます。検索結果とリサーチソースのどちらにも、date_source は "upstream"、"content"、または null(日付なし)が設定されます。deepseek_fetch は url、title、content、chars、truncated を返します。deepseek_deep_research は topic、subqueries、角括弧付きの引用([1]、[2])を含む report、synthesized、および sources を返します。deepseek_extract は url、title、data(要求されたフィールドまたはスキーマに一致する抽出済み JSON)を返します。すべてのツールで、chars は返された content の長さです。

エラーコード
コード意味
missing_api_keyDEEPSEEK_API_KEY またはフォールバックファイルにキーがありません
ssrf_blockedURL がローカルで拒否されました:内部ホスト、プライベートまたはループバックのリテラルアドレス、または埋め込み認証情報
bad_url、invalid_url、empty_url、url_too_longURL の形式が不正、または長すぎます
empty_query、query_too_long、bad_count、bad_lang、bad_request引数が無効です
rate_limited_local最大待機時間内にローカルのレート制限トークンを取得できませんでした
response_too_large上流の本文が上限を超えました(検索は8 MiB、取得は32 MiB)
deadline_exceededバッチ項目が共有バッチ期限までに完了しませんでした
timeout、network_error、request_failed、invalid_jsonトランスポートレベルのエラー
internal_errorバッチ項目の取得中に予期しない例外が発生しました
その他 / http_error上流 API エラーでは、DeepSeek のコード(または http_error)が維持され、error.status が設定されます

レスポンスサイズとコスト

各モードの1回のレスポンスのシリアライズ済みJSONサイズ。各ツールのデフォルトパラメーターを使用し、2026-10-28にライブAPIで測定(コンパクトJSON、UTF-8バイト数):

呼び出しサイズ
deepseek_search、count=3、need_content=false(デフォルトのsummary_chars)3.7 KB
deepseek_search、count=3、need_content=false、summary_chars=02.3 KB
deepseek_search、count=3、need_content=true(デフォルト)15.1 KB
deepseek_fetch、ドキュメントページ1件(デフォルトのmax_chars)20.9 KB
deepseek_fetch_many、ドキュメントページ3件13.3 KB
deepseek_research、max_pages=320.1 KB

これらは単一のサンプルであり、保証値ではありません。サイズはクエリや返されるページによって変わり、固定値ではなく、max_chars_per_result、max_total_charsやその他の文字数上限によって制限されます。

コスト:DeepSeekは、返された結果ごとではなく、成功したリクエストごとにSearchとFetchの料金を請求するため、countを変えても呼び出し料金は変わりません。最新の料金、課金ルール、制限については、DeepSeek Search & Fetchガイドを参照してください。これらは変更される可能性があり、このプロジェクトでは追跡していません。複数の上流リクエストを必要とするツール呼び出し(たとえば、検索コンテンツがないページを取得するdeepseek_researchやdeepseek_fetch_many)では、それぞれのリクエストに料金がかかります。また、rewrite=trueではdeepseek-flashのトークンも使用します。キャッシュヒットには料金がかかりません。

キャッシュとレート制限

キャッシュとリミッターはサーバープロセス内にあり、プロセス間で共有されません。

検索取得クエリの書き換え
キャッシュTTL5 min30 min24 h
エントリー上限1281281024
サイズ上限16 MiB32 MiB1 MiB
レート制限(持続/バースト)10 / s、205 / s、10制限なし
  • 成功し、空でないレスポンスのみがキャッシュされます。エラーはキャッシュされません。
  • 同一の並行呼び出しは1つの上流リクエストを共有します(シングルフライト)。リクエストを実行した呼び出しだけがリミッタートークンを消費し、いずれの呼び出しもcached: trueを報告しません。
  • refresh=trueは、その呼び出しでのキャッシュ読み取りをスキップし、保存済みエントリーを置き換えます。
  • dedupeは上流リクエストを変更するため(検索時に余分に取得します)、dedupe=trueとdedupe=falseの呼び出しはキャッシュエントリーを共有しません。
  • キャッシュヒットと書き換え呼び出しはリミッタートークンを消費しません。再試行を含め、論理呼び出し1回につきトークンを1つ消費します。
  • トークンが利用可能になるまで5秒を超える場合、呼び出しは無期限にキューで待機せず、rate_limited_localで直ちに失敗します。
  • 一時的な障害(HTTP 429およびゲートウェイの5xx)は1回再試行されます。
  • DEEPSEEK_MCP_CACHE=0ですべてのキャッシュが無効になります。

設定

変数必須用途
DEEPSEEK_API_KEYはいDeepSeekプラットフォームキー
DEEPSEEK_BASE_URLいいえAPIベースURL(デフォルトはhttps://api.deepseek.com)
MCP_BEARER_TOKENHTTPのみクライアントがAuthorization: Bearer ...として送信するトークン
DEEPSEEK_MCP_CACHEいいえキャッシュを無効にするには1(デフォルト)または0
DEEPSEEK_MCP_LOG_LEVELいいえサーバー、MCP SDK、uvicornのstderrログレベル:DEBUG、INFO、WARNING(デフォルト)、ERROR、CRITICAL
DEEPSEEK_AUTH_JSONいいえキーのフォールバックとして使用するJSONファイルへのパス(セキュリティを参照)

.env.exampleには同じ変数が記載されています。サーバーは.envファイルを自ら読み込みません。変数をエクスポートするか、MCPクライアントのenvに設定してください。

セキュリティ

ポリシー全文と報告手順:SECURITY.md。

  • 静的な SSRF チェックのみです。 URL は、キャッシュ、リミッター、ネットワークにアクセスする前に検証されます。 HTTP または HTTPS 以外のスキーム、内部ホスト名、プライベート/ループバック/リンクローカルのリテラルアドレス、認証情報が埋め込まれた URL は ssrf_blocked を返します。サーバーは DNS を解決しません。実際の取得は DeepSeek が行うため、これはネットワークの分離ではありません。
  • キーの取り扱い。 キーは、設定された API ベース URL に Authorization ヘッダーでのみ送信されます。キー、ベアラートークンなどのシークレットは、エラーメッセージやメモから秘匿されます。
  • HTTP トランスポートでは、すべてのリクエストにベアラートークンが必要です(定数時間比較を使用し、ログには記録されません)。
  • テレメトリーはありません。 外部への送信先は DeepSeek API のみです。
  • opencode のレガシーフォールバック。 DEEPSEEK_API_KEY が未設定の場合、サーバーは ~/.local/share/opencode/auth.json({"deepseek": {"key": "..."}})または DEEPSEEK_AUTH_JSON で指定されたファイルからキーを読み込みます。これは opencode ユーザー専用です。環境変数の使用を推奨します。
  • ツールの入力(クエリ、URL)は、処理のために DeepSeek に送信されます。これらにシークレットを含めないでください。

制限事項

  • deepseek_fetch は PDF と Reddit に対して HTTP 404 を返し、一部のサイトではタイムアウトします。代わりに、ページタイトルまたは site: で絞り込んだクエリを使って deepseek_search を使用してください。
  • Fetch が返すのはタイトルとコンテンツのみです。最終 URL、ステータスコード、公開日は返しません。
  • Fetch の遅延はこのサーバーではなく、DeepSeek によるページのレンダリングに起因します。すでにレンダリング済みのページは約 0.5 秒で返ります。それ以外は 3~10 秒かかり、ページが見つからない場合(HTTP 404)も、DeepSeek が報告するまで 3~5 秒かかります。404 は再試行されません。deepseek_fetch_many は一度に最大 5 件を取得するため、バッチの所要時間は最も遅いページと同程度です。大きなバッチでは、この点を考慮してください。
  • 検索と取得のみです。サイトのマッピングやクロール、非同期ジョブには対応しておらず、プロバイダーは DeepSeek のみです。
  • キャッシュとレートリミッターはプロセスごとに動作します。複数のサーバープロセスを実行すると、実効レートはその分だけ増加します。
  • ローカルのレート制限は保守的なデフォルト値であり、DeepSeek 独自のクォータに代わるものではありません。
  • HTTP トランスポートはプレーン HTTP、ステートレス、JSON のみです。OAuth と SSE ストリームには対応していません。

開発

git clone https://github.com/radoxtech/deepseek-search-everywhere-mcp.git
cd deepseek-search-everywhere-mcp
python -m venv .venv && . .venv/bin/activate
pip install -e ".[test,lint,http]" build twine

pytest -q                     # offline suite; no network, no key needed
ruff check .                  # lint
python -m build               # sdist + wheel in dist/
python -m twine check dist/*  # validate package metadata

オフラインテストでは DEEPSEEK_* 変数をクリアし、キーのフォールバック先を存在しないファイルに設定するため、ネットワークには接続できません。CI では Python 3.11、3.12、3.13 で lint、テスト、ビルドを実行します。

コントリビューションのワークフローとコミット規約については、CONTRIBUTING.md を参照してください。

ライブテスト

ライブテストスイートは実際の DeepSeek API をエンドツーエンドで呼び出し、LLM 評価者として deepseek-flash を使用して、結果の関連性と質問への回答の適切さを評価します。デフォルトの実行からは除外されており、キーがなければ自動的にスキップされます。全テストを実行しても費用は最大で数セントです(deepseek-flash による評価呼び出しも行われます)。

cp .env.example .env          # then put your key in DEEPSEEK_API_KEY=
set -a && . ./.env && set +a  # export the variables; tests do not read .env themselves
pytest -m live

実行後に評価スコアと理由が出力されます。.env は Git の追跡対象外です。絶対にコミットしないでください。

リリース

バージョン管理にはセマンティック バージョニングを採用し、 Conventional Commitsに基づいて release-pleaseで自動化しています。すべての処理は .github/workflows/release.ymlで実行されます。

  1. mainへのプッシュごとにrelease-pleaseが実行されます。release-pleaseは、pyproject.toml、 server.json、.release-please-manifest.jsonのバージョンを更新し、CHANGELOG.mdにセクションを 追加するリリースPRを作成(または更新)します。標準的なセマンティック バージョニングが適用されます。 fixはパッチバージョン、featはマイナーバージョン、破壊的変更(feat!:)はメジャーバージョンを 更新します。feat、fix、perf、refactor、docs、depsは変更履歴に記載されます。
  2. リリースPRをマージすると、release-pleaseがvX.Y.Zタグを付け、GitHub Releaseを作成します。
  3. 同じワークフローの実行で、タグが付いたコミットをビルドし、タグがpyproject.tomlと server.jsonのバージョンに一致することを確認してから、twine checkとクリーンなwheelでの スモークテストを実行します。Trusted Publishing(OIDC、トークン不要) を通じてPyPIに公開し、アーティファクトをGitHub Releaseに添付して、MCP Registryを更新します。

GITHUB_TOKENで作成されたタグとPRではほかのワークフローが起動しないため、公開処理は同じワークフローで実行されます。

手動での代替手順:pyproject.toml、server.json、.release-please-manifest.jsonのバージョンを更新し (tests/test_version_sync.pyが前の2つの一致を確認します)、CHANGELOG.mdを更新してコミットし、タグをプッシュします。 その後、ワークフローがパッケージを公開し、GitHub Releaseを作成します。

git tag -a v2.0.0 -m "v2.0.0" && git push origin v2.0.0
bash scripts/smoke_package.sh   # optional local check: build, install into a clean venv, run the CLI

ワークフローを手動で実行(workflow_dispatch)すると、パッケージをビルドして検証し、TestPyPIにのみ公開します。

リポジトリで一度だけ行う設定:

  • Settings、Actions、General:「Allow GitHub Actions to create and approve pull requests」を有効にすると、 release-pleaseがPRを作成できるようになります。
  • Settings、Environments:pypi環境を作成します(手動実行用にtestpypiも作成します)。ここで必須レビュー担当者を 追加すると、すべてのPyPI公開に承認が必要になります。
  • PyPI(およびTestPyPI)で、このリポジトリのTrusted Publisherを追加します。ワークフローにはrelease.ymlを、 環境にはpypiを指定します(TestPyPIではtestpypiを指定します)。
MCP Registryへの手動公開

server.jsonは、MCP Registry向けにPyPIパッケージを記述します。 READMEには、パッケージの所有権の確認にレジストリが使用するmcp-nameコメントが記載されています。 リリースワークフローではこの処理が自動的に行われます。手動で公開する場合は、次の手順に従ってください。

python scripts/validate_server_json.py   # structural checks; also runs `mcp-publisher validate` if installed
mcp-publisher login github               # the io.github.radoxtech namespace requires GitHub authentication
mcp-publisher publish

まずPyPIに公開してください。レジストリは、パッケージのバージョンが存在することを確認します。release-pleaseは pyproject.tomlとserver.jsonのバージョンを同期します。バージョンが一致しない場合、 tests/test_version_sync.pyは失敗します。

変更履歴

リリースノートについてはCHANGELOG.mdを参照してください。

ライセンス

MIT。DeepSeekとは無関係です。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。