Agent-almanac containerize-mcp-server

install
source · Clone the upstream repo
git clone https://github.com/pjt222/agent-almanac
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/pjt222/agent-almanac "$T" && mkdir -p ~/.claude/skills && cp -r "$T/i18n/es/skills/containerize-mcp-server" ~/.claude/skills/pjt222-agent-almanac-containerize-mcp-server-9a4a7c && rm -rf "$T"
manifest: i18n/es/skills/containerize-mcp-server/SKILL.md
source content

Contenerizar Servidor MCP

Contenerizar un servidor MCP basado en R para despliegue y distribución reproducible.

Cuándo Usar

  • Desplegando un servidor MCP en un entorno contenerizado
  • Distribuyendo servidores MCP pre-configurados a miembros del equipo
  • Integrando servidores MCP en infraestructura Kubernetes
  • Necesitando aislamiento entre múltiples servidores MCP
  • Automatizando el despliegue de servidores MCP en CI/CD

Entradas

  • Requerido: Código fuente del servidor MCP (R o Node.js)
  • Requerido: Lista de dependencias del servidor
  • Opcional: Certificados TLS para conexiones seguras
  • Opcional: Archivos de configuración del servidor
  • Opcional: Requisitos de recursos (CPU, memoria)

Procedimiento

Paso 1: Crear Dockerfile para Servidor MCP R

Construir la imagen Docker con las dependencias necesarias.

FROM rocker/r-ver:4.4.0

# Instalar dependencias del sistema
RUN apt-get update && apt-get install -y --no-install-recommends \
    libcurl4-openssl-dev \
    libssl-dev \
    && rm -rf /var/lib/apt/lists/*

# Instalar paquetes R necesarios
RUN R -e "install.packages(c('mcptools', 'ellmer', 'jsonlite'), repos='https://cloud.r-project.org')"

# Copiar código del servidor
WORKDIR /server
COPY . .

# Exponer puerto MCP
EXPOSE 8080

# Punto de entrada
CMD ["Rscript", "-e", "mcptools::mcp_server()"]

Esperado: Dockerfile creado con todas las dependencias, imagen base apropiada seleccionada.

En caso de fallo: Verificar que los paquetes R se instalan correctamente, comprobar dependencias del sistema faltantes.

Paso 2: Configurar Red y Transporte

Configurar el transporte de red para el servidor MCP.

# Para transporte stdio (comunicación estándar)
CMD ["Rscript", "-e", "mcptools::mcp_server()"]

# Para transporte HTTP/SSE
EXPOSE 8080
CMD ["Rscript", "-e", "mcptools::mcp_server(transport='sse', port=8080, host='0.0.0.0')"]

Esperado: El servidor acepta conexiones en el transporte configurado, los puertos están correctamente expuestos.

En caso de fallo: Verificar que el host es '0.0.0.0' (no 'localhost') para acceso externo al contenedor, comprobar reglas de firewall.

Paso 3: Compilar y Probar

Compilar la imagen y verificar la funcionalidad.

# Compilar imagen
docker build -t mcp-server-r:latest .

# Ejecutar con transporte stdio
docker run -i mcp-server-r:latest

# Ejecutar con transporte HTTP
docker run -p 8080:8080 mcp-server-r:latest

# Probar conectividad
curl http://localhost:8080/health

Esperado: El servidor MCP se inicia correctamente dentro del contenedor, acepta conexiones de clientes.

En caso de fallo: Revisar logs del contenedor (

docker logs
), verificar que los paquetes R están disponibles, comprobar el mapeo de puertos.

Paso 4: Optimizar Imagen

Reducir el tamaño de la imagen para producción.

# Compilación multi-etapa
FROM rocker/r-ver:4.4.0 AS builder
RUN R -e "install.packages('renv', repos='https://cloud.r-project.org')"
COPY renv.lock .
RUN R -e "renv::restore()"

FROM rocker/r-ver:4.4.0
COPY --from=builder /usr/local/lib/R/site-library /usr/local/lib/R/site-library
COPY . /server
WORKDIR /server
CMD ["Rscript", "-e", "mcptools::mcp_server()"]

Esperado: La imagen final es significativamente más pequeña que la versión de una sola etapa.

En caso de fallo: Verificar que todos los paquetes necesarios se copian desde la etapa de compilación, probar la imagen final exhaustivamente.

Validación

  • La imagen Docker se compila sin errores
  • El servidor MCP se inicia dentro del contenedor
  • Los clientes pueden conectarse al servidor contenerizado
  • Las herramientas MCP están disponibles y funcionan correctamente
  • El tamaño de la imagen es razonable para distribución
  • El contenedor se reinicia limpiamente sin pérdida de estado

Errores Comunes

  • Host localhost en contenedor: Usar '0.0.0.0' como host para que el servidor sea accesible desde fuera del contenedor.
  • Paquetes R faltantes: Instalar todas las dependencias en el Dockerfile, no confiar en el entorno del host.
  • Tiempo de inicio largo: Pre-compilar paquetes en la etapa de compilación para reducir el tiempo de inicio.
  • Sin persistencia: Los datos del servidor se pierden al reiniciar el contenedor; usar volúmenes para estado persistente.

Habilidades Relacionadas

  • create-r-dockerfile
    - Patrones base de Dockerfile para aplicaciones R
  • configure-mcp-server
    - Configuración de servidores MCP sin Docker
  • build-custom-mcp-server
    - Construir servidores MCP personalizados
  • scaffold-mcp-server
    - Andamiaje de nuevos servidores MCP