En una línea: cómo llevar el servidor HTTP (
src/http.ts) de tu máquina a la instancia OCI A1 (Ampere, arm64), expuesto vía Cloudflare con HTTPS.
Este documento describe el plan; la ejecución contra el servidor real queda pendiente hasta tener acceso SSH a la instancia y a la cuenta de Cloudflare.
Ya validado localmente (sin Docker ni OCI, simulando el paso de producción): el servidor
arranca y responde correctamente usando solo dependencias de producción (npm ci --omit=dev
dist/ ya compilado, igual que hace el Dockerfile y el unit de systemd), así que el único
paso que falta es ejecutar esto en la instancia real.| Variable | Descripción |
|---|---|
PORT |
Puerto donde escucha el servidor HTTP (por defecto 3000). |
MCP_TOKEN |
Token que deben enviar los clientes en Authorization: Bearer <token>. Obligatorio: el proceso no arranca sin él. |
Genera un token largo y aleatorio, por ejemplo con openssl rand -hex 32.
# En la instancia OCI A1 (arm64), o con buildx --platform linux/arm64 desde otra arquitectura:
docker build -t mcp-directorio-acambaro .
docker run -d \
--name mcp-directorio-acambaro \
--restart unless-stopped \
-p 127.0.0.1:3000:3000 \
-e MCP_TOKEN="tu-token-aqui" \
mcp-directorio-acambaro
Nota: better-sqlite3 es un módulo nativo; la imagen debe construirse en (o para) arm64 para
que coincida con la arquitectura de la instancia A1.
/opt/mcp-directorio-acambaro (incluye dist/, node_modules/,
package.json).deploy/.env.example a /opt/mcp-directorio-acambaro/.env y ajustar MCP_TOKEN.deploy/mcp-directorio-acambaro.service a /etc/systemd/system/.sudo useradd --system --no-create-home mcp-directorio
sudo chown -R mcp-directorio:mcp-directorio /opt/mcp-directorio-acambaro
sudo systemctl daemon-reload
sudo systemctl enable --now mcp-directorio-acambaro
sudo systemctl status mcp-directorio-acambaro
Recomendado: Cloudflare Tunnel (cloudflared) en la propia instancia OCI, apuntando a
http://localhost:3000. Evita abrir puertos en el firewall/Security List de OCI y Cloudflare
gestiona el certificado HTTPS.
cloudflared tunnel create mcp-directorio-acambaro
cloudflared tunnel route dns mcp-directorio-acambaro mcp.acambaro.com.mx # o el subdominio elegido
cloudflared tunnel --config ~/.cloudflared/config.yml run mcp-directorio-acambaro
Plantilla de config en deploy/cloudflared-config.example.yml
(copiarla a ~/.cloudflared/config.yml y ajustar credentials-file/hostname).
Alternativa: exponer el puerto en el Security List de OCI y usar Cloudflare como proxy DNS (nube naranja) hacia la IP pública, con “Full (strict)” y un certificado de origen de Cloudflare en el servidor. Requiere abrir el puerto en el firewall de OCI.
deploy/verificar.sh https://<tu-dominio> <tu-token>
Corre GET /salud, confirma que POST /mcp sin token da 401, y que con el token correcto
responde el initialize de MCP. Ya se probó contra una instancia local (ver arriba).
server.json ya está preparado (formato oficial de
modelcontextprotocol/registry), apuntando
como servidor remoto Streamable HTTP a https://mcp.acambaro.com.mx/mcp (ajustar si el dominio
final es otro) con autenticación por Authorization: Bearer <token>.
No se ha enviado nada todavía — falta, una vez desplegado y verificado:
# Instalar la CLI oficial (una vez):
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher && sudo mv mcp-publisher /usr/local/bin/
# Autenticarse con GitHub (abre el navegador, pide confirmar un código):
mcp-publisher login github
# Publicar (envía server.json al registro público):
mcp-publisher publish
staging.acambaro.com.mx
o similar para el subdominio del MCP).v0.2.0 una vez verificado en producción.server.json y correr mcp-publisher publish.