Pourquoi héberger son propre serveur MCP
Les services MCP hébergés chez un tiers introduisent une dépendance externe : vos données, vos prompts et vos contextes transitent par une infrastructure que vous ne contrôlez pas. Sur un VPS, le serveur MCP tourne dans votre réseau, avec vos règles d'accès et votre chaîne de confiance. C'est la même logique que d'auto-héberger un dépôt Git ou un registre Docker : l'autonomie prime sur la commodité.
Ce que vous gagnez à auto-héberger
- Confidentialité des données : aucun contexte ne quitte votre infrastructure.
- Pas de round-trip vers un tiers : le serveur MCP et votre application tournent sur le même réseau ou sur des VPS voisins.
- Personnalisation totale : outils maison, connecteurs propriétaires, environnement d'exécution sur mesure.
- Coût prévisible : un abonnement VPS fixe, sans facturation à l'appel.
- Contrôle des versions : vous choisissez quand mettre à jour le serveur et ses dépendances.
Prérequis avant de commencer
Vous avez besoin d'un VPS avec accès root, d'une distribution Linux récente (Ubuntu 22.04 LTS ou Debian 12 sont recommandés), de Node.js 18+ ou Python 3.11+ selon l'implémentation choisie, et d'un nom de domaine pointant vers l'IP de votre serveur. Un plan avec au minimum 1 vCPU et 2 Go de RAM convient pour un serveur MCP à usage modéré. Pour des charges importantes ou plusieurs serveurs MCP en parallèle, prévoir 2 vCPU et 4 Go.
Déployer un serveur MCP en 10 étapes
Mettre à jour le système et installer Node.js
Connectez-vous en SSH avec votre clé et lancez
apt update && apt upgrade -y. Installez Node.js via le dépôt officiel NodeSource :curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt install -y nodejs. Vérifiez avecnode -vetnpm -v.Créer un utilisateur dédié
Ne faites jamais tourner le serveur MCP en root. Créez un utilisateur applicatif :
useradd -m -s /bin/bash mcp && su - mcp. Toutes les commandes suivantes s'exécutent sous cet utilisateur.Cloner et installer le serveur MCP
Choisissez votre implémentation (voir la section « Serveurs MCP open source recommandés » ci-dessous). Pour
@modelcontextprotocol/server-filesystem:npm install -g @modelcontextprotocol/server-filesystem. Testez en local :npx @modelcontextprotocol/server-filesystem /tmp/test.Créer un fichier de service systemd
Créez
/etc/systemd/system/mcp-server.serviceavec les directivesUser=mcp,ExecStart=/usr/bin/npx @modelcontextprotocol/server-filesystem /home/mcp/data,Restart=alwaysetEnvironment=NODE_ENV=production. Activez et démarrez :systemctl enable --now mcp-server.Installer nginx
Nginx joue le rôle de reverse proxy devant votre serveur MCP.
apt install -y nginx. Créez un vhost dans/etc/nginx/sites-available/mcpavec unlocation /qui faitproxy_pass http://127.0.0.1:3000;et les en-têtesproxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;. Activez :ln -s /etc/nginx/sites-available/mcp /etc/nginx/sites-enabled/ && nginx -t && systemctl reload nginx.Obtenir un certificat TLS avec Certbot
apt install -y certbot python3-certbot-nginx && certbot --nginx -d votre-domaine.com. Certbot modifie automatiquement votre vhost nginx pour rediriger HTTP vers HTTPS et installe le renouvellement automatique. Vérifiez le renouvellement :certbot renew --dry-run.Activer l'authentification Bearer
Éditez votre vhost nginx pour exiger un token dans l'en-tête HTTP :
if ($http_authorization != 'Bearer VOTRE_TOKEN_SECRET') { return 401; }. Générez un token fort avecopenssl rand -hex 32. Conservez ce token : il sera renseigné dans la configuration de votre client IA.Configurer le pare-feu
Fermez tous les ports sauf 22, 80 et 443 :
ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw enable. Le port interne du serveur MCP (3000 par défaut) ne doit jamais être exposé directement.Tester l'endpoint avec curl
curl -H 'Authorization: Bearer VOTRE_TOKEN_SECRET' https://votre-domaine.com/health. Vous devez obtenir un JSON de statut. Une réponse 401 indique un token incorrect ; une réponse 502 indique que le service systemd ne tourne pas (systemctl status mcp-server).Activer les journaux d'accès nginx
Ajoutez dans votre vhost :
access_log /var/log/nginx/mcp_access.log; error_log /var/log/nginx/mcp_error.log warn;. Ces journaux sont indispensables pour détecter des appels non autorisés ou des boucles de requêtes. Tournez-les avec logrotate pour éviter de saturer le disque.
Activez systématiquement les journaux d'accès nginx pour votre serveur
Un serveur MCP reçoit des appels machine-to-machine : sans journaux, vous ne détectez ni les tentatives d'accès non autorisées ni les bugs d'intégration. Configurez aussi log_format pour enregistrer l'en-tête Authorization tronqué (les 8 premiers caractères suffisent à identifier l'origine sans exposer le token complet).
Serveurs MCP open source recommandés
@modelcontextprotocol/server-filesystem— accès contrôlé au système de fichiers, lecture et écriture de fichiers locaux. Idéal pour donner à un agent accès à un répertoire de travail.@modelcontextprotocol/server-git— clone, log, diff, commit via un dépôt local. Permet à un agent de lire l'historique ou de créer des branches.@modelcontextprotocol/server-fetch— délègue les requêtes HTTP sortantes au serveur MCP, en contournant les restrictions réseau du client.@modelcontextprotocol/server-postgres— connexion à une base PostgreSQL : requêtes SELECT, schéma, describe table. Ne pas exposer en écriture sans audit des permissions.@modelcontextprotocol/server-playwright— pilotage d'un navigateur Chromium headless depuis l'agent : screenshot, clic, remplissage de formulaire.mcp-server-sqlite(communauté) — alternative légère pour des bases SQLite locales, sans dépendance PostgreSQL.mcp-obsidian(communauté) — accès à un vault Obsidian, utile pour des bases de connaissance en Markdown.
Sécuriser son serveur MCP en production
Un serveur MCP exposé sur Internet est une surface d'attaque. Quatre mesures sont non négociables avant de connecter un client IA à ce serveur en production.
Authentification par token Bearer. Renseignez un token unique par client dans l'en-tête Authorization. Révoquez immédiatement un token compromis et générez-en un nouveau avec openssl rand -hex 32. Ne réutilisez pas le même token pour plusieurs clients : vous perdrez la traçabilité.
Rate-limiting nginx. Ajoutez dans votre vhost : limit_req_zone $binary_remote_addr zone=mcp:10m rate=30r/m; limit_req zone=mcp burst=10 nodelay;. Cela limite à 30 requêtes par minute par IP, avec un burst de 10. Ajustez selon votre usage réel.
HTTPS obligatoire et HSTS. Après l'installation de Certbot, ajoutez dans le bloc server HTTPS : add_header Strict-Transport-Security "max-age=31536000" always;. Cela interdit aux clients de se connecter en HTTP clair même s'ils le tentent.
Rotation des tokens. Planifiez une rotation tous les 90 jours via cron ou votre outil de secrets management. Documentez chaque token actif et son client associé dans un registre privé (pas dans le dépôt de code).
Intégrer Claude Desktop et Cursor avec votre serveur MCP
Une fois le serveur en ligne et sécurisé, la connexion depuis un client IA prend moins de deux minutes.
Claude Desktop. Ouvrez ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) ou %APPDATA%\Claude\claude_desktop_config.json (Windows). Ajoutez une entrée dans la clé mcpServers :
{
"mcpServers": {
"mon-vps": {
"url": "https://votre-domaine.com",
"headers": {
"Authorization": "Bearer VOTRE_TOKEN_SECRET"
}
}
}
}Redémarrez Claude Desktop. Le serveur apparaît dans la liste des outils disponibles.
Cursor. Dans les paramètres (Cursor > Settings > MCP), cliquez sur « Add server », choisissez le type HTTP, renseignez l'URL et ajoutez l'en-tête Authorization. Cursor injecte automatiquement les outils MCP dans le contexte de chaque conversation.
Vérification. Demandez à l'agent de lister les outils disponibles. Si le serveur filesystem est actif, la réponse doit inclure read_file, write_file et list_directory. L'absence de ces outils indique une erreur de configuration — vérifiez les journaux nginx en premier.
MCP vs API REST vs WebSocket pour agents IA
Faites défiler le tableau
| Critère | MCP | API REST | WebSocket |
|---|---|---|---|
| Modèle de communication | Appels d'outils typés, découverte dynamique du schéma | Requête/réponse HTTP stateless, contrat OpenAPI | Canal bidirectionnel persistant, événements temps réel |
| Intégration native avec les LLM | Native : Claude, Cursor, Cline, Continue lisent le schéma MCP directement | Nécessite un wrapper function-calling ou un plugin | Nécessite un adapter côté agent |
| Complexité de déploiement | Faible : un processus Node/Python, un vhost nginx | Faible à moyenne : framework REST standard | Moyenne à élevée : gestion des connexions, reconnexion, état |
| Convient pour | Outils locaux, accès fichiers, bases de données, automatisation agent | Intégrations tiers, webhooks, microservices existants | Notifications push, collaboration temps réel, streaming |
| Versioning et évolution | Schéma déclaré dans le serveur, auto-découvert par le client | Versioning explicite dans l'URL ou l'en-tête | Protocole applicatif à gérer manuellement |
Dépannage : 4 erreurs fréquentes
1. MCP transport error: Failed to fetch
Ce message apparaît dans Claude Desktop ou Cursor lorsque le client ne parvient pas à joindre l'URL configurée. Causes fréquentes : le service systemd ne tourne pas (systemctl status mcp-server), nginx n'est pas rechargé après modification du vhost (nginx -t && systemctl reload nginx), ou un pare-feu bloque le port 443 (ufw status).
2. Connection refused on 127.0.0.1:3000
Le serveur MCP ne s'est pas lancé ou a planté au démarrage. Consultez les journaux systemd : journalctl -u mcp-server -n 50. Les causes courantes sont un fichier de configuration JSON invalide, une dépendance npm manquante (npm install à relancer dans le répertoire du projet) ou un port déjà occupé (ss -tlnp | grep 3000).
3. Request timed out after 30000ms
Le serveur répond mais trop lentement. Sur un outil filesystem, cela arrive si le répertoire parcouru est trop large ou si le disque est saturé (df -h). Pour un outil postgres, vérifiez que la requête ne fait pas de full scan sur une table sans index. Augmentez le timeout nginx en dernier recours : proxy_read_timeout 120s;.
4. 401 Unauthorized systématique
Le token envoyé par le client ne correspond pas à celui attendu par nginx. Vérifiez l'exactitude du token dans la configuration du client (espace parasite, guillemets inclus par erreur). Si vous venez de renouveler le token côté serveur, redémarrez nginx et rechargez la configuration du client IA.
Vers un environnement IA complet sur votre VPS
Un serveur MCP est un composant parmi d'autres d'un environnement IA auto-hébergé. Sur le même VPS, vous pouvez faire tourner un modèle local via Ollama, une base vectorielle comme Qdrant ou Chroma, et un orchestrateur comme n8n ou Flowise — chacun connecté au serveur MCP via des outils dédiés. ServOrbit propose des templates VPS prêts à l'emploi pour ces environnements, installables en quelques clics depuis la Marketplace, sur une infrastructure hébergée en datacenters européens avec IPv4 dédiée et accès root.