自分のブログをClaudeに読み込ませようとしたところ、うまくいきませんでした。
ChatGPTは読めているのにClaudeだけ弾かれる。
原因を調査した記録です。
1. 症状
Claude.aiのチャットでブログのURLを渡すと、内部のweb_fetchツールがHTTPステータス415(Unsupported Media Type)を返してページを取得できません。
対象のサイトはmixhostで運用しているWordPressで、WebサーバーはLiteSpeedです。
2. 仮説と検証
2.1. User-Agentによるブロック
ClaudeのクローラーUser-Agentがサーバー側で弾かれているのではないかと考えました。
robots.txtを確認すると、ClaudeBotは/wp-admin/のみDisallowで、サイト全体へのアクセスは許可されていました。
User-AgentをclaudebotおよびClaude-Userに変えたcurlでも200が返ります。
User-Agentは原因ではありませんでした。
curl -sI -A "claudebot" "https://example.com/some-post/"
# → HTTP/2 200
curl -sI -A "Claude-User" "https://example.com/some-post/"
# → HTTP/2 200Code language: Bash (bash)
なお、Anthropicのドキュメントによると、ユーザー指示によるウェブ取得にはClaude-Userが使われ、ClaudeBotは学習用クロールに使われます。
両方を検証しましたが、どちらも問題ありませんでした。
2.2. ModSecurityの検証
cPanelのModSecurityが特定のリクエストをブロックしている可能性を検証しました。note.chiilabo.jpのModSecurityを一時的にOFFにして再試行しましたが、415のまま変わりませんでした。
ModSecurityは原因ではありません。
2.3. curlでは読める
通常のcurlでは問題なくHTMLを取得できます。
curl -s "https://example.com/some-post/" | head -20
# → <!DOCTYPE html> ...Code language: Bash (bash)
サーバーはリクエストを受け付けており、問題はリクエストの内容にあります。
2.4. 同じサーバーの複数ドメインで再現
note.chiilabo.jpだけでなく、同じmixhostサーバー上のchiilabo.comやchiilabo.jpでも同じ415が返りました。
特定のWordPressサイトの設定ではなく、mixhostのLiteSpeed環境全体でweb_fetchが弾かれていると判断できます。
2.5. web_fetchの実際のリクエストヘッダーを取得
「Acceptヘッダーが原因」という仮説を検証するため、webhook.siteを使ってweb_fetchが実際に送るヘッダーを取得しました。
user-agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +Claude-User@anthropic.com)
accept-encoding: gzip, deflate
accept: */*Code language: HTTP (http)
accept: */*は標準的な値で、415の原因にはなりません。
curlで同じヘッダーの組み合わせを送っても200が返り、415を再現できませんでした。
送信元IPもcurlと同じGoogle Cloud(米国)で、IPブロックも否定されました。
3. 結論
| 方法 | 結果 |
|---|---|
Claude web_fetch | 415エラー |
| curl(通常) | 200 OK |
| curl(ClaudeBot UA) | 200 OK |
| curl(Claude-User UA) | 200 OK |
| curl(web_fetchと同じヘッダー) | 200 OK |
ModSecurity OFF後の web_fetch | 415エラー(変わらず) |
| ChatGPT | 読める |
User-Agent・Acceptヘッダー・IPアドレス・ModSecurityのいずれも原因として否定されました。
curlでweb_fetchと同じヘッダーを送っても415を再現できないため、ヘッダーの内容だけでは説明がつきません。
原因はHTTP/2やHTTP/3のプロトコルレベルの違い、あるいはweb_fetch固有の実装にある可能性が残りますが、mixhostのアクセスログを確認しないと特定できません。
現時点での結論は「観測事実は揃ったが、415の直接原因は特定できていない」です。
4. 回避策
Claude.ai上でサイトの内容を参照したい場合、web_fetchの代わりに検索経由でアクセスする方法が使えます。
検索結果にはサイトのスニペットが含まれるため、ページの概要であれば取得できます。
bashツール経由でcurlを実行する方法もあり、こちらでは正常に200が返ってHTMLを取得できます。