Fase 2: 04_sanitize.py - scrubbing de secretos de skills/agentes/plans (10 secretos unicos, gate en verde)
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user