Túnel MCP para ChatGPT: conecta un servidor MCP local a ChatGPT

ChatGPT no puede acceder a localhost, así que un servidor MCP local necesita un túnel. Consulta los comandos exactos de ngrok y Cloudflare, el formulario del conector en modo desarrollador, los errores que bloquean la primera llamada a una herramienta y los hábitos que mantienen segura una URL pública, además de cuándo un servidor alojado es mejor que un túnel.

Túnel MCP para ChatGPT: conecta un servidor MCP local a ChatGPT
Cristian Da Conceicao
Fundador de Picasso IA

Tu servidor MCP funciona perfectamente en localhost:3000. Luego pegas esa dirección en ChatGPT y aparece un error. No pasa nada malo con tu código. ChatGPT vive en la nube de OpenAI, y tu equipo portátil está detrás de un router que nunca lo invitó a entrar. Un túnel MCP para ChatGPT cierra esa brecha: un pequeño programa en tu equipo abre una conexión saliente hacia un relé, el relé te entrega una dirección HTTPS pública y cada solicitud que ChatGPT envía a esa dirección viaja de vuelta por la conexión hasta tu servidor local.

Este artículo sigue el orden en el que realmente vas a trabajar: qué exige ChatGPT de un servidor MCP remoto, un servidor pequeño que merece la pena probar, dos opciones de túnel con comandos exactos, el formulario del conector dentro de ChatGPT, los errores que te roban una tarde entera y los hábitos que evitan que una URL pública se convierta en un problema. Como mucho necesitas una cuenta gratuita en un servicio de túneles, y nada más que un equipo portátil normal.

💡 La versión corta: sirve tu endpoint MCP con Streamable HTTP, apunta un túnel a ese puerto, pega https://<your-tunnel-host>/mcp en el formulario del conector en el modo desarrollador de ChatGPT y mantén ambos procesos en marcha mientras chateas.

Por qué ChatGPT no puede acceder a localhost

Solo servidores remotos

Los conectores de ChatGPT están pensados para servidores que viven en internet pública. Un servidor que habla stdio, el transporte en el que un cliente de escritorio lanza tu programa como proceso hijo, no puede funcionar aquí, porque ChatGPT no tiene forma de iniciar un proceso en tu equipo. Lo que sí puede hacer es llamar a un endpoint HTTPS, y la documentación de OpenAI enumera tanto Server-Sent Events como Streamable HTTP como protocolos compatibles. Elige Streamable HTTP salvo que tengas un motivo para no hacerlo: sustituyó al antiguo transporte HTTP más SSE en la especificación del Model Context Protocol, y es lo que recomiendan los SDK actuales.

Hay una segunda razón, más sencilla, por la que localhost falla. La palabra significa "esta máquina" para quien la lee. Cuando ChatGPT intenta http://localhost:3000, mira en sus propios servidores, no encuentra nada en el puerto 3000 y se rinde.

Túnel ferroviario de ladrillo con vías que llevan a un pequeño círculo de luz del día

Qué hace realmente un túnel

Un túnel invierte la dirección de la conexión. Tu equipo se conecta hacia fuera con el proveedor del túnel, algo que permiten todos los routers domésticos y la mayoría de los cortafuegos de oficina, y mantiene esa conexión abierta. El proveedor tiene un nombre de host público con un certificado TLS válido y envía las solicitudes entrantes por la conexión abierta. En la práctica, una solicitud recorre cinco pasos:

  1. ChatGPT envía una solicitud a https://abc123.ngrok-free.app/mcp.
  2. El nodo de borde del proveedor la recibe y encuentra tu sesión abierta.
  3. La solicitud baja hasta el cliente del túnel en tu equipo portátil.
  4. El cliente la reenvía a http://localhost:3000/mcp.
  5. La respuesta de tu servidor vuelve por el mismo camino.

