Descripción
Workflow automatizado de GitHub Actions que rota MCP_TOKENS (tokens de autenticación del MCP) en el entorno de Cloudflare Pages de CreaRack. Se ejecuta bajo demanda (workflow_dispatch) y no tiene ejecución programada.
Propósito crítico: permite cambiar los tokens de acceso del MCP sin requerir que un usuario intervenga directamente en la UI de Cloudflare (la credencial del repo CLOUDFLARE_API_TOKEN tiene scope limitado a Pages).
Flujo de ejecución
| Paso | Acción | Quién |
|---|---|---|
| 1 | Generar tokens nuevos (script scripts/generate-mcp-tokens.ps1) e guardarlos en bóveda | Humano (típ. Edu) |
| 2 | Publicar en GH secret temporal MCP_TOKENS_NEW (repo-scope) | Humano (gh secret set MCP_TOKENS_NEW -R ...) |
| 3 | Disparar este workflow (gh workflow run rotate-mcp-tokens.yml) | Humano |
| 4 | Workflow valida que ${{ secrets.MCP_TOKENS_NEW }} exista | Workflow (paso: Update Pages env var) |
| 5 | Compone JSON payload con estructura CF Pages: {deployment_configs:{production:{env_vars:{MCP_TOKENS:{type:"secret_text",value:$NEW_VALUE}}}}} | Workflow (jq en bash) |
| 6 | PATCH a CF API: https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/pages/projects/crearacksl-workspace | Workflow (curl) |
| 7 | Valida respuesta (.success == true) | Workflow |
| 8 | Eliminar secret temporal MCP_TOKENS_NEW | Humano (gh secret delete MCP_TOKENS_NEW) |
| 9 | Disparar cf-pages-deploy.yml para hacer deploy normal | Humano (gh workflow run cf-pages-deploy.yml) |
| 10 | Env de CF Pages se aplica en el SIGUIENTE deploy (no instantáneo) | CF Pages runtime |
Razón del workflow (en lugar de UI manual)
El token CF_CLAUDE_TOKEN (perfil de Edu en la sesión de Claude) no tiene scope Pages habilitado. Por eso la rotación de env vars se hace con:
CLOUDFLARE_API_TOKEN(secret del repo, scope: Account → Cloudflare Pages → Edit)CLOUDFLARE_ACCOUNT_ID(secret del repo, public)
Esto aísla el privilegio mínimo: solo Pages, sin acceso a DNS/Workers/Zero Trust.
Estructura del workflow
name: Rotate-MCP-Tokens
on:
workflow_dispatch: # Ejecución manual bajo demanda
jobs:
rotate:
name: PATCH MCP_TOKENS en CF Pages
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Update Pages env var
env:
CF_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CF_ACCOUNT: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
NEW_VALUE: ${{ secrets.MCP_TOKENS_NEW }} # ← TEMPORAL, del paso 2
run: |
# Valida que NEW_VALUE exista
# Compone JSON payload con jq (sin logging de valor)
# PATCH a CF API
# Verifica .success == true
# Imprime confirmación
Restricciones de seguridad
- No loguea valores: el nuevo token se pasa por env + stdin, nunca en stdout
- Expiración del secret: paso 8 obliga a borrar
MCP_TOKENS_NEWpara evitar accesos futuros - Timeout breve: 5 minutos máximo (evita workflows colgados)
- Atomic-like: la rotación es un PATCH único; no hay estados intermedios
Consumidores afectados tras el deploy
Cuando CF Pages despliega (paso 9), el nuevo MCP_TOKENS se aplica a:
- GitHub Actions (workspace repo): variable
MCP_TOKENenenvde otros workflows - OPS crons (
/opt/bib-reindex/.token): actualizado manualmente en máquina OPS - User env (
%APPDATA%\...en Windows): variableBIB_MCP_TOKENen cada PC del equipo
Véase Playbook §6 para coordinación exacta.
Historial de rotaciones
- 10-07-2026 (s216, P1a): tokens Edu/Dani/Txell + nuevo CI. Ejecutado la misma noche (orden Edu). Exposición: token compartido en
.mcp.jsonlocales (nunca en git).
Véase también
- [[entity—ci—script—generate-mcp-tokens]]
- [[concept—infra—secret-rotation]]
- [[crearack-tech—guides—secret-rotation-playbook]]
- [[crearack-tech—guides—inventario-de-secretos]]
- [[decision—20260710—mcp-json-hallazgo-falso-y-rotacion-p1a]]