Architecture MCP / stdio vs SSE / Configuration d'env / Enregistrement outils & droits / Daemon launchd / Tunnel SSH / SSE multi-client / Stabilité production / FAQ
Si vous utilisez Cursor, Claude Desktop ou OpenClaw, vous tombez tôt ou tard sur la même question : sur quelle machine faire tourner le MCP Server ? Sur votre machine quotidienne, les droits Shell et le système de fichiers sont directement exposés à l'Agent. Sur un Linux distant, la chaîne d'outils et l'écosystème macOS ne s'alignent pas. Un Mac mini cloud se situe exactement entre les deux — environnement Unix, isolation par snapshot et outils macOS natifs. Ce guide part des bases du sous-processus stdio pour aller jusqu'au SSE multi-client, au daemon launchd et à une configuration réellement stable 24/7.
Architecture MCP : Host, Client et Server
Avant de toucher au clavier, clarifitons les trois rôles :
- Host — L'application qui héberge l'interface utilisateur (Cursor, Claude Desktop, OpenClaw…). Le Host gère le cycle de vie d'un ou plusieurs Clients.
- Client — La couche d'adaptation de protocole dans le Host. Elle découvre les Servers, maintient les connexions et transfère les appels d'outils.
- Server — Un processus indépendant qui expose des Tools, des Resources et des Prompts via un protocole standardisé.
Host (Cursor)
└─ Client
└─ [stdio / SSE] ──── Server (processus outil MCP)
Principe de conception : le processus Server doit fonctionner avec les droits minimaux — n'enregistrez que les outils nécessaires à la tâche en cours. Évitez l'anti-pattern de l'« Agent omnipotent ».
Choix du transport : stdio vs SSE vs WebSocket
| Transport | Cas d'usage typique | Adaptation Cloud Mac |
|---|---|---|
| stdio | Sous-processus local, commande SSH distante | ✅ Recommandé : aucun port public, configuration la plus simple |
| SSE | Clients navigateur, Host partagé multi-client | Reverse proxy + TLS + auth requis |
| WebSocket | Couche Gateway longue connexion | Utilisé par OpenClaw et Gateways similaires |
L'ancienne approche consistant à écrire une couche de colle REST pour chaque intégration a été remplacée par le protocole de découverte d'outils unifié MCP — le Host récupère automatiquement tools/list depuis le Server au démarrage, sans client HTTP personnalisé par intégration. Ce changement transforme l'intégration d'outils de « réécrire à chaque fois » en « déclarer et utiliser », permettant à un développeur solo de connecter une douzaine d'outils MCP en un après-midi.
Glossaire des couches de transport
- Transport stdio
- Le Host lance le Server comme sous-processus et échange des messages JSON-RPC via stdin/stdout. Le processus se termine avec le Host — isolation naturelle, aucune exposition réseau.
- SSE (Server-Sent Events)
- Le Server écoute sur un port HTTP ; les Clients reçoivent des événements via une connexion persistante. Supporte plusieurs clients simultanés mais nécessite une configuration de sécurité réseau.
- Découverte d'outils (tools/list)
- La phase de handshake MCP : le Host demande tools/list au Server au démarrage, obtient noms d'outils, schémas de paramètres et descriptions, puis appelle les outils à la demande.
- HITL (Human In The Loop)
- Schéma dans lequel les appels d'outils se mettent en pause avant des opérations sensibles pour attendre une confirmation humaine, plutôt que de laisser le modèle décider seul.
Étape 1 : Préparer l'environnement Cloud Mac
Choix du nœud
Latence et région
Les nœuds Japon et Singapour atteignent GitHub et npm avec 20–60 ms de latence, idéaux pour les outils MCP qui récupèrent fréquemment des packages.
Mémoire et inférence
Pour faire tourner MCP Server et un modèle local (Ollama 7B-class) simultanément, commencez avec au moins M4 + 16 Go.
Tableau de référence des configurations recommandées
| Scénario | Minimum | Recommandé |
|---|---|---|
| MCP Server unique (appels d'outils seulement) | M4 + 8 Go | M4 + 8 Go |
| MCP + modèle local 7B | M4 + 16 Go | M4 + 24 Go |
| Multi-MCP + builds CI parallèles | M4 + 24 Go | M4 Pro + 24 Go |
Initialiser l'environnement
# Installer Homebrew (si absent)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Installer Node.js
brew install node@20
echo 'export PATH="/opt/homebrew/opt/node@20/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc
# Vérifier
node -v && npm -v
Étape 2 : Déployer le filesystem MCP Server (mode stdio)
# Démarrer le filesystem Server, limité à /Users/agent/workspace
npx -y @modelcontextprotocol/server-filesystem /Users/agent/workspace
Ajouter dans la config MCP de Cursor (~/.cursor/mcp.json) :
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/agent/workspace"]
}
}
}
Point clé : Ctrl + C arrête le Server stdio local. Utilisez launchd pour la gestion du cycle de vie sur un nœud distant (étape 4).
Étape 3 : Tunnel SSH pour connecter Cursor à distance
# Mapper le port distant 3000 en local (mode SSE)
ssh -L 3000:127.0.0.1:3000 user@cloud-mac.zekvps.com
# SSH vers la machine distante et démarrer le Server (mode stdio)
ssh user@cloud-mac.zekvps.com "npx -y @modelcontextprotocol/server-filesystem /workspace"
Pour les déploiements stables à long terme, pensez à Tailscale pour créer un VPN Mesh en remplacement du port forwarding SSH manuel.
Étape 4 : Daemon launchd pour une disponibilité 24/7
Créer ~/Library/LaunchAgents/com.zekvps.mcp-filesystem.plist :
<?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.zekvps.mcp-filesystem</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/opt/node@20/bin/npx</string>
<string>-y</string>
<string>@modelcontextprotocol/server-filesystem</string>
<string>/Users/agent/workspace</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
launchctl load ~/Library/LaunchAgents/com.zekvps.mcp-filesystem.plist
launchctl start com.zekvps.mcp-filesystem
launchctl list | grep mcp
Approfondissement : différences clés entre launchd et systemd
| Aspect | launchd (macOS) | systemd (Linux) |
|---|---|---|
| Format de configuration | XML plist | INI-style unit |
| Chemin service utilisateur | ~/Library/LaunchAgents/ | ~/.config/systemd/user/ |
| Commande de chargement | launchctl load | systemctl --user enable |
| Consultation des logs | log stream / fichier | journalctl |
N'installez jamais d'outils systemd sur macOS pour gérer des processus MCP.
Frontières de sécurité et gestion des droits
- Portée de répertoire minimale — Restreignez le chemin de
server-filesystemau strict nécessaire, jamais~ou/. - Secrets via variables d'environnement — Les clés API passent par
env, jamais dans le plist ou mcp.json. - Authentification du port SSE — Bearer Token + reverse proxy + TLS obligatoires si SSE est ouvert.
- Snapshot avant modifications importantes — La restauration d'un snapshot bat la reconstruction de zéro.
Récapitulatif : choisir son chemin de déploiement
| Scénario | Déploiement recommandé |
|---|---|
| Expérimentation personnelle, Host unique | stdio local (ou SSH vers Mac cloud) |
| Assistant personnel 24/7, toujours en ligne | Mac cloud + daemon launchd |
| Outils partagés en équipe, plusieurs Hosts | Mac cloud + SSE + reverse proxy |
| Haute sécurité / conformité | Mac cloud + Tailscale + audit logging |
Consultez la rubrique OpenClaw de ce site pour des guides pratiques sur le co-déploiement d'OpenClaw et MCP Server.
Séparez labo MCP et production sur un Mac mini cloud
Nœud M4 dédié, location à la journée, SSH prêt à l'emploi
Singapour · Japon · Corée · Hong Kong · États-Unis disponibles
Pour passer MCP ou vos Agents du démo au quotidien, un nœud Mac cloud avec snapshots bat un nouveau framework. Voir les forfaits ZekVPS Mac mini cloud — Séparez labo et poste principal pour des déploiements plus sereins.