Héberger un serveur MCP gratuitement : options Vercel, Cloudflare et Docker

Trois façons gratuites de mettre un serveur MCP en ligne : Vercel Hobby, Cloudflare Workers et les hébergeurs Docker comme Render, Cloud Run et Hugging Face Spaces. Limites réelles vérifiées en octobre 2026, code fonctionnel, sécurité des tokens et un tableau indiquant quelle option casse en premier.

Héberger un serveur MCP gratuitement : options Vercel, Cloudflare et Docker
Cristian Da Conceicao
Fondateur de Picasso IA

Votre serveur MCP fonctionne parfaitement sur votre ordinateur portable. Claude Desktop le lance via stdio, chaque outil répond, puis vous vous posez une question plus difficile : comment permettre à Cursor sur une autre machine, à un coéquipier ou à un connecteur ChatGPT d’accéder aux mêmes outils sans payer de serveur ? Il vous faut une URL HTTPS publique, et vous aimeriez que la facture affiche 0 $.

Vous pouvez héberger un serveur MCP gratuitement sur trois plateformes très différentes : Vercel, Cloudflare Workers et n’importe quel hébergeur Docker proposant une offre gratuite. Chacune convient à un type de serveur différent, et chacune possède un mur que vous finirez par heurter. Vous trouverez ci-dessous les chiffres réels, vérifiés auprès de la documentation des éditeurs en octobre 2026, un code fonctionnel pour chaque parcours, et une liste courte de ce qui casse en premier.

Développeur tapant sur un ordinateur portable à une table de cuisine, un soir de pluie

💡 Les offres gratuites changent souvent. Chaque limite de cet article provient de la documentation officielle en octobre 2026. Consultez à nouveau la page tarifs avant de lancer quoi que ce soit en public.

Pourquoi les serveurs locaux ne suffisent plus

Stdio ou HTTP distant

Un serveur stdio est un processus enfant. Le client le lance, communique par l’entrée et la sortie standard, puis l’arrête à la fin de la session. Rien ne quitte votre machine, ce qui fait de stdio un choix parfait pour lire des fichiers locaux, et inutile pour les partager.

Un serveur distant écoute à une seule URL, généralement /mcp ou /api/mcp, et parle Streamable HTTP. Tout client qui possède l’adresse et le bon token peut l’appeler de n’importe où. Le transport HTTP+SSE, plus ancien, disparaît peu à peu : la mcp-handler v2 de Vercel l’a supprimé, et la documentation actuelle de Cloudflare ne décrit que Streamable HTTP sur /mcp. Si vous construisez pour ce transport, vous n’aurez pas à tout réécrire l’an prochain.

Ce qu’un hébergement gratuit doit fournir

Avant de comparer les plateformes, notez ce dont votre serveur a réellement besoin :

  • Une URL HTTPS stable que vous pouvez coller dans une configuration de client
  • Un démarrage rapide, car un client au délai d’attente court échoue au handshake si votre serveur met une minute à démarrer
  • Un stockage sécurisé des secrets pour les tokens utilisés par vos outils
  • Assez de temps CPU par requête pour la logique de vos outils, et non pour exécuter un modèle
  • Des journaux lisibles le jour où un appel échoue sans que personne ne sache pourquoi

Main branchant un câble ethernet dans un petit mini PC noir à côté d’un routeur blanc

L’hébergement est d’abord un problème réseau avant d’être un problème de code : une adresse, un port ouvert, un processus qui répond. Chaque option ci-dessous résout ces trois points à sa manière.

Les trois parcours gratuits en un coup d’œil

Vercel et Cloudflare exécutent votre code sous forme de fonctions serverless : pas de machine à gérer, facturation à l’usage, gratuit jusqu’à un plafond. Les hébergeurs Docker exécutent votre code dans un conteneur : un processus complet avec son propre système de fichiers et le langage de votre choix. Cette seule différence explique la plupart des compromis.

OptionQuota gratuitDémarrageIdéal pourPrincipal piège
Vercel Hobby1 M d’invocations, 4 heures de CPU, 300 s par appelCourt, les instances sont réutiliséesÉquipes Next.js, déploiements rapidesUsage personnel et non commercial uniquement
Cloudflare Workers Free100 000 requêtes par jour, 10 ms de CPU chacuneNégligeableOutils légers, nombreux appels10 ms de CPU, 50 subrequests
Render Free750 heures d’instance par moisEnviron 1 minute après 15 minutes d’inactivitéN’importe quel DockerfileSe met en veille sans activité
Google Cloud Run2 M de requêtes, 180 000 secondes de vCPUPasse à zéro, premier appel plus lentConteneurs à trafic irrégulierNécessite un compte de facturation
Hugging Face SpacesCPU Basic gratuit (2 vCPU, 16 Go de RAM)Les Spaces inactifs peuvent se mettre en pauseDémos publiquesLe disque se réinitialise au redémarrage