Frente al reenvío de puertos clásico, te ahorras los ajustes del router, el DNS dinámico y la renovación de certificados. Además, tienes un interruptor de apagado: cierras el túnel y la dirección pública deja de funcionar al instante.

Qué preparar primero

Plan y modo desarrollador

Los conectores personalizados para servidores MCP remotos están detrás del modo desarrollador. La documentación de OpenAI lo incluye para cuentas Plus, Pro, Business, Enterprise y Education en la web. En los planes de espacio de trabajo, un administrador puede tener que permitirlo antes, así que compruébalo antes de culpar a tu servidor.

Los nombres de los menús cambian entre versiones. Hoy el interruptor está en Configuración, en la sección Apps, como un botón Modo desarrollador cerca de la parte inferior. Las versiones anteriores lo colocaban en Conectores. Si no lo encuentras, busca la palabra "desarrollador" en el panel de configuración.

RequisitoQué significa en la práctica
Plan de ChatGPTPlus, Pro, Business, Enterprise o Education, usado en la web
TransporteStreamable HTTP (Server-Sent Events también funciona)
DirecciónURL HTTPS pública que termina en la ruta MCP, normalmente /mcp
AutenticaciónOAuth, o sin autenticación para una prueba desechable
Túnelngrok, Cloudflare Tunnel o Tailscale Funnel
Procesos en marchaTu servidor y el túnel, ambos activos durante el chat

Un servidor Streamable HTTP mínimo

Necesitas algo pequeño con lo que probar el túnel. Este servidor en TypeScript expone una herramienta, en modo sin estado, así que no hay sesiones que perder al reiniciarlo. Instala primero las dependencias:

npm install @modelcontextprotocol/sdk express zod
npm install -D tsx typescript @types/express

Después guárdalo como server.ts:

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

const app = express();
app.use(express.json());

function buildServer() {
  const server = new McpServer({ name: "local-notes", version: "1.0.0" });
  server.tool(
    "add_numbers",
    "Use this when the user asks to add two numbers together.",
    { a: z.number(), b: z.number() },
    async ({ a, b }) => ({ content: [{ type: "text", text: String(a + b) }] })
  );
  return server;
}

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

app.listen(3000, "127.0.0.1", () => console.log("MCP on http://127.0.0.1:3000/mcp"));

Ejecútalo con npx tsx server.ts. Hay tres detalles importantes. Primero, la ruta es /mcp, y esa ruta exacta acaba en el formulario de ChatGPT. Segundo, sessionIdGenerator: undefined hace que cada solicitud sea independiente, lo que encaja con un túnel que puede reiniciarse. Tercero, la descripción de la herramienta empieza por "Use this when", un hábito que ayuda a ChatGPT a elegir la herramienta adecuada, ya que las elige leyendo esas frases.

Antes de que exista ningún túnel, comprueba que el servidor responde a un handshake:

curl -i http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'

Deberías ver un HTTP 200 y una respuesta que mencione local-notes. Si esto falla en local, ningún túnel lo arreglará.

Cuaderno abierto con un boceto a lápiz de dos cajas unidas por una línea, junto a un equipo portátil cerrado

Abre el túnel

ngrok en dos comandos

Instala ngrok con brew install ngrok en macOS, o usa el instalador de la web de ngrok en Windows y Linux. Después añade el token de tu panel y arranca el túnel:

ngrok config add-authtoken YOUR_TOKEN
ngrok http 3000

La terminal muestra una línea de reenvío como https://abc123.ngrok-free.app -> http://localhost:3000. Añade /mcp y tendrás la URL del conector. ngrok también sirve un inspector local en http://127.0.0.1:4040 que lista cada solicitud y respuesta, que es la forma más rápida de ver lo que ChatGPT envió de verdad.

De forma predeterminada, la dirección cambia cada vez que se reinicia el túnel. Reserva un dominio estático gratuito en el panel de ngrok y luego ejecuta ngrok http --url=your-name.ngrok-free.app 3000 (las versiones antiguas del cliente usan --domain) para que la URL del conector sobreviva a los reinicios y dejes de editarla cada mañana.

