Skip to main content
Glama
HasData

DuckDuckGo MCP Server

by HasData

DuckDuckGo MCP Server

DuckDuckGo の検索結果を構造化 JSON として、Claude、Cursor、Windsurf、その他の MCP クライアントへ提供するホスト型 Model Context Protocol (MCP) サーバーです。順位付きのオーガニック結果、広告は独立した配列、DuckDuckGo 独自の AI 回答、そして指定できる 37 のリージョンを備えています。大量のリクエストとパース処理を想定して設計されており、ローカルブラウザを設定する必要はなく、厄介なフォールバックチェーンもありません。

https://mcp.hasdata.com/api/mcp?apis=duckduckgo

tool contract MCP Regions License

目次

Related MCP server: duckduckgo-mcp

必要なもの

カスタムヘッダーを設定できる streamable HTTP に対応した MCP クライアントと、ダッシュボード から無料作成できる HasData API キーです。それだけで構いません。これはリモートサーバーであるため、Python 環境の管理も、ブラウザパッケージの追加も、ローカルプロセスを起動しておく必要もありません。

クイックスタート

サーバー URL はすべてのクライアントで共通です。Claude Code、Claude Desktop、Cursor、Windsurf、Cline で、以下の設定を使って確認しています。

フィールド

URL

https://mcp.hasdata.com/api/mcp?apis=duckduckgo

Transport

HTTP、streamable

Auth header

x-api-key: your_key_here

OAuth 対応のクライアントは、同じ URL をコネクタとして追加し、設定ファイルにキーを書かずにサインインできます。

claude mcp add --transport http duckduckgo "https://mcp.hasdata.com/api/mcp?apis=duckduckgo" \
  --header "x-api-key: your_key_here"

「Settings」を開き、「Connectors」から「Add custom connector」を選択し、https://mcp.hasdata.com/api/mcp?apis=duckduckgo を貼り付けてサインインします。

設定ファイルを使う場合は、claude_desktop_config.json に次を追加します:

{
  "mcpServers": {
    "duckduckgo": {
      "type": "http",
      "url": "https://mcp.hasdata.com/api/mcp?apis=duckduckgo",
      "headers": { "x-api-key": "your_key_here" }
    }
  }
}

すべてのプロジェクトでは ~/.cursor/mcp.json、特定のプロジェクトでは .cursor/mcp.json を使用します:

{
  "mcpServers": {
    "duckduckgo": {
      "url": "https://mcp.hasdata.com/api/mcp?apis=duckduckgo",
      "headers": { "x-api-key": "your_key_here" }
    }
  }
}

~/.codeium/windsurf/mcp_config.json です。Windsurf ではこのフィールドを url ではなく serverUrl と呼びます:

{
  "mcpServers": {
    "duckduckgo": {
      "serverUrl": "https://mcp.hasdata.com/api/mcp?apis=duckduckgo",
      "headers": { "x-api-key": "your_key_here" }
    }
  }
}
{
  "mcpServers": {
    "duckduckgo": {
      "url": "https://mcp.hasdata.com/api/mcp?apis=duckduckgo",
      "type": "streamableHttp",
      "headers": { "x-api-key": "your_key_here" },
      "disabled": false
    }
  }
}

ワークスペース内の .vscode/mcp.json に配置します:

{
  "servers": {
    "duckduckgo": {
      "type": "http",
      "url": "https://mcp.hasdata.com/api/mcp?apis=duckduckgo",
      "headers": { "x-api-key": "your_key_here" }
    }
  }
}

~/.codex/config.toml:

[mcp_servers.duckduckgo]
url = "https://mcp.hasdata.com/api/mcp?apis=duckduckgo"

[mcp_servers.duckduckgo.headers]
"x-api-key" = "your_key_here"

~/.gemini/settings.json:

{
  "mcpServers": {
    "duckduckgo": {
      "httpUrl": "https://mcp.hasdata.com/api/mcp?apis=duckduckgo",
      "headers": { "x-api-key": "your_key_here" }
    }
  }
}

例のプロンプト

これはコードではなくプロンプトです。1 つ貼り付けるだけで、エージェントが自分でツールを呼び出します。それぞれの呼び出しに必要な回数を併記しました。MCP では、モデルが呼び出し回数を決定し、成功した呼び出しごとに10クレジット消費されるためです。

