最近、業務をしていてAIに定期的にタスクを任せたいと思うことがでてきました。
たとえば毎朝レポートを生成したり、コードの変更を定期チェックしたり。
しかし、いざ自動化しようとするとサーバーの構築・管理やAIのAPIを利用する際にかかる従量課金といったハードルが出てきます。
「定期的にAIにタスクを任せたいけど、インフラ費用は抑えたい」
そこで行きついたのがGitHub Actionsです。
GitHub Actions なら
・サーバー構築が不要(GitHub が実行環境を用意してくれる)
・ Private リポジトリでも月 2,000 分まで無料で使える
・ Claude Code の OAuth トークンを使えば、サブスクリプションの範囲内で追加の API 料金もかからない
つまり、AWSのようなクラウドインフラを自分で管理する必要がなく、YAMLファイル1つで定期実行の仕組みが作れます。
この記事のターゲット
この記事はClaude CodeをAIエージェントとして定期実行したいが、できるだけお金をかけずに実現したい人向けです。
GitHub Actions の基本的な仕組みから解説するので、GitHub Actions を使ったことがない方でも読み進められます。
この記事で作るもの
GitHub Actions の cron スケジュール機能を使って、毎日決まった時間に Claude が自動で動く仕組みを作ります。
今回は 動作確認が目的なので、Claude にやらせるタスクはシンプルに
「今日の日付を含むメッセージをログに出力する」というものにします。
実行後、GitHub Actions のログに「Hello from Claude! 今日は 2025-07-01 です。」
のようなメッセージが表示されていれば成功です。
毎朝 9:00(JST)に GitHub Actions が自動起動↓GitHub が Ubuntu の仮想環境を用意する↓anthropics/claude-code-action@v1 が仮想環境内で Claude Code CLI を起動↓Claude がプロンプトに従って作業を実行し、結果をログに出力
ここで重要なのは、Claude はPCやGitHub上で直接動いているのではないということです。
GitHub Actions が用意した Ubuntu の仮想環境の中で Claude Code が動作しています。
仕組みの詳細は Step 4 で解説します。
プロンプトを変えれば、コードレビュー・レポート生成・ファイル操作・外部API連携など、さまざまなタスクに応用できます。
前提条件
- Claude Pro または Max のサブスクリプションに加入していること
- GitHub アカウントを持っていること
- Claude GitHub App がリポジトリにインストールされていること(手順は Step 2.3 で解説)
Step 1: GitHub リポジトリを作成する
まず、GitHub Actions を動かすためのリポジトリを作ります。
- GitHub にログインして、右上の「+」→「New repository」をクリック
- 以下の内容で作成します
| 項目 | 設定値 |
|---|---|
| Repository name | ai-agents(任意の名前でOK) |
| Visibility | Private |
| Initialize with README | チェックを入れる |
- 「Create repository」をクリック
Visibility は必ず Private にしてください。 この後の手順で Claude の OAuth トークンを扱います。Public リポジトリでは、ワークフローのトリガー設定次第でトークンが漏洩するリスクがあります。Private リポジトリでも GitHub Actions は月 2,000 分まで無料で使えるので、日次のタスク実行程度なら十分です。
Step 2: Claude Code の OAuth トークンを取得する
GitHub Actions から Claude Code を使うために、認証トークンを発行します。
2-1. Claude Code をインストール(まだの場合)
npm install -g @anthropic-ai/claude-code
2-2. トークンを発行する
ターミナルで以下を実行します。
claude setup-token
ブラウザが開き、Claude の認証画面が表示されます。ログインして許可すると、ターミナルにトークンが表示されます。
✔ Token saved successfully!
Your token: eyJhbGci...(長い文字列)
このトークンをコピーしておいてください。 次のステップで GitHub に登録します。
注意: このトークンは他人に見せないでください。あなたのサブスクリプションで Claude を利用するための鍵です。
2-3. Claude GitHub App をインストールする
拡張機能の anthropics/claude-code-action@v1 を使うには、OAuth トークンに加えて Claude の GitHub App をリポジトリにインストールする必要があります。この App がないと、ワークフロー実行時に以下のエラーが発生します。
Action failed with error: Claude Code is not installed on this repository.
Please install the Claude Code GitHub App at <https://github.com/apps/claude>
なぜ 2 つの認証が必要なのか
| 認証 | 役割 | 設定方法 |
|---|---|---|
OAuth トークン (CLAUDE_CODE_OAUTH_TOKEN) |
Claude のサブスクリプションを使うための認証 | Secrets に登録(Step 3) |
| Claude GitHub App | GitHub Actions から Claude Code を呼び出すための連携 | 以下の手順でインストール |
OAuth トークンだけでは動きません。GitHub App のインストールも必須です。
インストール手順
- https://github.com/apps/claude にアクセス

