Decisión: Rotación de MCP_TOKENS (P1a) — Corrección de hallazgo falso + ejecución
Contexto
Auditoría s216 (workspace, 10-07-2026): revisión de agentes MCP, wiki, protocolo de sesión y tools. Hallazgo inicial reportado: “secretos versionados en .mcp.json (git)” — verificado con cadena && defectuosa.
Corrección honesta: re-verificación contra git log --all demostró que el archivo nunca entró al historial (.gitignore en efecto desde siempre, en ambos repos). La exposición real: token Bearer MCP idéntico y en claro en los .mcp.json locales de los 3 PCs (Edu, Dani, Txell) → atribución rota (todo el equipo actuaba como “edu” en los activity logs).
Decisión
Ejecutada la misma noche por orden de Edu (no fue una recomendación abierta; Edu autorizó ejecución inmediata):
-
Rotar
MCP_TOKENS(CF Pages env var):- 3 tokens personales nuevos:
Edu:...,Dani:...,Txell:... - 1 token
CInuevo para GH Actions + crons OPS (atribución propia en activity_log) - Generador: CSPRNG (no
Get-Random), 40 chars
- 3 tokens personales nuevos:
-
Distribuir a consumidores:
- GH secrets
MCP_TOKENen workspace + CreaRack-Pro (ambos reciben tokenCI) - OPS
/opt/bib-reindex/.token→ tokenCI - Env User
BIB_MCP_TOKENen los 3 PCs Windows (cada uno su propio token, vía Gestor/Edu en persona)
- GH secrets
-
Migrar
.mcp.jsonlocal:- Ya no contiene tokens hardcodeados
- Usa expansión de variables:
${BIB_MCP_TOKEN}(user env) +${CF_ACCESS_CLIENT_ID}/${CF_ACCESS_CLIENT_SECRET}(idem) - Gitignored; nunca volverá a tener secretos en claro
-
Workflow permanente:
- Nueva acción:
.github/workflows/rotate-mcp-tokens.yml - Dispatch manual: composición de “Nombre:token,…” →
gh secret set MCP_TOKENS_NEW→ workflow PATCH en CF Pages env - Razón del workflow (no edición directa):
CF_CLAUDE_TOKENdel perfil no tiene scope Pages; usamosCLOUDFLARE_API_TOKENdel repo
- Nueva acción:
-
Playbook §6 reescrito:
- Era de la era STAGE/DR pre-s185; completamente desactualizado
- Nuevo flujo: 6 pasos desde generar tokens hasta verificar (tokens viejos = 401, nuevos = 200)
Justificación
- ✅ Corrección de atribución: de “compartido ‘edu’” a “token único por persona”
- ✅ Procedimiento repetible: workflow + playbook documentado
- ✅ Sin exposición en git: el error original fue falso (gitignored siempre)
- ✅ Urgencia rebajada: no fue robo; fue higiene + atribución
P1b (CF Access service token) queda para ventana separada con Edu (toca Dokploy PROD/STAGE + redeploy; urgencia rebajada ahora que no hay exposición en git).
Validación post-merge
- ✅
tools/listcon token nuevo = 200 - ✅
tools/listcon token viejo = 401 - ✅ Job
wiki-validate(CI) en verde - ✅ Workflow de Bibliotecario-Lint ejecuta sin errores
- ✅ Cron de OPS/bib-reindex a mano = success
Véase también
- [[runbook—infra—rotar-mcp-tokens]]
- [[crearack-tech—guides—secret-rotation-playbook]]
- [[crearack-tech—guides—inventario-de-secretos]]
- [[feature—mcp—maintenance-agent-token]]
- [[concept—general—como-se-autentica-el-endpoint-mcp-del-workspace-ap]]