Claude Codeの「ルーティン」機能で毎朝の定型作業を自動化した話

概要

今回はClaude Codeの「ルーティン」機能を使って、毎朝の定型作業をクラウド上でスケジュール自動実行する仕組みを組んだので紹介していきます。

普段Claude Codeにお願いしている定型作業があって、毎回「今日の分やって」と自分から声をかけないと動かないのが面倒でした(^^;
声をかけ忘れる日があると、そのままその日の分が抜け落ちてしまいます。

「毎日決まった時刻に勝手にやってくれたらいいのに」と思って調べたら、クラウド上でスケジュール実行できるルーティン機能があったので、これを使って自動化しました。

この記事では、その仕組みと実際の設定手順を、汎用的な例(毎朝AI関連ニュースを収集してまとめ、gitにコミットする)を交えて紹介します!

それではやっていきましょう!

目次

きっかけ

普段Claude Codeにお願いしている定型作業は、毎回自分から「今日の分やって」と話しかけて初めて動くタイプのものでした。
ただ声をかけ忘れた日はそのままその日の分が抜けるので、流石によろしくない運用になっていたんですよね。

本業が忙しくて出来ないこともよくありますし…
旅行とかで出来ないこともよくあります(- -

だったら決まった時刻に自動で動いてほしいわけで、そこで見つけたのが今回紹介するルーティン(Routines)機能です。

全体像

普通にClaude Codeを使うときは、自分のPC上でチャットしながら会話的に作業してもらいます。
今回使ったのはそれとは別の仕組みで、次のような形の「無人実行専用のClaude Code」を作る、というイメージです。

  • 決まったスケジュール(cron)で
    • 実行タイミングは5フィールドcron式で指定
  • クラウド上の隔離された環境で
    • PCの電源が入っていなくても決まった時刻になれば動く
  • 指定したGitHubリポジトリをチェックアウトして
    • 対象リポジトリはjob_configで指定
  • プロンプトで指示した作業を自律的にこなし
    • 会話の続きではなく、そのプロンプト単体で完結する内容にする必要がある
  • 終わったら結果をcommit & pushする
    • 最終的な成果物はリポジトリへの反映という形で残る

図にするとこんな流れです。

Claude Codeルーティンの処理フロー(cron起動→クラウドセッション起動→checkout→生成→push)
Claude Codeルーティンの処理フロー図 cron起動からクラウドセッション起動 指定リポジトリのgit checkout プロンプト通りの生成 git commitとpushまでの5ステップ

要はバッチ処理です(^^

使ったもの

Claude Codeの「ルーティン(Routines)」という機能です。
裏側はRemoteTriggerという仕組みで、名前・実行スケジュール・何をするかの中身を渡すとスケジュール実行ジョブを作れます(各項目の詳細は後述の「4. 実際の設定」でまとめて説明します)。

イメージとしては「毎朝9時にこのリポジトリを開いて、このプロンプト通りに作業して、終わったらpushして」という設定を1回作っておく感じです。

手順(例:「毎朝AIニュースを収集してまとめ、gitにコミットする」ルーティン)

ここでは例として、「毎朝AI関連ニュースをWeb検索で収集し、要約をMarkdownにまとめてnews/フォルダに書き出し、commit & pushする」ルーティンを作る想定で説明します。
(結構色々汎用が効くので、色々試してみるといいと思います!)

1. 目的を決める

毎朝自分でニュースサイトを巡回しなくても、起きたら「今日のAIニュースまとめ」が最新化されている状態にしたい

2. プロンプトを書く(ここが一番大事)

クラウド側のClaudeは会話の文脈をゼロから持ちません
そのため、プロンプトは自己完結させる必要があります。
今回学んだコツは以下の3つです。

  • 何を調べて、何を基準にまとめるかを明記する
    • 検索キーワード・対象期間・取り上げる件数など
  • 重複実行・誤生成を防ぐガードを入れる
    • 「今日の分が既にあれば何もしない」といった判定
  • やっていいことの範囲を明示的に区切る
    • 「まとめの生成とpush以外はしない。他のファイルは触らない」など

例文(イメージ)です。

プロンプト例

1
2
3
4
5
6
7
8
9
10
毎朝のAIニュース収集をお願いします。手順は以下の通りです。

1. WebSearchで直近24時間の生成AI・LLM関連ニュースを検索する
(キーワード例: "AI", "LLM", "Anthropic", "OpenAI", "Claude" など)。
2. news/YYYY-MM-DD-ai-news.md が既に存在する場合は何もせず終了する(重複防止)。
3. 存在しなければ、信頼できそうな情報源を中心に重要なニュースを5〜8件選び、
見出し・2〜3行の要約・出典リンクの形式でnews/YYYY-MM-DD-ai-news.mdに書き出す。
4. 生成したファイルをgit add・commit(例: "daily AI news: YYYY-MM-DD")し、
origin/main にpushする。
5. ニュースまとめの生成とpush以外の操作(他ファイルの編集、SNS投稿など)は一切行わない。

3. スケジュールを設定する(タイムゾーンに注意)

cronはUTC基準です。
日本時間で「毎朝8時」にしたい場合は、UTCでは前日23時になります(JST = UTC+9)。

UTC変換の例

1
2
JST 08:00 → UTC 23:00(前日)
cron式: 0 23 * * *
最小実行間隔は1時間なので、「30分ごと」のような設定はできません。

4. 実際の設定(RemoteTriggerのcreateリクエスト例)

routine_create_request.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
"name": "daily AI news digest",
"cron_expression": "0 23 * * *",
"enabled": true,
"job_config": {
"ccr": {
"environment_id": "env_xxxxxxxxxxxx",
"session_context": {
"model": "claude-sonnet-5",
"sources": [
{ "git_repository": { "url": "https://github.com/your-org/your-repo" } }
],
"allowed_tools": ["Bash", "Read", "Write", "Glob", "Grep", "WebSearch"]
},
"events": [
{
"data": {
"uuid": "(v4 UUIDを発行)",
"session_id": "",
"type": "user",
"parent_tool_use_id": null,
"message": {
"role": "user",
"content": "(上で書いたプロンプト本文)"
}
}
}
]
}
}
}

各項目の意味は以下のとおりです。

  • name
    • ルーティン管理画面に表示される名前。複数のルーティンを見分けるためのラベル
  • cron_expression
    • 実行スケジュールを表す5フィールドのcron式(UTC基準
  • enabled
    • trueで有効化。falseにしておくと設定を残したまま一時停止できる
  • job_config.ccr.environment_id
    • どの実行環境で動かすかを指定するID。事前にクラウド側で作成しておいた環境を指す
  • job_config.ccr.session_context.model
    • 実行に使うモデル名
  • job_config.ccr.session_context.sources
    • チェックアウト対象のGitHubリポジトリ一覧。git_repository.urlにリポジトリURLを指定する
  • job_config.ccr.session_context.allowed_tools
    • クラウド側のClaudeに使わせるツールの許可リスト。ここに無いツールは実行時に使えない
  • job_config.ccr.events
    • セッション開始時に最初に投げるメッセージの配列
    • data.type"user"固定(ユーザー発話であることを示す)、data.message.contentに実際のプロンプト本文を入れる
    • data.uuidはイベントごとに発行するv4 UUID、data.session_idは新規セッションなので空文字、data.parent_tool_use_idはトップレベルのメッセージなのでnullにする

作成に成功するとnext_run_atに次回実行予定時刻(UTC)が返ってくるので、JSTに変換して意図通りか必ず確認します

5. 結果の確認方法

クラウド実行はローカルPCとは別物なので、結果はGitHub側(Web・モバイルアプリ)で見に行きます。
news/フォルダに毎朝新しいファイルが増え、commit履歴に自動生成コミットが積まれていればOKです。

ハマった・気をつけたポイント

  • タイムゾーンはUTC基準
    • JSTで考えたい時刻は必ず変換する(8:00 JST → 23:00 UTC前日)
  • 最小実行間隔は1時間
    • 数分〜数十分おきの高頻度実行はできない
  • クラウド実行はGitHub上のリポジトリ状態しか見ない
    • ローカルで作業中の未push分は存在しないものとして扱われるので、自動化を始める前に一度ローカルの変更をpushして同期させておく必要がある
  • 二重実行・誤生成ガードは自分でプロンプトに書く
    • 「既にファイルがあれば何もしない」のような判定を入れないと、実行のたびに重複生成される
  • 情報収集系はソースの質にブレが出やすい
    • 「信頼できそうな情報源を優先」くらいの緩い指示だけだと拾ってくる記事の質が揺れるので、必要なら対象ドメインを絞るなど条件を強めるとよい
  • やっていい範囲を明示的に絞る
    • 「このファイルだけ触っていい」「このアクションは絶対にしない」まで書いておくと、意図しない操作を防げる

実際の実行結果を反映する行為(今回で言う外部への発信など、外部に影響する最終アクション)は自動化の対象から意図的に外しました
生成とpushまでを自動化し、最後の一手はレビューを挟んで人間が行う設計にしています。

品質管理はやっぱり人がやらないと今のAIだと厳しい印象です(^^

まとめ

今回はClaude Codeのクラウドルーティンを使って、毎回自分から頼まないと動かない定型作業をスケジュール実行に切り出す方法を紹介しました。

ポイントをおさらいすると以下のとおりです。

  • プロンプトを自己完結させる
    • 文脈をゼロから渡すつもりで書く
  • 重複防止・範囲限定のガードを必ず入れる
    • 「既にあれば何もしない」「このファイルだけ触る」を明記する
  • UTC⇄JSTの変換を確認する
    • next_run_atが返ってきたらJSTに直して意図通りか見る
  • 最終アクションは自動化に含めず、人間の確認ステップを残す
    • 投稿・削除・通知送信など不可逆・対外的なものは対象外にする

この形なら、日々のちょっとした定型作業をいくつも無人化していけそうです。
完全無人とは行かなくても、色々遊べそうな機能ですよね!

以上となります。
claudeは3000円くらいでいっぱい遊べるので最高です(^^
それではお疲れさまでした。