Manos de un desarrollador escribiendo en un equipo portátil en un despacho doméstico con poca luz, con una ventana de terminal desenfocada

Túnel rápido de Cloudflare

Si prefieres Cloudflare, instala cloudflared y ejecuta un solo comando:

cloudflared tunnel --url http://localhost:3000

Muestra una dirección como https://random-words.trycloudflare.com. Los túneles rápidos no necesitan cuenta, y ahí está su encanto y su límite: el nombre de host es nuevo en cada ejecución, así que tienes que volver a pegarlo en ChatGPT cada vez. Además, los desarrolladores comentan que los túneles rápidos pueden dar problemas con Server-Sent Events, lo que hace de Streamable HTTP la combinación más segura. Para una dirección permanente, crea un túnel con nombre asociado a un dominio que sea tuyo.

Elegir el túnel adecuado

OpciónEsfuerzo de configuraciónEstabilidad de la direcciónMejor para
Cuenta gratuita de ngrokCuenta más tokenAleatoria, salvo que reserves un dominio estáticoUna primera prueba rápida
Túnel rápido de CloudflareUn comando, sin inicio de sesiónNueva en cada ejecuciónDemos desechables
Túnel con nombre de CloudflareDominio más inicio de sesiónEstableTrabajo diario
Tailscale FunnelTailscale instaladoNombre de host estable dentro de tu tailnetConfiguraciones que ya usan Tailscale

Para una primera prueba, usa ngrok o un túnel rápido. Para el uso diario, una dirección estable importa más que cualquier función de esa tabla.

Cables de red azules conectados a un panel de parcheo negro en un pequeño armario

Añade el conector en ChatGPT

Activa el modo desarrollador

  1. Abre ChatGPT en el navegador y ve a Configuración.
  2. Busca el interruptor Modo desarrollador y actívalo.
  3. Lee la advertencia. Un conector puede leer tus datos y, si lo permites, cambiar cosas, así que conecta solo servidores en los que confíes.

Crea la aplicación

  1. Junto al interruptor, haz clic en Crear aplicación. Las versiones anteriores muestran este botón como Crear dentro de Conectores.
  2. Escribe un nombre como "Notas locales".
  3. Escribe una descripción breve de cuándo debería usarla el modelo.
  4. Pega tu dirección pública en URL del servidor MCP, con la ruta incluida: https://abc123.ngrok-free.app/mcp. Usar solo el nombre de host sin /mcp es el error más común.
  5. Pon Autenticación en Sin autenticación para una prueba desechable, o en OAuth si tu servidor lo implementa.
  6. Marca la casilla que confirma que confías en la aplicación y haz clic en Crear.

ChatGPT ahora contacta con tu URL, realiza el handshake MCP y lista las herramientas que encuentra. Ver add_numbers en esa pantalla significa que toda la cadena funciona: ChatGPT, el túnel y tu servidor.

Persona trabajando junto a la ventana de una cafetería con un equipo portátil, un café con leche y un cruasán

Haz tu primera llamada a una herramienta

Inicia un chat nuevo, abre el menú +, elige Más, selecciona Modo desarrollador y activa tu aplicación. Luego pide algo que la necesite: "Usa Notas locales para sumar 19 y 23".

ChatGPT muestra la llamada a la herramienta que quiere hacer. Las herramientas de solo lectura pueden ejecutarse libremente, mientras que las que escriben datos piden confirmación explícita, así que aprueba la llamada y observa tres sitios a la vez:

  • El chat: la respuesta 42, con la llamada a la herramienta desplegable encima.
  • La terminal de tu servidor: la solicitud entrante.
  • El inspector de ngrok: el JSON sin procesar que envió ChatGPT y que devolvió tu servidor.

