Skip to main content
Glama

web-search-mcp

完全ローカル・外部 API 不要・キー不要のオールインワン MCP ツールで、DeepSeek Harness + LM Studio に以下を提供します:

  1. ウェブ検索 —— 中国本土からアクセス可能な検索エンジンの結果ページ(百度 / 必应国内版 / 360 / 搜狗)を直接スクレイピングし、検索 API は一切呼び出しません。

  2. ページ全体の解析 —— Crawl4AI(ローカル Chromium)で Web ページの構造 + テキスト + 画像を抽出します。

  3. 画像の説明 —— ローカルの LM Studio ビジョンモデルで画像を中国語のテキスト説明に変換します(画像理解はサーバー側で行われるため、DSH がバイナリ画像を破棄する制限を回避します)。

5 つの MCP ツール:

ツール

説明

search_web

単一エンジン検索。タイトル / URL / 要約を返します

search_multi

マルチエンジン統合検索:百度/必应/360/搜狗 を並行検索し、URL で重複排除して結合

scrape_url

ページ全体を取得・解析(フィルタリング後の markdown + テキスト + 画像 + 画像説明)

search_and_extract

検索 → リダイレクトリンクの自動解決 → 上位 N 件を取得・解析まで一括実行

llm_extract

3 段階スマート抽出:ルールフィルタ → 小モデルでチャンク単位に抽出 → 大モデルで要約

取得した markdown はデフォルトで 3 段階のノイズ除去が適用されます:①PruningContentFilter によるフィルタリング(利用可能な場合)。②上部ナビゲーションバーの除去 + フッター/著作権/広告などのノイズ行を削除。③max_chars 上限(デフォルト 20000 文字、超過分は切り捨て)。広告などの無効なコンテンツがコンテキストを無駄に占有するのを防ぎます。

llm_extract はローカル LLM で本文抽出を完全に解決します:①ルールで Web ページをフィルタ → ②SMALL_MODEL(小モデル)でチャンクごとに要点を高速抽出 → ③LARGE_MODEL(大モデル)で一貫した要約に集約。

⚠️ モデル切替で VRAM を節約(デフォルト):config.py の model_switching=true の場合、単一インスタンスで順次切り替えます。小モデルが必要なときは自動で qwen3.5-4b に切り替え(思考はオフ)、処理後は大モデル qwen/qwen3.8-27b に戻して要約します。同時に読み込むモデルは 1 つだけなので、VRAM 不足を回避できます。false にするとデュアルインスタンスで並列実行します(十分な VRAM が必要)。


設定ファイル(ここを変更するだけ)

変更可能な設定はすべて config.py に集約されています。今後のメンテナンスはこの 1 ファイルを変更するだけです:

グループ

主な項目

説明

LM Studio 接続

llm_base_url / llm_api_key

エンドポイントと API キー

ビジョンモデル

vision_model

画像説明用のマルチモーダルモデル

LLM 抽出

small_model / large_model

小モデルで高速抽出 + 大モデルで要約

検索デフォルト

default_engine / multi_engines / search_max_results など

エンジンと件数

スクレイピングデフォルト

scrape_max_chars / scrape_describe_images など

本文の上限、画像説明の有無

抽出デフォルト

extract_max_chars / extract_chunk_chars

3 段階抽出のパラメータ

パフォーマンス最適化(ロードマップ A)

cache_enabled / cache_ttl_hours / scrape_concurrency / vision_max_side

ディスクキャッシュ、並列取得の制限、ビジョン画像のダウンサンプリング

Crawl4AI

crawl4ai_base_dir

データディレクトリ(空=プロジェクト内)

環境変数(DSH の cordis.patch.yml の env セクションなど)で config.py のデフォルト値を上書きすることもできますが、通常は config.py を変更するだけで十分です。変更後、DSH を再起動すると反映されます。


Related MCP server: WebFetch.MCP

アーキテクチャ

                    ┌──────────────────────────────┐
                    │  web-search-mcp (本进程)        │
关键词 ─────────────►│  1. 抓取 百度/必应/360/搜狗 结果页 │──► 搜索结果(标题/URL/摘要)
                    │  2. Crawl4AI 整页解析           │──► markdown / links / images
                    │  3. 下载图片 ─► LM Studio 视觉模型 │──► 图片中文描述(文本)
                    └──────────────────────────────┘
                              ▲ MCP stdio
                    ┌─────────┴──────────┐
                    │ DeepSeek Harness    │  (cordis.yml 里的 @deepseek-ai/dsh-mcp-client)
                    │ LM Studio(主模型)    │
                    └────────────────────┘
  • 検索・スクレイピング・画像説明はすべてローカルで完結します。唯一のネットワークアクセスは「Web ページ自体を開く」ことだけです(どのオンライン検索でも避けられません)。サードパーティの API もキーも不要で、データはローカルから出ません。

  • 画像説明はサーバーサイドビジョンです。Crawl4AI は画像 URL の抽出のみを担当し、本ツールが画像をダウンロードして LM Studio のビジョンモデルを呼び出し、画像をテキストに変換して DSH に返します。そのため、DSH の MCP ブリッジ層(バイナリ画像を破棄する)は問題になりません。


