local-web-mcp
local-web-mcp
Version 0.3.0 · AGPL-3.0
このツールは AI の支援を受けて開発されていますが、アップロード前に人間による評価を受けています。
自分のマシン上で動作するフォールバック Web フェッチャーを Claude に提供する MCP サーバーです。組み込みのフェッチャーがブロックされた場合、こちらはあなたの IP、あなたの接続、そしてオプションでログイン済みセッションを使って試行します。
ツールは 1 つだけです: fetch_url_locally。
解決する問題
ホステッドフェッチャーはデータセンターの IP レンジから実行されるため、多くのサイトが真っ向から拒否します。ローカルの stdio MCP サーバーはそうではありません。クライアントがあなたのマシン上でプロセスを起動するため、リクエストはあなたの通常の接続から発信されます。
ホステッドフェッチャーが読めなかったサイト(CNBC、Politiken、Bloomberg を含む)で動作確認済みです。
Related MCP server: auth-fetch-mcp
変わらないもの
枠組みが過大評価を招きがちなので、はっきり述べておく価値があります。
モデルの推論は依然として Anthropic のサーバー上で実行されます。
取得したページのテキストは、依然としてツール出力としてモデルに送信されます。認証済みセッションを通じて読み取られたものはすべてそれに含まれます。
変更されるのは Web サイトと通信するのは誰か であり、モデルがどこで実行されるか ではありません。
厳格な境界
そのページは JavaScript を実行せずに読めますか?
読めるなら、このツールで対応できます。読めないなら、ヘッダー、TLS、Cookie のどの層でもそこに到達できず、User-Agent をどんなに調整しても役に立ちません。DataDome、Cloudflare Turnstile、PerimeterX などを使用しているサイトは、通過するために実行しなければならないチャレンジを配信します。そのような場合は、ブラウザベースのツールを使うか、自分でページを開いてください。
これは修正すべきバグではなく、認識すべき境界です。
判定
すべてのレスポンスにはラベルが付きます。危険なケースは明らかな 403 ではなく、ページではない 200 です。ボットの中間ページ、同意ウォール、空のクライアントレンダリングシェルなどです。これらはあたかも記事であるかのように要約されます。
判定 | 意味 | 対処 |
| 実際のコンテンツ | 使用する |
| ボット対策を検出 | ブラウザが必要、停止する |
| 全面的に拒否 (403)、通常はボット検出 | ブラウザが必要、停止する |
| クライアントレンダリングされたシェル、JS なしではコンテンツなし | ブラウザが必要、停止する |
| 401、ログインウォール、または購読ウォール | Cookie が役立つ場合がある |
| その他の非 2xx ステータス (404, 429, 5xx) | 429/5xx の場合のみ後で再試行 |
| 抽出された文字数が 200 未満 | 読み取り失敗、空のページではない |
ok 以外の判定はすべて、モデルに対して本文をコンテンツとして扱わないよう明示的な警告を付加します。
本文の証拠はステータスコードよりも優先されます。ペイウォール付き記事を HTTP 403 として配信する出版社は、blocked ではなく login_required として報告されます。そこでの有益なアドバイスはブラウザに頼ることではなく、Cookie をエクスポートすることだからです。
検出は文言ではなくベンダーインフラに基づいて一致します。チャレンジページはローカライズされているため、captcha-delivery.com は「デバイスを確認しています」のような文言が信頼できない場合でも、信頼できるシグナルです。レスポンスヘッダー内のベンダー Cookie は、拒否ステータスと対になっている場合に証拠として扱われます。
ツール
fetch_url_locally(url, max_chars=20000, use_session=true)
パラメータ | 型 | デフォルト | 目的 |
| string | 必須 | 取得するページ。 |
| integer |
| 返されるテキストの上限。200000 にクランプされる。切り捨てはヘッダーで報告される |
| boolean |
| Cookie を送信する。ページが本当に公開されているかテストするには |
応答は、短いヘッダーとそれに続く抽出テキストで構成されます:
URL: https://example.com/article
Status: 200
Verdict: ok
Title: The headline
Session: authenticated (the user's cookies were sent)
The article text...Session: は、Cookie が実際に読み込まれ、そのホストにスコープされている場合にのみ表示されます。ok 以外の判定は、本文をコンテンツとして扱わないようモデルに指示する WARNING: 行を追加します。
失敗は原因を明示するエラーとして返されます。例: [blocked_host] Host '192.168.1.5' resolves to a private or internal address。コード: invalid_url, blocked_scheme, blocked_host, dns_failure, timeout, too_many_redirects, upstream_error, invalid_argument。
必要条件
Python 3.11+ (
asyncio.timeoutを使用)。uv を使えば自分でインストールする必要はありません。uv が適切なインタープリターを取得しますClaude Desktop または Claude Code。stdio サーバーはブラウザやモバイルアプリでは動作しません。これらは公開リーチ可能な HTTPS エンドポイントを必要とします。
インストール
uv を使うと、適切な Python と依存関係を uv 自身が取得します:
uv --directory /absolute/path/to/local-web-mcp run local-web-mcpサーバーを登録する前に、ターミナルで一度実行してください。 初回実行は環境の解決と構築を行うため時間がかかり、クライアントがコールド起動すると、設定が正しくても諦めてサーバーが失敗したと報告する可能性があります。
Starting local-web と表示され、その後 stdin でクライアントを待ちます。これが正常に動作するサーバーの姿です。その行が表示されたら環境は構築されています。Ctrl+C を押して先に進んでください。
または、通常の仮想環境を使う場合:
python3 -m venv .venv
.venv/bin/pip install -r requirements.txtClaude Desktop への登録
claude_desktop_config.json に追加します (macOS: ~/Library/Application Support/Claude/、Linux: ~/.config/Claude/):
{
"mcpServers": {
"local-web": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/local-web-mcp",
"run",
"local-web-mcp"
]
}
}
}uv がクライアントから見える PATH にない場合は、その絶対パスを command として使用します。仮想環境の場合の相当する設定は次のとおりです:
{
"mcpServers": {
"local-web": {
"command": "/absolute/path/to/.venv/bin/python",
"args": ["/absolute/path/to/local_web_mcp.py"]
}
}
}Claude Code の場合:
claude mcp add local-web -- uv --directory /absolute/path/to/local-web-mcp run local-web-mcp設定
すべてオプションです。すべての設定には動作するデフォルトがあります。
変数 | デフォルト | 目的 |
| 未設定 | Cookie jar へのパス |
| 未設定 | jar を使用できるドメイン。Cookie ファイルを設定するときは必ず設定すること |
|
| プライベート、ループバック、リンクローカルターゲットを許可 |
| 空 | IP チェックから除外されるホスト名 |
| Chrome UA | すべてのリクエストで送信される |
|
| 言語の嗜好。サイトはこれを使って言語を選び、場合によっては地域版を選ぶ |
|
| 秒 |
|
| 秒 |
|
| 呼び出しごとのハード上限 |
|
| レスポンス本文の上限 |
|
| リダイレクトのホップ数。meta リフレッシュと共用 |
デフォルトの Accept-Language は最初にデンマーク語を要求します。これは中立的なデフォルトではなく意図的なものです。英語や他の言語が必要な場合は LOCALWEB_ACCEPT_LANGUAGE を設定してください:
"env": { "LOCALWEB_ACCEPT_LANGUAGE": "en-GB,en;q=0.9" }セッション Cookie
LOCALWEB_COOKIE_FILE にブラウザ拡張機能からエクスポートしたファイルを指定します。ローダーは、ヘッダー行があってもなくても Netscape cookies.txt を受け付け、一般的な拡張機能からの JSON エクスポートも受け付けます。cookies.txt.example を参照してください。
必ず LOCALWEB_COOKIE_DOMAINS を設定してください。 これがないと jar 全体が有効になり、どのフェッチも無関係なセッションを運ぶ可能性があります。設定すると、jar がクライアントに届く前に、ロード時にそれらのドメイン外のすべての Cookie が破棄されます。マッチングはサブドメインをカバーします (example.com は www.example.com をカバー) が、類似ドメイン (evil-example.com) はカバーしません。
留意すべき点が 3 つあります:
セッションを通じて読み取られたコンテンツは、ツール出力としてモデルに送信されます。
Cookie ファイルは資格情報ファイルです。
chmod 600にしてください。また、このリポジトリでは gitignore されています。Cookie は期限切れになります。以前は動作していたソースが
login_requiredを返す場合、それはアクセス権の喪失ではなく、通常は古いエクスポートが原因です。
ページが本当に公開されているかどうかを確認するには、use_session=false を渡してください。
ローカルネットワークへのアクセス
プライベートアドレスはデフォルトでブロックされており、これは意図的です。モデルは直前に読んだテキストから URL を選ぶことがあるため、取得したページが 192.168.1.1 へ誘導しようとする可能性があります。ブロックリストにより、ページコンテンツへのプロンプトインジェクションでこれをネットワークスキャナーに変えることはできません。
全面許可スイッチよりも、狭い許可リストを優先してください:
"env": { "LOCALWEB_ALLOWLIST": "nas.local,nas" }セキュリティ
スキームは http と https のみに制限。資格情報を含む URL は拒否
ホスト名を解決し、リクエスト前にすべての返されたアドレスを検証
チェック前に IPv6 マップされた IPv4 (
::ffff:10.0.0.1) をアンラップクラウドメタデータエンドポイントは無条件にブロック。ホスト名は許可リストと
ALLOW_PRIVATEの両方より前に解決されるため、どちらもそれらを開くことはできないリダイレクトと meta リフレッシュは手動で追跡し、各ホップで再検証
記録されるのは Cookie の数のみ。名前、値、ドメインは決して記録されない
既知の制限
JavaScript なし。 上記の厳格な境界。
DNS リバインディング。 ホスト名は検証のために解決され、接続時に再度解決されます。このギャップを埋めるには、接続を検証済み IP に固定する必要があります。信頼できないネットワークで
ALLOW_PRIVATEを有効にする前に実施する価値があります。チャレンジ検出はシグネチャベースであり、ベンダーがマークアップを変更するにつれてずれていきます。判定がおかしいと思ったら
inspect_response.pyを実行してください。HTML からテキストへの抽出は依存関係なしの簡易的なものです。 本格的な記事抽出には
trafilaturaの方がはるかに優れているでしょう。
ファイル
ファイル | 目的 |
| サーバー |
| 寛容な Cookie ローダー。必須、サーバーがインポートする |
| 診断: フェッチャーが実際に受け取ったものをダンプする |
| 判定、ターゲット検証、Cookie の読み込みとスコープ |
| ブロック対象と 1 回のライブフェッチを stdio 経由でテスト |
| Cookie jar の注釈付きテンプレート |
| パッケージメタデータと |
| 再現可能なインストールのための依存関係バージョン固定 |
| 通常の venv ルート用のランタイム依存関係 |
| venv、キャッシュ、およびすべての Cookie ファイルを除外 |
| AGPL-3.0 の完全なテキスト |
誤った判定の診断
uv run python inspect_response.py https://example.com/articleステータス、注目すべきヘッダー、本文の先頭を表示し、その内容に対してサーバー自身の検出を実行します。検出ロジックを変更する前には必ずこれを確認してください。 ブラウザとこのフェッチャーには、しばしばまったく異なるレスポンスが返されます。したがって、画面に表示される内容はフェッチャーが受け取ったものの証拠にはなりません。
テスト
uv run python unit_test.py
uv run python smoke_test.pyunit_test.py はオフラインで動作し、失敗時には非ゼロの終了コードを返すため、pre-commit ゲートとして機能します。smoke_test.py は stdio を介してサーバーを駆動し、ライブリクエストを1回行うため、ネットワーク接続が必要です。両方ともリポジトリのルートから実行してください。
プレーンな venv を使用する場合は、uv run python の代わりに .venv/bin/python を使用してください。
ライセンス
Copyright (C) 2026 David Lindholm.
GNU Affero General Public License v3.0 またはそれ以降。LICENSE を参照してください。
このプログラムは、有用であることを願って配布されていますが、いかなる保証もありません。商品性または特定の目的への適合性についての暗黙の保証も一切ありません。
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceFetches content from authenticated web pages by driving your signed-in Chrome/Edge browser via DevTools Protocol, automatically handling login redirects and reusing sessions across domains.8MIT
- AlicenseAqualityAmaintenanceEnables AI assistants to access content from authenticated web pages by opening a real browser for manual login and session capture. It saves browser profiles locally so users only need to log in once per service for future automated access.46935MIT
- AlicenseAqualityDmaintenanceEnables AI agents to control the user's Chrome or Firefox browser, leveraging existing sessions for tasks requiring authentication and user handoff.181715MIT
- FlicenseNot gradedqualityCmaintenanceUnlimited, session-authenticated web search and fetch for AI tools using your own browser. Supports authenticated/paywalled pages without API keys.
Related MCP Connectors
Reliable web access for AI agents: smart HTTP, rotating proxies, and full-browser rendering.
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Provides cloud browser automation capabilities using Stagehand and Browserbase, enabling LLMs to i…
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/davidwlindholm/local-web-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server