Por qué alojar tu propio servidor MCP
Los servicios MCP alojados en terceros introducen una dependencia externa: tus datos, prompts y contextos pasan por una infraestructura que no controlas. En un VPS, el servidor MCP funciona dentro de tu red, con tus reglas de acceso y tu cadena de confianza. Es la misma lógica que autoalojar un repositorio Git o un registro Docker: la autonomía tiene prioridad sobre la comodidad.
Qué ganas con el autoalojamiento
- Confidencialidad de los datos: ningún contexto sale de tu infraestructura.
- Latencia reducida: el servidor MCP y tu aplicación funcionan en la misma red o en VPS vecinos.
- Personalización total: herramientas propias, conectores propietarios, entorno de ejecución a medida.
- Coste predecible: una suscripción VPS fija, sin facturación por llamada.
- Control de versiones: decides cuándo actualizar el servidor y sus dependencias.
Requisitos previos antes de empezar
Necesitas un VPS con acceso root, una distribución Linux reciente (Ubuntu 22.04 LTS o Debian 12 son recomendables), Node.js 18+ o Python 3.11+ según la implementación elegida, y un nombre de dominio apuntando a la IP de tu servidor. Un plan con al menos 1 vCPU y 2 GB de RAM es suficiente para un servidor MCP de uso moderado. Para cargas pesadas o varios servidores MCP en paralelo, planifica 2 vCPU y 4 GB.
Desplegar un servidor MCP en 10 pasos
Actualizar el sistema e instalar Node.js
Conéctate por SSH con tu clave y ejecuta
apt update && apt upgrade -y. Instala Node.js desde el repositorio oficial NodeSource:curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt install -y nodejs. Verifica connode -vynpm -v.Crear un usuario dedicado
Nunca ejecutes el servidor MCP como root. Crea un usuario de aplicación:
useradd -m -s /bin/bash mcp && su - mcp. Todos los comandos posteriores se ejecutan bajo este usuario.Clonar e instalar el servidor MCP
Elige tu implementación (ver la sección 'Servidores MCP de código abierto recomendados' más abajo). Para
@modelcontextprotocol/server-filesystem:npm install -g @modelcontextprotocol/server-filesystem. Prueba localmente:npx @modelcontextprotocol/server-filesystem /tmp/test.Crear un archivo de servicio systemd
Crea
/etc/systemd/system/mcp-server.servicecon las directivasUser=mcp,ExecStart=/usr/bin/npx @modelcontextprotocol/server-filesystem /home/mcp/data,Restart=alwaysyEnvironment=NODE_ENV=production. Activa e inicia:systemctl enable --now mcp-server.Instalar nginx
Nginx actúa como reverse proxy frente a tu servidor MCP.
apt install -y nginx. Crea un vhost en/etc/nginx/sites-available/mcpcon unlocation /que hagaproxy_pass http://127.0.0.1:3000;. Activa:ln -s /etc/nginx/sites-available/mcp /etc/nginx/sites-enabled/ && nginx -t && systemctl reload nginx.Obtener un certificado TLS con Certbot
apt install -y certbot python3-certbot-nginx && certbot --nginx -d tu-dominio.com. Certbot modifica automáticamente tu vhost nginx para redirigir HTTP a HTTPS y configura la renovación automática. Verifica la renovación:certbot renew --dry-run.Activar la autenticación Bearer
Edita tu vhost nginx para requerir un token en el encabezado HTTP:
if ($http_authorization != 'Bearer TU_TOKEN_SECRETO') { return 401; }. Genera un token fuerte conopenssl rand -hex 32.Configurar el cortafuegos
Cierra todos los puertos excepto 22, 80 y 443:
ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw enable. El puerto interno del servidor MCP (3000 por defecto) nunca debe estar expuesto directamente.Probar el endpoint con curl
curl -H 'Authorization: Bearer TU_TOKEN_SECRETO' https://tu-dominio.com/health. Debes obtener un JSON de estado. Una respuesta 401 indica un token incorrecto; una respuesta 502 indica que el servicio systemd no está funcionando.Activar los registros de acceso de nginx
Añade a tu vhost:
access_log /var/log/nginx/mcp_access.log; error_log /var/log/nginx/mcp_error.log warn;. Estos registros son esenciales para detectar llamadas no autorizadas o bucles de peticiones.
Activa siempre los registros de acceso de nginx para tu servidor
Un servidor MCP recibe llamadas máquina a máquina: sin registros, no puedes detectar intentos de acceso no autorizados ni errores de integración. Configura también log_format para registrar el encabezado Authorization truncado (los primeros 8 caracteres son suficientes para identificar el origen sin exponer el token completo).
Servidores MCP de código abierto recomendados
@modelcontextprotocol/server-filesystem— acceso controlado al sistema de archivos, lectura y escritura de archivos locales.@modelcontextprotocol/server-git— clone, log, diff, commit a través de un repositorio local.@modelcontextprotocol/server-fetch— delega las peticiones HTTP salientes al servidor MCP.@modelcontextprotocol/server-postgres— conexión a una base de datos PostgreSQL: consultas SELECT, esquema, describe table.@modelcontextprotocol/server-playwright— control de un navegador Chromium headless desde el agente.mcp-server-sqlite(comunidad) — alternativa ligera para bases de datos SQLite locales.mcp-obsidian(comunidad) — acceso a un vault de Obsidian, útil para bases de conocimiento en Markdown.
Asegurar el servidor MCP en producción
Un servidor MCP expuesto en Internet es una superficie de ataque. Cuatro medidas son innegociables antes de conectar un cliente de IA a este servidor en producción.
Autenticación por token Bearer. Introduce un token único por cliente en el encabezado Authorization. Revoca inmediatamente un token comprometido y genera uno nuevo con openssl rand -hex 32.
Rate-limiting en nginx. Añade en tu vhost: limit_req_zone $binary_remote_addr zone=mcp:10m rate=30r/m; limit_req zone=mcp burst=10 nodelay;.
HTTPS obligatorio y HSTS. Tras instalar Certbot, añade en el bloque server HTTPS: add_header Strict-Transport-Security "max-age=31536000" always;.
Rotación de tokens. Programa una rotación cada 90 días mediante cron o tu herramienta de gestión de secretos.
Integrar Claude Desktop y Cursor con tu servidor MCP
Una vez que el servidor está en línea y asegurado, la conexión desde un cliente de IA lleva menos de dos minutos.
Claude Desktop. Abre ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) o %APPDATA%\Claude\claude_desktop_config.json (Windows). Añade una entrada en la clave mcpServers:
{
"mcpServers": {
"mi-vps": {
"url": "https://tu-dominio.com",
"headers": {
"Authorization": "Bearer TU_TOKEN_SECRETO"
}
}
}
}Reinicia Claude Desktop. El servidor aparece en la lista de herramientas disponibles.
Cursor. En los ajustes (Cursor > Settings > MCP), haz clic en 'Añadir servidor', elige el tipo HTTP, introduce la URL y añade el encabezado Authorization.
MCP vs API REST vs WebSocket para agentes de IA
Desplace la tabla
| Criterio | MCP | API REST | WebSocket |
|---|---|---|---|
| Modelo de comunicación | Llamadas de herramientas tipadas, descubrimiento dinámico del esquema | Solicitud/respuesta HTTP sin estado, contrato OpenAPI | Canal bidireccional persistente, eventos en tiempo real |
| Integración nativa con LLM | Nativa: Claude, Cursor, Cline, Continue leen el esquema MCP directamente | Requiere un wrapper de function-calling o un plugin | Requiere un adaptador en el lado del agente |
| Complejidad de despliegue | Baja: un proceso Node/Python, un vhost nginx | Baja a media: framework REST estándar | Media a alta: gestión de conexiones, reconexión, estado |
| Adecuado para | Herramientas locales, acceso a archivos, bases de datos, automatización de agentes | Integraciones de terceros, webhooks, microservicios existentes | Notificaciones push, colaboración en tiempo real, streaming |
| Versionado y evolución | Esquema declarado en el servidor, autodescubierto por el cliente | Versionado explícito en la URL o el encabezado | Protocolo de aplicación a gestionar manualmente |
Resolución de problemas: 4 errores frecuentes
1. MCP transport error: Failed to fetch
Este mensaje aparece en Claude Desktop o Cursor cuando el cliente no puede llegar a la URL configurada. Causas frecuentes: el servicio systemd no está funcionando, nginx no se ha recargado tras modificar el vhost, o un cortafuegos bloquea el puerto 443.
2. Connection refused on 127.0.0.1:3000
El servidor MCP no se inició o se bloqueó al arrancar. Consulta los registros systemd: journalctl -u mcp-server -n 50.
3. Request timed out after 30000ms
El servidor responde pero demasiado lento. Verifica el tamaño del directorio o si el disco está lleno (df -h). Aumenta el timeout de nginx como último recurso: proxy_read_timeout 120s;.
4. 401 Unauthorized sistemático
El token enviado por el cliente no coincide con el esperado por nginx. Verifica la exactitud del token en la configuración del cliente.
Hacia un entorno de IA completo en tu VPS
Un servidor MCP es un componente entre muchos en un entorno de IA autoalojado. En el mismo VPS, puedes ejecutar un modelo local a través de Ollama, una base de datos vectorial como Qdrant o Chroma, y un orquestador como n8n o Flowise. ServOrbit ofrece plantillas VPS listas para usar para estos entornos, instalables en pocos clics desde la Marketplace, en infraestructura alojada en centros de datos europeos con IPv4 dedicada y acceso root.