Cómo alojar un servidor MCP gratis con Vercel, Cloudflare o Docker

Tres formas gratuitas de poner un servidor MCP en línea: Vercel Hobby, Cloudflare Workers y hosts Docker como Render, Cloud Run y Hugging Face Spaces. Límites reales revisados en octubre de 2026, código funcional, seguridad de tokens y una tabla que muestra qué opción se agota primero.

Cómo alojar un servidor MCP gratis con Vercel, Cloudflare o Docker
Cristian Da Conceicao
Fundador de Picasso IA

Tu servidor MCP funciona a la perfección en tu equipo portátil. Claude Desktop lo inicia por stdio, cada herramienta responde y, luego, te planteas una pregunta más difícil: ¿cómo dejas que Cursor en otra máquina, un compañero de equipo o un conector de ChatGPT lleguen a las mismas herramientas sin pagar por un servidor? Necesitas una URL HTTPS pública, y te gustaría que la factura marcara $0.

Puedes alojar un servidor MCP gratis en tres plataformas muy distintas: Vercel, Cloudflare Workers y cualquier host Docker con plan gratuito. Cada una encaja con un tipo distinto de servidor, y cada una tiene un límite con el que tarde o temprano te toparás. A continuación encontrarás las cifras reales, verificadas con la documentación de los proveedores en octubre de 2026, código funcional para cada camino y una lista breve de lo que falla primero.

Desarrollador escribiendo en un equipo portátil en una mesa de cocina una tarde lluviosa

💡 Los planes gratuitos cambian con frecuencia. Cada límite de este artículo procede de la documentación oficial a octubre de 2026. Revisa la página de precios antes de lanzar nada público.

Por qué los servidores locales dejan de ser suficientes

Stdio frente a HTTP remoto

Un servidor stdio es un proceso hijo. El cliente lo lanza, se comunica por la entrada y salida estándar, y lo apaga al terminar la sesión. Nada sale de tu equipo, lo que hace de stdio una opción perfecta para leer archivos locales e inútil para compartir.

Un servidor remoto escucha en una sola URL, normalmente /mcp o /api/mcp, y habla Streamable HTTP. Cualquier cliente que tenga la dirección y el token correcto puede llamarlo desde cualquier lugar. El transporte HTTP+SSE, más antiguo, está quedando atrás: la v2 de mcp-handler de Vercel lo eliminó, y la documentación actual de Cloudflare describe solo Streamable HTTP en /mcp. Si construyes con ese transporte, no tendrás que reescribir todo el próximo año.

Lo que debe ofrecer un host gratuito

Antes de comparar plataformas, anota lo que tu servidor necesita de verdad:

  • Una URL HTTPS estable que puedas pegar en la configuración de un cliente
  • Arranque rápido, porque un cliente con un tiempo de espera corto falla el handshake si tu servidor tarda un minuto en arrancar
  • Almacenamiento seguro de secretos para los tokens que usan tus herramientas
  • Tiempo de CPU suficiente por solicitud para la lógica de tus herramientas, no para ejecutar un modelo
  • Registros legibles para el día en que una llamada falle y nadie sepa por qué

Mano conectando un cable ethernet a un mini PC negro junto a un router blanco

El alojamiento es un problema de red antes que de código: una dirección, un puerto abierto y un proceso que responde. Cada opción siguiente resuelve esas tres cosas de una manera distinta.

Las tres rutas gratuitas de un vistazo

Vercel y Cloudflare ejecutan tu código como funciones sin servidor: sin máquina que gestionar, facturación por uso y gratis hasta un tope. Los hosts Docker ejecutan tu código como un contenedor: un proceso completo con su propio sistema de archivos y el lenguaje que quieras. Esa diferencia decide la mayoría de las contrapartidas.