Lisez le tableau ligne par ligne, pas colonne par colonne. La colonne démarrage indique comment le serveur se comporte dans un chat : Workers et Vercel répondent en millisecondes, alors qu’un conteneur endormi fait attendre le premier appel d’outil. La colonne quota gratuit indique combien de temps vous restez gratuit : 100 000 requêtes par jour semblent énormes, jusqu’à ce qu’un agent bavard boucle quarante fois sur le même outil par tâche.

💡 Les cinq options coûtent 0 $ le premier jour, donc le prix n’est pas le bon critère de départage. Choisissez selon ce que fait un seul appel d’outil : une recherche rapide, un calcul lourd ou une longue attente sur une autre API.

Vercel : le chemin le plus rapide du dépôt à l’URL

Si votre projet vit déjà dans une application Next.js App Router, un serveur MCP représente un fichier de plus. Vercel l’exécute comme une Function avec Fluid compute, qui facture séparément le CPU actif et le temps de mémoire. Cela convient bien au trafic MCP : de longues périodes d’inactivité, puis une rafale d’appels.

Installer et écrire la route

Il vous faut Node.js 20 ou une version ultérieure. La documentation de Vercel fixe ces versions :

npm i mcp-handler@2.1.1 @modelcontextprotocol/server@2 zod@4

Créez app/api/mcp/route.ts :

import { createMcpHandler } from 'mcp-handler';
import { z } from 'zod';

const handler = createMcpHandler((server) => {
  server.registerTool(
    'roll_dice',
    {
      description: 'Roll an N-sided die',
      inputSchema: z.object({ sides: z.number().int().min(2) }),
    },
    async ({ sides }) => {
      const value = 1 + Math.floor(Math.random() * sides);
      return { content: [{ type: 'text', text: `You rolled a ${value}` }] };
    },
  );
});

export { handler as GET, handler as POST };

Poussez dans Git, importez le dépôt sur Vercel, et le serveur répond à https://your-app.vercel.app/api/mcp. Dans Cursor, la configuration tient en une seule ligne : {"mcpServers": {"dice": {"url": "https://your-app.vercel.app/api/mcp"}}}. Testez d’abord en local avec npx @modelcontextprotocol/inspector@latest, choisissez Streamable HTTP, puis pointez vers http://localhost:3000/api/mcp.

Vue en contre-plongée d’un développeur travaillant dans un loft lumineux aux murs de brique blanche

Les limites Hobby à connaître

  • 1 000 000 d’invocations de fonctions par mois
  • 4 heures de CPU actif et 360 Go-heures de mémoire provisionnée
  • 300 secondes de durée maximale par fonction
  • Usage personnel et non commercial uniquement, selon les règles d’usage équitable de Vercel
  • Si vous dépassez une limite, vous attendez généralement 30 jours avant que la fonctionnalité soit de nouveau disponible

Un outil qui attend surtout une autre API consomme à peine les 4 heures de CPU. Un outil qui analyse de gros fichiers les épuise vite. Tenez compte aussi du plafond de 300 secondes : renvoyez rapidement un identifiant de tâche et laissez un second outil le vérifier, au lieu de garder un appel ouvert pendant des minutes.

💡 Si un client reçoit une page de connexion au lieu du JSON, vérifiez Deployment Protection. Les projets Hobby peuvent avoir Vercel Authentication activé, ce qui bloque les appelants anonymes, y compris votre client MCP.

Cloudflare Workers : gratuit, avec la vitesse de l’edge

Les Workers tournent dans des isolats V8, il n’y a donc aucun conteneur à démarrer. Cela correspond à la forme sans état requête-réponse de la plupart des serveurs MCP, et explique pourquoi le temps de démarrage est presque nul.

Initialiser avec une seule commande

npm create cloudflare@latest -- remote-mcp-server-authless --template=cloudflare/ai/demos/remote-mcp-authless

Le modèle expose Streamable HTTP sur /mcp. La documentation de Cloudflare recommande désormais createMcpHandler pour les nouveaux serveurs : il est sans état et construit un serveur MCP par requête. L’ancienne classe McpAgent est documentée comme obsolète et gelée fonctionnellement, donc évitez-la pour tout nouveau projet.

export default {
  fetch(request, env, ctx) {
    return createMcpHandler(createServer)(request, env, ctx);
  },
} satisfies ExportedHandler;

Enveloppez le handler dans une méthode fetch. Si vous exportez directement la fonction appelable, Wrangler lit un export par défaut de type fonction comme une classe WorkerEntrypoint et le déploiement se comporte mal.

Vue symétrique d’une allée de baies serveur dans un data center épuré

