Promo

2026 — Agent planifié sur Mac distant : orchestration launchd, déclencheurs MCP et validation de bail

Blog Workflow agent
2026-05-24 Environ 8 min de lecture

Faire tourner des agents planifiés 7×24 sur un Mac M4 distant, c’est d’abord gérer veille, coupures réseau et limites Seatbelt — bien avant le choix du modèle. Ce guide centre launchd et les déclencheurs MCP, avec des modèles reproductibles Claude Code / Codex CLI et un parcours PoC journalier avant de verrouiller un bail mensuel — volontairement distinct des articles worktree parallèle et passerelle OpenClaw.

Points clés

  1. 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.
  2. launchd est l’orchestration native macOS : StartCalendarInterval remplace cron, KeepAlive maintient les daemons, ThrottleInterval évite les boucles de crash.
  3. Les déclencheurs MCP doivent passer par des outils curated et une passerelle webhook n8n — ne jamais exposer chaque port MCP sur Internet.
  4. Pour les agents de codage parallèles, voir notre guide worktree parallèle ; pour le disque, gouvernance disque et inodes du runner.
  5. Parcours recommandé : PoC journalier pour valider launchd + premier job MCP → sprint hebdomadairemensuel quand les métriques tiennent.
  6. 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.
Poste de travail Mac M4 distant avec orchestration launchd et automatisation MCP
La valeur d’un agent planifié, ce sont des exécutions non assistées reproductibles — pas un échec silencieux quand le capot du portable se ferme.

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.

  1. Connexion SSH par clé ; uname -m renvoie arm64 ; fuseau horaire et NTP corrects.
  2. Installer Homebrew, Node 22 (courant pour les CLI agent) et tmux ou screen pour le dépannage.
  3. Créer ~/agent-runs/state, ~/agent-runs/logs, ~/agent-runs/scripts.
  4. Stocker les clés API dans ~/.config/agent/env (mode 600) ; les injecter via EnvironmentVariables du LaunchAgent — jamais en dur dans le plist.
  5. Lancer un crnd schedule ou un job launchd de test à la main et confirmer l’écriture des logs sur disque.
  6. curl vers 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).

ModeIdéal pourAvantagesPoints d’attention
Script direct launchdIntervalles/calendrier fixes, lot mono-dépôtZéro dépendance, natif, logs clairsÉcrire ThrottleInterval à la main dans le plist
crnd / agent-reveilleBeaucoup d’agents, horaires en langage naturelConvivial en CLI, versionnableRepose toujours sur launchd/cron
n8n + webhook MCPFlux inter-systèmes, étapes d’approbation humaineOutils curated, retries, alertesLatence supplémentaire ; sécurité entrante

Clés LaunchAgent typiques :

  • StartCalendarInterval : déclenchements jour/heure/minute — remplacement du crontab.
  • KeepAlive : redémarrage à la sortie ; coupler avec ThrottleInterval contre les boucles de crash.
  • StandardOutPath / StandardErrorPath : obligatoires — sans logs, vous devinez.
Exemple LaunchAgent (lot Codex horaire)
<?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.

run-codex-batch.sh (esquisse)
#!/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

ChargePression stockageBail suggéréUpgrade quand
MCP léger horaireFaible (<5 Go/semaine)PoC journalier → mensuel7 jours propres, logs auditables
Revue Codex quotidienne dépôt entierMoyenne (10–30 Go/semaine)Hebdo → mensuelDisque <70 %, RTT stable
Multi-agents + modèles locauxÉlevée (>50 Go/semaine)Hebdo + 512 Go→1 ToEnvisager 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 hebdomadairemensuel après deux semaines stables. Checklist PoC :

  1. Le LaunchAgent se charge et survit au redémarrage.
  2. Au moins un succès bout-en-bout webhook/MCP avec état idempotent.
  3. 24 h de logs sans panic non géré ; croissance disque/inodes acceptable.
  4. 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 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 MCPcomparer 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.