2児のパパ系Webエンジニア
の開発日記
A Dad-of-Two Engineer's Development Diary

claude -pが朝いきなり止まる前に!Claude Code 2.1.318のログイン期限チェックとsetup-tokenの使い分け

claude -pが朝いきなり止まる前に!Claude Code 2.1.318のログイン期限チェックとsetup-tokenの使い分け

🙌 結論から

無人で回している claude -p は、ログインの期限を先に見ておけば朝いきなり止まらずに済みます。

11月4日に出たClaude Code 2.1.318で、claude auth status にログインが切れる日(loginExpiresAt)が出るようになりました!

claude -p のJSONの結果にも credential_expires_at が入り、切れる10日前からはテキスト出力に1行の警告も出ます👀

このサイトも毎朝の定期実行で記事の草稿やSNSの候補を準備しているので、「ある朝なにも動いてなかった」は正直いちばん避けたいパターンです🤔

ログインで動かすか、claude setup-token の長期トークンで動かすかも、ここで決めておくとかなり楽・・!

💡 2.1.318でログインの期限が見えるようになった

公式の変更履歴(CHANGELOG)で、2.1.318の認証まわりの変更はこの4つです。

  • claude auth status に、保存されたclaude.aiのログインが切れる日(loginExpiresAt)が出る
  • claude -p のJSONの結果に credential_expires_at が入る
  • 切れる10日前から、claude -p のテキスト出力に1行の警告がstderrで出る
  • ログインが期限切れになったときのエラーが、それをはっきり伝えるようになった(claude -p では claude auth login と claude setup-token を案内)

npmの公開記録では、2.1.318は日本時間の11月4日の朝に出ています👍

これまでも対話モードなら、期限の3日前から起動時に Your login expires in 3 days · run /login to renew という警告は出ていました!

ただこれは起動したときの画面に出るものなので、人が見ていない claude -p だと気づけないんですよね・・・(´・ω・`)

10日前から無人の実行の出力にも出るようになったのが、今回いちばん大きいところです。

🤔 無人の実行はなぜ止まるのか

公式の認証ドキュメントでは、/login で保存したログインが切れて更新もできなくなると、モデルへのリクエストは毎回 Login expired · Please run /login で失敗する、と書かれています。

しかも警告自体はリクエストを止めないので、期限の当日までは普通に動いてしまうんです。

前の日まで元気に動いていたのに、次の朝だけ全部コケる、という止まり方になります(´;ω;`)

同じページには、エージェントビューのバックグラウンドのセッションやRemote Controlのセッションは、ログインが切れると自分では立ち直れないとも書かれていました👀

なので無人で回すなら、止まってから気づくより、10日前の時点で気づける形にしておくのが大事です。

🔧 私ならこの3行で見張ります

claude auth status は、ログインしていれば終了コード0、していなければ1を返します(CLIリファレンスより)。

出力はJSONなので、jq で期限だけ抜き出せます🙌

定期実行のスクリプトの先頭に置くなら、私はこの形にします。

# 1. ログインしていなければ、ここで止めて通知に回す
claude auth status > /tmp/claude-auth.json || { echo "Claude Codeにログインしていません"; exit 1; }

# 2. ログインが切れる日をログに残す(2.1.318以降)
jq -r '.authMethod, .loginExpiresAt' /tmp/claude-auth.json >> ~/logs/claude-auth.log

# 3. 本番の実行。stderrの警告を捨てずにログへ
claude -p "今日のタスクを処理して" --output-format json 2>> ~/logs/claude-stderr.log | jq -r '.credential_expires_at'

ポイントはstderrを /dev/null に捨てないことです!

10日前の警告はstderrに出るので、2>/dev/null のままだと今回の改善がまるごと見えなくなります😭

authMethod は claude.ai・oauth_token・api_key などのどれかが入るので、「今どの認証で動いているか」も一緒に残しておくと、あとで迷いません(^_^)

ちなみに対話モードなら /status の Login の行で、期限切れのときは Expired — log in again と出ます。

👀 /loginとsetup-tokenの使い分け

そもそも無人で回すなら、ログインではなく claude setup-token で作る長期トークンという手もあります💡

公式ドキュメントの説明を表にするとこうです。

方法有効期限使い方向いている場面
/login(claude auth login)期限あり・自動で更新ブラウザでログイン普段の対話・自分のMacでの定期実行
claude setup-token1年表示されたトークンを CLAUDE_CODE_OAUTH_TOKEN に入れるCIやスクリプトなど、ブラウザが開けない場所
ANTHROPIC_API_KEYキーによる環境変数に入れる従量課金のAPIで回したいとき

setup-tokenはPro・Max・Ultra・Team・Enterpriseのどれかのプランが必要で、モデルへのリクエストしかできないトークンです。

なのでRemote Controlのセッションを作ったり、claude.aiのコネクタを取ってきたりはできません(手元で設定したMCPサーバーは使えます)🙌

私の使い分けは、自分のMacで動かすものは /login のまま期限を見張る、ブラウザを開けないCIだけsetup-token、の2つにしています✨

1年のトークンは楽なんですが、表示されたトークンはどこにも保存されないので、置き場所(パスワード管理アプリやCIのSecrets)を先に決めてから発行するのがおすすめです。

🔥 ハマりやすいところ

最後に、ドキュメントを読んでいて「これは引っかかりそう」と思ったところを3つ書いておきます。

  • ANTHROPIC_API_KEY が残っていると、claude -p は必ずそれを使います。 対話モードなら最初に確認されますが、-p では聞かれません。サブスクで回しているつもりが従量課金になっていた、を防ぐには authMethod を見るのが早いです
  • --bare で起動すると CLAUDE_CODE_OAUTH_TOKEN は読まれません。 起動を速くしたくて --bare を付けるなら、ANTHROPIC_API_KEY か apiKeyHelper で認証する必要があります
  • CLAUDE_CODE_OAUTH_TOKEN を入れたまま /login すると、そのセッションは新しいログインに切り替わります。 次からもログインで動かしたいなら、シェルの設定ファイルから環境変数を消しておきます!

1つ目は特に、気づかないまま請求が来るタイプなのでこわいです(T_T)

主な優先順位は「環境変数のAPIキー → apiKeyHelper → setup-tokenのトークン → /login のログイン」の順なので、上に何か残っていると下は使われないと覚えておくと整理しやすいです(`・ω・´)

🔗 関連記事と使い分け

パパ系Webエンジニア〜愛用ガジェット一覧 🛍️

AI開発・執筆に使っている作業デスク環境を楽天ROOMにまとめています ✨ デスク周りの参考にどうぞ 🙌

🙌 まとめ

claude -p を無人で回しているなら、2.1.318にしてから loginExpiresAt をログに残すだけで、朝の「全部止まってた」がかなり防げます。

やることは、claude auth status を先頭に置く・stderrを捨てない・ブラウザが開けない場所だけsetup-tokenにする、の3つです✅

これが良いのか悪いのか、AIに任せる仕事が増えるほど、こういう「動かし続けるための見張り」の方が大事になってきた気がします。笑

みんなは無人の実行、どうやって見張ってますか?(^^)

※ バージョン番号・提供範囲は今後も変わる可能性があります。最新情報は Claude Codeの公式ドキュメント と CHANGELOG をご確認ください👀

参考になったらシェアしてもらえるとうれしいです🙌

Xでポスト Threads はてブ LINE
本日のAI速報 11月10日(火)・10件