OAuth y seguridad
agents2.me implementa OAuth 2.1 con PKCE para el MCP. No hay contraseña de aplicación, clave estática ni token de larga duración compartido — el asistente recibe tokens que pertenecen a una persona.
Endpoints
| Ruta | Función |
|---|---|
/.well-known/oauth-protected-resource | Metadatos del recurso protegido (/mcp) |
/.well-known/oauth-authorization-server | Metadatos del servidor de autorización |
/oauth/authorize | Inicio del flujo; valida client_id, redirect_uri y PKCE |
/oauth/authorize/request/:id | Consulta de la solicitud pendiente, para la pantalla de consentimiento |
/oauth/authorize/decision | Registro de la decisión (aprobar o rechazar) |
/oauth/token | Intercambio del código por el par de tokens y renovación por refresh token |
/oauth/revoke | Revocación del token |
/mcp | El endpoint MCP propiamente dicho |
/mcp/connections | Lista (GET) y revoca (DELETE) las conexiones del usuario |
Identificación del cliente
No existe registro dinámico de clientes. El client_id es una URL https canónica que apunta al documento de metadatos del propio cliente (el estándar CIMD). agents2.me:
- valida que el
client_ides una URL https canónica, con ruta; - busca el documento del cliente con protección contra SSRF, límite de 64 KB y timeout de 5 s;
- extrae el nombre del cliente y la lista de redirect URIs permitidas;
- guarda en caché por 1 hora.
Por eso el asistente debe publicar su propio documento de metadatos — así la pantalla de consentimiento muestra un nombre confiable en lugar de una URL cualquiera.
Tokens
| Token | Formato | Validez |
|---|---|---|
| Acceso | a2m_at_… | 1 hora |
| Renovación (refresh) | a2m_rt_… | 30 días, con rotación |
- Los tokens se guardan solo como hash — ni agents2.me puede imprimir el valor después de emitido.
- La renovación es rotativa: cada uso del refresh token genera uno nuevo e invalida el anterior (con una ventana de tolerancia para peticiones concurrentes).
- El código de autorización vive 60 segundos; la solicitud de consentimiento, 10 minutos.
- El token va siempre en el encabezado
Authorization: BearerUn token en la query string no se acepta — eso evita que aparezca en los logs.
Límites y protecciones
| Protección | Regla |
|---|---|
| Llamadas por conexión | 120 por minuto |
| Fallos de autenticación por IP | 600 por minuto (solo cuentan los tokens inválidos) |
| Tamaño del cuerpo | 4 MB — suficiente para una multimedia de hasta 2 MB en base64 |
| Origen | Las peticiones con Origin solo se aceptan si el origen es de la propia app (los asistentes llaman de servidor, sin Origin) |
| Respuestas de rechazo | 401 con WWW-Authenticate apuntando a los metadatos; 429 al superar el límite; 403 para origen no permitido |
Permisos
El asistente hereda al usuario, no a la empresa. Consecuencias:
- Toda herramienta corre con el perfil del usuario que autorizó el acceso.
- Desactivar al usuario invalida el acceso del asistente.
- Cambiar el perfil del usuario cambia — de inmediato — lo que el asistente puede hacer.
Auditoría
Las llamadas MCP se registran como llamadas autenticadas, con identificación de la conexión, del usuario y del horario (sin el contenido de los tokens, que nunca son legibles). La lista de conexiones activas, el último uso y la revocación quedan en Configuración → Apps conectadas.
Buenas prácticas
- Trata el consentimiento como tratas un inicio de sesión: lee el nombre del cliente antes de aprobar.
- Revoca las conexiones que no reconozcas.
- Prefiere un usuario dedicado (con perfil restringido) cuando la automatización sea de un servicio, no de una persona.
- No está permitido compartir tokens entre asistentes: cada uno hace su propio flujo.