Si has creado un servidor MCP y quieres que un asistente se conecte desde otro equipo, necesitas una dirección pública y un proceso que siga funcionando. Un VPS te da control sobre ese proceso, el proxy HTTPS y las actualizaciones, pero también te deja a cargo de la máquina.
Esto es distinto de conectar un asistente al servidor MCP de la cuenta Hostbrid: ese servicio permite consultar y gestionar recursos de tu cuenta; no ejecuta un servidor MCP que hayas programado. Para desplegar una web generada con IA, revisa Projects; para un servicio MCP persistente que administras tú, esta guía usa un VPS.
Elige el transporte antes de desplegar
El protocolo MCP define stdio y Streamable HTTP. Con stdio, el cliente inicia el proceso local en su propio equipo. Para conectarte a un servicio remoto necesitas un endpoint HTTP accesible, normalmente una ruta como https://mcp.ejemplo.com/mcp. El transporte Streamable HTTP usa peticiones HTTP y puede mantener respuestas SSE; un proxy o firewall que no admita ese tráfico puede romper la sesión aunque la página responda.
Comprueba qué transporte admite tu servidor y tu cliente antes de contratar. Si solo necesitas herramientas locales para ti, stdio puede bastar y no requiere un VPS público.
Crea un servidor pequeño y protegido
Este ejemplo usa el SDK TypeScript oficial de MCP v2, Express y una herramienta inocua ping. Se validó el 9 de octubre de 2026 con @modelcontextprotocol/server y @modelcontextprotocol/client 2.3.1, @modelcontextprotocol/express 2.0.2, @modelcontextprotocol/node 2.1.1, Express y Zod. Comprueba las versiones actuales antes de desplegar: el SDK y la especificación evolucionan.
Instala las dependencias y guarda las versiones exactas en package-lock.json:
npm install --save-exact @modelcontextprotocol/server@2.3.1 @modelcontextprotocol/express@2.0.2 @modelcontextprotocol/node@2.1.1 express zod
Crea server.mjs:
import { createMcpExpressApp } from '@modelcontextprotocol/express';
import { toNodeHandler } from '@modelcontextprotocol/node';
import { McpServer, createMcpHandler } from '@modelcontextprotocol/server';
import { timingSafeEqual } from 'node:crypto';
import { z } from 'zod';
const port = Number(process.env.PORT || 3000);
const bearer = process.env.MCP_BEARER_TOKEN;
const allowedHost = process.env.MCP_ALLOWED_HOST || '127.0.0.1';
if (!bearer || bearer.length < 32) throw new Error('Configura MCP_BEARER_TOKEN con un secreto aleatorio de al menos 32 caracteres.');
if (!Number.isInteger(port) || port < 1 || port > 65535) throw new Error('PORT no es válido.');
const app = createMcpExpressApp({
host: '0.0.0.0',
allowedHosts: [allowedHost],
allowedOrigins: [allowedHost],
});
const handler = createMcpHandler(() => {
const server = new McpServer({ name: 'mi-servidor-mcp', version: '1.0.0' });
server.registerTool('ping', {
description: 'Devuelve una respuesta fija de estado; no modifica nada.',
inputSchema: z.object({}),
}, async () => ({ content: [{ type: 'text', text: 'pong' }] }));
return server;
});
const nodeHandler = toNodeHandler(handler);
app.all('/mcp', (req, res) => {
const header = req.get('authorization') || '';
const actual = Buffer.from(header.startsWith('Bearer ') ? header.slice(7) : '');
const expected = Buffer.from(bearer);
const valid = actual.length === expected.length && timingSafeEqual(actual, expected);
if (!valid) return res.status(401).json({ error: 'unauthorized' });
return void nodeHandler(req, res, req.body);
});
app.listen(port, '127.0.0.1', () => console.log(`MCP escuchando en 127.0.0.1:${port}/mcp`));
allowedHosts y allowedOrigins deben contener el nombre público que servirá el proxy, por ejemplo mcp.ejemplo.com. El proceso escucha solo en loopback; no expongas el puerto de Node directamente a Internet. Para clientes que envíen un Origin distinto —por ejemplo, una extensión— añade solo el origen que realmente uses.
La autenticación de portador del ejemplo sirve para una prueba controlada y para un cliente que permita configurar esa cabecera. Para varios usuarios, tokens con permisos o acceso OAuth, usa un flujo de autenticación compatible con tus clientes MCP. No pongas secretos en Git, en el repositorio de ejemplos ni en los logs.
Mantén el proceso vivo y publica HTTPS
Ejecuta la aplicación con un usuario del sistema sin privilegios de administrador. Un servicio de systemd puede reiniciarla tras un fallo y al arrancar la máquina; guarda MCP_BEARER_TOKEN en un fichero de entorno legible solo por ese usuario, no en la línea de comandos ni en el repositorio.
Coloca Nginx delante del proceso, termina TLS para el subdominio y reenvía la ruta /mcp a 127.0.0.1:3000/mcp. Conserva los encabezados Host y Origin para que la validación corresponda al dominio público, permite los métodos HTTP que requiere Streamable HTTP y desactiva el buffering para respuestas SSE. Ajusta el tiempo de lectura si tu servidor admite respuestas largas. No abras puertos de administración ni bases de datos al exterior.
Después de obtener un certificado HTTPS, revisa desde fuera que el DNS apunta a la IP del VPS y que la ruta MCP llega al servicio. Las instrucciones exactas de Nginx dependen de tu certificado, dominio, versión del SDK y si tu servidor usa sesiones; prueba la configuración en un subdominio antes de mover tráfico real.
Comprueba protocolo, acceso y recuperación
Conecta un cliente MCP real —por ejemplo, MCP Inspector— al endpoint HTTPS. Confirma que puede inicializar la sesión, listar ping y recibir pong. Repite la prueba sin token y con un Origin no permitido: el ejemplo debe rechazarlos. Comprueba también el método GET/SSE si tu servidor lo ofrece, el reinicio del servicio y que los logs no incluyan tokens.
La prueba local de este ejemplo usó el cliente oficial MCP: la llamada sin token recibió HTTP 401, el cliente autorizado listó ping y obtuvo pong, y un origen no permitido recibió HTTP 403. Eso valida el ejemplo de protocolo y controles; no prueba el rendimiento, disponibilidad ni configuración de tu VPS en producción.
Cuándo conviene un VPS y qué implica
Un VPS encaja si necesitas un proceso persistente, instalar paquetes del sistema, controlar el proxy o adaptar la red. Hostbrid proporciona la máquina virtual; tú administras el sistema operativo, las actualizaciones, los permisos, la aplicación, los secretos, las copias de seguridad y la respuesta ante incidentes. Consulta las tallas y precios VPS y verifica el coste total y los recursos antes de contratar.
Una app Node.js en alojamiento Sites podría servir para un MCP HTTP sencillo, pero la documentación pública no confirma la compatibilidad con sesiones, streaming SSE y los límites de conexión de cada cliente. Comprueba ese comportamiento con tu proveedor antes de depender de ello. Projects está pensado para compilar y publicar repositorios web; no lo trates como un proceso MCP persistente sin probar sus límites.
Si el servicio guarda datos, define una copia y ensaya cómo restaurarla. Si una herramienta puede borrar datos, cambiar permisos o gastar dinero, añade autorización explícita, límites y una confirmación humana. El formato MCP conecta clientes con herramientas; no hace que una herramienta sea segura automáticamente.