OpciónAsignación gratuitaArranqueIdeal paraPrincipal pega
Vercel Hobby1 M de invocaciones, 4 horas de CPU, 300 s por llamadaBreve, las instancias se reutilizanEquipos de Next.js, despliegues rápidosSolo uso personal y no comercial
Cloudflare Workers Free100.000 solicitudes al día, 10 ms de CPU cada unaInsignificanteHerramientas ligeras, muchas llamadas10 ms de CPU, 50 subsolicitudes
Render Free750 horas de instancia al mesAlrededor de 1 minuto tras 15 minutos de inactividadCualquier DockerfileSe duerme cuando está inactivo
Google Cloud Run2 M de solicitudes, 180.000 segundos de vCPUEscala a cero, primera llamada más lentaContenedores con tráfico a ráfagasRequiere una cuenta de facturación
Hugging Face SpacesCPU Basic gratuita (2 vCPU, 16 GB de RAM)Los Spaces inactivos pueden pausarseDemos públicasEl disco se borra al reiniciar

Lee la tabla por filas, no por columnas. La columna de arranque predice cómo responde el servidor dentro de un chat: Workers y Vercel responden en milisegundos, mientras que un contenedor dormido hace que la primera llamada a una herramienta se quede colgada. La columna de asignación gratuita predice cuánto tiempo sigues sin pagar: 100.000 solicitudes al día suenan enormes hasta que un agente parlanchín hace un bucle de cuarenta llamadas a una herramienta por tarea.

💡 Las cinco opciones cuestan $0 el primer día, así que el precio es un mal criterio de desempate. Elige según lo que hace una sola llamada a una herramienta: una consulta rápida, un cálculo pesado o una larga espera a otra API.

Vercel: la ruta más rápida del repositorio a la URL

Si tu proyecto ya vive en una aplicación de Next.js con App Router, un servidor MCP es un archivo más. Vercel lo ejecuta como una Function con Fluid compute, que factura la CPU activa por separado del tiempo de memoria. Eso encaja bien con el tráfico MCP: largos periodos inactivos y, después, una ráfaga de llamadas.

Instalar y escribir la ruta

Necesitas Node.js 20 o posterior. La documentación de Vercel fija estas versiones:

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

Crea 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 };

Sube el código a Git, importa el repositorio en Vercel y el servidor responderá en https://your-app.vercel.app/api/mcp. En Cursor, la configuración es una sola línea: {"mcpServers": {"dice": {"url": "https://your-app.vercel.app/api/mcp"}}}. Prueba primero en local con npx @modelcontextprotocol/inspector@latest, elige Streamable HTTP y apúntalo a http://localhost:3000/api/mcp.

Vista desde abajo de un desarrollador trabajando en un loft luminoso con paredes de ladrillo blanco

Límites de Hobby que importan

  • 1.000.000 de invocaciones de funciones al mes
  • 4 horas de CPU activa y 360 GB-hora de memoria aprovisionada
  • 300 segundos de duración máxima por función
  • Solo uso personal no comercial, según las normas de uso justo de Vercel
  • Si superas un límite, lo habitual es esperar 30 días hasta que esa función vuelva a funcionar

Una herramienta que pasa la mayor parte del tiempo esperando a otra API apenas toca las 4 horas de CPU. Una herramienta que analiza archivos grandes las consume rápido. Planifica también según el límite de 300 segundos: devuelve pronto un ID de trabajo y deja que una segunda herramienta lo consulte, en lugar de mantener una llamada abierta durante minutos.

💡 Si un cliente recibe una página de inicio de sesión en lugar de JSON, revisa Deployment Protection. Los proyectos Hobby pueden tener activado Vercel Authentication, que bloquea a los llamantes anónimos, incluido tu cliente MCP.

Cloudflare Workers: gratis y con velocidad de edge

Los Workers se ejecutan dentro de isolates de V8, así que no hay ningún contenedor que arrancar. Eso encaja con la forma sin estado de solicitud y respuesta de la mayoría de los servidores MCP, y explica por qué el tiempo de arranque es casi cero.

Crear el proyecto con un solo comando

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

La plantilla sirve Streamable HTTP en /mcp. La documentación de Cloudflare recomienda ahora createMcpHandler para los servidores nuevos: es sin estado y crea un servidor MCP por solicitud. La clase McpAgent, más antigua, está documentada como obsoleta y congelada en funcionalidades, así que evítala en cualquier proyecto nuevo.

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

Envuelve el handler dentro de un método fetch. Si exportas la función invocable directamente, Wrangler lee una exportación por defecto de función como una clase WorkerEntrypoint y el despliegue se comporta mal.