インストール

1. 環境

  • Python 3.10 以上 (Crawl4AI は 3.11 / 3.12 を推奨。3.13 で依存関係の問題が発生した場合は 3.12 に戻してください)

  • Docker はインストール済みでなくても構いません(このプロジェクトは Docker 不要です。SearXNG も必須ではありません。検索は直接スクレイピングするためです)

  • LM Studio が起動し、モデルがロードされていること

2. 依存関係のインストール(中国本土向けミラー)

cd web-search-mcp
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

# 下载 Crawl4AI 用的 Chromium(仅抓取功能需要;只用搜索可跳过)
playwright install chromium

依存関係の説明:httpx + beautifulsoup4 は必須(検索 + MCP トランスポート)。lxml は任意(未インストールの場合は標準ライブラリに自動フォールバック)。crawl4ai はスクレイピング機能でのみ必要です。MCP トランスポート層は Python 標準ライブラリのみで実装されており、mcp/pydantic に依存しません。したがって、最悪 httpx + beautifulsoup4 だけでも検索は可能です。

3. LM Studio ビジョンモデルの設定(任意ですが、画像説明を行う場合は必須)

LM Studio で画像入力に対応したビジョンモデル(Qwen2.5-VL-7B-Instruct、MiniCPM-V、LLaVA など)をロードします。

環境変数を設定します(または .env に記述しますが、本ツールは .env を自動読み込みしないため、起動コマンドで設定してください):

変数

デフォルト

説明

VISION_BASE_URL

http://localhost:1234/v1

LM Studio の OpenAI 互換エンドポイント

VISION_MODEL

空

LM Studio でロードするビジョンモデル名(未設定の場合は画像説明をスキップ)

VISION_API_KEY

lm-studio

ローカルサービスでは任意の非空文字列で可

⚠️ シングルインスタンス vs デュアルインスタンス:LM Studio は通常、同時に 1 つのモデルしかロードしません。メインのチャットモデルがビジョンモデルでない場合は、LM Studio のインスタンスをもう 1 つ起動し(ポートを変更、例: 1235)、ビジョンモデルをロードして、VISION_BASE_URL を http://localhost:1235/v1 に設定することをお勧めします。


DeepSeek Harness への接続

cordis.yml のプラグインリストに 1 セクション追加します(例は cordis.example.yml を参照):

- id: mcp-websearch
  name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: websearch
    transport: stdio
    command: python
    args: ['C:/Users/LiangYuelin/Desktop/workspace/web-search-mcp/server.py']
    cwd: 'C:/Users/LiangYuelin/Desktop/workspace/web-search-mcp'
    env:
      VISION_BASE_URL: 'http://localhost:1234/v1'
      VISION_MODEL: 'qwen2.5-vl-7b-instruct'
      VISION_API_KEY: 'lm-studio'
    toolCallTimeoutMs: 300000   # 抓取 + 图片描述较慢,务必调大
  • venv を使用している場合は、command を .venv/Scripts/python.exe(絶対パス)に変更してください。

  • 接続後、モデルには mcp__websearch__search_web、mcp__websearch__scrape_url、mcp__websearch__search_and_extract の 3 つのツールが見えるようになります。


使用例

モデル側で自然にツールが呼び出されます。例:

  • 「『大模型 RAG 最新进展』を検索して」 → search_web(query="大模型 RAG 最新进展", engine="bing")

  • 「この Web ページを取得して解析し、中の画像が何か教えて」 → scrape_url(url="https://...", describe_images=true)

  • 「『比特币 行情』を検索して、上位 3 記事を要約して」 → search_and_extract(query="比特币 行情", engine="bing", max_results=3)

検索エンジンの選択:

engine

説明

baidu

デフォルトの百度。返される URL はリダイレクトリンクですが、search_and_extract が自動で解決します

bing

必应国内版。結果の URL がクリーンで、スクレイピング対策が最も弱く、「検索 + スクレイピング」に最もおすすめ

360

360 搜索

sogou

搜狗(スクレイピング対策が強く、たまに失敗します)


