Points clés
- Les agents planifiés exigent du matériel toujours allumé, des processus redémarrables et des journaux auditables — difficile sur un portable en veille, naturel sur un Mac M4 distant.
- launchd est l’orchestration native macOS :
StartCalendarIntervalremplace cron,KeepAlivemaintient les daemons,ThrottleIntervalévite les boucles de crash. - Les déclencheurs MCP doivent passer par des outils curated et une passerelle webhook n8n — ne jamais exposer chaque port MCP sur Internet.
- Pour les agents de codage parallèles, voir notre guide worktree parallèle ; pour le disque, gouvernance disque et inodes du runner.
- Parcours recommandé : PoC journalier pour valider launchd + premier job MCP → sprint hebdomadaire → mensuel quand les métriques tiennent.
- La passerelle OpenClaw et les agents CLI planifiés par lots sont des métiers différents — ce billet ne répète pas le déploiement du port 18789.

1. Pourquoi placer les agents planifiés sur un Mac distant en 2026
Cursor Automations, l’orchestration MCP via n8n et le remote-control de Codex CLI en 2026 transforment « lancer un agent à heure fixe » en charge facturable. L’exécution reste sur macOS : launchd ne planifie que des processus locaux, Seatbelt et le trousseau bloquent les outils non déclarés, et un Mac local perd des jobs à cause de la veille, des bascules Wi‑Fi et des redémarrages de mise à jour.
Héberger un agent planifié sur un Mac M4 distant apporte trois choses : ① disponibilité 7×24 avec redémarrages contrôlés ; ② RTT plus bas vers les API LLM/MCP (APAC ou US Est) ; ③ baux journaliers / hebdomadaires / mensuels élastiques pour libérer un PoC raté sans acheter du matériel.
Cet article porte sur les déclencheurs planifiés/événementiels et l’orchestration MCP, pas sur les fermes git worktree (traitées ailleurs). La passerelle OpenClaw, le port 18789, le démarrage à froid et tunnel+MCP n’apparaissent qu’en note de frontière — sans répétition du déploiement.
2. Provisionnement SSH et environnement launchd/crnd : checklist 30 minutes
Après provisionnement d’un Mac M4 distant, terminez les points ci-dessous en 30 minutes avant de charger votre premier LaunchAgent. Les détails SSH sont dans le centre d’aide.
- Connexion SSH par clé ;
uname -mrenvoie arm64 ; fuseau horaire et NTP corrects. - Installer Homebrew, Node 22 (courant pour les CLI agent) et
tmuxouscreenpour le dépannage. - Créer
~/agent-runs/state,~/agent-runs/logs,~/agent-runs/scripts. - Stocker les clés API dans
~/.config/agent/env(mode 600) ; les injecter viaEnvironmentVariablesdu LaunchAgent — jamais en dur dans le plist. - Lancer un
crnd scheduleou un job launchd de test à la main et confirmer l’écriture des logs sur disque. curlvers vos endpoints LLM/MCP depuis la machine et noter le RTT ; vérifier le pare-feu pour les callbacks webhook.
Choisissez ensuite la durée de bail PoC. Si une étape échoue, ne passez pas encore à l’hebdomadaire ou au mensuel.
3. Topologie LaunchAgent launchd
Les tâches planifiées au niveau utilisateur vont dans ~/Library/LaunchAgents/, chargées avec launchctl bootstrap gui/$(id -u) (Ventura et plus — préférer bootstrap à l’ancien load).
| Mode | Idéal pour | Avantages | Points d’attention |
|---|---|---|---|
| Script direct launchd | Intervalles/calendrier fixes, lot mono-dépôt | Zéro dépendance, natif, logs clairs | Écrire ThrottleInterval à la main dans le plist |
| crnd / agent-reveille | Beaucoup d’agents, horaires en langage naturel | Convivial en CLI, versionnable | Repose toujours sur launchd/cron |
| n8n + webhook MCP | Flux inter-systèmes, étapes d’approbation humaine | Outils curated, retries, alertes | Latence supplémentaire ; sécurité entrante |
Clés LaunchAgent typiques :
StartCalendarInterval: déclenchements jour/heure/minute — remplacement du crontab.KeepAlive: redémarrage à la sortie ; coupler avecThrottleIntervalcontre les boucles de crash.StandardOutPath/StandardErrorPath: obligatoires — sans logs, vous devinez.
<?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>Chargement : launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.kvmboot.agent.codex-batch.plist. Déchargement avec bootout sur le même chemin.
4. Chaîne de déclenchement MCP / webhook n8n et outils curated
Les déclencheurs MCP empruntent en général l’un de ces chemins : le CLI agent se connecte directement à un serveur MCP (dans le VPN ou un tunnel SSH), ou n8n/Cursor Automations appelle un webhook qui exécute des scripts sur le runner distant (quand il faut approbation, retries et alertes).
Périmètres de sécurité :
- N’exposer que des outils curated — E/S fichier sur liste blanche et API fixes. Ne jamais mettre un MCP shell sans restriction sur Internet.
- Valider les webhooks entrants avec HMAC ou jetons à courte durée ; écrire des clés d’idempotence dans
state/runs. - Timeouts stricts sur les appels LLM ; backoff exponentiel en échec pour éviter les tempêtes double launchd + webhook.
Les retours d’expérience 2026 Mattermost + n8n + MCP montrent l’orchestration dans n8n et l’exécution sur des runners macOS — compatible avec les appels launchd directs ; choisissez selon que vous exploitez déjà n8n.
5. Modèles de tâches planifiées Claude Code / Codex CLI
Claude Code et Codex CLI supportent tous deux des exécutions batch non interactives. Gardez AGENTS.md, le répertoire de travail et l’injection d’environnement identiques pour que launchd reproduise le résultat d’un SSH manuel.
#!/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
Avec agent-reveille / crnd : reveille add "0 9 * * 1-5" -- codex exec ... pour expérimenter vite ; exportez un plist en IaC une fois stable.
À coupler avec notre workflow agents parallèles worktree : les jobs planifiés gèrent les lots merge/review ; le codage interactif reste dans les worktrees pour éviter les verrous de répertoire.
6. Journaux, secrets et planification stockage
Les agents de longue durée remplissent vite state/runs, les caches modèle et les stores npm/pnpm. Fourchettes indicatives (pas de SLA) : agents légers de copie peuvent tenir des semaines sur 512 Go ; Ollama local ou artefacts lourds peuvent saturer 512 Go en 2–4 semaines.
- Rotation des logs — découpage journalier ou logrotate — pour qu’un seul fichier n’épuise pas les inodes.
- Secrets uniquement dans le trousseau ou des fichiers env en 600 ; jamais de jetons en clair dans
ProgramArguments. - À 80 % de disque, purger d’abord les caches de runs, puis agrandir le stockage ou ajouter un second runner parallèle.
Mémoire : les agents API-only tiennent souvent en 16 Go ; Ollama 7B+ ou Claude Code parallèle demandent de surveiller le swap et la gouvernance des pics mémoire — passer à 24 Go ou répartir les charges.
7. Fréquence des tâches × bail : matrice de décision et checklist de migration
| Charge | Pression stockage | Bail suggéré | Upgrade quand |
|---|---|---|---|
| MCP léger horaire | Faible (<5 Go/semaine) | PoC journalier → mensuel | 7 jours propres, logs auditables |
| Revue Codex quotidienne dépôt entier | Moyenne (10–30 Go/semaine) | Hebdo → mensuel | Disque <70 %, RTT stable |
| Multi-agents + modèles locaux | Élevée (>50 Go/semaine) | Hebdo + 512 Go→1 To | Envisager un second runner parallèle |
Tarifs selon la page forfaits et la console. Séquence : PoC journalier (1–3 jours, launchd + premier job MCP) → sprint hebdomadaire → mensuel après deux semaines stables. Checklist PoC :
- Le LaunchAgent se charge et survit au redémarrage.
- Au moins un succès bout-en-bout webhook/MCP avec état idempotent.
- 24 h de logs sans panic non géré ; croissance disque/inodes acceptable.
- RTT API et taux d’erreur dans les seuils de l’équipe (choisir APAC ou US Est pour la charge).
8. Frontière avec la passerelle OpenClaw (contraste uniquement)
OpenClaw excelle sur les passerelles de messages : 18789 public, tunnel+webhook, entrées multi-canal. L’agent planifié de cet article est un CLI par lots — déclenchements launchd (pas de port HTTP toujours ouvert), idéal pour les jobs façon cron. Les deux peuvent partager un Mac M4 distant avec comptes et répertoires séparés. Voir la colonne OpenClaw pour le déploiement passerelle ; non développé ici.
9. FAQ dépannage
Le plist ne se charge pas ? Lancez plutil -lint ; assurez un Label unique ; sur Ventura+, utilisez bootstrap, pas load.
launchctl bootstrap erreur I/O ? bootout le même job d’abord ; confirmez le plist sous LaunchAgents et des chemins sans espaces parasites.
Le job tourne mais pas de logs ? Vérifiez que le parent de StandardOutPath existe et que l’utilisateur d’exécution peut écrire.
Boucle de redémarrage KeepAlive ? Augmentez ThrottleInterval ; ajoutez des traps avant set -e ; vérifiez que le script ne sort pas instantanément.
Seatbelt / trousseau bloque le CLI ? Autorisez le trousseau une fois en SSH interactif ; le LaunchAgent a besoin du même PATH et HOME que votre shell de connexion.
Timeouts MCP ? Limitez le nombre d’outils, augmentez le timeout, rapprochez le runner de la région API.
Doublons webhook ? Clés d’idempotence dans state/runs ; déduplication dans n8n.
OOM inférence Ollama locale ? Modèle plus petit, limitez la concurrence, montez la RAM ou scindez sur un second runner.
Quand ajouter un second runner parallèle ? Disque 80 %+ après nettoyage, ou CPU >85 % soutenu avec tâches shardables.
Durée minimale du PoC journalier ? Couvrir un cycle complet de planification 24 h plus un déclenchement webhook manuel.
Différence avec l’article worktree parallèle ? Ce billet porte sur quand les jobs tournent ; worktree sur où et le codage parallèle.
OpenClaw ou launchd ? Messages/passerelles → OpenClaw ; cron/lots → launchd. Pas de promesse SLA — validez par mesures PoC.
Des agents planifiés stables sur Mac mini cloud
Un M4 dédié, une consommation au repos faible et un launchd natif macOS conviennent mieux aux chaînes Claude Code / Codex CLI qu’au Planificateur de tâches Windows ou au cron Linux. Nœuds APAC et US Est, SSH prêt à l’emploi, exécutions 7×24 sans dépendre du capot de votre portable. Passez la checklist PoC ci-dessus avant de verrouiller la durée de bail — le coût total bat souvent l’achat d’une station plus l’électricité et le temps d’exploitation.
Commencez par un bail journalier dans votre région cible pour valider launchd + votre premier déclencheur MCP — comparer les paliers de bail, vérifier RAM et stockage, lire l’accès SSH, ou partir de l’accueil ; d’autres guides sur le blog.