Vista simétrica de un pasillo de racks de servidores en un centro de datos limpio

Cifras del plan gratuito

  • 100.000 solicitudes al día, que se reinician a medianoche UTC, con un límite de ráfaga de 1.000 solicitudes por minuto
  • 10 ms de tiempo de CPU por solicitud HTTP
  • 50 subsolicitudes por solicitud
  • 128 MB de memoria por isolate
  • Hasta 100 Workers por cuenta

Esperar una llamada a fetch() no cuenta como tiempo de CPU, así que una herramienta que llama a una API externa y devuelve la respuesta cabe sin problemas. El análisis pesado o el procesamiento de imágenes no. Al superar el tope diario, Cloudflare devuelve Error 1027.

La autenticación ya está resuelta aquí. Las plantillas OAuth admiten GitHub, Google, Slack, Auth0, Stytch, WorkOS y Cloudflare Access, con un namespace de KV que guarda las sesiones. El estado, si lo necesitas, puede vivir en KV o en Durable Objects con SQLite, que están disponibles en el plan gratuito.

Docker: cuando necesitas un proceso real

Elige un contenedor cuando tu servidor necesite bibliotecas nativas, archivos locales, un trabajo de larga duración o un lenguaje distinto de TypeScript. Cambias el arranque instantáneo por libertad.

Un Dockerfile mínimo

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"]

Hay dos reglas que importan. Escucha en el puerto que te asigna el host leyendo PORT, y enlaza a 0.0.0.0, no a localhost. Después ejecuta el servidor en modo Streamable HTTP sin estado, para que cualquier instancia pueda responder a cualquier solicitud. Los hosts que escalan a cero descartarán sin aviso las sesiones en memoria.

Vista aérea de contenedores de carga de colores apilados en un puerto con luz dorada

Render, Cloud Run y Spaces

  • Render Free: 750 horas de instancia por espacio de trabajo cada mes, una sola instancia, sin disco persistente, sin SSH y sin SMTP saliente. Las bases de datos Postgres gratuitas caducan a los 30 días.
  • Google Cloud Run: el nivel siempre gratuito ofrece cada mes 2 millones de solicitudes, 180.000 segundos de vCPU, 360.000 GiB-segundos y 1 GB de tráfico saliente desde Norteamérica. Escala a cero por defecto, pero debes vincular una cuenta de facturación.
  • Hugging Face Spaces: añade sdk: docker y app_port: 7860 al encabezado YAML de tu README. El contenedor se ejecuta como el usuario 1000 y todo lo que se escriba en disco se pierde al reiniciar.

Los arranques en frío rompen los handshakes

El servicio gratuito de Render se detiene tras 15 minutos sin tráfico, y despertarlo tarda alrededor de un minuto. Un cliente con un tiempo de espera corto falla la primera solicitud y luego funciona a la segunda. Ese error es muy difícil de rastrear si no conoces la causa.

Dedo pulsando el botón de encendido de una pequeña placa de circuitos sobre una mesa de trabajo

Tienes tres opciones:

  1. Aceptarlo y reintentar la primera llamada
  2. Dividir el servidor: pon las herramientas sensibles a la latencia en Workers y las pesadas en el contenedor
  3. Hacer ping a un endpoint de salud cada 10 minutos. Así un servicio se mantiene despierto dentro de las 750 horas (un mes de 31 días tiene 744), pero revisa las normas del host antes de confiar en ello

Asegúralo antes de compartir la URL

Una URL MCP es un mando a distancia para todo lo que pueden hacer tus herramientas. Cualquiera que la encuentre puede pulsar los botones, y los planes gratuitos no tienen un tope de presupuesto que impida que un desconocido consuma tu cuota.

Añade un token de portador

En Vercel, envuelve el handler con withMcpAuth, define required: true y devuelve el cliente verificado desde verifyToken. Las solicitudes sin un token válido reciben un 401. Un token al que le falte un scope requerido recibe un 403. El ejemplo de la documentación lee un token de demostración desde una variable de entorno y advierte de que, en producción, hay que comprobar el emisor, la audiencia, la caducidad y los scopes contra un servidor de autorización real. mcp-handler no emite tokens por sí mismo.