「model context protocol」を DuckDuckGo で検索し、上位10件を position とドメイン付きで教えてください。

1回の呼び出し、10クレジット。

「vpn review」というクエリをドイツ地域と米国地域でそれぞれ実行し、どちらかにだけ出現するドメインを教えてください。

2回の呼び出し、20クレジット。地域はパラメータです。同じクエリを2つのマーケットで実行すると、2回の呼び出しになります。

「best crm software」を検索し、有料掲載のみを広告主のドメイン付きで一覧にしてください。

1回の呼び出し、10クレジット。広告は独立した配列で返るため、フィルタリングのためのヒューリスティックは不要です。

「model context protocol」というクエリで最初の3ページを巡回し、複数の position を持つドメインを教えてください。

3回の呼び出し、30クレジット。2ページ目以降はカーソルを指定した新しい呼び出しになります。カーソルを手に入れたら q は引数から外してください。

「who invented the transistor」を検索し、DuckDuckGo 自身が提供する AI 回答を、参照したオーガニック結果と並べて表示してください。

1回の呼び出し、10クレジット。

この2つが、このサーバーが存在する理由です。リージョンを特定できることは、37 のマーケットで第一級のパラメータです。同じクエリを国ごとに比べるのは「ループ」であり、プロキシを用意するのとは違います。また、有料掲載はオーガニック結果とは別で返るので、どの結果が広告かを推測することなくランキングの追跡ができます。

ページングには呼び出しが1回ずつ必要です。10ページを巡るプロンプトは10回の呼び出し、100クレジットです。

ツール

ツールは1つだけです。下記のサンプルは実際の呼び出しから一部省略したもので、結果は Web の変化につれて変わります。あくまで形として読んでください。

サンプルは全体のレスポンスではなく、その中に含まれるペイロードです。tools/call の結果はテキストブロックを1つ持ち、そのテキスト自体が urlstatustextjson を含む JSON で、スクレイピングされたデータは json の下にあります。生の JSON-RPC レスポンスから取得する場合、result.content[0].text をパースし、その中の .json を参照します。チャットクライアントはこれを自動的に展開してくれますが、エンドポイントと直接通信するコードでは展開されません。

DuckDuckGo の検索結果を取得

hasdata_duckduckgo_serp_getSearchResults

DuckDuckGo の検索結果ページを取得し、パースした状態で返します。

パラメータ

備考

q

string

検索語。qnextPageToken のどちらかが必要です。

nextPageToken

string

前のレスポンスの pagination.nextPageToken にあるカーソル。両方送った場合はこちらが優先され、一緒に送った q は警告ロスに無視されます。

kl

string

リージョンを <country>-<language> で指定。us-ende-de から、jp-jp、リージョンなしの wt-wt まで37値。

cc

string

2文字の国コード。36値。setLang と組み合わせたときの kl の代替です。

setLang

string

インターフェースと結果の言語。33値。

safeSearch

string

offmoderate、またはstrict

deviceType

string

desktopmobile、または tablet

qnextPageToken のどちらか一方を送ってください。どちらも送らない場合、422 で両方のフィールド名が列挙されます。必須要件が条件付きであるため、スキーマとしては単純な必須リストでは表現できないからです。両方送ってもエラーにはなりません。カーソルが優先され、クエリはどこにも使われません。そのため、ページング中に q をそのまま引数に残しているエージェントは、静かに別の検索結果を読み取ることになります。

position は、それが含まれるページ内での順位です。全セットにわたる通し番号ではありません。2ページ目は再び position が 1 から始まるほか、ページサイズも固定ではないため、10件、15件、14件のページが混在して返れ来ます。絶対順位は、それまでに取得したオーガニック結果の件数に position を加えたもので、ページ番号から計算できるものではありません。これを無視してランキングのデータセットを組むと、各ページが独自の「1位」を持ちます。

adssearchAssist は、それらが存在しないページでは省略されます。読み取る前にキーの有無を確認してください。organicResults も省略される場合がありますので、あっても当然と前提で読むより、デフォルト値で取得してください。実際には一致がないクエリに対しても、ゆるく関連した件の通常ページが返ります。これは「見つかりません」とは違うのです。

