Proteger el acceso MCP de Composer con Cognito OAuth

Composer puede proteger su endpoint MCP con access tokens de Amazon Cognito y seguir usando los hooks de transporte del adaptador MCP oficial de WordPress. No sustituye al adaptador ni crea un usuario de WordPress sombra para cada principal externo.

La autorización es la intersección de privilegio mínimo entre:

  1. el rol de Composer mapeado desde el grupo de Cognito del token;
  2. el rol máximo permitido para el OAuth App Client;
  3. los scopes de Composer realmente concedidos en el access token;
  4. Site Contract, Blueprint, propiedad, validación y aprobación humana.

Modos de acceso

  • Open conserva la ruta compatible autenticada por WordPress.
  • Protected valida Cognito cuando hay bearer token y puede conservar la ruta de compatibilidad configurada.
  • Protected Required falla cerrado: sin provider, mapa de grupos y cliente permitido completos no expone herramientas; cada solicitud requiere token.

Elija el modo deliberadamente en Site Contract y MCP Access. No active Protected Required hasta probar todo el ciclo OAuth.

Identity provider

Composer puede resolver región AWS y User Pool ID desde otro componente WP Suite. La administración muestra región, pool, issuer, URL JWKS, fuente y estado efectivos. Si la resolución falta o es incorrecta, active la configuración manual e introduzca ambos valores.

AWS Region: eu-central-1
User Pool ID: eu-central-1_AbCd1234
Issuer: https://cognito-idp.eu-central-1.amazonaws.com/eu-central-1_AbCd1234

No son secretos. Client secrets y claves privadas no pertenecen a Composer.

Dominio Cognito y App Client público

OAuth requiere un dominio del User Pool. Elija un dominio de prefijo Cognito generado o un custom domain con certificado ACM y DNS. Crear solo un App Client no basta: sin dominio no existe endpoint de autorización de Hosted UI.

El App Client público dedicado debe usar:

  • authorization code grant;
  • PKCE con S256;
  • ningún client secret;
  • la URL callback HTTPS exacta del cliente MCP;
  • openid y los scopes del resource server de Composer;
  • refresh tokens cuando los necesite el cliente.

WP Suite orchestration v1.0.93 o posterior puede crear opcionalmente resource server y App Client para un pool nuevo o existente. Para un pool nuevo, el deployment wizard exige también un dominio Cognito generado o personalizado. Un pool existente gestionado externamente puede conservar su dominio separado. Copie el output AgentComposerMcpOAuthClientId del stack al mapa de clientes OAuth de Composer.

La callback debe coincidir exactamente, incluidos ruta y slash final.

Grupos, roles, clientes y scopes

Mapee valores exactos de cognito:groups a roles de Composer. Si hay varios, el rol mapeado más alto es el inicial. Añada cada App Client permitido con etiqueta local y rol máximo; el límite solo puede reducir el rol del grupo.

Scopes OAuth compatibles:

openid
composer/read
composer/draft
composer/propose
composer/publish.request

Composer normaliza scopes del resource server a composer.read, composer.draft, composer.propose y composer.publish.request. Sistemas legacy también pueden derivar sc.group.<group>. La claim firmada cognito:groups sigue siendo la fuente de pertenencia; un scope no inventa un grupo.

En el flujo Cognito legacy probado, solicitar openid fue necesario para la ruta de claims deseada. Esto no obliga a activar OIDC email/domain claiming de ChatGPT. Composer valida el access token firmado, no el ID token, y no publica un documento OIDC proxy con issuer inválido.

Discovery público antes de autenticar

Los metadatos de protected resource de MCP, los de authorization server y el challenge 401 WWW-Authenticate deben estar disponibles sin bearer token; de otro modo, el cliente no puede descubrir cómo autenticarse.

Debe funcionar por HTTP directo en /wp-json/mcp/smartcloud-agent-composer y por un perfil HTTP de OpenAI Secure MCP Tunnel dirigido al mismo endpoint. Un perfil STDIO antiguo no transporta el challenge externo ni el bearer token. Haga copia, migre cada sitio a HTTP, reinicie su servicio y pruebe discovery antes de reconectar.

Configurar ChatGPT

  1. En la app de modo developer, seleccione el túnel del sitio o URL directa.
  2. En Advanced OAuth settings, elija un cliente OAuth público definido por el usuario.
  3. Copie exactamente la callback de ChatGPT al App Client de Cognito.
  4. Introduzca Client ID, deje secret vacío y token endpoint auth en none.
  5. Solicite openid y los scopes de Composer necesarios.
  6. Complete login y consentimiento de Cognito Hosted UI.
  7. Reconecte, revise el catálogo de acciones y pruebe primero una lectura.

401 frente a 403

  • 401 Authentication required: falta token, es inválido/caducado, tiene issuer, audience o client incorrecto, o no se puede verificar.
  • 403 Forbidden: autenticación correcta, pero grupo, límite de cliente, scope, rol, propiedad o Site Contract no autoriza la herramienta.

No lo corrija concediendo Administrator de WordPress ni desactivando el contrato. Revise el detalle redactado en Audit & portability.

Auditoría y seguridad del token

Composer registra decisiones, llamadas completadas, identidad externa, resultado y códigos redactados en una cadena de auditoría con detección de manipulación. La interfaz muestra hora local del navegador con zona y conserva el UTC exacto en el detalle.

Nunca debe persistir ni mostrar token completo, Authorization header, client secret, argumentos de solicitud o resultado de herramienta.

Lista para producción

  • Región, pool, issuer y JWKS URL resueltos son correctos.
  • El dominio generado/custom sirve Hosted UI.
  • El cliente público usa code + PKCE S256 y callback exacta.
  • Los grupos necesarios están en el access token y mapeados exactamente.
  • Client ID, rol máximo y scopes permitidos son correctos.
  • Clientes desconocidos fallan según la política.
  • Discovery funciona sin bearer por la ruta HTTP elegida.
  • Los límites Reader, Contributor y Publisher se prueban por separado.
  • Publisher puede solicitar aprobación pero no publicar directamente.
  • Éxitos y denegaciones aparecen en auditoría sin datos sensibles.

Para el transporte, continúe con MCP directo o Secure Tunnel y ChatGPT.