デプロイ状況(ローカル)

完了済みで、ローカルで実測済み:

  • 依存関係はインストール済み:crawl4ai 0.9.2 + playwright + lxml + Chromium(国内ミラー経由)

  • DSH 設定は ~/.dsh/profiles/web/cordis.patch.yml に書き込み済み

  • 4 つの検索エンジン(百度/必应/360/搜狗)すべてで結果を返却

  • 百度のリダイレクトリンクを正しく解決

  • MCP stdio プロトコルを完全に検証(initialize / tools/list / tools/call / エラーハンドリング / 中国語 UTF-8)

  • scrape_url(ページ全体の markdown + links + 画像)と search_and_extract(検索→解決→スクレイピング→画像抽出)のエンドツーエンドを確認

残っている手動ステップ(画像説明に必要):

  1. LM Studio を開く → ローカルサーバーを起動(ポート 1234)

  2. ビジョンモデル qwen/qwen3.8-27b をロード(mmproj 付き、画像入力対応)

  3. DSH を再起動(dsh web)すると、モデルに mcp__websearch__* の 3 つのツールが表示されます


ファイル構成

  • server.py —— MCP サーバーエントリポイント(手書き MCP stdio、mcp/pydantic 依存ゼロ)

  • engines.py —— 検索エンジンスクレイピングモジュール(百度/必应/360/搜狗)

  • vision.py —— LM Studio ビジョンモデルによる画像説明

  • cache.py —— ディスクキャッシュモジュール(スクレイピング結果 / 画像説明の再利用、標準ライブラリのみ)

  • config.py —— 集中設定(変更可能な全項目)

  • requirements.txt —— 依存関係

  • .env.example —— ビジョンモデルの環境変数サンプル

  • cordis.example.yml —— DSH 接続設定のサンプル

パフォーマンス最適化(ロードマップ A・実装済み)

20GB VRAM + 32GB メモリのローカル環境向けに、新しい大規模モデルを追加せずに 4 つの最適化を実施しました:

項目

説明

効果

F1 フェーズバッチ処理

search_and_extract(use_llm_extract=true) の「モデル切り替え」をページあたり 2 回から呼び出しあたり 2 回に削減(最初に小モデルへ切り替えて一括抽出、その後大モデルへ切り替えて一括要約)

3 ページで 6 回のロード/アンロード → 2 回

F2 並列スクレイピング

複数ページの取得を asyncio.gather + Semaphore(scrape_concurrency) で並列化・レート制限

Chromium は I/O バウンドのため、約 2~3 倍高速化

F3 ディスクキャッシュ

スクレイピング結果と画像説明を (URL+パラメータ) のハッシュで保存し、cache_ttl_hours で期限切れ

実測で 4.14 秒 → 0.01 秒(>400 倍)

F4 リダイレクト解決時に本文をダウンロードしない

resolve_url は HEAD を優先し、失敗した場合はレスポンスヘッダーのみ読むストリーミング GET にフォールバック

ページ全体のダウンロードを 1 回分節約

F5 ビジョン画像のダウンサンプリング

ビジョンモデルに送る前に Pillow で長辺を vision_max_side(デフォルト 800px)に縮小

画像トークンが大幅に減り、高速化・KV キャッシュの VRAM 節約

F5 にはオプション依存の Pillow が必要です(requirements.txt に含まれています)。未インストールの場合はダウンサンプリングを自動スキップし、他の機能には影響しません。 キャッシュディレクトリはデフォルトでプロジェクト内の .cache/ です。CACHE_ENABLED=false を設定すると完全に無効化できます。

既知の制限

  • 検索結果に広告が含まれることがあります(百度の baidu.php?url=... は広告リンクで解決できないため、スクレイピング時にスキップ/エラーになりますが、正常です)

  • 検索エンジンのスクレイピング対策により、たまに失敗することがあります。その場合はエンジンを切り替えてください

  • 大きなページや画像が多いページの取得は遅いため、DSH 設定で toolCallTimeoutMs を必ず大きくしてください

  • 画像説明の品質は、お使いのローカルビジョンモデル自体に依存します

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables local LLMs in LM Studio to perform web searches through a privacy-focused local SearXNG instance. It features concurrent search capabilities, automatic result caching, and advanced filtering options like domain exclusion and time-range limits.
    6
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables local LLMs to search the web and fetch clean content from URLs without API keys, using SearxNG and Mozilla Readability.
    2
    41
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables local LLMs to search the web, scrape pages, and extract structured data (tables, metadata) from sources like Wikipedia and IMDb, with caching and rate limiting.
    1
    MIT