2026 — OpenClaw sur Mac physique distant : MCP en stdio et Streamable HTTP — tutoriel reproductible (spawn ENOENT, incompatibilité de version, timeouts d'outils + CLI + FAQ)
Les équipes qui font tourner OpenClaw sur des passerelles Mac physiques sans opérateur voient souvent trois échecs MCP : le spawn ENOENT en stdio à cause d'un PATH émondé, un décalage de version ou de type de contenu sur Streamable HTTP, et des appels d'outils qui dépassent les timeouts client ou serveur. Ce guide propose un déploiement en sept étapes, une matrice stdio vs HTTP, des fragments JSON MCP prêts à coller, des tableaux de dépannage, des seuils réutilisables pour vos docs SLO et une FAQ — pour reproduire les correctifs dans votre wiki interne.
1. Pourquoi MCP casse sur les passerelles Mac distantes
MCP (Model Context Protocol) n'est qu'un échange de messages structurés sur un transport. Sur un portable vous voyez l'échec tout de suite dans le terminal ; sur un Mac loué ou colocalisé, la passerelle tourne souvent sous launchd sans shell de connexion, avec un autre répertoire de travail et un PATH sans Homebrew ni shims Volta — les serveurs stdio échouent avant d'écrire une seule ligne de log.
- Dérive d'environnement — La session SSH charge
~/.zprofile; le démon non. Les commandes qui marchent en SSH déclenchent encorespawn ENOENTsous la passerelle. - Transport inadapté — Les points de terminaison Streamable HTTP et de style SSE exigent des révisions de protocole alignées, des en-têtes
Acceptet un comportement TLS cohérent. Un reverse proxy qui tamponne ou retire des en-têtes se manifeste par « incompatibilité de version » ou 406 — pas par un simple « réseau coupé ». - Timeouts superposés — Le client modèle, la passerelle OpenClaw, le serveur MCP et l'outil sous-jacent appliquent chacun des délais différents. N'en augmenter qu'une seule masque le bug et laisse des jobs bloqués sur des nœuds physiques partagés.
Pour standardiser plusieurs régions et comparer le TCO des nœuds physiques, croisez ce runbook avec notre 2026 : équipes Apple transfrontalières — Mac mini ou nœuds distants multi-régions ? TCO 3 ans et gouvernance du parc Mac (tableau).
2. stdio vs Streamable HTTP : quel transport choisir ?
Choisissez le transport qui minimise les pièces mobiles sur l'hôte, puis passez à HTTP lorsqu'il faut partager un serveur ou terminer l'authentification au proxy.
| Critère | Serveur MCP stdio | Serveur MCP Streamable HTTP |
|---|---|---|
| Rayon d'explosion en cas d'échec | Processus enfant isolé ; la passerelle peut redémarrer un serveur. | Port et certificat TLS partagés ; une mauvaise config impacte toutes les URL. |
| Sensibilité PATH / cwd | Élevée — ENOENT est le mode d'échec par défaut. | Plus faible pour la résolution du binaire (serveur géré par launchd), plus forte pour les URL amont. |
| Multi-clients / clients distants | Un processus passerelle par machine sauf multiplexage manuel. | Naturel — un serveur HTTP, plusieurs appelants derrière l'auth. |
| Observabilité | Logs structurés passerelle + stderr de l'enfant. | Ajoutez journaux proxy, timing amont et trace ALPN/TLS. |
3. Déploiement reproductible en sept étapes
- Capturer l'identité — Noter l'utilisateur propriétaire d'OpenClaw, l'étiquette LaunchAgent/plist et le cwd issu de
launchctl printou de l'unité de service. - Rejouer stdio sans passerelle — En tant que cet utilisateur, exécuter
/bin/bash -lc 'which node; node -v'puis la commande MCP exacte avec parité de fichier d'environnement. - Durcir la config stdio — Chemins absolus pour
command, tableauargsexplicite,cwdoptionnel et blocenv(voir JSON ci-dessous). - Voie HTTP optionnelle — Lier MCP HTTP sur
127.0.0.1, terminer TLS sur nginx/Caddy, vérifier aveccurl -vque la négociationAcceptest correcte. - Verrouillage de version — Épingler le SDK / paquet serveur MCP sur le même major.minor que la bibliothèque client dans OpenClaw ; consigner les deux dans le changelog.
- Budget de timeouts — Mesurer le P95 de
tools/callavec des entrées réalistes ; fixer l'attente client ≥ P95 × 1,5 avec un plafond dur. - Contrat de logs — Émettre une ligne JSON par
initialize,tools/listettools/callavec un identifiant de corrélation partagé.
Pour des flux d'agents 7j/7 qui survivent aux redémarrages, alignez ce runbook sur vos playbooks launchd existants (labels plist, parité PATH, redémarrage contrôlé) avant d'ajouter des serveurs MCP.
4. Fragments de configuration CLI (JSON illustratif)
Adaptez les clés au schéma OpenClaw ou hôte ; l'essentiel est d'utiliser des chemins absolus et des blocs d'environnement explicites.
Serveur stdio avec point d'entrée Node (macOS)
{
"mcpServers": {
"repo-tools": {
"command": "/opt/homebrew/bin/node",
"args": ["/usr/local/lib/mcp-servers/repo-tools/dist/main.js"],
"cwd": "/Users/shared/mcp/repo-tools",
"env": {
"PATH": "/opt/homebrew/bin:/usr/bin:/bin",
"NODE_ENV": "production"
}
}
}
}
stdio via wrapper shell de connexion (lorsqu'il faut sourcer des profils)
{
"mcpServers": {
"legacy-npx": {
"command": "/bin/bash",
"args": ["-lc", "exec npx --yes @example/[email protected]"],
"env": { "HOME": "/Users/shared" }
}
}
}
Point de terminaison Streamable HTTP (référence côté client)
{
"mcpServers": {
"http-shared": {
"url": "https://mcp.internal.example.com/v1/mcp",
"headers": {
"Authorization": "Bearer ${MCP_EDGE_TOKEN}"
}
}
}
}
5. Runbooks symptômes
5.1 spawn ENOENT (stdio)
| Signal | Cause probable | Ordre des correctifs |
|---|---|---|
ENOENT sur node |
PATH du démon sans Homebrew. | Définir command en chemin absolu ou préfixer PATH dans env. |
| ENOENT sur le chemin du script | Mauvais cwd ou lien symbolique invisible pour l'utilisateur service. | Renseigner cwd ; remplacer le symlink par le chemin canonique. |
| Fonctionne seulement en SSH | Exports du shell interactif ≠ launchd. | Wrapper bash -lc ou migrer les variables dans EnvironmentVariables du plist. |
5.2 Version de protocole / 406 (Streamable HTTP)
Comparez côte à côte les journaux de handshake client et serveur. Si le serveur attend text/event-stream mais que le proxy injecte gzip sans flush, les clients restent bloqués sur « incompatibilité de version » alors que les numéros de version semblent alignés.
5.3 Timeouts d'outils
Tracez trois minuteurs : (A) attente routeur/modèle, (B) deadline amont passerelle, (C) timeout de job interne au serveur MCP. Ajustez d'abord la couche la plus serrée, puis élargissez les adjacentes seulement si les traces prouvent une file d'attente.
Les opérations longues sur dépôts ou caches (comme les grosses synchronisations de dérivés) relèvent de la même discipline de timeouts que la 2026 — Gouvernance mondiale des caches de build iOS : Derived Data Xcode et dépendances — autorité monorégion ou nœuds Mac physiques régionaux ? (matrices + paramètres + FAQ) : évitez un seul appel bloquant quand un job asynchrone avec sondes convient mieux.
6. Chiffres à coller dans les docs SLO
- ~4 W — Consommation au repos d'un Mac mini Apple Silicon avec SSH et passerelles légères — utile pour le TCO face aux tours x86 beaucoup plus gourmandes au ralenti.
- 25 s — Plafond indicatif pour un P95 « rapide » de
tools/callsur nœuds partagés ; au-delà, découpez les outils ou diffusez des résultats partiels plutôt que d'augmenter les timeouts sans fin. - 600 s — Les outils de maintenance lourds (grands scans de dépôt) devraient passer en jobs asynchrones avec polling, pas en un seul appel MCP bloquant — sur le même principe que les longues opérations Git/npm en CI.
7. FAQ
Faut-il exécuter les serveurs MCP en root ?
Préférez un utilisateur de service dédié avec ACL fichiers limitées au workspace ; root complique les invites confidentialité macOS et les audits TCC.
Rosetta impacte-t-elle les binaires MCP ?
Oui — mélanger Node arm64 et modules natifs x64-only produit des boucles de crash ressemblant à des timeouts. Uniformisez l'architecture par serveur.
Puis-je réutiliser les certificats d'inspection HTTPS d'entreprise ?
Importez la racine MITM dans le trousseau système approuvé par l'utilisateur service ; sinon Streamable HTTP échoue sur des erreurs TLS peu lisibles.
Où tracer les montées de version de protocole ?
Tenez un tableau de compatibilité interne : build OpenClaw, version SDK MCP, hash du paquet serveur, date du dernier smoke test tools/list.
8. Faire tourner cette pile sur un Mac mini silencieux et sobre
Les serveurs MCP en stdio sont impitoyables sur la parité d'environnement — charge de travail qui se comporte mieux sur un hôte macOS longue durée avec chemins stables, Gatekeeper et SIP que sur des VM Windows ad hoc. Les Mac mini Apple Silicon combinent une très faible consommation au repos (de l'ordre de quelques watts), un refroidissement quasi silencieux et une toolchain Unix native : Node, proxies et passerelles pilotées par launchd peuvent tourner 24h/24 sans la danse des pilotes qu'on voit ailleurs.
Si vous standardisez des passerelles distantes OpenClaw avec des sidecars MCP, regrouper sur du matériel type Mac mini M4 réduit les pièces mobiles : une architecture pour vos agents, vos outils de build et vos agents d'observabilité, avec FileVault et TCC pour une piste d'audit plus nette que des images Linux hétérogènes.
Pour un banc d'essai à faible friction du runbook ci-dessus, le Mac mini M4 reste le point d'ancrage physique le plus rentable : procurez-vous un nœud et répliquez les mêmes JSON que vous avez validés en préproduction.
Mac physique stable pour OpenClaw + MCP ?
Louez un Mac mini avec la même toolchain macOS que ce runbook — faible conso au repos, fonctionnement 24/7 discret et chemins prévisibles pour les serveurs stdio.