- 「Configure」をクリック
- インストール先を選択する
- 個人アカウントのリポジトリの場合 → 自分のアカウントを選択
- Organization のリポジトリの場合 → 対象の Organization を選択
- 「Only select repositories」を選び、対象のリポジトリ(例: ai-agents)を指定
- 「Install & Authorize 」をクリック
以下が表示されればインストール完了です。
Organization の場合の注意: Organization への GitHub App のインストールには Owner 権限 が必要です。権限がない場合は、Organization の Owner に依頼してください。
追加の費用はかかりません。
Step 3: GitHub にシークレットを登録する
トークンを安全に保管するため、GitHub の Secrets 機能を使います。
- リポジトリページで「Settings」タブをクリック
- 左メニューの「Secrets and variables」→「Actions」をクリック
- 「New repository secret」をクリックして登録します
| Name | Value | 説明 |
|---|---|---|
| CLAUDE_CODE_OAUTH_TOKEN | Step 2 で取得したトークン | Claude Code の認証用 |
外部サービスと連携する場合は、必要に応じて追加の Secrets を登録してください (例: Notion API トークン、Slack Webhook URL など)。
Secrets の特徴
- 登録後は画面上で値を確認できない(再設定のみ可能)
- ワークフローのログに出力されても自動で ** にマスクされる
- リポジトリの管理者権限がないとアクセスできない
Step 4: ワークフローファイルを作成する
いよいよ本題です。GitHub Actions のワークフローを作ります。
このワークフローを実行すると、裏側では次のような流れで処理が行われます。
GitHub Actions が Ubuntu 仮想環境を起動↓anthropics/claude-code-action@v1 が仮想環境内で Claude Code CLI を起動↓Claude がプロンプトに従って作業を実行↓仮想環境のターミナル出力(stdout)が Actions のログに記録される↓ブラウザの「Actions」タブで実行ログとして確認できる
普段ターミナルで claude コマンドを使うのと同じことが、GitHub Actions が用意した仮想環境の中で自動的に行われているというのが基本的な仕組みとなります。
※ これより先に記載している「 { 」はブログの都合上、「 ${{」と一部全角で記載していますが、コピー&ペーストで利用される場合は全て半角に直してから使用してください。
- リポジトリのページで「Add file」→「Create new file」をクリック
- ファイル名に .github/workflows/scheduled-task.yml と入力
- 以下の内容を貼り付けます
name: Scheduled AI Task# ─── いつ実行するか ───on:schedule:# 毎日 0:00 UTC(日本時間 9:00)に実行- cron: "0 0 * * *"# 手動でも実行できるようにする(テスト用)workflow_dispatch:# ─── 権限設定(claude-code-action に必要) ───permissions:id-token: write # OIDC トークンの発行に必要contents: read # pushに必要# ─── 何を実行するか ───jobs:run:runs-on: ubuntu-latesttimeout-minutes: 30steps:# Claude Code Action を実行- uses: anthropics/claude-code-action@v1with:claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
show_full_output: true
prompt: |今日の日付を取得し、以下のマークダウンを Bash で
$GITHUB_STEP_SUMMARY に追記してください。
Actions の実行結果画面の上部に綺麗に表示されます
```
## Scheduled AI Task 実行結果
- 実行日時(UTC): YYYY-MM-DD HH:MM:SS
- メッセージ: Hello from Claude!
```claude_args: '--allowedTools "Bash"'
permissions を忘れるとどうなる? claude-code-action は内部で OIDC(OpenID Connect)トークンを使って認証します。id-token: write がないと、以下のエラーが発生します:
Could not fetch an OIDC token. Did you remember to add `id-token: write` to your workflow permissions?
- 「Commit changes」をクリックして保存
ワークフローの構成を解説
on:schedule:- cron: "0 0 * * *" # ← 実行スケジュール(cron 記法)workflow_dispatch: # ← 手動実行ボタンを有効にする
cron の書き方は「分 時 日 月 曜日」の 5 つのフィールドで指定します。
| 例 | 意味 |
|---|---|
| "0 0 * * *" | 毎日 0:00 UTC(JST 9:00) |
| "0 0 * * 1-5" | 平日のみ 0:00 UTC |
| "0 */6 * * *" | 6 時間ごと |
| "30 1 * * 1" | 毎週月曜 1:30 UTC(JST 10:30) |
- uses: anthropics/claude-code-action@v1with:claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} # ← 認証トークン。prompt: # ← Claude に渡す指示(自由に書ける)...claude_args: '--allowedTools "Bash,Read,Write"' # ← Claude が使えるツール
prompt の中身を変えるだけで、あらゆるタスクに対応できます。
claude_args の --allowedTools で使用可能なツールを制限することで、意図しない操作を防ぎます。
OAuth トークンは with で渡す(env ではない)
CLAUDE_CODE_OAUTH_TOKEN は必ず with の claude_code_oauth_token パラメータで渡してください。env で渡すと認識されません。
# ❌ NG: env で渡すと action 内部で上書きされ、認識されない- uses: anthropics/claude-code-action@v1with:prompt: |...env:CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}# ✅ OK: with で渡す- uses: anthropics/claude-code-action@v1with:claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
show_full_output: trueprompt:...
claude-code-action は action.yml の内部で入力パラメータを環境変数にマッピングしています。step レベルの env で同名の変数を設定しても、action 内部のマッピングで空の値に上書きされてしまいます。
なお、with で渡した $ の値は GitHub のマスク処理の対象なので、ログに平文で出力されることはありません。prompt の中に直接埋め込むのとは異なり、認証処理専用のパラメータとして安全に扱われます。
使えるツールは必要最小限に
Claude Code が使えるツールは claude_args の --allowedTools で制限します。そのタスクに本当に必要なツールだけを指定してください。
注意: allowed_tools という with パラメータは存在しません。指定しても Warning が出て無視され、すべてのツールが使える状態になります。必ず claude_args 経由で渡してください。
| ツール | 用途 | リスク |
|---|---|---|
| Bash | シェルコマンドの実行(curl, git など) | 外部通信・ファイル操作が可能 |
| Read | リポジトリ内のファイル読み取り | 低リスク |
| Write | リポジトリ内のファイル書き込み | ファイルの作成・上書きが可能 |
たとえば、外部 API を叩くだけのタスクなら Bash のみで十分です。リポジトリ内のファイルを読み書きしないなら Read や Write は外しましょう。
# 外部APIとの連携のみなら Bash だけでOK
claude_args: '--allowedTools "Bash"'
# リポジトリ内のファイルも操作するなら追加
claude_args: '--allowedTools "Bash,Read,Write"'
# ❌ NG: allowed_tools は with の有効なパラメータではない(無視される)
allowed_tools: "Bash"
Secrets をプロンプトに直接埋め込まない
外部サービスの API トークンを Claude に渡したいとき、prompt 内で $ を直接展開してしまいがちですが、これは避けてください。
# ❌ NG: Secrets がプロンプト文字列に平文で埋め込まれる
prompt: |
APIトークン: ${{ secrets.API_TOKEN }}
# ✅ OK: 環境変数経由で渡し、プロンプトでは変数名を指示する
prompt: |
APIトークン: 環境変数 API_TOKEN を使用してください
env:
API_TOKEN: ${{ secrets.API_TOKEN }}
なぜ NG なのか:
- Secrets の値がプロンプト文字列に平文で展開されるため、Claude がプロンプト内容をそのまま引用・出力すると、Actions のログにトークンが記録される
- GitHub は Secrets のマスク処理を行うが、値が部分的に分割・加工された場合はマスクが機能しないことがある
env で環境変数として渡せば、Claude Code は $API_TOKEN として参照でき、プロンプト文字列自体にはトークンの値が含まれません。
Step 5: 手動実行で動作確認する
スケジュールを待たずに、手動でテスト実行してみましょう。
- リポジトリの「Actions」タブをクリック
- 左メニューから「Scheduled AI Task」を選択
- 「Run workflow」ボタンをクリック
- ブランチが main になっていることを確認して「Run workflow」
実行が始まると、ログをリアルタイムで確認できます。
実行結果の確認方法
ワークフローが正常に完了したら、Actions の実行ページを開いて以下を確認します。
以下のように表示されていればOKです。
うまくいかない場合のチェックリスト
| 症状 | 確認ポイント |
|---|---|
| 「Token is invalid」エラー | CLAUDE_CODE_OAUTH_TOKEN の値を再確認。claude setup-token で再発行 |
| 「OIDC token」エラー | permissions に id-token: write が設定されているか確認(Step 4 参照) |
| 「Claude Code is not installed」エラー | Claude GitHub App がリポジトリにインストールされているか確認(Step 2.3 参照) |
| 「ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN is required」エラー | トークンを env ではなく with の claude_code_oauth_token で渡しているか確認 |
| ワークフローが一覧に表示されない | .github/workflows/ のパスが正しいか確認。main ブランチにあるか確認 |
| 手動実行ボタンがない | workflow_dispatch: がワークフローに含まれているか確認 |
| タイムアウトする | timeout-minutes の値を増やす。処理内容に対して十分な時間を設定 |
Step 6: 定期実行を確認する
Step 4 で設定した cron スケジュールにより、毎日日本時間 9:00 頃に自動実行されます。
知っておくべきポイント: GitHub Actions の cron は正確なタイミングで動くとは限りません。混雑時には数分〜数十分の遅延が発生することがあります。「きっかり9時に動いてほしい」という用途には向きませんが、「毎朝やっておいてほしい」という用途には十分です。
実行履歴は「Actions」タブでいつでも確認できます。
注意: 60 日間放置するとワークフローが止まる
GitHub は、60 日間コミットがないリポジトリの cron ワークフローを自動的に無効化します。無効化されると定期実行が止まり、手動で再有効化するまで動きません。
対策:
- Actions タブに通知が出るので、気づいたら「Enable workflow」をクリックして再有効化する
- 定期的にリポジトリにコミットする(プロンプトの改善など)
応用: 1つのリポジトリで複数の自動タスクを管理する
ワークフローファイルを追加するだけで、複数のタスクを管理できます。
.github/workflows/
├── daily-report.yml # 日次レポート生成(毎日 9:00)
├── weekly-summary.yml # 週次サマリー(毎週月曜 10:00)
└── code-review.yml # コードレビュー(PR作成時に実行)
担当者ごとにトークンを分けることもできます。
- uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.OAUTH_TOKEN_TANAKA }}
prompt: | ...
Secrets にはユーザーごとに別々のトークンを登録しておきます。
Repository Secrets:
OAUTH_TOKEN_TANAKA → 田中さんのトークン
OAUTH_TOKEN_SUZUKI → 鈴木さんのトークン
注意点: schedule(定期実行)のワークフローは、デフォルトブランチ(main)に置いたファイルのみが実行されます。ブランチを分けて管理したい場合も、ワークフローファイル自体は main ブランチに置いてください。
認証方式の比較: OAuth トークン vs API キー
anthropics/claude-code-action@v1 は 2 つの認証方式に対応しています。
| 項目 | OAuth トークン | API キー |
|---|---|---|
| with パラメータ名 | claude_code_oauth_token | anthropic_api_key |
| 取得方法 | claude setup-token | Anthropic コンソールから発行 |
| 課金 | サブスク内(追加 $0) | API 従量課金 |
| 権限の範囲 | アカウント全体 | API 利用のみ |
どちらも with で渡します。
# OAuth トークンの場合
- uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
# API キーの場合
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
サブスク内で収めたい場合は OAuth トークン、権限を最小限にしたい場合は API キーと、用途に応じて使い分けてください。
セキュリティについて:必ず知っておくべきこと
OAuth トークンを GitHub Actions で使う構成には、便利さの裏にリスクがあります。「Secrets に入れておけば安全」と思い込まず、以下の点を理解した上で運用してください。
1. OAuth トークンの権限が広い(最大のリスク)
CLAUDE_CODE_OAUTH_TOKEN は、API キーのように「このプロジェクトだけ」と権限を絞る(スコープを切る)ことができません。このトークンは あなた個人の Claude アカウントのセッショントークンです。
もし何らかの理由でこのトークンが漏洩した場合、第三者があなたの Claude アカウントに不正アクセスし、過去のチャット履歴をすべて閲覧したり、あなたになりすまして AI を利用したりすることが可能 になります。
API キー(ANTHROPIC_API_KEY)であれば、漏洩しても影響は API 利用分の課金だけに留まります。OAuth トークンはそれよりも被害範囲が広いことを認識しておいてください。
2. Public リポジトリ × 悪意ある PR による攻撃
Public リポジトリでは、誰でも Pull Request を送ることができます。ここで注意すべきなのが ワークフローのトリガー設定 です。
GitHub Actions のトリガー(on: の部分)には色々な種類がありますが、中には 外部の人が PR を送るだけで Secrets 付きでワークフローが実行される 危険なものがあります。
# ⚠ 危険な設定 - 外部PRでもSecretsにアクセスできる状態で実行される
on:
pull_request_target:
この場合、攻撃者がリポジトリをフォークし、悪意あるコードを含む PR を作成するだけで、あなたの Secrets(トークン含む)が盗まれる可能性があります。
攻撃者がリポジトリをフォーク
↓
悪意あるコードを含む PR を作成
↓
pull_request_target でワークフローが起動(Secrets 付き)
↓
攻撃者のコードが実行され、トークンが外部に送信される
3. 安全なトリガー設定(対策)
定期実行のバッチ処理では、トリガーを schedule と workflow_dispatch だけに限定 してください。
# ✅ 安全な設定 - 外部の人がトリガーできる余地がない
on:
schedule:
- cron: "0 0 * * *" # GitHub が自動実行。外部の人は介入できない
workflow_dispatch: # リポジトリの Write 権限を持つ人だけが実行可能
この 2 つだけであれば、外部の人がワークフローを起動するきっかけが一切ないため、
Public リポジトリでもトークン漏洩のリスクは大幅に下がります。
逆に、以下のトリガーは OAuth トークンを扱うワークフローでは使わないでください
| トリガー | リスク |
|---|---|
| pull_request_target | 外部 PR で Secrets 付き実行される。最も危険 |
| issues / issue_comment | 誰でも Issue を作成・コメントできるため、トリガーし放題 |
| public | リポジトリの公開設定変更時に発火。意図しない実行の可能性 |
結論: Private リポジトリ + トリガー制限が鉄則
OAuth トークンの権限の広さを考えると、Private リポジトリで運用するのが鉄則 です。
Public にする唯一のメリットは無料枠の制限がなくなることですが、
日次タスク程度なら月 2,000 分で十分足りると思います。
| 設定 | 推奨 |
|---|---|
| リポジトリ | Private |
| トリガー | schedule + workflow_dispatch のみ |
| 外部アクション |
信頼できるもののみコミットハッシュ固定で使用 |
まとめ
- anthropics/claude-code-action@v1 を使えば、GitHub Actions 上で Claude Code を動かせる
- OAuth トークンを使えば、サブスクリプション内で追加のAPI料金なし
- cron スケジュールで定期実行が可能(サーバー不要)
- 複数のワークフローを1つのリポジトリで管理できる
- OAuth トークンは権限が広いため、トリガーの制限とリポジトリの公開設定に注意が必要
「AIエージェントを定期実行したいけど、インフラ構築は大変…」という方は、まずこの方法から試してみてください。YAML ファイル1つで、あなた専用の AI アシスタントが毎日働いてくれるようになります。