{
  "organicResults": [
    {
      "position": 1,
      "title": "What is the Model Context Protocol (MCP)?",
      "link": "https://modelcontextprotocol.io/docs/getting-started/intro",
      "displayedLink": "modelcontextprotocol.io › docs › getting-started › intro",
      "source": "modelcontextprotocol.io",
      "snippet": "MCP is an open-source standard for connecting AI applications to external systems."
    }
  ],
  "ads": [
    { "position": 1, "title": "Make Agents Accountable", "link": "https://www.gravitee.io/platform/ai-agent-management" }
  ],
  "searchAssist": {
    "answer": "Model Context Protocol (MCP) is an open standard from Anthropic that lets LLMs connect to external tools, systems, and data sources using a shared interface."
  },
  "pagination": { "nextPageToken": "eyJ1cmwiOiJodHRwczovL2xpbmtzLmR1Y2tkdWNrZ28uY29t…" }
}

エラーと障害までのはじめ

クライアントがツール呼び出しで HTTP エラーコードを直接見ることはほとんどありません。MCP レイヤーは 200 で応答し、失敗は isError: true と理由テキストとして結果の中に含めます。ステータス行を想定するところで、エージェントはメッセージを読み取ります。

間違ったキーは接続エラーではなく、ツール出力として現れます。 一覧ツールは、空でないキーならすべて受け付ける。なので、クライアントはハンドシェイクを完了して「接続できた」表示になります。最初のツール呼び出しで isError: trueHasData API error: 401 Unauthorized というテキストが返ります。この文字列に注意してください。それより前のフローでは一切報告されません。

キーが欠けているのが唯一の実際の HTTP エラーです。 認証はどのツールよりも前に行われるので、接続自体が 401 で失敗します。

スキーマを壊すような引数は、検索の前に拒否されます。 サーバーは isError: trueMCP error -32602: Input validation error というテキストと、該当フィールド名を返します。何もフェッチされず、課金もありません。

qnextPageToken も送らなかった場合は、 422 レスが返り、errors 配列の中に両方のフィールド名と、両者を結びつける requiredIfNotExists ルールが挙されています。

内容が何もないクエリに対しても検索結果は返ります。 関連性を決めるのは DuckDuckGo 側です。無意味な文字列でも、adssearchAssist が含まれない、ゆるく関連した10件のページが通常どおり返ってきます。その出力が「見つからない」ことを示す情報はなく、そのブランドに関するカバレッジがない状態を検知し、いつも作業で注意が必要です。

データを伴う結果には、サポートへの問い合わせで使える requestMetadata.id が含まれています。

価格、無料枠、そして制限

呼び出しごとに 10クレジットです。結果件数によって価格は変わりません。完全なページも1件だけのページも同じ価格です。

無料トライアルは 30日間で 1,000クレジット、カード不要です。これは100回の検索に相当します。その後、アクティブなアカウントは残高が 100 クレジット未満になるたびに毎日 100 クレジットが補充されるます。そのため、小規模なエージェントは無料枠で無期限に動かせます。

有料プランは月額 $49で 200,000クレジット、20,000の検索です。単価はボリュームに押されて下がり、エントリープランは 1,000検索あたり $2.45 から、Businessでは $0.99、して Growth では $0.83、最大規模のハイボリュームプランでは $0.75 です。最新の数字は 価格ページ にあります。

プランによって並列実行数の上限も変わります。無料トライアルは同時リクエスト数 1、Startup は 15、Business は 30、Growth は 50、大規模プランは 200〜1,500 です。無監視で動かす場合はフェイルセーフを忘れず組み込んでください。リクエストを並列に発行てげるエージェントが上限に達しても、自分が気づいた時には遅いですから。

200以外のステータスで返されたリクエストは課金されません。成功した呼び出して何も見つからなかった場合も、それはそれで1回の呼び出しになります。

ツールの選択

apis クエリパラメータで、エージェントが見えるツールが決まります。ツールが少なければ、ツール定義に使うコンテキストも減り、モデルが誤ったツールを呼ぶ可能性も減ります。

?apis=duckduckgo                        the one tool in this repo
?apis=duckduckgo,google_serp            add Google search
?apis=duckduckgo,bing_serp,google_serp  three engines side by side

パラメータは、duckduckgo のようなプロバイダ名と、google_maps_search のような個別のAPI名を受け取ります。スペルミスのある名前は無視されます。すべての名前が間違っている場合、リクエストは400で失敗し、ボディには認識できなかった名前と有効な値のすべてがリストされます。パラメータを省略すると、同じエンドポイントでHasDataの57個すべてのツールが公開されます。

