Skip to main content
Glama
dollarser

keyless-web-search-mcp

by dollarser

keyless-web-search-mcp

スタンドアロンのMCP stdioサーバーです。鍵不要の2ツール、web_search(自己運用エンジンプール:Bing360BaiduGoogleNaverYandexDuckDuckGo)と web_fetch(匿名HTTP(S)ページリーダー)を提供します。各検索では、有効なエンジンを最大2つまでに保ち、クエリ言語に応じてデフォルトの優先順位を振り分け、失敗したエンジンや無関係なエンジンを制限付きの試行予算内で補充し、結果を関連度でランク付けして統合し、正規URLで重複排除します。自己完結ディレクトリで、ビルドステップは不要、ハーネスのパッケージシステムには含まれません。どこへでも移動できます。

存在理由

ハーネス組み込みの web_search(DeepSeekプロバイダー)は DEEPSEEK_API_KEY を必要とし、すべてのクエリをDeepSeekクラウドに送信します。このサーバーはローカルモデル向けの代替です。鍵が不要で、ベンダー製検索APIも不要で、中国本土・香港のネットワークで動作します(中国本土回線ではBing/360/Baidu、検証済みの香港回線ではBing/360/Naver/Yandex。DuckDuckGoはこれらの回線のどれからも到達できません)。

web_fetch も、読み取り側では同じ理由で存在します。webプロファイルには検索プロバイダーはマウントされますが、フェッチプロバイダーはありません。そのため、組み込みの web_fetch ツールは(プリセットで有効化されても)毎回 WEB_PROVIDER_UNAVAILABLE で失敗します。このツールは、同じ鍵不要サーバーを通じてページの全文を読み取ります。

Related MCP server: Heventure Search MCP

実行

npm install --cache ./.npm-cache   # deps: @modelcontextprotocol/sdk, zod
node index.js                      # speaks MCP over stdio
npm test                            # run deterministic ranking/fallback tests

クライアントなしのクイックプローブ:

printf '%s\n' \
  '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"0.0.1"}}}' \
  '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
  '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
  | node index.js

Claude Code へのインストール

現在のユーザーにインストールして、すべてのClaude Codeプロジェクトから使えるようにします。サーバー登録時には両方のパスを解決してください。これにより、シェルの作業ディレクトリや後からの PATH に依存しなくなります:

claude mcp add --transport stdio --scope user web-search-self -- "$(command -v node)" "/absolute/path/to/keyless-web-search-mcp/index.js"
claude mcp get web-search-self

代わりに --scope local を使うと現在のプロジェクト内だけに限定でき、--scope project を使うと共有可能な .mcp.json に書き込めます。Claude Codeはユーザー/ローカル登録を ~/.claude.json に保存します。MCPサーバー定義は settings.json に置くべきではありません。

登録後、claude mcp listweb-search-self を接続済みとして報告するはずです。ツールは mcp__web-search-self__web_searchmcp__web-search-self__web_fetch として表示されます。

ツール

web_search({ query, count?, maxSources?, engines? })

パラメーター

デフォルト

意味

query

検索クエリ。任意の言語

count

8

統合結果の最大数(1〜20)

maxSources

2

検索ごとに使えるエンジンの最大数(上限は2。フォールバック試行は制約された範囲内)

engines

クエリ言語依存

優先順位付きの明示的なプール(任意)。省略時は、中国語・韓国語・日本語・ロシア語のクエリに対して地域に適した優先順位を使用

