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
- Crear
managed-mcp.jsonen 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"]
}
}
}
-
Añadir
managed-mcp.jsona.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. -
chmod 644 managed-mcp.jsonpara 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:rodocker-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
- Dentro del contenedor con el volumen montado:
cat /etc/claude-code/managed-mcp.jsondevuelve el JSON esperado. claude mcp listmuestra los 5 servidores como connected/healthy (no⏸ Pending approval), sin aceptar ningún diálogo de trust, en un$HOMElimpio.- Una llamada trivial a
gitea/docmostconfirma que los tokens montados funcionan.