1つのエージェントに3つのエンジンを入れることが、ここでリストを広げる一般的な理由です。なぜなら、DuckDuckGo、Google、Bingで同じクエリを比較するのは、3つすべてが公開されていれば1つのプロンプトで済むからです。

比較の仕組み

現実的な代替案は、自己ホスト型サーバーです。人気のあるものはローカルで実行するPythonパッケージで、自分のマシンからDuckDuckGoにアクセスし、モデルに整形されたテキストブロックを渡します。これは、一度に1つの質問に答えるリサーチアシスタントにはうまく機能します。しかし、ボリュームと安定した構造が必要になると機能しなくなります。

自己ホスト型サーバー

このサーバー

検索が返すもの

モデルが読むために作られた整形済みテキスト文字列

positiontitlelinkdisplayedLinksourcesnippet、日付、サイトリンクを含むJSON

有料掲載

他のノイズと一緒に除去される

別のads配列に保持

ページネーション

1ページあたりのmax_results上限

すべてのレスポンスにカーソル

リージョン

1つのregionコード

37のリージョンコード、または国と言語を別々に設定

SafeSearch

サーバー起動時に固定され、エージェントからは意図的に呼び出せない

呼び出しごとに設定

ページを取得する主体

あなたのマシン。httpx経由で、オプションのcurl_cffiバックエンドと設定可能なフォールバック付き

当社

スループット

毎分30検索に自己スロットル

プランの同時実行数。トライアルの1から1,500まで

実行するもの

Python環境、オプションの追加パッケージ、localhostでない場合のコンテナまたはプロキシ設定

URLとヘッダー

ページコンテンツ抽出

fetch_contentツール

提供なし

コスト

無料

1コールあたり10クレジット

決定を左右するのは2つの行です。テキストブロブはチャット回答には適切な出力ですが、ランクデータセットには不適切です。なぜなら、散文からpositionを再構築するのは、あなたがやるべきではない作業だからです。また、フェッチが当社側にあるということは、バックエンドの問題がなくなり、httpxとブラウザ偽装クライアントの選択、フォールバックが依存する追加パッケージのインストール、プレーンなHTTPクライアントがページを取得できなくなったときのスタックトレースを読むこと、これらすべてから解放されます。

リストの他の項目はすべて実際のトレードオフです。自己ホスト型サーバーは無料で、アカウント不要で、クエリを自分のマシンに保持し、ページコンテンツをフェッチしますが、このサーバーはそれをしません。1日に数回の検索を1つのアシスタント内で実行するなら、そちらの方が適しています。こちらは、検索数、リージョン数、または出力の構造が重要になり始めるケース向けです。

DuckDuckGo独自のAPIに対して。 api.duckduckgo.comはInstant Answer APIで、結果ページではなく、存在する場合には百科事典的な要約を返します。ランク付けされたウェブ結果を提供する公式エンドポイントは存在しないため、ここでのすべてのオプションはページを解析します。

このサーバーが行わないこと。 ページのフェッチやコンテンツ抽出はなく、画像やニュースの垂直検索もなく、オートコンプリートもありません。解析された結果ページを返すだけです。

FAQ

公式のDuckDuckGo MCPサーバーはありますか?

いいえ。DuckDuckGoはMCPサーバーを公開していません。すべてのオプションは他の誰かによって構築されています。ほとんどはローカルで実行されるオープンソースプロジェクトであり、これはHasDataが保守するホスト型サーバーです。

DuckDuckGo MCPサーバーとは何ですか?

DuckDuckGo検索を、AIクライアントが呼び出せるツールとして公開するサーバーです。クライアントはModel Context Protocolを介してツールコールを送信し、サーバーは検索を実行して構造化されたJSONを返し、モデルは結果を処理してHTMLページを見ることはありません。

DuckDuckGoアカウントやAPIキーは必要ですか?

いいえ。唯一の認証情報はHasDataキーです。DuckDuckGoには登録する開発者プログラムはなく、公開されているInstant Answer APIも検索結果を返しません。

ホストや実行が必要なものはありますか?

いいえ。これはストリーミング可能なHTTP上のリモートMCPサーバーです。インストールするものも、Python環境も、ブラウザパッケージも、再起動するプロセスもありません。

データはライブですか、それともキャッシュされていますか?