Para cumplir con la especificación de MCP, publica también los metadatos del recurso protegido de OAuth en /.well-known/oauth-protected-resource, para que los clientes compatibles encuentren tu servidor de autorización.

Candado de latón en una cadena de acero sobre una puerta de madera con gotas de lluvia

Mantén los secretos fuera del repositorio

  • Vercel: variables de entorno del proyecto
  • Cloudflare: npx wrangler secret put PICASSOIA_TOKEN
  • Render y Spaces: secretos del panel, leídos como variables de entorno en tiempo de ejecución

Nunca pegues un token en la descripción de una herramienta ni en un prompt. Los clientes muestran las descripciones de las herramientas al modelo, y el modelo puede repetirlas. Añade también un contador de llamadas por token, ya que todos los que llaman comparten la cuota gratuita.

Elige la opción gratuita adecuada

Vista cenital de un cuaderno con líneas de cuadrícula dibujadas a mano junto a una taza de café

  • Elige Vercel si el proyecto ya está en Next.js, el tráfico es personal y quieres una URL de vista previa para cada pull request.
  • Elige Cloudflare si quieres un arranque casi nulo, hasta 100.000 llamadas al día y herramientas que sobre todo reenvían solicitudes a otras API.
  • Elige un host de contenedores si necesitas binarios nativos, archivos en disco o un trabajo que dure más que una solicitud rápida.

Nada te impide combinarlos. Una configuración habitual es un Worker que responde las consultas baratas y reenvía las solicitudes pesadas a un contenedor, así el cliente siempre recibe una primera respuesta rápida. Empieza con la plataforma más sencilla que encaje, mide durante una semana y cambia solo cuando un límite realmente te afecte.

Qué falla primero

PlataformaPrimer muro con el que topasSeñal de alerta
Vercel Hobby4 horas de CPU, o la norma de uso no comercialFunciones pausadas, espera de 30 días
Workers Free10 ms de CPU en herramientas pesadasErrores de límite de CPU al analizar
Render FreeRetraso de arranqueLa primera llamada falla tras un periodo de inactividad
Cloud RunUso por encima de la asignación gratuitaCargos en la factura
SpacesReinicio del discoEl estado desaparece tras un reinicio

Pruébalo con Picasso IA

Un servidor alojado solo es útil si sus herramientas hacen algo que merezca la pena invocar. La generación de imágenes es una buena primera herramienta, porque puedes ver de inmediato si todo el ciclo funciona.

Una herramienta que llama a un modelo de imagen

PicassoIA expone una API de estilo Replicate en https://api.picassoia.com/v1. Te autenticas con un token Bearer que empieza por pia_sk_, creas una predicción y luego la consultas. El modelo PicassoIA Image acepta un objeto input con un prompt y 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}` }],
    };
  },
);

En Workers, lee el token desde env en lugar de process.env. Las predicciones son asíncronas, así que divide el trabajo en dos herramientas: make_image devuelve el ID de la predicción, y check_image llama a GET /v1/predictions/{id} y devuelve el estado y las URL de salida. Los estados son starting, processing, succeeded, failed y canceled. Cada llamada termina en milisegundos, lo que cabe en el presupuesto de 10 ms de CPU de Workers y nunca mantiene una solicitud abierta. El límite de la cuenta es 5 predicciones a la vez, compartidas entre tokens y conexiones MCP.

💡 La documentación de la API dice que las predicciones son actualmente gratuitas y no usan créditos, y también dice que se necesita un plan Infinite para crearlas. Revisa la página de precios antes de construir una herramienta pública sobre ella.

Modelos que merece la pena conectar

Fotógrafo revisando fotografías impresas colgadas en una pared de un estudio luminoso

Despliega esta noche el servidor de dados y luego abre Picasso IA y crea algo con él. Escribe un prompt, pásalo por Seedream 5 Pro y Nano Banana 2 Lite, y compara los dos resultados lado a lado. Cuando tu propia herramienta MCP devuelva una URL de imagen desde un servidor que no cuesta nada, tendrás todo el ciclo funcionando, y cada nueva herramienta que añadas después llevará minutos. Prueba varios prompts, rompe algunos límites a propósito y comprueba qué host gratuito aguanta mejor tu proyecto.

Compartir este artículo

Elige tu idioma