Cuando los tres coincidan, tendrás un túnel MCP para ChatGPT funcionando y una plantilla para cada herramienta que añadas después.

Dos compañeros sonriendo ante un equipo portátil en una oficina tipo loft

Soluciona los errores con los que te encontrarás

Errores de conexión y la ruta /mcp

Cuando ChatGPT se niega a guardar la aplicación o informa de que no pudo contactar con el servidor, revisa esta lista antes de cambiar cualquier código:

  • ¿Está el servidor en marcha? Abre la terminal donde se inició y confirma que sigue activo.
  • ¿Apunta el túnel al mismo puerto? ngrok http 3000 solo funciona si tu servidor escucha en el 3000.
  • ¿Coincide la ruta? La URL en ChatGPT debe terminar en la misma ruta que registra tu código.
  • ¿Se reinició el túnel? Un nombre de host aleatorio nuevo significa que la URL antigua del conector ya no sirve.
  • ¿La dirección es HTTPS? ChatGPT no acepta HTTP sin cifrar.

Después repite la prueba de handshake en local contra la dirección pública. Si falla ahí pero funciona en localhost, el fallo está entre el túnel y tu servidor, nunca dentro de ChatGPT:

curl -i https://abc123.ngrok-free.app/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'

Desarrollador agotado frotándose el puente de la nariz en un escritorio iluminado por una sola lámpara de noche

Herramientas obsoletas y cabeceras de host

Dos problemas parecen errores y no lo son.

Herramientas obsoletas. ChatGPT guarda la lista de herramientas cuando creas la aplicación. Si añades, renombras o reformulas una herramienta, el chat seguirá mostrando la versión antigua hasta que actualices el conector desde su página de configuración o lo vuelvas a crear. Cada vez que una herramienta nueva no aparezca, actualiza primero.

Comprobaciones de la cabecera Host. Algunos frameworks y algunos asistentes de los SDK de MCP validan la cabecera Host para bloquear ataques de DNS rebinding. Una solicitud que llega por el túnel trae el nombre de host del túnel en lugar de localhost, así que tu servidor puede responder 403 o 421. Añade el nombre de host del túnel a tus hosts permitidos. Los túneles rápidos cambian de nombre de host en cada ejecución, así que permite un sufijo como .trycloudflare.com en lugar de desactivar la comprobación.

SíntomaCausa probableSolución
Error al guardar la aplicaciónRuta incorrecta o servidor caídoEjecuta el handshake con curl contra la URL pública
Funcionaba ayer, hoy noCambió el nombre de host del túnelActualiza el conector o reserva un dominio fijo
403 o 421 desde tu servidorValidación de la cabecera HostPermite el nombre de host del túnel
Nueva herramienta que no aparece en el chatLista de herramientas en cachéActualiza o vuelve a crear el conector
La llamada a la herramienta agota el tiempoHerramienta lenta detrás del túnelResponde pronto y limita las llamadas a unos pocos segundos

Bloquéalo bien

Trata la URL como pública

Cualquiera que consiga la dirección de tu túnel puede llamar a tu servidor si nada se lo impide. Un nombre de host aleatorio es ocultación, no protección, y aparece en los registros, las capturas de pantalla y el historial del navegador. Usa OAuth en el servidor o pon una capa de acceso delante del túnel: Cloudflare Access y las políticas de tráfico de ngrok existen precisamente para eso. Vincula tu servidor a 127.0.0.1, como hace el código de ejemplo, para que solo el cliente del túnel en tu propia máquina pueda llegar a él directamente.

Pesado pestillo de latón con candado en una puerta de madera desgastada

Limita lo que pueden escribir las herramientas