ライブです。各コールはリクエスト時に結果ページをフェッチし、独自のrequestMetadata.idを持ちます。2つの同一のコールは2つの別々のフェッチであり、保存されたコピーの再生ではありません。

同じクエリをリージョン間で比較できますか?

はい、それがパラメータをプロキシの代わりに使う主な理由です。klは37のリージョンコードを受け取り、ccsetLangは国と言語を分離する必要がある場合に分離します。各リージョンは独自のコールです。

DuckDuckGoがレイアウトを変更したらどうなりますか?

あなた側では何も起こりません。当社が変更を追跡し、レスポンススキーマを安定に保つため、フィールド名と型は変わりません。報告するものがないブロックはレスポンスに存在しないため、adssearchAssistはデフォルト値で読み取ってください。

これを他のHasData APIと一緒に使えますか?

はい。apisパラメータはリストを受け取り、?apis=duckduckgo,google_serp,bing_serpはエージェントに3つの検索エンジンを同時に提供します。

キーを貼り付ける代わりにOAuthでサインインできますか?

はい、対応しているクライアントでは可能です。Claude DesktopとCursorはエンドポイントをコネクタとして追加し、サインインできます。無人エージェントとスクリプトはx-api-keyヘッダーを使用します。

コンプライアンスと個人データ

HasDataは公開されているデータのみにアクセスします。プラットフォームの利用規約が自動アクセスを制限する場合があり、コンプライアンスの責任はあなたにあります。収集するデータに個人情報が含まれる場合は、GDPR、CCPA、またはお住まいの地域の同等の規則に基づく正当な根拠があることを確認してください。

HasDataリンク

製品ページとリクエストビルダー

DuckDuckGo SERP API

サーバードキュメント

MCP server docs

1つのサーバー内の57個すべてのツール

HasData/hasdata-mcp

クライアントウォークスルー

MCP clients and integrations

当社が解析する他の検索エンジン

Google, Bing and 53 more APIs

プランとクレジットコスト

Plans and credit costs

キーと使用状況

HasData dashboard

開発

このリポジトリはリモートサーバーの設定とドキュメントです。ビルドステップもコンテナ化するものもありません。

test/内のテストはツール契約を検証します。これはここでのコミットなしに壊れる可能性のある部分です。?apis=duckduckgoが正確に1つのツールを返すこと、その名前が変わっていないこと、このREADMEが文書化しているパラメータが引用しているenumとともにまだ存在すること、使用中のキーが実際に受け入れられることを確認します。最後のチェックは実際の検索を実行し、10クレジットを消費します。これは、正しい理由で失敗できるカナリアの価格です。

# macOS and Linux
HASDATA_API_KEY=your_key_here npm test

# Windows PowerShell
$env:HASDATA_API_KEY="your_key_here"; npm test

同じスイートがプッシュのたびにCIで実行され、週に1回スケジュールで実行されます。なぜなら、上流のツールリストは誰かがこのリポジトリに触れることなく変更される可能性があるからです。失敗は、ツールリストが移動したか、キーが機能しなくなったか、エンドポイントに到達できなかったことを意味し、アサーションメッセージがどれかを示します。

貢献

パラメータテーブルとレスポンスサンプルの修正が最も有用な貢献です。なぜなら、それらがずれやすい部分だからです。実行したコールと受け取ったレスポンスを含めてください。フォークからのプルリクエストはキーなしでスイートを実行し、ライブチェックは赤になる代わりにスキップされます。

ライセンス

MIT。 LICENSEを参照してください。

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    This MCP server utilizes DuckDuckGo for web searches, providing structured search results with metadata and features like smart content classification and language detection, facilitating easy integration with AI clients supporting the MCP protocol.
    1
    26
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A MCP server for DuckDuckGo HTML search. Unlike other DuckDuckGo MCP servers, this one isn't just AI slop.
    ISC
  • A
    license
    Not graded
    quality
    D
    maintenance
    DuckDuckGo Search MCP Server. Scrapes DuckDuckGo Lite directly — no API key required, no rate limits, robust anti-bot protection.
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for internet search via direct Google and DuckDuckGo HTML scraping with AI-powered result normalization and optional summarization, requiring no API keys for search.
    MIT

View all related MCP servers

Related MCP Connectors

  • MCP server for Google search results via SERP API

  • Hosted MCP: 795 structured web-data tools for search, maps, commerce, social, gaming & finance.

  • Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/HasData/duckduckgo-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server