Claude Media
「Invalid request header value」エラーの原因と対処 — Claude Code

「Invalid request header value」エラーの原因と対処 — Claude Code

Claude Codeの「Invalid request header value」は、HTTPヘッダーに使えない文字が認証値に混ざったサインです。原因の特定方法と直し方をまとめます。

「Invalid request header value」は、認証情報として送ろうとした値にHTTPヘッダーが運べない文字が含まれているときに出ます。改行・NULバイト・U+00FFより上のコードポイントの文字(カーリークォートやゼロ幅スペースなど)が対象です。典型的な原因は、文書やチャットから貼り付けた認証情報に不可視文字や余計な改行が付いていたことです。Claude Codeはリクエストを送る前に止め、原因の変数か設定名をメッセージに含めて表示します。

画面に出た文言から、直す場所を決める

直す場所は、メッセージの先頭を見れば決まります。メッセージは·(中黒)で区切られ、最初の部分が原因の変数を示します。

メッセージの先頭原因の変数・設定
Invalid auth token原因の変数・設定ANTHROPIC_AUTH_TOKENまたはCLAUDE_CODE_OAUTH_TOKENのベアラートークン
Invalid ANTHROPIC_CUSTOM_HEADERS原因の変数・設定ANTHROPIC_CUSTOM_HEADERSに設定したヘッダー名または値
Invalid request header from the environment原因の変数・設定CLAUDE_AGENT_SDK_CLIENT_APPなど、他の環境変数からヘッダーへコピーされる値

ANTHROPIC_CUSTOM_HEADERSが原因のときは、Name: Valueのペアのうち何番目が問題かも示されます。「distinct header 2 of 3 parsed from ANTHROPIC_CUSTOM_HEADERS」のように示されます。名前も値も自分で決めたものなので、繰り返さずペアの位置だけを数える形式です。ANTHROPIC_CUSTOM_HEADERSのこの挙動はv2.1.227以降が対象です。

説明部分の文字位置を読む

2つ目の·より後ろが、問題の説明です。固定のフレーズと文字数だけで組み立てられ、値そのものは含まれません。位置は1文字目から数えます。

Invalid auth token · Fix external auth token · Invalid Authorization header value from ANTHROPIC_AUTH_TOKEN: it contains a line break at character 41 (120 characters on 2 lines).

この例なら、41文字目に改行があり、全体は2行にわたる120文字です。BOM・ゼロ幅スペース・カーリークォートのようなよく知られた不可視文字か記号は名指しされ、それ以外はa non-ASCII characterとだけ表示されます。先頭がInvalid request header from the environmentのときは、説明部分に直すべき変数名が入ります。

なお、AuthorizationやHostのように認証・ルーティングに関わるヘッダーをANTHROPIC_CUSTOM_HEADERSに入れる場合があります。組織のサーバー管理設定で配布すると、承認ダイアログが出ます。プロジェクトやローカルの設定から入れた場合は、envの値が適用される条件のルールに従います。

値を表示せずに問題の文字を探す

メッセージの位置が読めても、画面上の見た目では区別がつかないことがあります。値を画面に出さずに同じ基準(改行・NUL・U+00FF超)で位置だけ調べるには、次のワンライナーが使えます。変数名は引数で渡します。変数が未設定のときもOKと出るので、設定されているかはenv | grep ANTHROPICで先に見ておきます。

python3 -c 'import os,sys; v=os.environ.get(sys.argv[1],""); print([(i,f"U+{ord(c):04X}") for i,c in enumerate(v,1) if ord(c)>0xFF or c in "\r\n\0"] or "OK")' ANTHROPIC_AUTH_TOKEN

手元(Python 3、macOS)で、カーリークォートU+201Cを含む疑似トークンsk-test“abcと、通常のsk-test-abcを設定して実行した出力は次のとおりです。

[(8, 'U+201C')]
OK

1行目は、先頭から8文字目が問題だという意味です。値そのものは出力に含まれません。なお、この簡易チェックはClaude Codeの検査を再現するものではなく、同じ文字の種類を探すだけです。

直し方の手順

手順

エラーが出たときの直し方

  1. 1

    メッセージの先頭で変数を特定する

    上の表の先頭文言と照らして、直す変数を1つに絞ります。

  2. 2

    報告された位置の周辺を手で打ち直す

    同じ貼り付け元から再度コピーすると、同じ不可視文字をまた持ち込みます。ANTHROPIC_CUSTOM_HEADERSは、メッセージが数えたName: Valueのペアだけを書き直します。

  3. 3

    ソースが意図どおりか確認する

    /statusで、想定した認証情報のソースが有効になっているか確かめます。環境変数は/loginより優先されるので、.envなどから読み込まれた値が先に使われている場合があります。

手順2のあとに値が古いままなら、シェル側の環境変数が残っている可能性があります。env | grep ANTHROPIC(PowerShellならGet-ChildItem Env:ANTHROPIC*)で現在の値を洗い出します。direnvやdotenvのシェルプラグイン、IDE内蔵ターミナルが、プロジェクトの.envから意図しない値を読み込んでいる場合の発見にも使えます。

