Files
qwen3-6-lora/data/raw/sanitized/plans/creo-que-hay-un-rosy-unicorn.md
T

3.1 KiB

Crear managed-mcp.json para montarlo como volumen

Contexto

Los MCP no se cargan desde settings.json porque settings.json no soporta la clave mcpServers (ni el de usuario ni el de proyecto; es ignorada). Las definiciones de MCP solo se leen de .mcp.json, ~/.claude.json, --mcp-config o managed-mcp.json (mecanismo system-wide, ruta fija en /etc).

Como el username del SO (y $HOME) se asigna al arrancar el contenedor, no sirve sembrar ~/.claude. La solución independiente del usuario es el archivo en /etc/claude-code/managed-mcp.json. En vez de hornearlo en la imagen, se monta como volumen (bind-mount) desde el host → los tokens quedan solo en el host, fuera de la imagen del registry.

  • Nombre de archivo obligatorio: managed-mcp.json
  • Ruta destino dentro del contenedor: /etc/claude-code/managed-mcp.json
  • Se carga para cualquier usuario y sin depender de workspace-trust (las fuentes managed aplican en carpetas untrusted).

Cambio a implementar

  1. Crear managed-mcp.json en la raíz del repo (/home/aleleba/projects/vscode-server/managed-mcp.json) con esta configuración (5 servidores, réplica exacta de los actuales, tokens literales):
{
  "mcpServers": {
    "gitea": {
      "type": "http",
      "url": "https://gitea-mcp.p-lao.com/mcp",
      "headers": { "Authorization": "Bearer <<SPARK_PASSWORD_1>>" }
    },
    "docmost": {
      "type": "http",
      "url": "https://docmost-mcp.p-lao.com/mcp",
      "headers": { "Authorization": "Bearer <<BEARER_TOKEN_1>>" }
    },
    "github-personal": {
      "type": "http",
      "url": "https://github-mcp.p-lao.com",
      "headers": { "Authorization": "Bearer <<SPARK_PASSWORD_1>>" }
    },
    "penpot": {
      "type": "http",
      "url": "https://penpot-mcp.p-lao.com/mcp",
      "headers": { "Authorization": "Bearer <<SPARK_PASSWORD_1>>" }
    },
    "atlassian": {
      "type": "stdio",
      "command": "npx",
      "args": ["mcp-remote", "https://mcp.atlassian.com/v1/mcp"]
    }
  }
}
  1. Añadir managed-mcp.json a .gitignore (contiene tokens en texto plano; no debe commitearse al repo que va al registry). El repo hoy no tiene .gitignore, así que se crea uno con esa entrada.

  2. chmod 644 managed-mcp.json para que el usuario dinámico del contenedor pueda leerlo cuando se monte.

Cómo montar el volumen (referencia para el usuario)

  • docker run:
    -v /ruta/en/host/managed-mcp.json:/etc/claude-code/managed-mcp.json:ro
    
  • docker-compose:
    services:
      vscode-server:
        volumes:
          - ./managed-mcp.json:/etc/claude-code/managed-mcp.json:ro
    

Docker crea /etc/claude-code/ automáticamente al montar el archivo. El :ro lo deja de solo lectura dentro del contenedor.

Verificación

  1. Dentro del contenedor con el volumen montado: cat /etc/claude-code/managed-mcp.json devuelve el JSON esperado.
  2. claude mcp list muestra los 5 servidores como connected/healthy (no ⏸ Pending approval), sin aceptar ningún diálogo de trust, en un $HOME limpio.
  3. Una llamada trivial a gitea/docmost confirma que los tokens montados funcionan.