Web Search MCP Server:APIキー不要のローカルLLMウェブ検索
Web Search MCP Server
A Web Search MCP Server は、ローカルホストされたLLMにリアルタイムでオンプレミスのウェブ検索機能を提供する、軽量でTypeScriptベースのMCP(Model Context Protocol)サーバーです。支払う必要のあるAPIを排除し、Bing、Brave、DuckDuckGoと直接接続して、完全なページコンテンツまたは軽量なスニペットを抽出します。
なぜ使うのか?
| 要件 | 重要性 |
|---|---|
| APIキー不要 | 多くのLLMデプロイメントは外部コストと潜在的なレイテンシを回避します。 |
| マルチエンジン戦略 | 片方が失敗した場合に代替エンジンにフォールバックします。 |
| フルページ抽出 | 高品質のコンテキストを得るために記事全体を取得します。 |
| 並列処理 | 複数の結果を同時に取得し、総待機時間を短縮します。 |
| Playwrightサポート | 人間の閲覧をシミュレートしてボット検出を回避します。 |
| 環境変数で設定可能 | コードを変更せずにタイムアウト、ブラウザー数、関連性閾値を調整できます。 |
迅速なインストール
# 1. リポジトリをクローン
git clone https://github.com/mrkrsl/web-search-mcp.git
cd web-search-mcp
# 2. Node.js v18+ と npm v8+ をインストール
# (公式インストーラーまたは nvm で管理)
# 3. 依存関係と Playwright ブラウザーをインストール
npm install
npx playwright install
# 4. TypeScript コードをビルド
npm run build
# 5. サーバーを起動(開発モード)
npm start # もしくは "npm run dev" でホットリロード
Tip: Windows ではスラッシュをバックスラッシュに置き換え、PowerShell コマンドを使用してください。
設定
プロジェクトのルート(あるいは好きな場所)に mcp.json を作成または編集し、MCPクライアントにサーバーのバイナリ場所を伝えます。
{
"mcpServers": {
"web-search": {
"command": "node",
"args": ["/path/to/web-search-mcp/dist/index.js"],
"env": {
"MAX_CONTENT_LENGTH": "10000",
"BROWSER_HEADLESS": "true",
"MAX_BROWSERS": "3",
"BROWSER_FALLBACK_THRESHOLD": "3"
}
}
}
}
command– 通常nodeです。args–dist/index.jsへの絶対パスです。env– 詳細調整のためのオプション環境変数です。
共通の環境変数
| 変数 | デフォルト | 用途 |
|---|---|---|
MAX_CONTENT_LENGTH |
500000 |
ページ抽出時に返す最大文字数 |
DEFAULT_TIMEOUT |
6000 |
要求タイムアウト(ミリ秒) |
MAX_BROWSERS |
3 |
同時に実行できるブラウザーの最大数 |
BROWSER_TYPES |
chromium,firefox |
起動するブラウザーの種類 |
ENABLE_RELEVANCE_CHECKING |
true |
検索品質スコアリングを有効にします |
RELEVANCE_THRESHOLD |
0.3 |
最小品質スコア |
FORCE_MULTI_ENGINE_SEARCH |
false |
1つが成功してもすべてのエンジンでクエリを実行します |
MCPツールの概要
サーバーは、MCP対応クライアント(LM Studio、LibreChat、または独自アプリ)で呼び出せる3つの異なるツールを公開します。
1. full-web-search
| 特徴 | 詳細 |
|---|---|
| 検索ロジック | Bing → Brave → DuckDuckGo を優先します |
| 結果ペイロード | url、title、description、およびオプションの content を含むオブジェクトの配列 |
| カスタマイズ | limit (1‑10)、includeContent (boolean) |
リクエスト例
{
"name": "full-web-search",
"arguments": {
"query": "TypeScript MCP server",
"limit": 3,
"includeContent": true
}
}
2. get-web-search-summaries
full-web-search と同じ検索戦略ですが、フルページコンテンツは返さずスニペット/説明のみを返します。高速検索や帯域が限られている場合に最適です。
リクエスト例
{
"name": "get-web-search-summaries",
"arguments": {
"query": "best TypeScript web search",
"limit": 5
}
}
3. get-single-web-page-content
既に目的のURLが分かっていてメインコンテンツだけが必要な場合に有効です。
リクエスト例
{
"name": "get-single-web-page-content",
"arguments": {
"url": "https://example.com/article.html",
"maxContentLength": 5000
}
}
ローカルLLMクライアントとの連携
以下は、LibreChat構成にサーバーを統合する最小限の例です。
# librechat.yaml
mcpServers:
web-search:
type: stdio
command: node
args:
- /app/mcp/web-search-mcp/dist/index.js
env:
MAX_CONTENT_LENGTH: "10000"
serverInstructions: true
チャットメッセージ内では次のように呼び出します。
{{{ full-web-search(query="nodejs web search", limit=5, includeContent=true) }}}
LLMはURL、タイトル、説明、および全文を含む構造化JSONを受け取り、生成のコンテキストとして使用できます。
パフォーマンスヒント
| 設定 | 効率向上の理由 |
|---|---|
DEFAULT_TIMEOUT = 4000 |
レスポンスが遅い際に早期失敗させ、全行程時間を短縮 |
MAX_BROWSERS = 1 |
メモリ使用量を削減、リソースが限られた環境で便利 |
BROWSER_HEADLESS = true |
ヘッドレスモードでレンダリングオーバーヘッドを排除 |
RELEVANCE_THRESHOLD = 0.5 |
品質の高い結果のみ残すための厳格なフィルタ |
注意: これらの値はネットワーク、CPU、LLMリクエストのサイズに応じて調整してください。
トラブルシューティング
| 症状 | 可能原因 | 修正 |
|---|---|---|
npm install が失敗 |
Node/NPMが古い | Node 18+ と NPM 8+ にアップグレード |
| ブラウザーインストールが停止 | プロキシ/ネットワーク制限 | npx playwright install --with-deps をVPNまたはプロキシ設定後に実行 |
| 検索結果が空 | エンジンがブロック | BROWSER_FALLBACK_THRESHOLD を増やすか FORCE_MULTI_ENGINE_SEARCH を有効化 |
| Out‑of‑memory | ブラウザー数が多い | MAX_BROWSERS を減らす |
未期待の HTTP/2 エラー |
プロトコルサポート問題 | サーバーは自動でフォールバックします。 BROWSER_HEADLESS=true を確実に設定 |
サーバー拡張
コードベースはモジュール化されています。新しいツールは簡単に追加できます。
src/tools/配下にrun関数を実装したファイルを作成。src/index.tsに export して登録。- 必要なら
package.jsonとmcp.jsonを更新。
Tip: 既存の zod スキーマ検証を活用し、引数の型安全性を保てます。
ライセンス
本プロジェクトは MIT ライセンスで配布されています。自由にフォーク、改変、独自パイプラインへの組み込みが可能です。
まとめ
Web Search MCP Server はローカルLLM開発者の大きなギャップを埋めます。APIフリーで即時にウェブ閲覧が可能。マルチエンジン、洗練されたコンテンツ抽出、クリーンなMCPインターフェースを組み合わせることで、フルページコンテンツとサマリーモードの両方を単一リポジトリで実現します。小規模研究支援ツールから本番チャットボットまで、外部コストなしで最新情報をLLMに即座に投入できます。
楽しい検索を!