2ソースポリシー。 engines が省略された場合、プールはクエリ言語で振り分けられます。中国語は360/Baidu/Bing、英語はBing/Google/Naver/360から始まるため、検証済みの中国本土/香港ネットワークでも、4回の試行予算の中で動作するフォールバックを維持できます。明示的な engines リストは常に優先されます。候補は並列ラウンドで実行され、エンジンがソーススロットを消費するのは、パースできて保守的な語彙的関連性フィルタを通過した結果を返したときに限ります。失敗したエンジン、チャレンジされたエンジン、空結果のエンジン、無関係なエンジンは、試行予算と収集予算の範囲内で補充され、診断は "Engine note" 行に表示されます。結果はクエリとの重なりに加えて、ソース品質の小さな調整を加えてランク付けされます。明らかな転載・コンテンツファームの兆候は減点され、公式・ドキュメント・教育・GitHub の兆候は加点されますが、通常のサイトを強制的にブロックすることはありません。マージはラウンドロビン交互(エンジンAの1番目、エンジンBの1番目、Aの2番目、...)のままであり、正規URLの重複排除により、フラグメント、一般的な追跡パラメータ、安全な www. の違いを除去します。

結果:title [engine] / 実際の転送先URL / スニペットの番号付きリスト。リンクのクリーンアップはエンジンごとに実行します。Bingのクリックトラッカーリンクはローカルでデコード(base64 u パラメータ)。360は data-mdurl 属性を読み、Baiduはブロックの mu 属性を読みます(直接URLですが、レガシー link?url= ラッパーの場合のみ1回だけベストエフォートのリダイレクトGETを行います)。NaverとYandexのタイトルはアンカー内の直接URLを保持します。Googleの /url?q= ラッパーは展開されます。DuckDuckGoの /l/?uddg= トラッカーは展開されます。エンジンごとのプローブ予算は、Bing・Baidu が10秒、360・Naver・Yandex が8秒、Google・DuckDuckGo が5秒です。すべて並列で実行されるため、ラウンド全体の所要時間は最も遅いメンバーの処理時間になります。

web_fetch

web_fetch({ url, maxChars? })

パラメーター

デフォルト

意味

url

絶対 http(s) URL(それ以外は診断付きで拒否)

maxChars

20000

返すコンテンツの最大文字数(1000〜100000)

匿名でのパブリックWeb読み取りです。認証なし、ブラウザーのUser-Agent、リダイレクトは最大5回、ヘッダーとボディを含め壁時計で20秒の制限内です。レスポンスボディは正確に5MBで切り詰めます。DNS解決後、最初のURLとリダイレクト先のすべてをチェックし、ループバック・プライベート・リンクローカル・キャリアグレードNAT・予約済みアドレス・マルチキャスト・ローカルホスト名を拒否して、マシンやクラウドメタデータサービスへのSSRFを防ぎます。HTMLは表示可能テキストに削られ(script/style/noscript/svg/head/iframe/canvas/form は削除し、ブロック境界は改行にし、<title> はヘッダーに残します)。テキスト型・JSON型・XML型のメディアタイプは、宣言された文字セットを使ってエンティティデコードされて通ります。バイナリ系メディアタイプは拒否されます。出力は、status、リダイレクト後の最終 urlcontent-type、切り詰め情報をはじめとするステータスヘッダーと、その後に続くコンテンツ本体です。2xx以外の応答は、本体冒頭と注記(403/429はボットチェックまたはペイウォールと解釈)を返します。捏造されたページを返すことはありません。

エンジンとその状態

2026年7月に、3つの回線(中国本土回線、上海電信回線、香港Zenlayerデータセンター回線)から検証しました:

Engine

Endpoint

これらのネットワークからのステータス

bing

www.bing.com/search

✅ 両回線で~10個のオーガニックブロック。回線によっては、www がSERPを直接提供するか、cn.bing.com の双子に302リダイレクトする(エンジンはそれを追跡する);cn/ck/a トラッカーの代わりに直接結果URLを使用する — どちらの形状もパース可能

360

www.so.com/s

✅ クリーンな200;オーガニックブロックは data-mdurl に実際のURLを保持

google

www.google.com/search

到達可能(200)だが、このクライアント/IPはプレーンHTMLのSERPに対して信頼されていない:ボディはオーガニック結果がゼロの、JS無効の enablejs メタリフレッシュ壁。診断付きで検出・スキップされる;クリーンなIPからならマージに参加するだろう(下記のバイパス試行を参照)

baidu

www.baidu.com/s