ここでANTHROPIC_AUTH_TOKENが原因なら、ベアラートークンとして送る値そのものを疑います。ゲートウェイ経由の認証方式はClaude Codeログイン方法3種の使い分けにあります。ANTHROPIC_API_KEYとの使い分けも同じ記事です。環境変数の設定箇所はClaude Code環境変数リファレンスにあります。値を一元管理するenvブロックはClaude Code settings.json完全ガイドで扱っています。

ANTHROPIC_CUSTOM_HEADERSを書くときの形式

複数のヘッダーを設定するときは、改行区切りで1行に1つのName: Valueを書きます。

# 1行に1ペア。複数ヘッダーは改行で区切る
export ANTHROPIC_CUSTOM_HEADERS="X-Team-Id: platform
X-Request-Source: internal-tool"

ここに全角記号や、貼り付け元でカーリークォートへ自動変換された"が混ざると、該当ペアの位置がエラーに出ます。

不可視文字が混ざり込む経路を減らす

値の出どころが「人が読む文書」を経由していると、混入しやすくなります。チャットアプリやワープロソフトの中には、ストレートクォート(")をカーリークォートに自動変換するものがあり、そこからコピーすると、見た目で区別がつかないままU+00FFを超える文字が入ります。

くらべる

認証値の取り込み方の違い

混入しやすい

文書から貼り付ける

チャットやドキュメントからコピーした値に、カーリークォート・ゼロ幅スペース・余分な改行が付いてくることがあります。エラー後に位置で探すことになります。

混入を減らせる

コマンドの出力を直接渡す

シークレット管理ツールのCLIなどの出力を、コマンド置換で環境変数へ直接渡します。手で貼る工程が消えます。シェルのコマンド置換は末尾の改行を取り除くので、末尾の改行の混入も防げます。

手元のシェルでは、printf 'sk-test-abc\n'の出力は12バイトで、コマンド置換$(...)を経由して変数に入れた値は11バイトでした。末尾の改行1つ分が落ちています。ただし途中の改行は残るため、複数行の出力を渡すときは先頭・途中の改行に注意が要ります。

同じ値が別の入り口から入ったときの見分け方

認証値の出どころによって、同じ不正文字でも表示が変わります。画面の文言を手がかりに、次の順で調べます。

説明が続かないInvalid API keyは、キー自体の打ち間違いや、Consoleで失効させたキーを疑う場面です。同じシェルでenv | grep ANTHROPICを実行して、プロジェクトの.envから古いキーが読み込まれていないかも確かめます。ANTHROPIC_API_KEYを外して/loginでサブスクリプション認証へ切り替える手もあります。

apiKeyHelperを設定している場合は、スクリプトの出力が保存済みの/loginより優先されます。ログイン情報が正しくても、ヘルパーが鍵以外(ログイン時のバナーやログ行など)を標準出力に出すと、「Your apiKeyHelper script is failing」になります。Claude Codeはスクリプトを再実行しながら最大2回までリクエストを再試行するので、失敗は3回の試行の中で画面に出ます。このとき/loginをやり直しても直りません。ヘルパーのコマンドを直接実行して、標準出力が鍵1つだけになっているかを確認します。出力は印字可能なASCIIの1トークンで、16,384文字以内、終了コードは0が条件です。v2.1.274以降の/statusには、失敗の詳細を示すapiKeyHelperの行がFailingとして現れます。

保存済みの/login情報が壊れている場合は、このエラーではなくNot logged in · Please run /loginになります。Claude Desktopアプリが動かすセッション(CodeタブやCowork)は、別の文言です。Authentication required · Sign in again to continueと出て、アプリから再サインインします。

同じ設定ディレクトリを使う別のClaude Codeウィンドウでclaude.aiにログインすると、メッセージを出していた対話セッションはそのログインを自動で使い始めます。v2.1.286より前のmacOSでは、古い~/.claude/.credentials.jsonが残っているとログイン後もメッセージが残ることがあります。その場合はセッションを再起動します。CIのように対話ログインできない環境では、起動時に鍵を取得するapiKeyHelperを設定する選択肢があります。繰り返しログインを求められるなら、システム時計のずれやmacOSの資格情報ストレージを確認する手順が公式のトラブルシューティングにあります。

このエラーが出る場面・出ない場面

チェックが走るのは、Claude APIへ直接リクエストを送るときと、LLMゲートウェイ経由のときです。Amazon Bedrockのようなサードパーティのクラウドプロバイダー経由では、送信前のこのチェックは実行されません。

apiKeyHelperの出力は、このチェックの代わりにスクリプト実行時に別途検証されます。v2.1.227より前は、スクリプトが出力した内容が前後の空白を除いたうえでそのまま送られていました。

ゲートウェイがヘッダー自体を落とすと、値の中身ではなくanthropic-betaヘッダーの欠落が原因になります。この場合は「Extra inputs are not permitted」の原因と対処という別のエラーとして表面化します。

この記事を共有:XはてブLinkedIn