# 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 <<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"]
    }
  }
}
```

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.
