# 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): ```json { "mcpServers": { "gitea": { "type": "http", "url": "https://gitea-mcp.p-lao.com/mcp", "headers": { "Authorization": "Bearer <>" } }, "docmost": { "type": "http", "url": "https://docmost-mcp.p-lao.com/mcp", "headers": { "Authorization": "Bearer <>" } }, "github-personal": { "type": "http", "url": "https://github-mcp.p-lao.com", "headers": { "Authorization": "Bearer <>" } }, "penpot": { "type": "http", "url": "https://penpot-mcp.p-lao.com/mcp", "headers": { "Authorization": "Bearer <>" } }, "atlassian": { "type": "stdio", "command": "npx", "args": ["mcp-remote", "https://mcp.atlassian.com/v1/mcp"] } } } ``` 2. 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. 3. `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`: ```yaml 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.