Not logged in · Please run /login
認証情報が1つも見つからない状態。設定ファイルのJSONが壊れていると鍵を書いていても黙って捨てられ、同じ表示になる。
エラー文字列
Not logged in · Please run /login
⚠️ このメッセージは標準エラーではなく標準出力に出ます。終了コードは 1 です。
claude -p の出力をそのまま変数に入れている場合、この文字列が「回答」として入ります。
何が起きているか
Claude Code が、使える認証情報を1つも見つけられなかった状態です。
認証情報は3つの経路のどれかで渡します。
| 経路 | 渡し方 | 主な用途 |
|---|---|---|
| OAuth | claude を起動して /login |
対話環境 |
| API キー | 環境変数 ANTHROPIC_API_KEY |
CI・スクリプト |
| OAuth トークン | 環境変数 CLAUDE_CODE_OAUTH_TOKEN |
CI で Claude の契約を使う場合 |
🔴 設定ファイルに鍵を書いたのに出る場合
JSON が壊れていると、設定ファイルは警告なしに丸ごと捨てられます。
これが最も見つけにくい原因です。Claude Code は settings.json の JSON が壊れていても
**何も言いません。**警告も出ず、終了コードも変わらず、そのファイルは無かったことになります。
v2.1.238 で実測した結果です。env.ANTHROPIC_API_KEY に同じ値を書いた設定ファイルを、
JSON の壊し方だけ変えて渡しています。
~/.claude/settings.json の状態 |
実際に出た表示 |
|---|---|
| 正しい JSON | Failed to authenticate. API Error: 401 ...(鍵は読まれている) |
閉じ括弧 } が足りない |
Not logged in · Please run /login |
| 末尾にカンマがある | Not logged in · Please run /login |
// コメントが入っている |
Not logged in · Please run /login |
⭐ settings.json は JSONC ではありません。 // や /* */ のコメントを書くと、
その時点でファイル全体が無効になります。エディタが色を付けてくれても JSON としては不正です。
⚠️ 末尾カンマも同じです。JavaScript では許されますが JSON では不正です。
直し方
1. まず設定ファイルが JSON として妥当か確かめる
鍵を設定ファイルに書いている場合は、ここから確認してください。 壊れていても Claude Code は何も言わないため、自分で確かめる以外に気づく方法がありません。
Windows(PowerShell)
foreach ($p in @("$env:USERPROFILE\.claude\settings.json", ".claude\settings.json", ".claude\settings.local.json")) {
if (Test-Path $p) {
try { Get-Content $p -Raw -Encoding utf8 | ConvertFrom-Json | Out-Null; "OK $p" }
catch { "壊れている $p -- $($_.Exception.Message)" }
}
}
macOS / Linux
for p in ~/.claude/settings.json .claude/settings.json .claude/settings.local.json; do
[ -f "$p" ] || continue
if python3 -c "import json,sys;json.load(open(sys.argv[1]))" "$p" 2>/dev/null; then
echo "OK $p"
else
echo "壊れている $p"
fi
done
⚠️ jq は Windows にも macOS にも標準では入っていません。 上は追加インストール無しで動く形にしてあります。
2. 対話環境で認証する
claude
起動してから /login を実行します。ブラウザが開いて認証が完了すると、次回以降は不要です。
3. CI・スクリプトで認証する
/login は対話が必要なため CI では使えません。環境変数を使います。
export ANTHROPIC_API_KEY="sk-ant-..."
claude -p "..."
⚠️ 値の前後に改行や空白が混ざると認証は通りません。 CI のシークレット貼り付けで混入しがちです。
その場合は Not logged in ではなく Failed to authenticate. API Error: 401 API key is invalid. になります。
4. スクリプトでは終了コードを見る
このメッセージは標準出力に出ます。出力を回答として扱っていると、 認証されていないことに気づかないまま処理が進みます。
if ! out=$(claude -p "$prompt"); then
echo "Claude Code が失敗しました: $out" >&2
exit 1
fi
再発防止
- 設定ファイルを手で編集したら、必ず JSON として検証する。 Claude Code は壊れていても黙っています
- 設定ファイルにコメントを書かない。メモを残したいなら、使われないキー(例:
_note)に文字列として入れる - CI では
ANTHROPIC_API_KEYを使い、値に改行が入っていないことを確認する claude -pの終了コードを必ず見る。標準出力だけを見ていると、この表示を回答として受け取ってしまう