CLAUDE_CODE_DISABLE_WEB_FETCHでWebFetchツールを無効にする
CLAUDE_CODE_DISABLE_WEB_FETCH=1でWebFetchを止める方法。WebSearchやBashのcurlが残る点と、denyルール・--restrictedとの使い分けを解説します。
CLAUDE_CODE_DISABLE_WEB_FETCHは、Claude CodeのWebFetchツールを丸ごと止める環境変数です。値を1にして起動すれば、Claudeは任意のURLを取得できなくなります。v2.1.285(2026年9月29日)で追加されたもので、使うには同バージョン以上が必要です。
止まるのはWebFetchだけです。WebSearchは残り、Bashが許可されていればcurlも使えます。「ネットワークを完全に切る」設定ではない点が、この変数を選ぶときの最大の注意です。
設定方法は環境変数1つ
シェルから渡す場合は、起動前にexportするか、コマンドの前に付けます。
# そのセッションだけ無効にする
CLAUDE_CODE_DISABLE_WEB_FETCH=1 claude
# シェルの設定ファイルに書いて常時無効にする
export CLAUDE_CODE_DISABLE_WEB_FETCH=1プロジェクトやユーザーのsettings.jsonにはenvキーがあり、起動時の環境変数をここに書けます。公式の例はDISABLE_AUTO_COMPACTやANTHROPIC_BASE_URLです。同じ形で書くなら、例えば次のようになります。
{
"env": {
"CLAUDE_CODE_DISABLE_WEB_FETCH": "1"
}
}envの値は、フォルダを信頼するまで適用されない場合があります。チームで配る設定として使うなら、この点は先に押さえておく必要があります。
止まるもの・残るもの
変数が止めるのはWebFetchだけで、WebSearchは残ります。経路ごとの影響は次のとおりです。
DISABLE_WEB_FETCH=1 のあとに残る経路
止まる
任意URLの取得と、取得結果へのプロンプト実行ができなくなります。
残る
WebSearch、Bash経由のcurl、MCPサーバーのツールはそのまま動きます。
WebSearchとの違い
WebSearchは検索クエリを実行し、結果のタイトルとURLを返します。結果ページの本文は取りに行きません。ページを読みたいとき、Claudeは通常WebFetchで続きを取得します。
つまりWebFetchだけを止めると、Claudeは検索して候補のURLまでは得られても、本文は読めなくなります。「検索はさせたいが、任意のページ取得は避けたい」という分離を作る用途に合います。WebSearchも止めたいときは、権限ルールのdenyにWebSearchを足します。WebSearchの権限ルールに指定子はなく、ツール全体を許可か拒否するだけです。
{
"permissions": {
"deny": ["WebSearch"]
}
}環境変数とこのルールを併用すれば、WebFetchとWebSearchの両方が使えなくなります。
Bashのcurlは別経路
Bashツールが使える状態なら、ClaudeはcurlやwgetでURLを取得できます。公式の権限ドキュメントも、WebFetchだけではネットワークアクセスを防げないと明記しています。取得を本当に絞りたいなら、Bashのdenyルールとサンドボックスのネットワーク許可リストを組み合わせます。
{
"permissions": {
"deny": ["Bash(curl *)", "Bash(wget *)"]
},
"sandbox": {
"enabled": true,
"network": {
"allowedDomains": ["github.com", "*.npmjs.org"]
}
}
}Bash(curl *)のdenyルールは、/usr/bin/curlのようにパスで呼ぶ場合やsh -cの中のcurlには当たりません。そこで、サンドボックスが許可ドメイン以外への接続を止める構成と組み合わせます。サンドボックスは既定で無効なので、sandbox.enabledをtrueにするのを忘れないでください。なおallowedDomainsが制限するのはBashから起動したコマンドの通信で、WebFetchは制限しません。
許可リスト外のホストに当たったとき、既定ではClaude Codeが確認プロンプトを出します。プロンプトなしで拒否したいなら、sandbox.network.strictAllowlistをtrueにします(v2.1.219以上)。このキーはユーザー設定・管理設定・--settingsで有効で、リポジトリの.claude/settings.jsonに書いても効きません。管理設定でallowManagedDomainsOnlyを立てると、許可リストに入るのは管理設定側のエントリだけになり、利用者が手元の設定でドメインを足すことはできません。
また、WebFetchはlocalhostのようなドット無しのホスト名を拒否し、ローカルサーバーにはcurlを使うよう促します。WebFetchを止めた環境では、ローカル確認もBash側の権限設計に寄ります。
denyルール・--restrictedとの使い分け
WebFetchを止める手段は環境変数のほかにもあります。違いは「どこで・誰が設定するか」と、副作用の範囲です。
| 手段 | 効果 | 向く場面 |
|---|---|---|
CLAUDE_CODE_DISABLE_WEB_FETCH=1 | 効果WebFetchのみ停止(WebSearchは残る) | 向く場面起動環境やコンテナ単位で止めたい |
permissions.denyにWebFetch | 効果ツールが取り除かれ、取得不可 | 向く場面設定ファイルで管理・配布したい |
permissions.denyにWebFetch(domain:*) | 効果ツールは残り、取得のたびに拒否 | 向く場面サンドボックスの到達先も絞りたい |
--restricted / CLAUDE_CODE_RESTRICTED=1 | 効果コマンド実行系とWebFetchをまとめて除去 | 向く場面読み取り中心の隔離セッション |
権限ルール側には裸のWebFetchとWebFetch(domain:*)という2つの書き方があり、挙動が違います。denyに裸のWebFetchを書くとツール自体が取り除かれ、domain:*を書くとツールは残って取得ごとに拒否され、サンドボックス化コマンドもどのホストにも届かなくなります。逆向きの関係にも注意が要ります。WebFetch(domain:...)のallowルールに書いたドメインは、サンドボックスの許可リストにも自動で加わります。WebFetchを止める目的で環境変数を使っても、設定ファイルに残ったallowルールがBash側の到達先を広げたままになることがあるので、止めたあとはallowルールの棚卸しもあわせて行います。詳細はWebFetch権限ルールの設計にまとめています。
環境変数が向くのは、設定ファイルを触らずに止めたい場合です。CIのジョブ定義やコンテナのイメージ、ラッパースクリプトに1行足すだけで済み、リポジトリの.claude/settings.jsonは変わりません。逆に「誰が起動しても止まっていてほしい」なら、管理設定のdenyルールが候補になります。管理設定は、ユーザー・プロジェクトの設定ファイルや--settingsでは上書きできません。ファイルで配る場合の置き場所はOSごとに決まっています。
| OS | managed-settings.jsonの場所 |
|---|---|
| macOS | managed-settings.jsonの場所/Library/Application Support/ClaudeCode/ |
| Linux・WSL | managed-settings.jsonの場所/etc/claude-code/ |
| Windows | managed-settings.jsonの場所C:\Program Files\ClaudeCode\ |
中身は通常のsettings.jsonと同じ形です。WebFetchを組織全体で外すなら、次のように書きます。
{
"permissions": {
"deny": ["WebFetch"]
}
}MDMやclaude.aiの管理コンソール(サーバー管理設定)からも同じキーを配れます。複数チームで分担するときは、同じディレクトリのmanaged-settings.d/に分割して置けます。
環境変数をコンテナやCIに渡す場合は、そのイメージや実行環境の定義に書きます。DockerfileならENV CLAUDE_CODE_DISABLE_WEB_FETCH=1の1行、docker runなら-e CLAUDE_CODE_DISABLE_WEB_FETCH=1で足ります。CIサービスのジョブ定義にも、各サービスの環境変数の書式でそのまま書けます。
--restrictedは範囲が広く、Bashなど実行系のツールもまとめて外し、ユーザー・プロジェクト・ローカルの設定ファイルも無視します。WebFetchだけを外したいときの手段ではありません。
止める前に確認したい副作用
取得失敗ではなく「ツールがない」状態になる
WebFetchが有効な環境で失敗すると、キャッシュや待機時間が原因のエラーになります。そうした場合の切り分けはWebFetchのキャッシュとタイムアウトとWebFetchのダウンロード待機時間が扱っています。環境変数で止めた場合はこれらと違い、そもそもツールが利用可能な一覧に載りません。Claudeが「URLを読めない」と答えたとき、原因がエラーなのか無効化なのかは、envと設定ファイルを見て確認します。
組織ポリシーによる停止との見分け方
TeamやEnterpriseのclaude.aiアカウントで、LLMゲートウェイを通さずに使っている場合、WebFetchは組織ポリシーにも依存します。ポリシーを起動時に取得できないと、読み込めるまでWebFetchが保留されます。
WebFetchが消えているとき、環境変数による無効化か、ポリシー未取得による保留かは/statusで切り分けられます。Organization policyの行にポリシーが読めなかった旨とWebFetchが出ていれば、後者です。セッション外ではclaude doctorが同じ行を出します。環境変数を設定していなければ、ポリシーが読み込まれた時点でツールは再起動なしに戻ります。
ドメイン安全確認の通信も止まる
WebFetchは取得の前に、ホスト名だけをapi.anthropic.comへ送って安全性を確認します。WebFetch自体を止めれば、この確認も走りません。一方、WebFetchを残したまま確認だけ省く場合はskipWebFetchPreflightという別の設定を使います。この確認はCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFICの対象外なので、通信を絞る目的ではWebFetchの停止とあわせて検討する対象になります。
Bedrockでは検索側がもともと使えない
WebSearchはClaude API、Claude Platform on AWS、Microsoft Foundryで使えます。Google CloudのAgent PlatformではClaude 4以降のモデルで動き、Amazon Bedrockはサーバー側のWeb検索ツールを公開していません。
Bedrockを使う環境では、WebFetchを止めると組み込みのWeb参照が実質なくなります。検索を別プロバイダーで補いたい場合は、検索ツールを公開するMCPサーバーを追加する方法が案内されています。検索バックエンド自体は設定で変えられません。
Coworkではツール名が別になる
Claude DesktopのCoworkセッションでは、Webの取得にmcp__workspace__web_fetchが使われます。WebFetchというツール名全体に掛けたdenyルールは、このCowork側のツールにも適用されます。環境変数がCoworkのツールにも効くかは、公式の変数説明に記載がありません。Coworkで止めたいなら、denyルールを使うほうが確実です。
どの止め方を選ぶか
数行にまとめると、判断の軸は3つです。
- WebSearchは使わせたい → 環境変数か
denyのWebFetch - 設定の配布・強制が目的 → 管理設定の
denyルール - 実行系も含めて隔離したい →
--restricted
環境変数は手軽な反面、設定する側が起動方法を握っているときにしか効きません。利用者が自由にclaudeを起動できる環境では、環境変数は利用者が外せます。強制したいなら管理設定のdenyルールに置く必要があります。