web-search-mcp
web-search-mcp
完全ローカル・外部 API 不要・キー不要のオールインワン MCP ツールで、DeepSeek Harness + LM Studio に以下を提供します:
ウェブ検索 —— 中国本土からアクセス可能な検索エンジンの結果ページ(百度 / 必应国内版 / 360 / 搜狗)を直接スクレイピングし、検索 API は一切呼び出しません。
ページ全体の解析 —— Crawl4AI(ローカル Chromium)で Web ページの構造 + テキスト + 画像を抽出します。
画像の説明 —— ローカルの LM Studio ビジョンモデルで画像を中国語のテキスト説明に変換します(画像理解はサーバー側で行われるため、DSH がバイナリ画像を破棄する制限を回避します)。
5 つの MCP ツール:
ツール | 説明 |
| 単一エンジン検索。タイトル / URL / 要約を返します |
| マルチエンジン統合検索:百度/必应/360/搜狗 を並行検索し、URL で重複排除して結合 |
| ページ全体を取得・解析(フィルタリング後の markdown + テキスト + 画像 + 画像説明) |
| 検索 → リダイレクトリンクの自動解決 → 上位 N 件を取得・解析まで一括実行 |
| 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 接続 |
| エンドポイントと API キー |
ビジョンモデル |
| 画像説明用のマルチモーダルモデル |
LLM 抽出 |
| 小モデルで高速抽出 + 大モデルで要約 |
検索デフォルト |
| エンジンと件数 |
スクレイピングデフォルト |
| 本文の上限、画像説明の有無 |
抽出デフォルト |
| 3 段階抽出のパラメータ |
パフォーマンス最適化(ロードマップ A) |
| ディスクキャッシュ、並列取得の制限、ビジョン画像のダウンサンプリング |
Crawl4AI |
| データディレクトリ(空=プロジェクト内) |
環境変数(DSH の
cordis.patch.ymlのenvセクションなど)でconfig.pyのデフォルト値を上書きすることもできますが、通常はconfig.pyを変更するだけで十分です。変更後、DSH を再起動すると反映されます。
アーキテクチャ
┌──────────────────────────────┐
│ 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 を自動読み込みしないため、起動コマンドで設定してください):
変数 | デフォルト | 説明 |
|
| LM Studio の OpenAI 互換エンドポイント |
| 空 | 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 | 説明 |
| デフォルトの百度。返される URL はリダイレクトリンクですが、 |
| 必应国内版。結果の URL がクリーンで、スクレイピング対策が最も弱く、「検索 + スクレイピング」に最もおすすめ |
| 360 搜索 |
| 搜狗(スクレイピング対策が強く、たまに失敗します) |
デプロイ状況(ローカル)
完了済みで、ローカルで実測済み:
依存関係はインストール済み: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(検索→解決→スクレイピング→画像抽出)のエンドツーエンドを確認
残っている手動ステップ(画像説明に必要):
LM Studio を開く → ローカルサーバーを起動(ポート 1234)
ビジョンモデル
qwen/qwen3.8-27bをロード(mmproj 付き、画像入力対応)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 フェーズバッチ処理 |
| 3 ページで 6 回のロード/アンロード → 2 回 |
F2 並列スクレイピング | 複数ページの取得を | Chromium は I/O バウンドのため、約 2~3 倍高速化 |
F3 ディスクキャッシュ | スクレイピング結果と画像説明を (URL+パラメータ) のハッシュで保存し、 | 実測で 4.14 秒 → 0.01 秒(>400 倍) |
F4 リダイレクト解決時に本文をダウンロードしない |
| ページ全体のダウンロードを 1 回分節約 |
F5 ビジョン画像のダウンサンプリング | ビジョンモデルに送る前に Pillow で長辺を | 画像トークンが大幅に減り、高速化・KV キャッシュの VRAM 節約 |
F5 にはオプション依存の
Pillowが必要です(requirements.txt に含まれています)。未インストールの場合はダウンサンプリングを自動スキップし、他の機能には影響しません。 キャッシュディレクトリはデフォルトでプロジェクト内の.cache/です。CACHE_ENABLED=falseを設定すると完全に無効化できます。
既知の制限
検索結果に広告が含まれることがあります(百度の
baidu.php?url=...は広告リンクで解決できないため、スクレイピング時にスキップ/エラーになりますが、正常です)検索エンジンのスクレイピング対策により、たまに失敗することがあります。その場合はエンジンを切り替えてください
大きなページや画像が多いページの取得は遅いため、DSH 設定で
toolCallTimeoutMsを必ず大きくしてください画像説明の品質は、お使いのローカルビジョンモデル自体に依存します
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
LLM-ready web search + instant answers + URL-to-clean-text fetch for agents and RAG.
The best web search for your AI Agent
Web search, page extraction and structured commerce, social and business data for AI agents
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/meteoritesama/web-search-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server