IA-BRIEF TERMINAL · ÉDITION N°153
MAR 02 JUIN 2026 15:51 UTC+1

Analyse

Déployer un serveur MCP en production pour 0 € : guide PME pas à pas en 2026

Publié
MAJ
Par Stefan
Lecture 8 min

Le Model Context Protocol (MCP) a été présenté par Anthropic en novembre 2024 comme un standard ouvert pour connecter les LLMs à des outils et données externes. Depuis, l’écosystème a mûri : SDKs Python et TypeScript stables, serveurs de référence prêts à l’emploi, et une communauté active sur GitHub. Mais il manquait un chaînon : comment passer du prototype local à un serveur MCP qui tourne en production, accessible à vos agents IA, sans budget dédié.

Voici le guide pas à pas pour déployer un serveur MCP en production pour 0 €.

Architecture cible en trois composants

Avant de coder, visualisons l’architecture que nous allons construire :

graph LR
    A["Agent IA\n(Claude Desktop, app)"] -->|MCP over HTTPS| B["Cloudflare Tunnel\n(gratuit)"]
    B -->|localhost:3000| C["Serveur MCP\n(Docker)"]
    C -->|OAuth| D["Fournisseur OAuth\n(GitHub / Google)"]
    C -->|API| E["Vos outils\n(BDD, CRM, API)"]

Trois composants, trois responsabilités :

  1. Le serveur MCP : un processus Node.js ou Python qui expose vos outils (tools), ressources (resources) et éventuellement des prompts via le protocole MCP. Il tourne dans un conteneur Docker.
  2. Le tunnel Cloudflare : Cloudflare Tunnel (anciennement Argo Tunnel) crée un pont chiffré entre votre serveur local et le réseau Cloudflare, sans ouvrir de port sur votre machine. Le plan gratuit suffit.
  3. L’authentification OAuth : pour sécuriser l’accès, le serveur MCP délègue l’authentification à un fournisseur OAuth (GitHub ou Google sont les plus simples à configurer). Pas de gestion de mots de passe.

Étape 1 : Créer un serveur MCP minimal

Nous allons utiliser le SDK TypeScript officiel et créer un serveur qui expose deux outils simples : get_time (renvoie l’heure actuelle) et read_public_file (lit un fichier dans un répertoire). Ce squelette servira de base pour y brancher vos vrais outils.

Créez un nouveau projet :

mkdir mon-serveur-mcp && cd mon-serveur-mcp
npm init -y
npm install @modelcontextprotocol/sdk express
npm install -D typescript @types/node @types/express

Créez le fichier src/server.ts :

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
import express from "express";
import { z } from "zod";
import fs from "fs";
import path from "path";

// Créer le serveur MCP
const server = new McpServer({
  name: "mon-serveur-pme",
  version: "1.0.0",
});

// Outil 1 : obtenir l'heure
server.tool("get_time", "Renvoie l'heure actuelle au format ISO", {},
  async () => ({
    content: [{ type: "text", text: new Date().toISOString() }]
  })
);

// Outil 2 : lire un fichier public
server.tool(
  "read_public_file",
  "Lit un fichier dans le répertoire public autorisé",
  { filename: z.string().describe("Nom du fichier à lire") },
  async ({ filename }) => {
    const safePath = path.join("/data/public", path.basename(filename));
    if (!fs.existsSync(safePath)) {
      return { content: [{ type: "text", text: `Fichier introuvable: ${filename}` }] };
    }
    const content = fs.readFileSync(safePath, "utf-8").slice(0, 10000);
    return { content: [{ type: "text", text: content }] };
  }
);

// Transport HTTP pour la production
const app = express();
app.use(express.json());

app.post("/mcp", async (req, res) => {
  const transport = new StreamableHTTPServerTransport();
  await server.connect(transport);
  transport.handleRequest(req, res, req.body);
});

app.get("/health", (req, res) => res.json({ status: "ok" }));

app.listen(3000, () => console.log("MCP server running on port 3000"));

Étape 2 : Conteneuriser avec Docker

Le Dockerfile :

FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY dist/ ./dist/
RUN mkdir -p /data/public
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s \
  CMD wget -qO- http://localhost:3000/health || exit 1
USER node
CMD ["node", "dist/server.js"]
npx tsc
docker build -t mon-serveur-mcp:latest .
docker run -d --name mcp-server -p 3000:3000 \
  -v /chemin/vers/vos/fichiers:/data/public \
  mon-serveur-mcp:latest

Étape 3 : Exposer via Cloudflare Tunnel (gratuit)

Cloudflare Tunnel permet d’exposer un service local au monde entier via un domaine Cloudflare, sans ouvrir de port sur votre réseau. Le plan gratuit inclut cette fonctionnalité.

