Claude.aiのweb_fetchがmixhost
(LiteSpeed)で415を返す

自分のブログを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.comchiilabo.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_fetch415エラー
curl(通常)200 OK
curl(ClaudeBot UA)200 OK
curl(Claude-User UA)200 OK
curl(web_fetchと同じヘッダー)200 OK
ModSecurity OFF後の web_fetch415エラー(変わらず)
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を取得できます。