この記事の要点
- 定期 Agent には「マシンが眠らない・プロセスが再起動できる・ログが監査可能」の 3 点が必要——ローカル Mac では難しく、リモート Mac M4 が適する。
- launchd は macOS ネイティブのオーケストレーション層:
StartCalendarIntervalで cron 代替、KeepAliveで常駐、ThrottleIntervalでクラッシュループ防止。 - MCP トリガー は Curated tools + n8n Webhook ゲートウェイを推奨。MCP ポートを丸ごとインターネットに晒さない。
- 並列コーディング Agent はworktree 並列記事、ディスク管理はRunner ディスク/inode 計画を参照。
- 推奨パス:日次 PoC で launchd + 初回 MCP タスクを通す → 週次でスプリント固定 → 指標安定後に月次常駐。
- メッセージ型 OpenClaw Gateway とバッチ型 CLI 定期 Agent は役割が異なり、本稿では 18789 デプロイ骨格は繰り返さない。

1. 2026 年、なぜ定期 Agent をリモート Mac に置くのか
2026 年、Cursor Automations、n8n MCP オーケストレーション、Codex CLI の remote-control などにより、「一定間隔で Agent を 1 周回す」ワークロードはデモから課金対象 workload へ移行しつつあります。しかし実行面は依然 macOS 上です。launchd はローカルプロセスしかスケジュールできず、Seatbelt と Keychain が未宣言のツールアクセスを遮断します。ローカル Mac はスリープ、Wi‑Fi 切替、OS アップデート再起動でタスクを失いやすい。
定期 Agent を リモート Mac M4 ホスティングノードに置くことは、実質 3 つを買うことです:① 7×24 オンラインと制御可能な再起動;② LLM/MCP API への低 RTT(アジア太平洋または米東を選択);③ 日次/週次/月次の弾力性——PoC 失敗時に解放でき、実験用に物理機を買う必要がない。
本稿の主軸は「定期/イベントトリガー + MCP オーケストレーション」であり、git worktree ファーム(別記事で扱う)ではありません。OpenClaw ゲートウェイ、18789 コールドスタート、Tunnel+MCP は境界節で対照のみ、本文では繰り返しません。
2. SSH 開通と launchd/crnd 環境:30 分検収チェックリスト
リモート Mac M4 開通後、最初の LaunchAgent をロードする前に 30 分以内で次を完了することを推奨します。SSH 接続の詳細はヘルプセンターを参照。
- 鍵認証 SSH ログイン、
uname -mが arm64、タイムゾーンと NTP が正しい。 - Homebrew、Node 22(Agent CLI 常用)、排障用
tmuxまたはscreenをインストール。 - ディレクトリ作成:
~/agent-runs/state、~/agent-runs/logs、~/agent-runs/scripts。 - API Key を
~/.config/agent/envに書き込み(権限 600)。LaunchAgent はEnvironmentVariablesで注入し、plist に直書きしない。 - 手動で
crnd scheduleまたはlaunchdテストタスクを 1 本実行し、ログがディスクに落ちることを確認。 - マシンから
curlで LLM/MCP エンドポイントへ到達し RTT を記録。Webhook コールバックはファイアウォールとインバウンド方針を確認。
すべて通過してから PoC レンタル期間を決める。どれか 1 つでも失敗したら、週次/月次へ上げない。
3. launchd LaunchAgent トポロジ
macOS ではユーザーレベルの定期タスクを ~/Library/LaunchAgents/ に置き、launchctl bootstrap gui/$(id -u) でロードします(Ventura 以降は旧式 load より bootstrap を推奨)。
| モード | 適用シーン | 利点 | 注意点 |
|---|---|---|---|
| launchd 直調スクリプト | 固定間隔/カレンダー、単一リポジトリのバッチ | 依存ゼロ、OS ネイティブ、ログが明瞭 | plist に ThrottleInterval を手書き |
| crnd / agent-reveille | 複数 Agent、自然言語スケジュール | CLI フレンドリー、バージョン管理しやすい | 下層は launchd/cron 依存 |
| n8n + MCP Webhook | クロスシステムオーケストレーション、人手承認ノード | Curated tools、リトライとアラート | 1 ホップ遅延、インバウンドセキュリティ要 |
典型的な LaunchAgent フィールド:
StartCalendarInterval:日/時/分でトリガー、cron 代替。KeepAlive:プロセス終了後に再起動。ThrottleIntervalと併用してクラッシュループ防止。StandardOutPath/StandardErrorPath:ログ必須。未設定だと排障は推測のみ。
<?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.kvmboot.agent.codex-batch</string>
<key>ProgramArguments</key><array>
<string>/bin/zsh</string><string>-lc</string>
<string>source ~/.config/agent/env && ~/agent-runs/scripts/run-codex-batch.sh</string>
</array>
<key>StartCalendarInterval</key><dict>
<key>Minute</key><integer>0</integer><key>Hour</key><integer>*/1</integer>
</dict>
<key>ThrottleInterval</key><integer>300</integer>
<key>StandardOutPath</key><string>/Users/runner/agent-runs/logs/codex.out.log</string>
<key>StandardErrorPath</key><string>/Users/runner/agent-runs/logs/codex.err.log</string>
</dict></plist>ロード:launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.kvmboot.agent.codex-batch.plist。アンロードは同パスで bootout。
4. MCP / n8n Webhook トリガーチェーンと Curated tools
MCP トリガー の典型ルートは 2 つ:Agent CLI が MCP Server に直結(イントラまたは SSH トンネル内向け)、または n8n/Cursor Automations が Webhook 経由でリモート Runner 上のスクリプトを呼ぶ(承認・リトライ・アラートが要るフロー向け)。
セキュリティ境界の推奨:
- Curated tools のみ(ホワイトリストのファイル読書、固定 API)。shell MCP を無制限にインターネット公開しない。
- Webhook インバウンドは HMAC / 短寿命 token で検証。冪等キーを
state/runsに書き二重トリガーを防ぐ。 - タイムアウトとリトライ:LLM 呼び出しに hard timeout。失敗は指数バックオフ。launchd と Webhook の二重トリガー雪崩を避ける。
2026 年の Mattermost + n8n + MCP 事例は、オーケストレーション層が n8n、実行層が macOS Runner であることを示す——本稿の launchd 直調と共存可能。チームが既に n8n を持つかで選ぶ。
5. Claude Code / Codex CLI 定期タスクテンプレート
Claude Code と Codex CLI は非対話モードでバッチ実行可能。要点は AGENTS.md、作業ディレクトリ、env 注入を launchd 環境と手動 SSH で一致させること。
#!/bin/zsh set -euo pipefail cd ~/projects/my-repo export CODEX_API_KEY="$(grep CODEX_API_KEY ~/.config/agent/env | cut -d= -f2-)" /usr/local/bin/codex exec --prompt-file ~/agent-runs/prompts/nightly-review.md \ >> ~/agent-runs/logs/codex-$(date +%Y%m%d).log 2>&1
agent-reveille / crnd 利用時:reveille add "0 9 * * 1-5" -- codex exec ... でスケジュールを素早く試し、安定後に plist をエクスポートして IaC に取り込む。
worktree 並列 Agentと組み合わせる場合:定期タスクは「マージ/Review」系バッチ、対話型コーディングは worktree 分離——単一ディレクトリのロック競合を避ける。
6. ログ、秘密鍵、ストレージ計画
Agent 長期運用後、state/runs、モデルキャッシュ、npm/pnpm store が急速にディスクを占める。経験値(SLA ではない):軽量文案 Agent なら 512 GB で数週間;ローカル Ollama や大量 artifact 付きなら 512 GB は 2–4 週で逼迫しうる。
- ログローテーション:
log rotateまたは日次分割。単一ファイルが inode を圧迫しないように。 - 秘密鍵は Keychain または 600 権限 env のみ。LaunchAgent の
ProgramArgumentsに token 平文を書かない。 - ディスク 80% アラート時は runs キャッシュを優先削除し、それでも足りなければ容量拡張または2 台目並列 Runnerを検討。
メモリ面:純 API 呼び出し型 Agent なら 16 GB で通常十分。同機で Ollama 7B+ や Claude Code 並列なら swap とメモリスパイク管理に注意。必要なら 24 GB へ上げるかマシン分割。
7. タスク頻度 × レンタル期間:意思決定マトリクスと移行チェック表
| タスク特性 | ストレージ圧力 | 推奨レンタル | 移行条件 |
|---|---|---|---|
| 毎時軽量 MCP | 低(<5 GB/週) | 日次 PoC → 月次 | 7 日連続失敗なし、ログ監査可能 |
| 毎日 Codex 全リポジトリ Review | 中(10–30 GB/週) | 週次 → 月次 | ディスク <70%、RTT 安定 |
| 複数 Agent + ローカルモデル | 高(>50 GB/週) | 週次 + 512GB→1TB | 2 台目並列を検討 |
価格はプラン一覧とコンソールを正とする。推奨順:日次 PoC(1–3 日、launchd + MCP 初タスクを通す)→ 週次でイテレーションスプリント固定 → 2 週連続指標安定後に月次常駐。PoC チェックリスト:
- LaunchAgent ロード成功、再起動後も自動起動。
- Webhook/MCP エンドツーエンド成功が 1 回以上、state に冪等記録あり。
- 24h ログに未捕捉 panic なし。ディスク/inode 増分が許容範囲。
- API RTT とエラー率がチーム閾値内(米東/アジア太平洋は workload でノード選択)。
8. OpenClaw Gateway との境界(対照)
OpenClaw はメッセージ型ゲートウェイに強い:18789 対外、Tunnel+Webhook、多チャネルインバウンド。本稿の 定期 Agent はバッチ CLI:launchd トリガー、常駐 HTTP ポートなし、cron 型タスク向け。同一 リモート Mac M4 に共存可だが、アカウント/ディレクトリで分離。ゲートウェイデプロイは OpenClaw コラム参照、本稿では展開しない。
9. トラブルシュート FAQ
plist ロード失敗? plutil -lint で XML 検証。Label 一意性確認。Ventura+ は load ではなく bootstrap。
launchctl bootstrap が I/O error? 先に同名 job を bootout。plist が LaunchAgents にありパスに空白問題がないか確認。
タスクは動くがログなし? StandardOutPath の親ディレクトリ存在と実行ユーザーの書き込み権限を確認。
KeepAlive が狂った再起動? ThrottleInterval を増やす。スクリプト内 set -e 前に trap。秒退するスクリプトを疑う。
Seatbelt / Keychain が CLI を遮断? 初回は対話 SSH で Keychain 承認。LaunchAgent 環境にログイン shell と同じ PATH と HOME が必要。
MCP タイムアウト? tools 数を制限、timeout 引き上げ、Runner を API に近いリージョンへ移す。
Webhook 二重トリガー? 冪等キーを state/runs に。n8n 側で dedupe。
Ollama ローカル推論 OOM? より小さいモデル、並列制限、またはメモリプランのアップ/2 台目 Runner。
いつ 2 台目並列を足す? 単一ディスク 80%+ で削除が無効、または CPU 長時間 >85% でタスク shard 可能なとき。
日次 PoC 最短どれくらい? 24h 定期周期 + 人手 Webhook トリガー 1 回をカバー。
worktree 並列記事との分担? 本稿は「いつ走らせるか」;worktree 記事は「どこで・どう並列コーディングするか」。
OpenClaw か launchd か? メッセージ/ゲートウェイは OpenClaw;cron/バッチは launchd。FAQ トーン:SLA 約束なし、PoC 実測を正とする。
クラウド Mac mini で安定した定期 Agent を
M4 専有、低待機電力、macOS ネイティブ launchd は、Windows タスクスケジューラや Linux cron より Claude Code / Codex CLI チェーンに適合します。アジア太平洋/米東ノード選択可、SSH 即利用、7×24 無人運用はローカル Mac のフタ開閉に依存しません。上記 PoC チェックリスト通過後にレンタル期間を確定すれば、自前ワークステーション + 電気代 + 運用工数より総合コストが低くなりやすい。
まず日次で対象リージョンに launchd + 初回 MCP トリガータスクを検収—— レンタルプランを比較、 メモリとストレージを確認、 SSH 接続を見る、または フロントページから注文前セルフチェック。実践記事は ブログへ。