Fase 2: 04_sanitize.py - scrubbing de secretos de skills/agentes/plans (10 secretos unicos, gate en verde)

This commit is contained in:
2026-07-29 00:35:59 +00:00
parent 21bc219f31
commit 837f91060f
79 changed files with 10153 additions and 0 deletions
@@ -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.