Prérequis : un nom de domaine géré par Cloudflare (le transfert DNS vers Cloudflare est gratuit, vous pouvez utiliser un domaine existant sans changer de registar).

# Installer cloudflared (Linux/macOS)
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared
chmod +x cloudflared

# Authentifier
./cloudflared tunnel login

# Créer le tunnel
./cloudflared tunnel create mcp-pme

# Configurer le tunnel (fichier config.yml)
cat > ~/.cloudflared/config.yml << EOF
tunnel: <votre-tunnel-id>
credentials-file: /root/.cloudflared/<votre-tunnel-id>.json

ingress:
  - hostname: mcp.votredomaine.fr
    service: http://localhost:3000
  - service: http_status:404
EOF

# Router le DNS
./cloudflared tunnel route dns mcp-pme mcp.votredomaine.fr

# Lancer le tunnel
./cloudflared tunnel run mcp-pme

En production, utilisez un service systemd pour que cloudflared redémarre automatiquement.

Étape 4 : Sécuriser avec l’authentification

Un serveur MCP exposé sans authentification est une porte ouverte à vos données. Deux approches, du plus simple au plus robuste :

Niveau 1 — Token statique (suffisant pour du prototypage interne) : Le SDK MCP supporte les headers d’authentification. Ajoutez une vérification de token dans votre middleware Express.

Niveau 2 — OAuth via GitHub/Google (recommandé en production) : MCP spécifie un flow d’autorisation standardisé. En attendant que l’écosystème de librairies OAuth pour MCP mature, la solution pragmatique est de placer un reverse proxy avec authentification devant le serveur MCP. Cloudflare Access (gratuit jusqu’à 50 utilisateurs) fait exactement cela : il intercepte les requêtes avant le tunnel, vérifie l’authentification OAuth, et ne laisse passer que les utilisateurs autorisés.

Ce qu’il ne faut PAS faire en production

Trois erreurs à éviter, vues sur des déploiements amateurs :

  1. Laisser le transport stdio en production. Le transport StdioServerTransport est conçu pour du local (Claude Desktop ↔ serveur sur la même machine). En production, utilisez exclusivement le transport HTTP streamable.
  2. Ne pas versionner les tools exposés. Chaque outil exposé via MCP est une surface d’attaque. Si votre outil execute_sql accepte n’importe quelle requête, l’agent peut faire un DROP TABLE. Chaque tool doit valider ses entrées (Zod, comme dans l’exemple) et limiter son périmètre.
  3. Oublier les logs et la supervision. Un serveur MCP en production doit être monitoré : healthcheck Docker (déjà dans le Dockerfile ci-dessus), logs structurés (JSON pour ingestion dans vos outils), et alertes si le serveur ne répond plus.

FAQ

Quelle est la différence entre ce guide et l’article MCP existant sur IA Brief ?

L’article MCP : le protocole open source qui connecte vos agents IA à vos outils explique le protocole, son architecture théorique et trois cas d’usage. Ce guide-ci fait le pas suivant : il donne le code, l’architecture de déploiement et les commandes exactes pour passer de zéro à un serveur MCP en production. Si vous débutez avec MCP, lisez l’autre article d’abord ; si vous êtes prêt à déployer, vous êtes au bon endroit.

Puis-je utiliser autre chose que Cloudflare Tunnel ?

Oui. Ngrok (gratuit avec limitations), Tailscale Funnel, ou un reverse proxy Nginx classique avec Let’s Encrypt si vous avez une IP publique. Cloudflare Tunnel est recommandé ici pour sa gratuité, sa simplicité et son intégration native avec Cloudflare Access pour l’authentification.

Mon serveur MCP doit-il tourner 24/7 ?

Pour un usage PME avec des agents IA qui ne sont pas sollicités en continu, non. Vous pouvez le lancer à la demande. Mais les agents IA modernes (Claude, GPT) fonctionnent souvent en mode asynchrone (tâches planifiées, batchs) — dans ce cas, un uptime 24/7 via un serveur léger (VPS à 5 €/mois, ou un vieux PC sous le bureau) est préférable.

Quels outils dois-je exposer en priorité ?

Commencez par les trois qui apportent le plus de valeur immédiate : (1) un connecteur à votre base de données pour des requêtes en langage naturel, (2) un connecteur à votre CRM pour qualifier des leads ou créer des tâches, (3) un connecteur filesystem pour lire/écrire des rapports. Évitez les outils « jouets » (météo, blague du jour) : ils consomment du contexte sans valeur métier.


Pour comprendre les fondamentaux du protocole MCP avant de déployer, lisez notre introduction au Model Context Protocol. Pour sécuriser vos agents contre les injections de prompt, consultez notre guide prompt injection 2026. Et si vous vous demandez comment MCP s’articule avec les Agent Skills d’Anthropic, voyez notre comparatif Agent Skills vs MCP.

Sources primaires