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 です。
  • argsdist/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つの異なるツールを公開します。

特徴 詳細
検索ロジック Bing → Brave → DuckDuckGo を優先します
結果ペイロード urltitledescription、およびオプションの 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 を確実に設定

サーバー拡張

コードベースはモジュール化されています。新しいツールは簡単に追加できます。

  1. src/tools/ 配下に run 関数を実装したファイルを作成。
  2. src/index.ts に export して登録。
  3. 必要なら package.jsonmcp.json を更新。

Tip: 既存の zod スキーマ検証を活用し、引数の型安全性を保てます。

ライセンス

本プロジェクトは MIT ライセンスで配布されています。自由にフォーク、改変、独自パイプラインへの組み込みが可能です。

まとめ

Web Search MCP Server はローカルLLM開発者の大きなギャップを埋めます。APIフリーで即時にウェブ閲覧が可能。マルチエンジン、洗練されたコンテンツ抽出、クリーンなMCPインターフェースを組み合わせることで、フルページコンテンツとサマリーモードの両方を単一リポジトリで実現します。小規模研究支援ツールから本番チャットボットまで、外部コストなしで最新情報をLLMに即座に投入できます。

楽しい検索を!

この記事を共有