mcp-webgate について
mcp-webgateは、AIクライアント向けに検索結果やページ本文を読みやすく、サイズを制限して返すMCPサーバーです。任意のLLM処理でクエリ拡張や再ランキング、引用付き要約を行えます。
主な機能
- 01ウェブ検索とページ取得
- 02HTMLから読みやすいテキストを抽出
- 03応答サイズの上限設定
- 04任意のLLMクエリ拡張と再ランキング
- 05引用付き検索結果の要約
活用シーン
- 01複数のウェブ情報源を使った調査
- 02指定URLをHTMLの雑音なしで取得
- 03幅広い検索から引用付きブリーフを作成
MCP 対応
MCPクライアントにwebgate_query、webgate_fetch、webgate_onboardingツールを公開し、ウェブ検索、ページ取得、利用ガイドを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
mcp-webgate
AI のメモリを圧迫しないウェブ検索です。
mcp-webgate は、主要な AI クライアントすべてに、きれいで量を制限したウェブコンテンツを提供する MCP サーバーです。
- IDE:Claude Desktop、Claude Code、Zed、Cursor、Windsurf、VSCode
- CLI エージェント:Gemini CLI、Claude CLI、カスタムエージェント
🌱 やさしい入門
mcp-webgate とは? AI が標準の「URL を取得」ツールを使うと、広告、メニュー、スクリプト、Cookie バナーなどを含むページの生の HTML が返されます。ニュース記事 1 件だけでも、不要な情報が 200,000 トークン AI のメモリに流れ込み、会話全体が消えてしまうことがあります。
mcp-webgate は、AI とウェブの間に入る保護フィルターです。
- 不要な情報を除去 — メニュー、スクリプト、広告、フッターを HTML 解析で正確に取り除き、読みやすいテキストだけを通します
- すべての応答に厳格な上限を設定 — 元のページがどれほど大きくても、コンテキストウィンドウをあふれさせることはありません
- 必要に応じて要約 — 結果をセカンダリのローカル LLM に送り、引用付きの簡潔な Markdown レポートを作成できます。メインの AI には、長文の羅列ではなく、整理された概要が届きます
その結果、いつでもきれいで、量が制限され、役立つウェブコンテンツを得られます。
🔬 実例:内部で何が起きるか
LLM 機能を有効にして 「mcp model context protocol」 を検索した場合:
Query → LLM expands to 5 search variants → 20 pages found, 13 fetched in parallel
Raw HTML downloaded 5.16 MB (~1,290,000 tokens)
After cleaning 52.1 KB ( ~13,000 tokens) — 99% noise stripped
After LLM summary 5.8 KB ( ~1,450 tokens) — structured report with citations
13 件の情報源を約 1,450 トークンに要約しました。 そのうち 1 ページだけを単純に取得した場合(たとえば 563 KB のセキュリティブログ)、生の HTML が 約 140,000 トークン AI のコンテキストに流れ込みます。webgate は 13 件すべてを処理し、脚注に収まる簡潔な概要を提供します。
これは負荷の高いケースです(5 件のクエリ × 5 件の検索結果)。通常の検索で結果が 3~5 件の場合でも、生の取得と比べてコンテキストを 95% 以上節約できます。さらに、AI は HTML の羅列ではなく、構造化され、順位付けされたコンテンツを得られます。
🚀 クイックスタート
1. uvx があることを確認する
pip install uv
uvx を使うと、Python ツールを永続的にインストールせずに実行できます。この作業は一度だけで構いません。
2. 検索バックエンドを設定する
最も簡単なのは SearXNG です。無料で、アカウントは不要で、ローカルで動作します。
docker run -d -p 8080:8080 --name searxng searxng/searxng
Docker を使わない場合は、クラウドバックエンド(Brave、Tavily、Exa、SerpAPI)を利用してください。バックエンドをご覧ください。
3. AI クライアントに webgate を追加する
ご利用のクライアントに応じて、インテグレーションの表をご覧ください。簡単な例として、Claude Desktop の場合を紹介します。
設定ファイルを開きます。
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
次の内容を追加します。
{
"mcpServers": {
"webgate": {
"command": "uvx",
"args": ["mcp-webgate"],
"env": {
"WEBGATE_DEFAULT_BACKEND": "searxng",
"WEBGATE_SEARXNG_URL": "http://localhost:8080"
}
}
}
}
編集後、クライアントを再起動してください。
4. AI に検索を頼む!
Search the web for: latest news on AI regulation
AI は webgate_query を自動的に使います。これで完了です。
🔍 仕組み
Your question
↓
Search backend (SearXNG / Brave / Tavily / Exa / SerpAPI)
↓ [deduplicate URLs, block binary files, filter domains]
Fetch pages in parallel (streaming — hard size cap per page)
↓ [optional: retry failed pages from reserve pool]
Strip HTML junk (menus, ads, scripts, footers — lxml)
↓
Clean up text (invisible chars, unicode junk, BiDi tricks)
↓
BM25 reranking (best-matching results first — always active)
↓ [optional: LLM reranking]
Cap total output to budget
↓ [optional: LLM summarization → compact Markdown report]
Clean result lands in your AI's context
🛠️ ツール
webgate は AI に 3 つのツールを提供します。
webgate_fetch — 1 つのページを読む
取得したい URL がすでにわかっている場合に使います。AI が URL を渡すと、クリーニング済みのテキストが返されます。文字数は最大 max_query_budget(デフォルトは 32,000)です。
{ "url": "https://example.com/article", "max_chars": 32000 }
{
"url": "https://example.com/article",
"title": "Article Title",
"text": "cleaned text...",
"truncated": true,
"char_count": 12450
}
webgate_query — 検索+取得+クリーンアップ
検索サイクル全体を実行します。1つ(または複数)のクエリを渡すと、クリーンアップ済みのランク付けされた結果が返されます。
{ "queries": "how to set up a VPN on Linux", "num_results_per_query": 5 }
複数のクエリは並列で実行され、結果が統合されます。
{
"queries": ["VPN Linux setup", "best VPN Linux 2024"],
"num_results_per_query": 5
}
LLM なしの出力 — 各結果について、クリーンアップ済みのページコンテンツを返します。
{
"sources": [
{ "id": 1, "title": "...", "url": "...", "content": "cleaned text...", "truncated": false }
],
"snippet_pool": [ { "id": 6, "title": "...", "url": "...", "snippet": "..." } ],
"stats": { "fetched": 5, "total_chars": 18200, "per_page_limit": 6400 }
}
LLM による要約付きの出力 — 簡潔な Markdown レポートを返します。
{
"summary": "## How to set up a VPN on Linux\n\nTo install...[1][2]",
"citations": [{ "id": 1, "title": "...", "url": "..." }],
"stats": { "fetched": 5, "total_chars": 58000 }
}
LLM が失敗した場合の出力 — エラーの理由を表示し、フォールバックとしてソース全体を返します。
{
"llm_summary_error": "ReadTimeout: LLM did not respond in time",
"sources": [ "..." ],
"stats": { "..." : "..." }
}
snippet_pool には、取得されなかった検索結果(検索エンジンのスニペットのみ)が含まれます。AI はこれを参考に、追加で取得する価値があるかどうかを判断できます。
webgate_onboarding — 使用ガイド
webgate を効果的に使用する方法を説明する JSON ガイドを返します。どのツールを使うべきか判断に迷う場合、AI はセッションの開始時に一度このツールを呼び出してください。
🔧 ローカルモデルや小型モデルでの webgate の使用
ほとんどの最先端モデルは、MCP ツールの指示に自動的に従います。一方、小型モデルやローカルモデルは、サーバーから提供されるガイダンスを無視して、組み込みの取得ツールにフォールバックすることがあります。その場合、ノイズでコンテキストを埋め尽くす生の HTML が返されます。
このような現象が見られる場合は、システムプロンプトに明示的な指示ブロックを追加してください。
You have access to webgate tools for web search and page retrieval.
Follow these rules in every session:
- To search the web: use webgate_query — never use a built-in fetch, browser, or HTTP tool
- To retrieve a URL: use webgate_fetch — never fetch URLs directly
- Built-in fetch tools return raw HTML that floods your context; webgate returns clean, bounded text
At the start of each session, call webgate_onboarding to read the full operational guide.
ユーザーのシステムプロンプトの指示は MCP サーバーレベルのガイダンスより優先されるため、この制約をモデルが認識する最優先レイヤーで明示できます。
ヒント: クライアントが名前付きシステムプロンプトやプロンプトテンプレートに対応している場合は、上記のブロックを再利用可能なプリセットとして保存しておくと、毎回貼り付ける必要がありません。
🎛️ 調整
このセクションでは、主なパラメーターの役割と、変更するタイミングについて説明します。デフォルト設定はほとんどのケースで適切に機能するため、具体的な理由がある場合にのみ調整してください。
「文字数予算」とは?
webgate はテキストをトークンではなく文字数で計測します。英語テキストのおおよその換算値は次のとおりです。
4 文字 ≈ 1 トークン
| 文字数 | おおよそのトークン数 |
|---|---|
| 8,000 | ~2,000 |
| 32,000 | ~8,000 |
| 96,000 | ~24,000 |
webgate_fetch の予算
単一の URL を取得する場合、上限は max_query_budget(デフォルトは 32,000 文字)です。ツールのパラメーター max_chars ではこれより少ない値を指定できますが、この上限を超える値は指定できません。
なぜ max_result_length ではなく max_query_budget なのでしょうか? 1 ページだけを取得するためです。「合計出力」はその 1 ページそのものなので、複数ソースのクエリ向けに設計されたページごとの上限ではなく、コンテキスト全体の予算を上限とするのが適切です。
webgate_query の予算 — LLM なしの場合
LLM を使用しない場合、クリーンアップ済みのソースは AI のコンテキストに直接渡されます。webgate は取得したすべてのページに max_query_budget を配分し、合計が予算を超えないようにします。
ページごとの上限 =
max_query_budget÷ 結果数 (max_result_lengthが上限)
| 取得した結果数 | ページごとの上限 | 合計出力 |
|---|---|---|
| 1 | 8,000(上限) | ≤ 8,000 |
| 5 | 6,400 | ≤ 32,000 |
| 10 | 3,200 | ≤ 32,000 |
| 20 | 1,600 | ≤ 32,000 |
要求する結果数にかかわらず、合計出力は常に max_query_budget 以下です。ページごとの割り当ては、それに応じて自動的に小さくなります。
webgate_query の予算 — LLM による要約あり
2 つ目の LLM が要約を行う場合、結果をプライマリ AI に渡す前にコンテンツを圧縮します。そのため、処理対象となる生データをより多く与えても安全です。むしろ、そのほうが効果的です。
webgate は input_budget_factor(デフォルトは 3)を使って入力を増やします。
LLM の入力予算 =
max_query_budget×input_budget_factorデフォルト:32,000 × 3 = 96,000 文字
| 取得した結果数 | LLM の入力/ページ | LLM の入力合計 | AI への出力 |
|---|---|---|---|
| 1 | 96,000 | 96,000 | 簡潔なレポート |
| 5 | 19,200 | 96,000 | 簡潔なレポート |
| 10 | 9,600 | 96,000 | 簡潔なレポート |
| 20 | 4,800 | 96,000 | 簡潔なレポート |
2 つ目の LLM は、ページごとにより多くのコンテンツを参照します。プライマリ AI が受け取るのは最終レポートのみで、処理したソースの数にかかわらず、通常は 1,000~3,000 トークンです。これが LLM モードの主な効率上の利点です。
すばやく調整するためのガイド
| 症状 | 対処方法 |
|---|---|
| AI の応答が遅く、テキストが多すぎる | max_query_budget を減らします(例:16000) |
| AI の回答が浅い、または詳細が抜けている | max_query_budget を増やします(例:48000) |
| LLM の要約が簡素すぎる、または情報が抜けている | input_budget_factor を増やします(例:5) |
| LLM の要約がタイムアウトする、または非常に遅い | input_budget_factor を減らす(例:2)か、results_per_query を減らします |
fetch で長いページの取得内容が少なすぎる | max_query_budget を増やします(例:64000) |
| ページのダウンロードが遅い | max_download_mb を減らします(例:1。デフォルトも 1) |
| サーバーが不要なデータをダウンロードしすぎる | max_download_mb を減らします(例:1) |
🤖 LLM の機能
オプション機能です。有効にする場合は明示的な設定が必要です。llm.enabled = false(デフォルト)の場合、webgate は完全に決定論的に動作します。[llm] ブロックを有効にすると、3 つの機能を追加で利用できます。
🤔 LLM の機能を有効にするタイミング
| 状況 | 推奨設定 | 通常の遅延の増加 |
|---|---|---|
| すばやい回答、一般的な調査 | LLM 無効(デフォルト)— BM25 で順位付けされた、不要な情報のないソースを使用。遅延の増加なし | なし |
| 複雑なトピックの詳細な調査 | 要約を有効化 — 生のページではなく、引用付きの Markdown レポートを取得 | +5~30 秒 |
| 幅広いトピックで、1 つのクエリでは不十分 | クエリ展開+要約 — LLM がクエリのバリエーションを生成し、すべての結果を統合 | +6~35 秒 |
| 速度よりも結果の順序が重要 | LLM による再ランキングを有効化 — クエリごとに LLM 呼び出しが 1 回増える代わりに、意味に基づいて並べ替え | +1~5 秒 |
プライバシー: LLM が無効の場合、Web リクエストを除き、データがマシンの外部に送信されることはありません。LLM が有効の場合、クリーニング済みの検索結果(生の HTML ではありません)が、設定した base_url に送信されます。すべての処理をデバイス上にとどめるには、ローカルの Ollama インスタンスを指定してください。
遅延とのトレードオフ: 有効にした機能ごとに、クエリあたり LLM との往復が 1 回追加されます。クエリ展開では約 1~5 秒、要約ではモデルとコンテンツ量に応じて約 5~30 秒増加します。対話的に使う場合は、Gemma 3 4B などの高速なローカルモデルで要約を行うのがおすすめです。
セットアップ
[llm]
enabled = true
base_url = "http://localhost:11434/v1" # Ollama, OpenAI, LM Studio, vLLM, Groq...
api_key = "" # empty for local models
model = "gemma3:27b"
timeout = 60 # local 27B+ models may need up to 60s
または、環境変数を使います。
"env": {
"WEBGATE_LLM_ENABLED": "true",
"WEBGATE_LLM_BASE_URL": "http://localhost:11434/v1",
"WEBGATE_LLM_MODEL": "gemma3:27b",
"WEBGATE_LLM_TIMEOUT": "60"
}
base_url には、OpenAI、Ollama、LM Studio、vLLM、Together AI、Groq など、OpenAI 互換の任意のエンドポイントを指定できます。
クエリ展開
単一のクエリを送信し、expansion_enabled = true にすると、LLM はバックエンドに問い合わせる前に、補完的な検索クエリのバリエーションを自動生成します。すでに複数のクエリを渡している場合、この処理はスキップされます。
"best laptop for programming"
↓ expansion
["best laptop for programming 2024", "developer laptop recommendations", "laptop specs for coding"]
↓ all search in parallel
LLM が失敗した場合は、元のクエリに通知なくフォールバックします。
要約
summarization_enabled = true の場合、LLM は取得したすべてのページを読み込み、引用をインラインで含む構造化された Markdown レポートを作成します。AI には生のテキストではなく、このレポートが渡されます。
- 成功:
summary+citations(出力を簡潔にし、生のコンテンツを AI に渡しません) - 失敗:理由を含む
llm_summary_errorと、フォールバックとしての完全なsources(AI は引き続きクリーニング済みのコンテンツを利用できます)
レポートの目標文字数は max_summary_words で設定します。0(デフォルト)の場合は、max_query_budget / 5 から算出されます。たとえば、予算が 32k の場合、目標は約 6,400 語です。
再ランキング
結果は返却前に、常に BM25(キーワードの重複度。コストゼロ)で再ランキングされます。必要に応じて、LLM によるセマンティック関連性の判定を第 2 パスとして実行できます。
| Tier | When | Cost |
|---|---|---|
| BM25(決定論的) | 常に | ゼロ — 純粋な計算 |
| LLM 支援 | llm_rerank_enabled = true | クエリごとに LLM 呼び出し 1 回 |
LLM による再ランキングでは、LLM の応答時間に比例して遅延が増加します。結果の順序が速度よりも重要な場合にのみ有効にしてください。
パイプライン:clean → BM25 rerank → (LLM rerank) → (LLM summarize) → output
🔗 連携
mcp-webgate は主要な AI クライアントすべてに対応しています。
| プラットフォーム | 設定ガイド | 備考 |
|---|---|---|
| Claude Desktop | IDE 連携 | デスクトップアプリ |
| Claude Code | IDE 連携 | CLI コーディングエージェント |
| Zed Editor | IDE 連携 | MCP をネイティブサポート |
| Cursor | IDE 連携 | Agent モードが必要です |
| Windsurf | IDE 連携 | グローバル設定のみ |
| VSCode | IDE 連携 | Copilot または MCP 拡張機能経由 |
| Gemini CLI | エージェント連携 | Google の CLI エージェント |
| Claude CLI | エージェント連携 | Anthropic の CLI エージェント |
📦 インストール
uvx 経由(推奨 — インストール不要)
uvx mcp-webgate
pip / uv 経由
pip install mcp-webgate
# or
uv add mcp-webgate
⚙️ 完全な設定
すぐに使える設定ファイルは examples/ にあります。
解決順序
CLI args > env vars > webgate.toml > defaults
設定は起動時に一度だけ読み込まれます。変更を適用するにはサーバーを再起動してください。
必要に応じて組み合わせながら、次の 3 つの方法で webgate を設定できます。
webgate.toml— 起動時に./webgate.toml、次に~/webgate.tomlの順で確認します- 環境変数 —
WEBGATE_*接頭辞を使用します。常に文字列です(MCP の JSON 要件) - CLI 引数 —
--kebab-caseを使用します。整数は整数のままで、複数インスタンス構成に最適です
設定ファイル(webgate.toml)
[server]
max_download_mb = 1 # how many MB to download per page before cutting off
max_result_length = 8000 # max chars per page in multi-source queries (no LLM)
max_query_budget = 32000 # total char budget for a fetch, or input pool for a query
max_search_queries = 5 # max parallel queries per call
results_per_query = 5 # results to fetch per query
search_timeout = 8 # seconds before giving up on a page
oversampling_factor = 2 # fetch 2× more candidates than needed (dedup reserve)
auto_recovery_fetch = false # retry failed fetches from reserve pool
max_total_results = 20 # hard cap: never fetch more than this many pages total
blocked_domains = ["reddit.com", "pinterest.com"]
allowed_domains = [] # if non-empty, only these domains are allowed
adaptive_budget = false # [EXPERIMENTAL] proportional char allocation based on BM25 rank
adaptive_budget_fetch_factor = 3 # generous pre-rank fetch multiplier
[backends]
default = "searxng"
[backends.searxng]
url = "http://localhost:8080"
[backends.brave]
api_key = "BSA..."
[backends.tavily]
api_key = "tvly-..."
search_depth = "basic"
[llm]
enabled = true
base_url = "http://localhost:11434/v1"
api_key = ""
model = "llama3.2"
timeout = 60
expansion_enabled = true
summarization_enabled = true
llm_rerank_enabled = false
max_summary_words = 0 # 0 = max_query_budget / 5 (e.g. 6400 with budget 32000)
input_budget_factor = 3 # LLM input = max_query_budget × factor (default: 96000)
MCP クライアントの設定例
環境変数を使用する場合(すべての値を文字列にする必要があります):
{
"mcpServers": {
"webgate": {
"command": "uvx",
"args": ["mcp-webgate"],
"env": {
"WEBGATE_DEFAULT_BACKEND": "searxng",
"WEBGATE_SEARXNG_URL": "http://localhost:8080",
"WEBGATE_LLM_ENABLED": "true",
"WEBGATE_LLM_TIMEOUT": "60"
}
}
}
}
CLI 引数を使用する場合(整数は整数のままです。Zed、Cursor などで独立したインスタンスを実行する場合に最適です):
{
"mcpServers": {
"webgate": {
"command": "uvx",
"args": [
"mcp-webgate",
"--searxng-url", "http://localhost:8080",
"--llm-enabled",
"--llm-model", "gemma3:27b",
"--llm-timeout", "60"
]
}
}
}
ブール値フラグは --flag / --no-flag 構文に対応しています(例:--llm-enabled、--no-llm-rerank-enabled)。
完全なリファレンス
| CLI 引数 | 環境変数 | デフォルト | 説明 |
|---|---|---|---|
--default-backend | WEBGATE_DEFAULT_BACKEND | searxng | アクティブなバックエンド |
--searxng-url | WEBGATE_SEARXNG_URL | http://localhost:8080 | SearXNG インスタンスの URL |
--brave-api-key | WEBGATE_BRAVE_API_KEY | (empty) | Brave Search API キー |
--tavily-api-key | WEBGATE_TAVILY_API_KEY | (empty) | Tavily API キー |
--exa-api-key | WEBGATE_EXA_API_KEY | (empty) | Exa API キー |
--serpapi-api-key | WEBGATE_SERPAPI_API_KEY | (empty) | SerpAPI キー |
--serpapi-engine | WEBGATE_SERPAPI_ENGINE | google | SerpAPI エンジン(google、bing、...) |
--serpapi-gl | WEBGATE_SERPAPI_GL | us | SerpAPI の国コード |
--serpapi-hl | WEBGATE_SERPAPI_HL | en | SerpAPI の言語 |
--max-download-mb | WEBGATE_MAX_DOWNLOAD_MB | 1 | ページごとのダウンロードサイズ上限(MB) |
--max-result-length | WEBGATE_MAX_RESULT_LENGTH | 8000 | ページごとの文字数上限(LLM を使用しないクエリ) |
--max-query-budget | WEBGATE_MAX_QUERY_BUDGET | 32000 | フェッチとクエリの合計文字数上限 |
--max-search-queries | WEBGATE_MAX_SEARCH_QUERIES | 5 | 1 回の呼び出しあたりのクエリ上限 |
--results-per-query | WEBGATE_RESULTS_PER_QUERY | 5 | クエリあたりに取得するデフォルトの結果数 |
--search-timeout | WEBGATE_SEARCH_TIMEOUT | 8 | HTTP リクエストのタイムアウト(秒) |
--oversampling-factor | WEBGATE_OVERSAMPLING_FACTOR | 2 | 重複除去用の予備を確保する検索結果の倍率 |
--auto-recovery-fetch | WEBGATE_AUTO_RECOVERY_FETCH | false | ギャップを埋めるフェッチ(第 2 ラウンド)を有効化 |
--max-total-results | WEBGATE_MAX_TOTAL_RESULTS | 20 | 1 回の呼び出しあたりの合計結果数の上限 |
--debug | WEBGATE_DEBUG | false | 構造化デバッグログを有効化 |
--log-file | WEBGATE_LOG_FILE | (empty) | ログファイルのパス(空の場合は stderr) |
--trace | WEBGATE_TRACE | false | 要約された引用にコンテンツを含めます。また、デバッグログも有効化します |
--adaptive-budget | WEBGATE_ADAPTIVE_BUDGET | false | [EXPERIMENTAL] BM25 ランクに基づいて文字数を比例配分します |
--adaptive-budget-fetch-factor | WEBGATE_ADAPTIVE_BUDGET_FETCH_FACTOR | 3 | [EXPERIMENTAL] ランク付け前の余裕を持たせたフェッチ倍率 |
--llm-enabled | WEBGATE_LLM_ENABLED | false | LLM 機能を有効化 |
--llm-base-url | WEBGATE_LLM_BASE_URL | http://localhost:11434/v1 | OpenAI 互換エンドポイント |
--llm-api-key | WEBGATE_LLM_API_KEY | (empty) | API キー(ローカルモデルの場合は空) |
--llm-model | WEBGATE_LLM_MODEL | llama3.2 | モデル名 |
--llm-timeout | WEBGATE_LLM_TIMEOUT | 30 | LLM リクエストのタイムアウト(秒) |
--llm-expansion-enabled | WEBGATE_LLM_EXPANSION_ENABLED | true | クエリをバリエーションに自動展開 |
--llm-summarization-enabled | WEBGATE_LLM_SUMMARIZATION_ENABLED | true | 引用付きの LLM 要約 |
--llm-rerank-enabled | WEBGATE_LLM_RERANK_ENABLED | false | LLM による再ランク付け |
--llm-max-summary-words | WEBGATE_LLM_MAX_SUMMARY_WORDS | 0 | 要約の目標語数(0 = 自動) |
--llm-input-budget-factor | WEBGATE_LLM_INPUT_BUDGET_FACTOR | 3 | LLM 入力予算の倍率 |
🔌 バックエンド
| バックエンド | 認証 | 備考 |
|---|---|---|
| SearXNG | なし | セルフホスト可能、おすすめ |
| Brave Search | API キー | 高品質、無料プランあり |
| Tavily | API キー | AI 向けのスニペット、無料プランあり |
| Exa | API キー | ニューラル/セマンティック検索、無料プランあり |
| SerpAPI | API キー | Google、Bing、DuckDuckGo などのプロキシ、無料プランあり |
SearXNG クイックスタート(Docker)
docker run -d -p 8080:8080 --name searxng searxng/searxng
次に、WEBGATE_SEARXNG_URL=http://localhost:8080 を設定します。
Exa の注意事項
Exa はデフォルトでニューラル(セマンティック)検索を使用します。これは、キーワード検索バックエンドより Exa を選ぶ主な理由です。mcp-webgate が独自の LLM エクスパンダーでクエリ拡張を行うため、use_autoprompt は false にハードコードされており、ユーザーは設定できません。
SerpAPI の注意事項
engine は、基盤となる検索エンジン(google、bing、duckduckgo、yandex、yahoo)を選択します。英語以外のクエリでは、gl と hl が検索結果の品質に大きく影響します。
🐛 デバッグモード
有効にすると、すべてのツール呼び出しについて、構造化されたログエントリーが記録されます。
fetch:URL、ダウンロードした未加工の KB、返されたクリーンな KB、経過時間(ミリ秒)query:使用したクエリ、要求/取得/失敗した検索結果数、未加工データの MB 数、クリーンな KB、合計経過時間(ミリ秒)
export WEBGATE_DEBUG=true # log to stderr
export WEBGATE_LOG_FILE=/tmp/wg.log # or log to file
🛡️ 保護機能の概要
これらの保護機能は常に有効です。製品の中核的な価値を担うものであり、無効にはできません。
| 起こりうる問題 | webgate による防止方法 |
|---|---|
| ページが 2 MB の HTML を出力する | max_download_mb のハード上限により、ダウンロードをストリームの途中で停止し、バッファーに格納しません |
| クリーンアップ後のテキストがまだ巨大である | ページごとの max_result_length 文字数上限 |
| 多数の検索結果がコンテキストを圧迫する | max_query_budget により、固定の合計予算をすべての検索結果に配分 |
| 取得するページが多すぎる | max_total_results のハード上限 |
| PDF/ZIP/DOCX が要求される | ネットワークリクエストを行う前にバイナリー拡張子フィルターを実行 |
| 接続が遅い、または応答しなくなる | search_timeout と 5 秒の接続タイムアウト |
| コンテンツ内の不可視 Unicode を使った細工 | 正規表現による完全な無害化パイプライン(ゼロ幅文字、BiDi など) |
| レート制限(429/502/503) | 指数バックオフによる再試行を行い、Retry-After ヘッダーを尊重 |
| 不要なドメイン | blocked_domains/allowed_domains フィルター |
📚 ドキュメントの構成
統合ガイド
- IDE 統合 — Claude Desktop、Claude Code、Zed、Cursor、Windsurf、VSCode
- エージェント統合 — Gemini CLI、Claude CLI、カスタムエージェント
- 高度な機能 — BM25/LLM による再ランキングの内部処理、適応型の予算配分
🧪 ベータ版のステータス
mcp-webgate はベータ版です。コア機能は安定しており、サーバーは本番環境で使用されていますが、1.0 までに設定 API が変更される可能性があります。
フィードバックを歓迎します。 期待どおりに動作しない場合、挙動がおかしい場合、または対応されていないユースケースがある場合は、
バグ報告、設定に関する質問、機能リクエストは、いずれもロードマップの策定に役立ちます。
🤝 貢献
貢献を歓迎します。以下の詳細なガイドラインについては、CONTRIBUTING.md をご覧ください。
- 開発環境のセットアップとワークフロー
- コードスタイルと規約
- テスト要件
- ドキュメントの規約
- プルリクエストの手順
📄 ライセンス
MIT ライセンス — 詳細は LICENSE をご覧ください。
🔗 リンク
- GitHub リポジトリ — ソースコードと Issue
- PyPI パッケージ — Python Package Index
- MCP レジストリ — Model Context Protocol レジストリ
- MCP プロトコル — Model Context Protocol の仕様
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。