Claude Codeを定期実行するにはいくつかの方法があります。この記事ではそれらの方法について解説します。
前提となるヘッドレスモード
Claude Codeをターミナルで開くと、質問に答えたり確認プロンプトに応じたりしながら進みます。人間が張り付いている前提の動き方なので、このままでは定期実行できません。
そこで使うのがヘッドレスモードです。claudeコマンドに-p(--print)を付けると、対話をすべて省いて一回きりのバッチ処理として動きます。
claude -p "今日の依存関係の警告を確認して" 入力を待たず、確認も求めず、指示した内容を最後まで処理して結果を標準出力に返します。成功なら終了コード0、失敗なら非ゼロを返すので、シェルスクリプトからそのまま扱えます。
無人で動かすときは承認モードを明示しておきます。dontAskを指定すると、事前に許可したツールと読み取り専用のコマンドだけを実行し、それ以外は確認を求めずに自動で拒否します。指定を省くと確認プロンプトで止まったまま朝を迎えることになります。
claude -p "今日の依存関係の警告を確認して" \
--permission-mode dontAsk \
--allowedTools "Read,Grep,Bash(npm audit)" あとは、このコマンドを決まった時刻に叩いてくれる仕組みを用意するだけです。その選択肢が主に4つあります。cron、launchd、Routines、GitHub Actions。順に見ていきます。
cronで動かす【非推奨】
cronはLinuxサーバーに標準で入っている、もっとも枯れたスケジューラです。すでに別のジョブを動かしているサーバーがあるなら、そこに一行足すだけで済みます。
crontabは「分 時 日 月 曜日 コマンド」の5フィールドで書きます。平日の朝7時・昼12時・夕方17時に実行する例です。
CRON_TZ=Asia/Tokyo
0 7,12,17 * * 1-5 /home/you/claude_cron.sh 呼び出し先のラッパースクリプトはこう組みます。
#!/bin/bash
export PATH="/usr/local/bin:/opt/homebrew/bin:$PATH"
LOGFILE="/home/you/logs/claude-cron.log"
echo "[$(date '+%F %T')] start" >> "$LOGFILE"
claude -p "今日の依存関係の警告を確認して" \
--permission-mode dontAsk \
--allowedTools "Read,Grep,Bash(npm audit)" >> "$LOGFILE" 2>&1
echo "[$(date '+%F %T')] exit $?" >> "$LOGFILE" 冒頭のexport PATHは省略できません。cronの実行環境は対話シェルとは別物で、SHELL・HOME・LOGNAME程度しか設定されず、PATHは驚くほど狭いのが普通です。ここを書き忘れるとclaudeコマンド自体が見つからず、「command not found」で静かに失敗し続けます。nvmでNode.jsを入れている場合は、スクリプトの先頭でnvm useも明示しておきます。
もう一つ、cronは実行予定時刻にマシンが起きていなければ、その回を単純にスキップします。取りこぼしを後から追いつき実行する仕組みはありません。常時稼働のサーバーなら問題になりませんが、ノートPCでの運用には向いていません。
なおMacでcronを使うのは避けたほうが無難です。Apple自身が公式ドキュメントで「まだ動くが推奨しない。launchdに置き換えられた」と明言しています。
launchdで動かす【推奨】
Macで定期実行するならlaunchdを使います。Apple公式が正式に推している仕組みで、ジョブごとに独立したplistファイルで管理します。
~/Library/LaunchAgents/に置くplistの例です。毎日9時に実行し、出力をログファイルへ流します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.claude-daily</string>
<key>ProgramArguments</key>
<array>
<string>/bin/zsh</string>
<string>-lc</string>
<string>/usr/local/bin/claude -p "定型タスクの内容" --permission-mode dontAsk > /Users/USERNAME/Library/Logs/claude-daily.log 2>&1</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key><integer>9</integer>
<key>Minute</key><integer>0</integer>
</dict>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
<key>CLAUDE_CODE_OAUTH_TOKEN</key>
<string>YOUR_TOKEN_HERE</string>
</dict>
</dict>
</plist> 登録と確認はlaunchctlで行います。古いload/unloadは設定に問題があっても無言で失敗するため、bootstrap/bootoutを使います。
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.claude-daily.plist
launchctl kickstart -k gui/$(id -u)/com.example.claude-daily # 即時実行してテスト
launchctl print gui/$(id -u)/com.example.claude-daily # 状態確認
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.example.claude-daily.plist cronと違い、スリープ中に予定時刻を過ぎても、Macが起きた直後に取りこぼした分を実行してくれます。ノートPCでの運用ならこの差は大きいです。
一方でlaunchd特有の詰まりどころがあります。ログイン済みのはずなのにNot logged in · Please run /loginと表示されて止まる問題です。ターミナルから同じコマンドを打てば動くのに、launchd起点だと失敗する。macOSのKeychainがプロセスの起動元によって読み取りを拒否しているためと見られています。
回避策は、CLAUDE_CODE_OAUTH_TOKENという環境変数でKeychain参照そのものを迂回することです。トークンはclaude setup-tokenで発行でき、有効期限は1年です。これをplistのEnvironmentVariablesに入れておけば認証が通ります。
claude setup-token Routinesで動かす
Routinesは、Anthropicがクラウド上に用意した公式の定期実行機能です。cronやlaunchdが「時刻を鳴らすだけ」なのに対し、Routinesは実行環境そのものをまるごと用意してくれます。ノートPCを閉じていても、電源を落としていても動きます。
設定するのはプロンプト・対象リポジトリ・トリガーの3点だけ。claude.ai/code/routinesのWeb UIか、セッション内で/scheduleコマンドを打つと作れます。自然言語で書けます。
/schedule daily PR review at 9am トリガーはスケジュール・API呼び出し・GitHubイベントの3種類から選べ、組み合わせることもできます。
制約は3つあります。1つ目は、実行のたびに対象リポジトリをデフォルトブランチから新規クローンし直すこと。未コミットの変更やローカルの環境変数、社内サービスには一切アクセスできません。ローカルCLIで追加したMCPサーバーも引き継がれないので、claude.aiのコネクタとして登録し直すか、リポジトリに.mcp.jsonをコミットしておく必要があります。
2つ目は最小実行間隔が1時間であること。これより短い間隔は指定できません。
3つ目は1日あたりの実行回数の上限です。公式発表時点ではPro 5回、Max 15回、Team・Enterprise 25回という数値が示されていました。ただしこの数値は今後変わりうるものとして扱われており、現在の正確な値はclaude.ai/code/routinesのダッシュボードで確認する必要があります。日次のスケジュール実行を数本と、GitHubイベントのトリガーを組み合わせるだけで上限に近づいた、という報告もあります。
なお承認プロンプトは一切なく、完全に自律実行されます。会話履歴も引き継がないので、プロンプトには「何をするか」「何をもって成功とするか」を自己完結的に書き切る必要があります。
GitHub Actionsで動かす
リポジトリに紐づいた作業をチームで共有しながら回すなら、GitHub Actionsが素直な選択です。既存のCI/CDパイプラインにそのまま組み込めますし、公式のclaude-code-actionが提供されています。
.github/workflows/に置くYAMLです。毎日UTC 9:00(日本時間18:00)に実行し、前日のコミットとオープンIssueをまとめます。cronの時刻指定はUTC基準である点に注意してください。
name: Daily Report
on:
schedule:
- cron: "0 9 * * *"
jobs:
report:
runs-on: ubuntu-latest
permissions:
contents: read
issues: read
id-token: write
steps:
- uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
prompt: "Generate a summary of yesterday's commits and open issues"
claude_args: |
--allowedTools "mcp__github__list_commits,mcp__github__list_issues" 準備はClaude GitHub Appのインストールとシークレット登録の2ステップです。/install-github-appコマンドを使えば対話形式で進められます。
サブスク契約のまま動かす場合は、ローカルでclaude setup-tokenを実行してトークンを発行し、リポジトリシークレットにCLAUDE_CODE_OAUTH_TOKENとして登録します。上のサンプルのようにclaude_code_oauth_tokenを指定すれば、API従量課金ではなくサブスクの枠を消費する形で動きます。
どれを選ぶか
4つの方式は、実行場所とマシンへの依存度という軸で並べると違いがはっきりします。
| 方式 | 実行場所 | マシンの電源 | 実行の制約 | 向いている用途 |
|---|---|---|---|---|
| cron | 自分のLinuxサーバー | 必要 | 制約なし | 常時稼働サーバーでの個人運用 |
| launchd | 自分のMac | 必要 | 制約なし | Mac常用者の個人運用 |
| Routines | Anthropicのクラウド | 不要 | 最小1時間間隔/日次の回数上限あり | 止まってほしくない定常業務 |
| GitHub Actions | GitHubのランナー | 不要 | 最短5分間隔 | チーム共有・リポジトリ作業 |
上から順に当てはめれば、たいていは一発で決まります。
常時起動しているマシンが手元にあり、ローカルのファイルや社内サービスを触りたい。この場合は追加のインフラすら要りません。OSがLinuxならcron、Macならlaunchdです。
常時起動のマシンがない、あるいはPCを閉じても止まってほしくない。この条件ならRoutinesが第一候補です。ただしGitHubリポジトリと紐づく前提があるので、ローカルだけで完結する作業には使えません。
チームで結果を共有したい、既存のCI/CDパイプラインに乗せたい。ここはGitHub Actionsです。PRレビューやコミット履歴を扱う作業と相性がよく、実行のたびにリポジトリの最新状態を反映できます。
実行頻度が決め手になることもあります。1時間に複数回動かしたいならRoutinesは脱落。5分未満の間隔が必要ならGitHub Actionsも脱落。分単位で細かく回すなら、間隔に制約のないcronかlaunchdしか残りません。
この4つ以外にも、Linuxならsystemd timer、WindowsならタスクスケジューラとWSLの組み合わせ、実行頻度が高い場合や非エンジニアも触る運用ならn8nのようなワークフローツール、という選択肢があります。いずれもclaude -pを叩くという中身は変わりません。
サブスク契約のまま定期実行して規約違反にならないか
結論として、Claude Code本体のclaude -pと、公式のGitHub Actions連携でサブスクの認証を使う分には問題ありません。Agent SDKの公式ドキュメントが禁止しているのは、事前に承認されていないサードパーティ製品がclaude.aiのログインやレート制限をそのまま使うことです。非公式のツールにサブスクの認証トークンを渡す使い方がこれに該当します。公式のCLIやGitHub Actionsで自動化すること自体は、公式ドキュメントに正式な使い方として書かれています。
課金面でもう一つ押さえておきたい経緯があります。2026年6月15日、Anthropicはclaude -pやAgent SDK経由の利用を対話枠から切り離し、別建ての月次クレジットに移す変更を予告していました。ところがこの変更は施行当日に一時停止されています。公式ヘルプセンターにはこう明記されています。
"We're pausing the changes to Claude Agent SDK usage described below. For now, nothing has changed: Claude Agent SDK,
claude -p, and third-party app usage still draw from your subscription's usage limits."
「撤回」ではなく「一時停止」という表現である点に注意してください。Anthropicは計画を見直し中で、変更を出す際は事前告知するとしています。今後別の形で課金区分が変わる可能性は消えていません。
2026年8月時点で確認できる限り、この一時停止が解除されたという続報はありません。現状はclaude -pもRoutinesもGitHub Actions経由の利用も、対話セッションと同じサブスク利用枠を消費します。定期実行を組み始める前に、上記ヘルプセンター記事の最新版を一度確認しておくと安心です。