Les chiffres de l’offre gratuite

  • 100 000 requêtes par jour, réinitialisées à minuit UTC, avec une limite de rafale de 1 000 requêtes par minute
  • 10 ms de temps CPU par requête HTTP
  • 50 subrequests par requête
  • 128 Mo de mémoire par isolat
  • Jusqu’à 100 Workers par compte

Attendre un appel fetch() ne compte pas dans le temps CPU : un outil qui appelle une API externe et renvoie la réponse tient donc largement. Un traitement lourd ou de l’analyse d’images, non. Au-delà du plafond quotidien, Cloudflare renvoie l’erreur 1027.

L’authentification est déjà résolue ici. Les modèles OAuth prennent en charge GitHub, Google, Slack, Auth0, Stytch, WorkOS et Cloudflare Access, avec un namespace KV qui conserve les sessions. L’état, si vous en avez besoin, peut vivre dans KV ou dans des Durable Objects adossés à SQLite, disponibles dans l’offre gratuite.

Docker : quand vous avez besoin d’un vrai processus

Choisissez un conteneur lorsque votre serveur a besoin de bibliothèques natives, de fichiers locaux, d’une tâche de longue durée ou d’un langage autre que TypeScript. Vous échangez un démarrage instantané contre la liberté.

Un Dockerfile minimal

FROM node:22-slim AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:22-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY --from=build /app/dist ./dist
ENV PORT=8080
EXPOSE 8080
CMD ["node", "dist/http.js"]

Deux règles comptent. Écoutez sur le port que l’hébergeur vous attribue en lisant PORT, et liez-vous à 0.0.0.0, et non à localhost. Lancez ensuite le serveur en mode Streamable HTTP sans état, afin que n’importe quelle instance puisse répondre à n’importe quelle requête. Les hébergeurs qui passent à zéro abandonnent les sessions en mémoire sans prévenir.

Vue aérienne de conteneurs maritimes colorés empilés dans un port, sous une lumière dorée

Render, Cloud Run et Spaces

  • Render Free : 750 heures d’instance par espace de travail et par mois, une seule instance, pas de disque persistant, pas de SSH, et pas de SMTP sortant. Les bases Postgres gratuites expirent au bout de 30 jours.
  • Google Cloud Run : l’offre toujours gratuite donne 2 millions de requêtes, 180 000 secondes de vCPU, 360 000 secondes-GiB et 1 Go de trafic sortant vers l’Amérique du Nord chaque mois. Il passe à zéro par défaut, mais vous devez associer un compte de facturation.
  • Hugging Face Spaces : ajoutez sdk: docker et app_port: 7860 dans l’en-tête YAML de votre README. Le conteneur s’exécute sous l’utilisateur 1000, et tout ce qui est écrit sur le disque est perdu au redémarrage.

Les démarrages à froid cassent les handshakes

Le service gratuit de Render s’arrête après 15 minutes sans trafic, et le réveiller prend environ une minute. Un client au délai d’attente court échoue sur la première requête, puis fonctionne à la deuxième. Ce bug est pénible à traquer si vous ne connaissez pas la cause.

Doigt appuyant sur le bouton marche-arrêt d’une petite carte électronique posée sur un établi

Vous avez trois options :

  1. Accepter le problème et relancer le premier appel
  2. Découper le serveur : mettez les outils sensibles à la latence sur Workers et les outils lourds dans le conteneur
  3. Interroger un point de santé toutes les 10 minutes. Un service reste alors éveillé dans les 750 heures (un mois de 31 jours compte 744 heures), mais vérifiez les règles de l’hébergeur avant de vous y fier

Verrouillez l’accès avant de partager l’URL

Une URL MCP est une télécommande pour tout ce que vos outils peuvent faire. Quiconque la trouve peut appuyer sur les boutons, et les offres gratuites n’ont aucun plafond budgétaire qui empêche un inconnu de consommer votre quota.

Ajouter un bearer token

Sur Vercel, enveloppez le handler avec withMcpAuth, définissez required: true, et renvoyez le client vérifié depuis verifyToken. Les requêtes sans token valide reçoivent un 401. Un token qui n’a pas le scope requis reçoit un 403. L’exemple de la documentation lit un token de démonstration depuis une variable d’environnement, et indique qu’en production il faut vérifier l’émetteur, l’audience, l’expiration et les scopes auprès d’un véritable serveur d’autorisation. mcp-handler n’émet pas lui-même de tokens.

Pour respecter la spécification MCP, publiez aussi les métadonnées de ressource protégée OAuth à /.well-known/oauth-protected-resource, afin que les clients conformes puissent trouver votre serveur d’autorisation.

Cadenas en laiton sur une chaîne en acier, avec des gouttes de pluie sur un portail en bois

Garder les secrets hors du dépôt

  • Vercel : variables d’environnement du projet
  • Cloudflare : npx wrangler secret put PICASSOIA_TOKEN
  • Render et Spaces : secrets du tableau de bord, lus comme variables d’environnement à l’exécution

