「Claude Code、便利だな」 毎日そう思いながら、私はこうやって使っていました。 ターミナルを開く。Claude Codeを起動する。 「今日のニュースを集めて」と打つ。待つ。結果を見る。「これを記事にして」と打つ。待つ。デプロイする。 1日に何度もこれを繰り返していました。 ある日、気づきました。 私がやっている作業の8割は「Claude Codeを起動すること」だと。 ニュースの収集、記事の生成、サイトの更新、スケジュールの整理。全部Claude Codeがやってくれる。 でも「やって」と言うのは私。 毎回、私がMacの前に座って、ターミナルを開いて、命令を打つ。 AIが優秀になっても、起動ボタンを押す人間がボトルネックになっていたのです。
Claude Codeには、対話モードだけでなく 非対話モード があります。
claude -p "この指示を実行して"
-p フラグをつけると、Claude Codeは人間の入力を待たずに、指示を実行して終了します。
つまり、シェルスクリプトから呼べる。
シェルスクリプトから呼べるということは、macOSのlaunchdで定時実行できる。
定時実行できるということは——
寝ている間に、AIが勝手に仕事をしてくれる。
この発見で、私のClaude Codeの使い方は根本から変わりました。
現在、私のMacには 8つの自動エージェント が常駐しています。 朝起きてMacを開くと、こんな状態になっています。
7:00 スケジュール+ToDoがGmailに届く
7:23 SEO記事が1本、自動生成される
7:27 朝のブリーフィング(今日やるべきことの判断)
12:00 昼のニュース収集 → ランキング → 記事生成 → デプロイ
20:00 夜のニュース収集 → 同上
21:07 サイト改善レポート → 自動でカテゴリ補強・再デプロイ
常時 スケジュール変更を検知 → ダッシュボード自動更新
常時 Slackの未対応デザイン依頼を30分おきにチェック
「9つのエージェント」と聞くと大げさに聞こえますが、1つ1つの仕組みは単純です。 必要なのは3つだけ。
-p フラグ(AIに実行させる)
たとえば、毎日のニュース収集はこうなっています。#!/bin/bash
# Phase 1: Pythonでニュース収集(トークン消費ゼロ)
python3 brain_content.py rss --days 1
# 収集結果を確認
NEWS_COUNT=$(python3 brain_content.py rss --count)
# 0件ならここで終了(Claude Codeを起動しない=コスト0)
if [ "$NEWS_COUNT" -eq 0 ]; then
echo "新着ニュースなし。終了。"
exit 0
fi
# Phase 2: Claude Codeでランキング+判断
claude -p "raw_news.jsonを読んで重要度ランキング。S/A/B/Cで判定し、atoms.csvに転記して"
# Phase 3: Claude Codeで記事生成+デプロイ
claude -p "新規atomsからニュース記事を生成。事実確認→ビルド→デプロイ→git push"
ポイントは Phase 1のゲートキーパー機能 です。 Pythonがニュースを集め、0件ならスクリプトがそこで終了します。Claude Codeは起動すらしません。トークン消費ゼロ。 ニュースがあるときだけClaude Codeが起動し、「どれが重要か」「どう記事にするか」を判断する。固定処理はPython、判断はClaude Code。 この役割分担は前回の記事で書いた原則そのままです。
<?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.kawai.ainews.noon</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/kawai/brain/scripts/ai-news-collect.sh</string>
<string>noon</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>12</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>StandardOutPath</key>
<string>/Users/kawai/brain/logs/ainews_noon.log</string>
<key>StandardErrorPath</key>
<string>/Users/kawai/brain/logs/ainews_noon_error.log</string>
</dict>
</plist>
これだけです。
<strong>StartCalendarInterval</strong> で「毎日12時」を指定し、<strong>ProgramArguments</strong> でシェルスクリプトを呼ぶ。
macOSが勝手に起動してくれます。cronより信頼性が高く、Macがスリープから復帰したときに未実行分を補完してくれるのがlaunchdの強みです。
このplistを <strong>~/Library/LaunchAgents/</strong> に置いて、
launchctl load ~/Library/LaunchAgents/com.kawai.ainews.noon.plist
これで「毎日昼12時にニュースを自動収集するエージェント」が完成します。
同じ仕組みで、8つのエージェントを動かしています。
「Mac起動時」というトリガーがあるのに気づいたでしょうか。
launchdには <strong>RunAtLoad</strong> というオプションがあります。
これを使うと、Macにログインした瞬間にスクリプトが走ります。
<key>RunAtLoad</key>
<true/>
朝、Macを開く。コーヒーを淹れて戻ってくると、今日のブリーフィングが出来上がっている。
「今日は研修資料の更新を優先。午後にnote記事を1本。昨日のニュースで反応が良かったネタをXに展開」 Claude Codeが朝の時点で今日の全体像を整理してくれています。私はそれを見て「よし、これでいこう」と判断するだけ。
定時実行だけではありません。
launchdの <strong>KeepAlive</strong> を使うと、常時起動のプロセス を作れます。
私のダッシュボードシステムがこれです。
# watch.py(24行だけ)
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import subprocess, time
class Handler(FileSystemEventHandler):
def on_modified(self, event):
if event.src_path.endswith("SCHEDULE.md"):
subprocess.run(["python3", "generate.py"])
observer = Observer()
observer.schedule(Handler(), path=".", recursive=False)
observer.start()
while True:
time.sleep(1)
SCHEDULE.mdを編集するたびに、ダッシュボードのHTMLが自動再生成されます。カレンダー表示、ToDo一覧、今週の予定——全部リアルタイムで更新。
launchdの <strong>KeepAlive</strong> で常駐させているので、Macが再起動しても自動復帰します。
「cronでいいじゃん」と思うかもしれません。 実際、私も最初はcronを使っていました。 launchdに移行した理由は3つです。
cronはMacがスリープ中のジョブをスキップします。launchdは復帰後に実行してくれます。ノートPCの蓋を閉じて寝る人には、これが決定的です。
StandardOutPath を指定するだけで、実行ログがファイルに残ります。問題が起きたとき、ログを見れば一発で原因がわかる。
cronにはこの概念がありません。プロセスが死んだら自動再起動、という動きはlaunchdならではです。
まず、Claude Codeに普段やらせていることを1つ選んでください。「毎回同じ指示を出しているもの」がベストです。
#!/bin/bash
# my-daily-task.sh
claude -p "ここに普段の指示をそのまま書く"
これだけで、シェルスクリプトから実行可能になります。
<?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.yourname.daily-task</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/あなたのユーザー名/my-daily-task.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>7</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>StandardOutPath</key>
<string>/tmp/daily-task.log</string>
<key>StandardErrorPath</key>
<string>/tmp/daily-task-error.log</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin</string>
</dict>
</dict>
</plist>
# plistを配置
cp com.yourname.daily-task.plist ~/Library/LaunchAgents/
# 登録
launchctl load ~/Library/LaunchAgents/com.yourname.daily-task.plist
# 確認
launchctl list | grep yourname
これで、毎朝7時にClaude Codeが自動起動します。 ステップ4(上級):ゲートキーパーを追加する 最初はステップ3までで十分です。慣れてきたら、シェルスクリプトにPythonの前処理を追加してください。
#!/bin/bash
# 前処理(トークン0)
python3 prepare_data.py
# データがなければ終了(Claude Code起動しない)
if [ ! -s output.json ]; then exit 0; fi
# データがあるときだけClaude Codeを起動
claude -p "output.jsonを読んで処理して"
この「データがなければ起動しない」が、トークン代を劇的に下げるコツです。
launchdはユーザーのシェル環境を引き継ぎません。
<strong>claude</strong> コマンドや <strong>python3</strong> のフルパスを指定するか、<strong>EnvironmentVariables</strong> でPATHを明示してください。
<strong>StandardOutPath</strong> のディレクトリが存在しないと、ジョブ自体は動きますがログがサイレントに消えます。
問題の切り分けが不可能になるので、先にディレクトリを作っておくこと。
-p モードではエラーが起きても対話で修正できません。
指示は具体的に、かつ「失敗したらログに記録して終了」という設計にしておく。<strong>--max-turns</strong> フラグで無限ループも防げます。
claude -p --max-turns 20 "指示内容"
以前は、朝の最初の1時間が「ニュース集め→記事書き→デプロイ」のルーティンでした。毎日同じ作業。退屈だけど必要。 今は、朝の最初の1時間が「ブリーフィングを見て判断する」だけ。残りの時間を、研修の教材設計や、新しいコンテンツの企画に使えるようになりました。
自動化前:週に2〜3本のニュース記事 自動化後:毎日3回のニュース収集 + 毎日1本のSEO記事 + ダッシュボード常時更新 人間1人のアウトプットではありません。でも、動かしているのは私1人のMacです。
以前の私にとって、AIを使うとは「AIと対話すること」でした。
今は違います。AIを使うとは「AIが勝手に動く仕組みを作ること」です。
対話は設計時だけ。運用に入ったら、人間は判断だけをする。
Claude Codeは、対話ツールではありません。
自動化エンジンです。
-p フラグ1つで、それに変わります。
前回の記事で「PythonとClaude Codeの役割分担」を書きました。
今回は、その設計を「人間がいなくても動く」レベルに引き上げる方法です。
必要なのは、シェルスクリプトとplistファイル。どちらも数十行。
高度なインフラは要りません。あなたのMacが、すでにそのインフラです。
#AI #生成AI #AIエージェント #AI時代 #AI活用 #AI人材 #AI研修 #AIツール #デザイン #デザイナー