CreaRack-SL

Workflow: Rotate-MCP-Tokens (GH Actions + CF Pages)

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

PasoAcciónQuién
1Generar tokens nuevos (script scripts/generate-mcp-tokens.ps1) e guardarlos en bóvedaHumano (típ. Edu)
2Publicar en GH secret temporal MCP_TOKENS_NEW (repo-scope)Humano (gh secret set MCP_TOKENS_NEW -R ...)
3Disparar este workflow (gh workflow run rotate-mcp-tokens.yml)Humano
4Workflow valida que ${{ secrets.MCP_TOKENS_NEW }} existaWorkflow (paso: Update Pages env var)
5Compone JSON payload con estructura CF Pages: {deployment_configs:{production:{env_vars:{MCP_TOKENS:{type:"secret_text",value:$NEW_VALUE}}}}}Workflow (jq en bash)
6PATCH a CF API: https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/pages/projects/crearacksl-workspaceWorkflow (curl)
7Valida respuesta (.success == true)Workflow
8Eliminar secret temporal MCP_TOKENS_NEWHumano (gh secret delete MCP_TOKENS_NEW)
9Disparar cf-pages-deploy.yml para hacer deploy normalHumano (gh workflow run cf-pages-deploy.yml)
10Env 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_NEW para 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_TOKEN en env de otros workflows
  • OPS crons (/opt/bib-reindex/.token): actualizado manualmente en máquina OPS
  • User env (%APPDATA%\... en Windows): variable BIB_MCP_TOKEN en 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.json locales (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]]