Una herramienta es una promesa sobre lo que el modelo puede hacer en tu máquina. Mantenla pequeña:

  • Empieza con herramientas de solo lectura y añade las de escritura una a una.
  • Nunca expongas un comando de shell general ni el borrado de archivos sin restricciones.
  • Limita las herramientas de archivos a una sola carpeta de proyecto.
  • Registra cada llamada con sus argumentos, para poder ver después qué ocurrió.
  • Trata la salida de las herramientas como texto no fiable. Una página web o un documento que devuelva tu herramienta puede contener instrucciones dirigidas al modelo, un riesgo conocido como inyección de prompts.
  • Detén el túnel con Ctrl+C al terminar. Una dirección pública inactiva solo supone riesgos.

Cuándo gana un servidor alojado

Un túnel es la herramienta adecuada para construir y depurar. Para el uso diario, un servidor alojado elimina toda una clase de problemas, porque ya vive en una dirección pública: no hay equipo portátil que mantener despierto, ni nombre de host que volver a pegar, ni puerto que olvidar.

PicassoIA funciona así en el lado de la API. Su API para desarrolladores se ejecuta en https://api.picassoia.com/v1 con endpoints al estilo de Replicate: creas una predicción, la consultas y luego obtienes el resultado. Las conexiones MCP se gestionan desde tu cuenta en picassoia.com/en/mcp/accounts tras iniciar sesión, y una cuenta puede ejecutar hasta 5 predicciones a la vez, compartidas entre tokens y conexiones MCP. Consulta la página de la API de PicassoIA para ver las normas de acceso vigentes antes de construir sobre ella.

Cómo usar GPT 5.4 en PicassoIA

Depurar un servidor MCP implica mucha escritura: descripciones de herramientas, esquemas JSON, explicaciones de errores. GPT 5.4 es un buen compañero de redacción para ese trabajo. Este es un flujo de trabajo que encaja con este artículo:

  1. Abre la página del modelo GPT 5.4 en PicassoIA.
  2. Pega el nombre de una herramienta, su esquema de entrada y un objetivo de una línea. Pide tres variantes de descripción que empiecen por "Use this when".
  3. Pide al modelo que enumere dos situaciones en las que ChatGPT no debería llamar a esa herramienta, y luego añade esas líneas a la descripción.
  4. Pega el error exacto de tu terminal o del inspector de ngrok y pide las tres causas más probables, ordenadas.
  5. Copia la mejor descripción de vuelta a tu servidor, reinícialo y actualiza el conector en ChatGPT.

Consejos de parámetros: pega esquemas reales en lugar de describirlos, cambia una sola cosa por prompt y mantén cada solicitud dentro de una sola herramienta. Para una segunda opinión sobre código complicado, pasa el mismo prompt por Claude Sonnet 5 o GPT 5.6 Sol y compara las respuestas.

💡 Consejo: cuando dos modelos no coinciden sobre por qué falla una solicitud, confía en el que señale una línea que puedas verificar en el inspector de ngrok.

Crea después tus propias imágenes

Cuando tu servidor funcione, querrás documentarlo, mostrarlo en una demo o incluirlo en un README, y una publicación necesita imágenes. Cada fotografía de este artículo se generó, no se tomó: cada prompt nombra un sujeto, un escenario, la dirección de la luz, un objetivo y un tipo de película. Esa receta sirve para cualquier tema que le propongas.

  • Nombra la luz: "luz dorada y baja desde la izquierda" funciona mejor que "buena iluminación".
  • Elige un objetivo: "85 mm a f/1.8" da un aire de retrato, "24 mm a f/8" da una escena amplia y nítida.
  • Describe las texturas: la lana, el aluminio cepillado y el ladrillo mojado hacen que una imagen parezca real.

Abre PicassoIA, elige un modelo de imagen y prueba un prompt para tu propio proyecto. Si una imagen fija no basta, un modelo de texto a video puede convertir la misma idea en movimiento. Empieza con una escena de tu propia configuración y mira lo cerca que queda el primer resultado.

Creativo trabajando en un escritorio de estudio luminoso con fotografías impresas de paisajes y una cámara

Compartir este artículo

Elige tu idioma