✅ 上海と香港の回線で:リスクコントロールがスクリプト形状のリクエストをゲートする(クッキーに関係なくUAのみの302で wappass.baidu.com の画像キャプチャへ)が、完全なドキュメントナビゲーションヘッダーシグネチャ(Accept + Referer + sec-fetch-* + Upgrade-Insecure-Requests)は受け入れる — クッキーの有無にかかわらず、繰り返しの実行で安定。エンジンはそのシグネチャを送信する;より厳しくゲートする回線(以前の本土回線)は、検出・スキップされたキャプチャ診断に依然としてヒットする。パーサーはブロックの mu 属性(直接URL)を読み取る;非オーガニックカード(レコメンドリスト、ホットボード、関連検索)は、他の場所の広告スロットと同様にスキップされる

naver

search.naver.com/search.naver

✅ HK回線で(200、~10個の fds-web-doc-root オーガニックブロック、実行間で安定;中国語のクエリに中国語の結果で回答)。タイトルアンカーは直接URLを保持;韓国語のa11yラベル「새 창 열림」はタイトルとスニペットから除去される。韓国語優先のインデックスだが、グローバルな技術サイトもカバー;本土回線からは未テスト(標準の到達不能診断に劣化するだろう)

yandex

yandex.com/search

✅ HK 回線で:Baidu と同じナビゲーションシグネチャの教訓 — スクリプト形状のリクエストは SmartCaptcha の「ロボットではありません」チェックボックスを受けるが、完全なドキュメントナビゲーションヘッダーセットに加えてホームページのクッキーセッション(yandexuid など)があれば、プレーンHTMLのSERP(~50個の Organic ブロック、OrganicTitle アンカー内の直接URL)が提供される。エンジンはプロセス内でセッションをウォームアップする(30分TTL、チャレンジ応答時に再ウォームアップを1回再試行)。注意点:データセンターIPからは、Yandex はローリングレート状態を実行する — 検索のバーストがIPを数分間キャプチャモードに戻すため、プールの6番目に位置する(前のエンジンが失敗した場合にのみ参照される)

duckduckgo

html.duckduckgo.com/html

❌ テストした3つの回線すべて(HKを含む)でTCP到達不能;それが機能するネットワークのための最後の手段エンジン

意図的にプールに含めていない:Sogousogou.com/antispider/ に302リダイレクト、Baidu がカバーするのと同じIP壁クラス。また、HK 回線からスキャンして拒否されたもの:Mojeek(キャプチャページを提供)、Ecosia(403「Ecosia Firewall」)、MetaGer(非結果ページにリダイレクト)、および Yahoo/Brave/Qwant/Startpage/goo.ne.jp(本土とHKの両方の回線からTCP到達不能)。

Google の壁:試みられたこと

このIPからの200応答はブロックではなく、JSチャレンジインタースティシャル~90 KBの難読化/暗号化されたJavaScript;JS無効パスはメタリフレッシュで行き止まりになる)。壁は2層であることが判明:

  1. JSチャレンジ(計算) — デコードすると、証明値を計算して SG_SS クッキー(5分の有効期限)を設定し、リロードする。この層はブラウザ外で解決可能:プレーンなNode.jsでページのスクリプトを軽量なDOMシム(クッキージャー、navigatorImagedocument)で実行すると計算が完了し、結果の SG_SS クッキーが一度受け入れられた — Google は200で応答し、このIPには通常送信しない NID/AEC トラストクッキーを発行した。

  2. セッションパターン層(行動) — その後のプレーンHTTPフォローアップ(スクリプト自身のリロードフローの正確なレプリカ(emsg=SG_REL + 一致する sei、ジャー統合クッキー、ブラウザヘッダー)を含む)は、google.com/sorry 429 異常壁にエスカレーションする。この層はセッション全体(TLS/HTTP2フィンガープリント、リクエストペーシング、メソッドミックス)を判断するが、Node の OpenSSL/undici スタックはそれに一致しない。