Ne collez jamais un token dans une description d’outil ou un prompt. Les clients montrent les descriptions d’outils au modèle, et celui-ci peut les répéter. Ajoutez aussi un compteur d’appels par token, car le quota gratuit est partagé par tous les appelants.

Choisir la bonne option gratuite

Vue de dessus d’un carnet avec des lignes de quadrillage tracées à la main, à côté d’une tasse de café

  • Choisissez Vercel si le projet est déjà sur Next.js, que le trafic est personnel et que vous voulez une URL de prévisualisation pour chaque pull request.
  • Choisissez Cloudflare si vous voulez un démarrage quasi nul, jusqu’à 100 000 appels par jour, et des outils qui transmettent surtout des requêtes à d’autres API.
  • Choisissez un hébergeur de conteneurs si vous avez besoin de binaires natifs, de fichiers sur disque, ou d’une tâche qui dure plus qu’une requête rapide.

Rien ne vous empêche de combiner les options. Une configuration courante consiste en un Worker qui répond aux recherches simples et transmet les requêtes lourdes à un conteneur, afin que le client reçoive toujours une première réponse rapide. Commencez avec la plateforme la plus simple qui convient, mesurez pendant une semaine, et ne changez que lorsqu’une limite vous freine vraiment.

Ce qui casse en premier

PlateformePremier mur rencontréSigne avant-coureur
Vercel Hobby4 heures de CPU, ou la règle du non-commercialFonctionnalités suspendues, attente de 30 jours
Workers Free10 ms de CPU sur les outils lourdsErreurs de limite CPU lors de l’analyse
Render FreeDélai de réveilLe premier appel échoue après une période d’inactivité
Cloud RunUsage au-delà du quota gratuitDes frais apparaissent sur la facture
SpacesRéinitialisation du disqueL’état disparaît après un redémarrage

Essayez avec Picasso IA

Un serveur hébergé ne sert à rien si ses outils ne font rien d’utile. La génération d’images fait un bon premier outil, car vous voyez tout de suite si la boucle complète fonctionne.

Un outil qui appelle un modèle d’image

PicassoIA expose une API de type Replicate à https://api.picassoia.com/v1. Vous vous authentifiez avec un Bearer token qui commence par pia_sk_, vous créez une prédiction, puis vous l’interrogez. Le modèle PicassoIA Image accepte un objet input avec un prompt et un aspect_ratio :

server.registerTool(
  'make_image',
  {
    description: 'Start an image generation from a text prompt',
    inputSchema: z.object({ prompt: z.string().min(10) }),
  },
  async ({ prompt }) => {
    const res = await fetch(
      'https://api.picassoia.com/v1/models/picassoia/picassoia-image/predictions',
      {
        method: 'POST',
        headers: {
          Authorization: `Bearer ${process.env.PICASSOIA_TOKEN}`,
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ input: { prompt, aspect_ratio: '16:9' } }),
      },
    );
    if (!res.ok) {
      return { isError: true, content: [{ type: 'text', text: `API error ${res.status}` }] };
    }
    const prediction = await res.json();
    return {
      content: [{ type: 'text', text: `Prediction ${prediction.id} is ${prediction.status}` }],
    };
  },
);

Sur Workers, lisez le token depuis env au lieu de process.env. Les prédictions sont asynchrones, donc répartissez le travail en deux outils : make_image renvoie l’identifiant de la prédiction, et check_image appelle GET /v1/predictions/{id} et renvoie le statut et les URL de sortie. Les statuts sont starting, processing, succeeded, failed et canceled. Chaque appel se termine en quelques millisecondes, ce qui tient dans le budget de 10 ms de CPU des Workers et ne garde jamais une requête ouverte. La limite du compte est de 5 prédictions simultanées, partagées entre tous les tokens et toutes les connexions MCP.

💡 La documentation de l’API indique que les prédictions sont actuellement gratuites et ne consomment aucun crédit, mais elle précise aussi qu’il faut un plan Infinite pour les créer. Vérifiez la page tarifs avant de bâtir un outil public dessus.

Modèles intéressants à intégrer

Photographe examinant des tirages accrochés à un mur dans un studio lumineux

Déployez le serveur de dés ce soir, puis ouvrez Picasso IA et créez quelque chose avec. Rédigez un prompt, lancez-le avec Seedream 5 Pro et Nano Banana 2 Lite, et comparez les deux résultats côte à côte. Dès que votre propre outil MCP renvoie une URL d’image depuis un serveur qui ne coûte rien, la boucle complète fonctionne, et chaque nouvel outil ensuite ne prend que quelques minutes. Testez plusieurs prompts, dépassez volontairement quelques limites et voyez quel hébergeur gratuit tient la route pour votre projet.

Partager cet article

Choisissez votre langue