Autenticación MCP
OAuth usa clientes públicos, registro dinámico y código de autorización con PKCE S256. No hay secreto de cliente ni claves de modelos. El token OAuth MCP y el ID token Firebase de la aplicación tienen propósitos diferentes: /api/mcp acepta el primero; /api/connections verifica el segundo.
Descubrimiento y rutas
| Ruta | Método | Función |
|---|---|---|
/.well-known/oauth-protected-resource/api/mcp |
GET | Recurso, servidor de autorización, alcances y Bearer en cabecera |
/.well-known/oauth-authorization-server |
GET | Endpoints y capacidades OAuth |
/oauth/register |
POST | Registro dinámico; 201 con datos del cliente |
/oauth/authorize |
GET | Valida petición y redirige 302 al consentimiento de la aplicación |
/oauth/token |
POST | Intercambia código o rota refresh token |
/oauth/revoke |
POST | Revoca la concesión asociada; 200 {} incluso para token desconocido |
/api/connections |
GET, POST | Consentimiento y gestión autenticada de conexiones |
El registro requiere redirect_uris (1–10 URLs, máximo 2048 caracteres cada una). Acepta client_name (1–120, predeterminado Cliente MCP), grant_types, response_types, token_endpoint_auth_method: "none", client_uri y logo_uri. Devuelve client_id, client_name, redirect_uris, token_endpoint_auth_method, grant_types y response_types; no devuelve secreto. Las redirecciones deben usar HTTPS o HTTP en localhost, 127.0.0.1 o [::1]; sin credenciales ni fragmento. La coincidencia posterior con la URL registrada es exacta. No se implementa descubrimiento del cliente por descarga de una URL de identidad.
La autorización exige client_id, redirect_uri, response_type=code, code_challenge (43 caracteres base64url), code_challenge_method=S256 y resource igual al recurso anunciado. scope omisible adopta projects:read projects:write; acepta state y ui_locales. La redirección al cliente incluye code, iss y el state recibido. Parámetros repetidos o desconocidos se rechazan.
Alcances y consentimiento
projects:read: proyectos, historial, enlaces, exportación, cursos, formularios y respuestas privadas.projects:write: borradores, entrevista, cursos, formularios e invitaciones.sites:publish: publicación explícita.
El propietario inicia sesión en Wookcom y elige un subconjunto de los alcances solicitados, hasta 100 proyectos propios y allowCreate. Un permiso de escritura no concede lectura automáticamente. Una conexión no accede a todos los proyectos por defecto. Los proyectos creados mediante esa conexión se añaden a su concesión. Para ampliar permisos se necesita un consentimiento nuevo.
El intercambio acepta JSON o formulario URL-encoded: grant_type, client_id y resource son obligatorios. Para código añade code, redirect_uri y code_verifier (43–128 caracteres de [A-Za-z0-9._~-]); para renovación añade refresh_token. scope solo permite reducir permisos. Devuelve access_token, refresh_token, token_type: "Bearer", expires_in y scope.
Código y solicitud de consentimiento caducan a los 5 minutos; acceso a los 15 minutos como máximo; la familia/concesión a los 30 días. La renovación rota ambos tokens. Reutilizar un refresh token usado revoca la conexión completa. La revocación recibe token, client_id y token_type_hint?.
Gestión de conexiones
Con ID token Firebase, GET /api/connections?request=REQUEST_ID&cursor=CURSOR describe el consentimiento y proyectos disponibles (50 por página); sin request, devuelve {connections,nextCursor}. POST admite {action:"approve",requestId,selection:{scopes,projectIds,allowCreate}} y responde {redirectUrl}; {action:"revoke",grantId} responde {revoked:true}; {action:"delete",grantId} responde {deleted:true}. Eliminar la concesión también invalida autenticación y renovación.
El transporte responde con errores HTTP {error,error_description} y desafío WWW-Authenticate para autenticación. Una herramienta puede devolver isError:true, texto JSON {error,message} y _meta["mcp/www_authenticate"]. No registrar tokens en ejemplos, capturas ni logs. Un origen de navegador no autorizado recibe 403; la lista permitida viene de la configuración del servidor, no del registro OAuth.
Fuentes: OAuth, clientes, caducidades, concesiones, metadatos, configuración, rutas y pruebas OAuth.
