GitHub Actions / Cron / Docker などで Claude Code を自動実行したい人向け
GitHub Actions で `claude -p` を回したい初日や、VPS の Cron / Docker コンテナで Claude を自動実行したい場面で、自分のパソコンのターミナルで一度だけ叩いて長期トークンを発行する。出てきた文字列を GitHub Secrets や `--env-file` に置いて、CI 側に `CLAUDE_CODE_OAUTH_TOKEN` という名前の設定値として読ませる
Claude Code を CI(自動実行用のサーバー環境)や Cron で動かしたい時、最初にぶつかる壁が認証です。普段はブラウザでログインすればよかったのに、GitHub Actions の中や Docker コンテナの中では、そもそもブラウザが開けない。そこで使うのが claude setup-token という発行サブコマンドで、長期有効な OAuth トークンを 1 本作って、それを設定値に置いて認証する形にできます。
ローカルで 1 回叩いて、出てきた文字列を GitHub の Secrets や Docker の起動指定にコピーすれば、以降そのジョブはブラウザを開かずに Claude Code として動けるようになります。
噛み砕くと、自動実行用の長期入館証を発行するサブコマンド
普段の claude 起動は、毎回ブラウザを開いて「あなたですね」と確認する形です。会社の受付で、来るたびに身分証を見せて入館証をもらい直すような流れに近い。
でも CI 環境にブラウザはありません。そこで「1 年間使い回せる長期入館証」を 1 枚先に発行して、それを CI に持たせる発想が claude setup-token です。発行は自分のパソコンで 1 回だけ。発行が終わったら、その入館証を CI 側の金庫にしまって、ジョブが走るたびに首から下げてもらう。
そんなに難しい話ではない、けど落とし穴は多めです。
大事な前提:このサブコマンドはローカルのパソコンで叩く
このサブコマンドは、ブラウザでの認可ステップが入ります。なので CI 環境の中で叩いても意味がない。手順としては「自分のパソコンで 1 回発行 → 出てきた文字列を CI の金庫にしまう」が正しい流れです。
もう 1 つ、Claude Pro / Max / Team / Enterprise のいずれかを契約していないと使えません。Free プランでは発行できない仕様です。
「料理ブログの自動公開」を例に、実際の手順を見る
題材は「料理ブログを GitHub Actions で半自動運用する」流れです。毎週月曜の朝 9 時に Claude が下書きを 1 本書いて Pull Request を立て、人間が PR をレビューしてマージするフロー。CI 環境にはブラウザがないので、長期 OAuth トークンを発行して GitHub の Secrets に置きます。
ステップ1: ローカルのターミナルで叩く
自分のパソコンで、料理ブログのフォルダに移動した状態で 1 行打ちます。
$ claude setup-token
これだけ。後ろに何かを書き足したりはしません。
ステップ2: ブラウザでの認可
叩くと「Open the following URL in your browser...」みたいなメッセージとともに、認可用の URL がターミナルに出ます。その URL をブラウザで開いて、自分の Claude アカウントでログインして、認可ボタンを押します。
Open the following URL in your browser to authorize:
https://claude.ai/oauth/authorize?...
ステップ3: トークン文字列がターミナルに 1 回だけ表示される
認可が終わってターミナルに戻ると、トークン本体が表示されます。
Token: (長い認証文字列)
Copy this token and set it as CLAUDE_CODE_OAUTH_TOKEN
where you want to authenticate.
ここで一番大事な注意があります。このトークンはディスクのどこにも保存されません。画面に出るのは 1 回だけで、ターミナルを閉じたら復元できない。コピーは確実に。
初心者がやりがちな勘違いがここです。「画面に出たんだから、どこかのファイルに保存されてるはず」と思ってターミナルを閉じてしまうケース。残念ながら復元手段はなくて、もう一度 claude setup-token を叩いて発行し直すしかありません。発行し直しても古いトークンは無効にはならない(並行して有効なまま)ので壊れはしないんですが、管理が散らかるので最初の 1 回でしっかりコピーします。
ステップ4: GitHub の Secrets に登録
料理ブログのプロジェクトの GitHub ページに行って、Settings → Secrets and variables → Actions → New repository secret と進みます。
- Name:
CLAUDE_CODE_OAUTH_TOKEN - Secret: さっきコピーした
(長い認証文字列)をそのまま貼る
名前は CLAUDE_CODE_OAUTH_TOKEN 固定です。Claude Code 側がこの名前で読みに行く決まりなので、変えない。
ステップ5: ワークフローファイルから渡す
プロジェクト内、.github/workflows/blog-update.yml みたいなファイルで、ジョブにトークンを渡します。
name: weekly-blog-draft
on:
schedule:
- cron: '0 0 * * 1' # 毎週月曜 UTC 0時 = JST 9時
jobs:
draft:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm install -g @anthropic-ai/claude-code
- run: claude -p "今週のレシピ下書きを書いて PR を立てて"
env:
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
ポイントは env: でトークンを Claude Code に渡してる部分。GitHub Secrets に置いた値が、ジョブ実行時にだけ設定値として注入されます。
ステップ6: ジョブが走って Claude が動く
月曜の朝になると GitHub Actions がジョブを起動して、トークンで認証された Claude Code が -p(プロンプト 1 発実行モード)で動きます。レシピ下書きを書いて PR を立てるところまで Claude がやって、あとは人間がレビューしてマージ。これで毎週の下書き工程が半自動になります。
つまり claude setup-token は何をしてくれるのか
- やってくれる: ブラウザ認可を介して、1 年間有効な OAuth トークンを発行してターミナルに表示する
- やってくれない: 発行したトークンをファイルに保存することはしない。GitHub Secrets への登録も、Docker への注入も、ユーザー側の手作業
- 意味が薄い場面: 普通に自分のパソコンで対話的に Claude Code を使うだけの人。普段の
/loginで十分で、わざわざ長期トークンを発行する必要はない
使いどころ3シナリオ(具体題材で再現)
シナリオ1: GitHub Actions で毎週の自動記事更新(料理ブログ)
上の実演そのままです。料理ブログのレシピ下書きを毎週月曜の朝に Claude が 1 本書いて PR を立てる運用。ローカルで 1 回 claude setup-token を叩いて、出た文字列を GitHub Secrets の CLAUDE_CODE_OAUTH_TOKEN に登録、ワークフローから env: で渡すだけ。最初の 30 分で組めば、以降は 1 年間動き続けます。
シナリオ2: VPS の Cron で毎日深夜にレポート生成(在庫管理アプリ)
在庫管理アプリの日次集計を、深夜に Claude にやらせて Slack に通知する運用。VPS(自分で借りてるサーバー)にはブラウザがないので、まずローカルで claude setup-token を発行して、SSH で VPS に入って ~/.claude_env みたいなファイルに export CLAUDE_CODE_OAUTH_TOKEN=(長い認証文字列) を書く。Cron からはそのファイルを source してから claude を呼ぶ形にすると、ターミナル外でも動きます。
# cron.d ディレクトリ下に inventory-report として保存
0 2 * * * blog-user . /home/blog-user/.claude_env && claude -p "本日の在庫集計を Slack に通知" >> /var/log/claude.log 2>&1
シナリオ3: Docker コンテナで PR 自動レビュー bot
社内の Pull Request を Docker で動かす Claude が自動レビューする運用。Dockerfile に ENV CLAUDE_CODE_OAUTH_TOKEN=(長い認証文字列) と書き込んでしまうと、その Dockerfile やビルドして公開した image にトークンが焼き込まれて漏洩リスクが高い。これは避けます。
安全な渡し方は、コンテナ起動時の -e 指定か --env-file 指定で外から渡す形です。
$ docker run --env-file ./secrets.env claude-reviewer:latest
secrets.env は .gitignore に必ず入れて、プロジェクトには絶対に登録しない運用にします。
初心者が踏みやすい落とし穴
- トークンはディスクに保存されない。
claude setup-tokenの出力は 1 回きりで、ファイルにも自動保存されません。コピー失敗してターミナルを閉じたら復元不可、再発行するしかない - 1 年で失効する。発行から 1 年後にジョブが突然認証エラーで落ちます。GitHub Actions や Cron を組むなら、年に 1 回トークン更新のリマインダーをカレンダーに別途仕込んでおくこと
ANTHROPIC_API_KEYが同時にセットされていると無視される。Claude Code の認証優先順位では API Key が長期 OAuth トークンより上に来ます。「Secrets に長期トークンを置いたつもりが、別ジョブでセットした API Key 側が使われて課金された」事故はこのパターン。CI 側の設定値を確認する--bareモードでは効かない。最小起動モード(bare mode)はCLAUDE_CODE_OAUTH_TOKENを読まない設計です。--bareを付けるジョブではANTHROPIC_API_KEYかapiKeyHelper(認証情報を返すスクリプト)の方を使ってください- Free プランでは発行できない。Pro / Max / Team / Enterprise の契約者だけが使えるサブコマンドです。Free プランで叩くと認可ステップで弾かれます
- inference only スコープ。発行したトークンは「Claude にプロンプトを投げて回答をもらう」用途専用で、Remote Control のセッション確立には使えません
- 2026-06-15 以降は Agent SDK credit 枠から消費される。Subscription 契約で
claude -pや Agent SDK を CI で大量に叩く運用は、6/15 以降は対話利用とは別計算の「Agent SDK credit」月次枠から引かれます。CI 利用量が多い人は枠を確認しておく。公式 authentication ドキュメントの Note ブロックに明記されています - 絶対にプロジェクトに登録しない。トークン文字列を
.envや設定ファイルに書いてうっかりgit pushしたら、1 年間そのトークンで悪用されます。.envは.gitignoreに必ず追加、GitHub Secrets か Docker の--env-file経由で渡す運用に統一する
書き方
claude setup-token
やってみるとこうなる
入力
$ claude setup-token
出力例
Open the following URL in your browser to authorize:
https://claude.ai/oauth/authorize?...
(ブラウザでログイン → 認可ボタンを押す)
Token: (長い認証文字列)
Copy this token and set it as CLAUDE_CODE_OAUTH_TOKEN
where you want to authenticate.
# トークン表示は1回きり。ファイル保存されないのでここでコピーする
# 使う側では:
$ export CLAUDE_CODE_OAUTH_TOKEN=(長い認証文字列)
このページに出てきた言葉
- OAuth トークン
- 「この人として API を叩いてよし」を証明する長い文字列。ログイン情報の代わりにアプリ同士で受け渡しする鍵
- Subscription
- Claude の月額契約プラン(Pro / Max / Team / Enterprise)。<code>claude setup-token</code> は契約者だけが使える
- Remote Control
- claude.ai 側から自分のパソコンで動く Claude Code を遠隔操作する機能。長期 OAuth トークンではセッションを張れない
- --bare モード
- Claude Code を最小機能で起動するモード。<code>CLAUDE_CODE_OAUTH_TOKEN</code> を読まない設計なので、別の認証手段が必要
- Agent SDK
- Claude を自社プログラムから呼び出すための公式ライブラリ群。2026-06-15 以降は Subscription 利用が専用 credit 枠から引かれる