テストされ、層1の回答を変更しなかったクライアント側のレバー:gbv=1 パラメータ、クッキーのウォームアップ、完全なブラウザフィンガープリントヘッダー、retry/enablejs フロー、/m エントリ、テキストブラウザ/フィーチャーフォン/IE6/旧Android UA、偽装された Googlebot UA(Google はそれを検証する)、CONSENT クッキー、POST送信(405)、代替TLD、およびクッキーなしの「ここをクリック」 emsg=SG_REL リンク。Google プロキシの代替もこのネットワークからは到達不能または壁に遮られた:Startpage と Qwant はタイムアウト、Mojeek はキャプチャページを提供、Ecosia は403。

結論:層1はNodeで解決可能(実証済み);層2は非ブラウザネットワークスタックからは解決不可能。このマシンから Google への信頼できる唯一の経路は、クリーンIPプロキシまたは実際のブラウザコンテキスト(ヘッドレス Chromium)である;どちらもスクレイパーが正直に議論できない同じIP/トラフィックパターン層にあり、繰り返しのプロービングはIPの異常ウィンドウを延長するリスクがある — そのためこのサーバーはそれらを試みない。Google は、プレーンHTMLのSERPを提供するネットワークでアクティブになるバックフィルエンジンとして残る。

DeepSeek ハーネスへのマウント

cordis.yml に追加する(MCPブリッジはこのエントリをホットリロードする):

- id: mcp-search
  name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: search
    transport: stdio
    command: node
    args: ['/absolute/path/to/keyless-web-search-mcp/index.js']

モデルはその後、ツールを mcp__search__web_searchmcp__search__web_fetch として見る。

制限事項

  • 検索品質はヒューリスティック:語彙的関連性は明らかなオフトピック結果と中国語のn-gramを処理する;内部検索エンジンページは除外される;コンテンツファーム/再投稿シグナルは順序を調整するだけで、普遍的な信頼判断ではない。関連する結果がその主張が正しいことを証明するものではない — 重要な事実はフェッチしてクロスチェックすること。

  • APIではなくスクレイピング:レイアウトの変更がパーサーを壊す可能性がある;失敗は明確(「パース可能なオーガニック結果がない」)であり、決して捏造されない。Google と DuckDuckGo のパーサーは文書化されたSERP構造から書かれており、このネットワークからはライブ検証できない — エンジンが実際に応答する最初の機会にそれらを調整する。

  • レート制御:両方の公開エンジンはカジュアルな使用を許容する;ハンマリングはボットチャレンジを引き起こす。

  • クエリはマシンを離れる(キーレス検索の代償);2ソースキャップにより、検索ごとに最大2つのエンジンがクエリを見る。

  • フェッチはキーレスの公開ページリーダーであり、ブラウザやイントラネットクライアントではない:JSレンダリングされたコンテンツはそれには見えない(検索パーサーと同じクラスの制限);匿名クライアントに403/429を返すページは報告され、バイパスされない。ローカル/プライベート/予約済みネットワークターゲットは、リダイレクト先を含めて意図的にブロックされる。

Install Server
F
license - not found
A
quality
C
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

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables web search across multiple search engines (DuckDuckGo, Bing, Startpage) with parallel execution and result deduplication. Also provides web page content extraction capabilities.
    2
  • A
    license
    A
    quality
    C
    maintenance
    Enables web search without API keys using DuckDuckGo and Bing search engines, and retrieves webpage content. Supports multiple search engines simultaneously with privacy protection and asynchronous processing.
    2
    7
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Provides free web search, content fetching, image search, and deep research via SearXNG, no API keys required.

View all related MCP servers

Related MCP Connectors

  • LLM-ready web search + instant answers + URL-to-clean-text fetch for agents and RAG.

  • Web search for AI agents — one tool across 6 engines, routed to the cheapest + cached.

  • Multi-engine search for AI agents. Trust scoring, local corpus, MCP-native. Self-hostable, BYOK.

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/dollarser/keyless-web-search-mcp'

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