Claude CodeにOpenAIのサイトを読んでもらうには?
OpenAIのサイトが読めない問題
Claude Codeで作業をしていると、OpenAIのサイトを参照したい場面があります。最新のニュースを確認したい、ブログ記事を読みたい、そんなときにClaude Codeに「read https://openai.com/ja-JP/news/」と頼むと、こうなります。
❯ read https://openai.com/ja-JP/news/
⏺ Fetch(https://openai.com/ja-JP/news/)
⎿ Error: Request failed with status code 403
⏺ 申し訳ありませんが、https://openai.com/ja-JP/news/ へのアクセスが
403 (Forbidden) で拒否されました。このサイトはボットやスクレイピング
からのアクセスをブロックしているようです。
403で弾かれてしまいます。example.comやwikipedia.orgのような普通のサイトはWebFetchで問題なく読めるのに、OpenAIのサイトだけが通りません。
「OpenAIがAnthropicのエージェントをブロックしている?」「競合排除か?」と思うかもしれません。実際にGitHubのissueでもそういう推測をしている人はいます。実態を調べてみました。
WebFetchが送っているUser-Agent
なぜ弾かれるのか。IPアドレスベースの制限、リファラの有無、User-Agentによるフィルタリングなど、いくつかの可能性が考えられます。まずはWebFetchが実際に何を送っているのかを確認します。ローカルにヘッダーエコーサーバーを立て、ngrokで外部公開してWebFetchからアクセスしてみました。
[2026-03-26T11:28:21.127Z] "GET /" "Claude-User (claude-code/2.1.84; +https://support.anthropic.com/)"
User-AgentはClaude-User (claude-code/2.1.84; +https://support.anthropic.com/)でした。バージョン番号入りで、Anthropicのサポートページへのリンクまで添えた行儀の良いUA文字列です。
このUAはv2.1.83のリリースノートで追加されたものです。
Improved WebFetch to identify as Claude-User so site operators can recognize and allowlist Claude Code traffic via robots.txt
サイト運営者がClaude Codeのトラフィックを識別し、robots.txtで許可・拒否を制御できるようにするという変更です。Webクローラーが自分の名前を名乗るのは行儀の良い作法であり、設計意図として正しいものです。
ただし、v2.1.83以前はUAが空でした。空UAはCloudflareの基本ルールでブロックされるので、以前から同じ問題は発生していました。v2.1.83でClaude-Userを名乗るようになった結果、今度はCloudflareのAIボットブラックリストに引っかかるようになりました。どちらにしても弾かれる状況です。
何がブロックされ、何が通るのか
さまざまなUA文字列でopenai.comとclaude.aiの両方にリクエストを送って検証しました。「OpenAIがAnthropicを狙い撃ちしているのでは」という疑念を検証するため、Anthropic自身のサイトも対象に含めています。
| User-Agent | openai.com | claude.ai |
|---|---|---|
Claude-User (claude-code/2.1.84; ...) |
403 | 403 |
ClaudeBot |
403 | 403 |
CCBot/2.0 |
403 | 403 |
curl/8.0 |
403 | 403 |
python-requests/2.31 |
403 | 403 |
Mozilla/5.0(素の短い形) |
403 | 403 |
""(空) |
403 | 403 |
claude-code/1.0 |
200 | 200 |
Claude / claude / CLAUDE |
200 | 200 |
GPTBot |
200 | 200 |
Googlebot |
200 | 200 |
wget/1.21 |
200 | 200 |
両サイトのブロックパターンはほぼ同一です。Claude-Userはopenai.comだけでなくclaude.ai自身でもブロックされています。これはOpenAIが独自に設定したルールではなく、Cloudflareの同じボット管理ルールセットによるものと考えられます。
ブロックのルールは大きく2層に分かれているようです。第1層はAIクローラーの名前ブラックリストで、ClaudeBot、Claude-User、CCBot、Bytespider、PetalBot、Amazonbotなど既知のAIクローラー名がブロックされています。Claude単体やCLAUDEは通るのにClaude-UserやClaudeBotは弾かれることから、ワード単位に近いマッチングです。第2層はプログラマティックアクセスのブラックリストで、curl/*、python-requests/*、Go-http-client/*、空UA等がブロック対象です。ただしwgetは通るので網羅的ではありません。
GPTBotとGooglebotが両方のサイトで通過する点も注目に値します。これはOpenAIが自社クローラーを優遇しているわけではなく、Cloudflareのルールセットでこれらがホワイトリスト扱いになっているのかもしれません。
GitHub上でもnpmjs.comやclaude.ai/shareなど複数のサイトで同様の報告があります。Wikipediaでも報告がありましたが、こちらは現在WebFetchでアクセスできるため、Cloudflareのルールセットがサイトごとに異なることがわかります。
なお、OpenAIの開発者ドキュメント(developers.openai.com)は現在WebFetchでアクセス可能です。同じOpenAIでもサブドメインごとにCloudflareのポリシーが異なります。ただし、v2.1.83以前のUA空時代はこちらも403でした。
WebFetchではUser-Agentを変えられない
WebFetchのインターフェースにはURLとプロンプトしかなく、カスタムHTTPヘッダーを指定する手段がありません。GitHub上でもこの問題は報告されています。
- Issue #7696: Changing the user agent on the Fetch() tool
- Issue #29758: Fetch tool gives 403 error; curl does not
後者のタイトルが状況を端的に表しています。
対処法:CLAUDE.mdでcurlフォールバックを指示する
WebFetchが使えないなら、よりプリミティブなBashツールでのcurlコマンドに頼る方法があります。
~/.claude/CLAUDE.md(グローバル設定)に一行書くだけです。
- When fetching URLs, use `claude-code/1.0` as User-Agent. If WebFetch returns 403, fall back to curl.
これだけで、Claude CodeはWebFetchで403が返ったときに自律的にcurl -A "claude-code/1.0"にフォールバックしてくれます。実際に試してみます。まずはOpenAIのサイトです。
❯ - When fetching URLs, use `claude-code/1.0` as User-Agent.
⏺ 了解しました。今後 URL を取得する際は claude-code/1.0 を
User-Agent として使用します。
ただし、WebFetch ツールには User-Agent を指定するオプションが
ないため、代わりに curl コマンドを使って取得します。
⏺ Bash(curl -s -A "claude-code/1.0" "https://openai.com/ja-JP/news/" | head -500)
WebFetchで弾かれていたOpenAIのサイトから、HTMLが取得できました。
次にclaude.aiの共有リンクも試します。
❯ read https://claude.ai/share/4b3a1a9d-...
⏺ Fetch(https://claude.ai/share/4b3a1a9d-...)
⎿ Error: Request failed with status code 403
⏺ CLAUDE.md の指示に従い、curl にフォールバックします。
⏺ Bash(curl -s -L -A 'claude-code/1.0'
'https://claude.ai/share/4b3a1a9d-...' | head -500)
「CLAUDE.md の指示に従い」というClaude Codeの発言に注目してください。一行の指示を読み取って、WebFetch失敗→curlフォールバックという判断を自律的に行っています。ユーザーが毎回「curlで試して」と言う必要はありません。
補足すると、claude-code/1.0は筆者が考えた架空のUA文字列です。検証の結果、Cloudflareのブラックリストに入っていないので通ります。
とはいえUA偽装の是非
ここまで「CLAUDE.mdでcurlフォールバックすれば回避できる」と書きましたが、これは技術的にはサイト側のアクセス制御を迂回していることになります。
Claude-User UAをrobots.txtやWAFで拒否しているサイトに対して、別のUA文字列でアクセスする行為は、サイト運営者の意図を無視しています。robots.txtに法的拘束力はありませんが、Webの慣習として尊重されるべきものです。
一方で、今回のケースにはいくつかの事情があります。WebFetchのUser-Agentはサイト運営者が個人のCLIツール利用と大規模クローリングを区別できるように設計されたものですが、実際にはWAFが一律にブロックしてしまっています。個人がWebページを1つ読みたいだけという用途と、AIクローラーが大量にページを巡回する用途は性質が異なります。また、筆者自身はこれまでブラウザでドキュメントを開いてからClaude Codeのチャットにコピペで運搬していたので、それが自動化されたに過ぎないという見方もできます。
また、MCPでWebFetchと同名のツールを定義して上書きする方法もありますが、今の段階では過剰な対処です。
まとめ
Claude CodeのWebFetchが403で弾かれる原因は、WebFetchのUser-AgentがCloudflareのボット管理ルールセットに引っかかることでした。v2.1.83以前はUAが空で弾かれ、v2.1.83でClaude-Userを名乗るようになった後はボットリストに引っかかって弾かれています。openai.comとclaude.aiでブロックパターンが一致していることから、特定サイトの独自設定ではなくCloudflareの共通ルールによるものと考えられます。競合排除ではありません。
CLAUDE.mdの一行指示でcurlフォールバックを設定すれば回避は可能ですが、サイト側のアクセスポリシーを尊重した上で利用してください。この問題をWebFetch側でどう解決するかは現時点では未定です(Issue #7696等で報告あり)。