El conector
Conectar un asistente
Todo es autoservicio: nadie en Orkasa registra la aplicación del corredor.
Añade el conector
En Claude: Configuración → Conectores → Añadir conector personalizado, y
pega https://orkasa.app/api/mcp. En otros clientes, la misma dirección
donde pidan una URL de servidor MCP.
Autoriza en Orkasa
Se abre Orkasa, entras con tu cuenta y apruebas los permisos. Cada uno se puede desmarcar.
Listo
El asistente ya ve las herramientas que corresponden a los permisos concedidos, y ninguna más.
Qué pasa por debajo
1. El cliente hace POST /api/mcp → 401 + WWW-Authenticate:
resource_metadata="…"
2. GET /.well-known/oauth-protected-resource (RFC 9728)
→ authorization_servers: [orkasa.app]
3. GET /.well-known/oauth-authorization-server (RFC 8414)
→ authorize / token / register
4. POST /api/oauth/register (RFC 7591) → client_id [+ secret]
5. GET /oauth/authorize → el corredor entra y aprueba
6. POST /api/oauth/token → access + refresh
7. POST /api/mcp (Bearer ork_at_…) → tools/list, tools/call
Los pasos 2 a 4 son lo que convierte esto en autoservicio. Sin ellos habría que crear un cliente OAuth a mano para cada corredor — es decir, no habría conector.
El registro abierto es seguro
POST /api/oauth/register no está autenticado. No puede estarlo: el cliente
que se anuncia todavía no tiene ninguna identidad con nosotros.
Un registro no concede nada. Crea una identidad de aplicación sin agencia,
sin token y sin datos detrás. Cada byte que llegue a leer algún día se decide
después, por una persona conectada, en /oauth/authorize, dentro de su propio
tenant. La superficie de abuso son filas en una tabla, no accesos — y los
límites están cortados a esa medida:
- 10 registros por hora y por IP;
redirect_urisenhttps, salvo loopback (RFC 8252 §7.3: una aplicación de escritorio recibe su código enhttp://127.0.0.1:<puerto>);- permisos topados a los del conector, pida lo que pida el cliente;
- registrado dinámicamente implica PKCE obligatorio, como para cualquier cliente público.
El nombre lo elige un desconocido
La pantalla de autorización dice « X quiere conectarse », y ese nombre lo eligió quien se registró. Por eso la pantalla enseña el destino real, no la URL que la aplicación declara:
Nombre elegido por la propia aplicación, sin verificar. Tus datos van a salir hacia evil.example. Autoriza solo si reconoces ese destino y tú iniciaste la conexión.
Enseñar el client_uri declarado como prueba de procedencia volvía el aviso en
nuestra contra: bastaba registrarse con client_uri: "https://orkasa.app" para
que la pantalla mostrara « · orkasa.app » debajo de un nombre inventado. La
redirect_uri, en cambio, se verifica carácter a carácter contra la lista
blanca del cliente — es lo único de esa pantalla que un suplantador no puede
maquillar.
Y se puede retirar
La tarjeta Conexiones, en los ajustes de Orkasa, lista los asistentes con acceso vivo, quién lo autorizó y cuándo, con un botón Desconectar. Sin eso, una autorización dada por error valía sesenta días — lo que dura el token de refresco.
Clientes de escritorio
Un asistente de escritorio no tiene dónde esconder un secreto. Se registra con
token_endpoint_auth_method: "none", obtiene un client_id solo, y lo que
protege el intercambio es PKCE — en S256 y nada más.
Un code_challenge sin método se rechaza: el valor histórico por defecto en
OAuth es plain, que compara el verificador con el reto en claro, y ese reto ya
viajó dentro de la URL de autorización (o sea, por el historial del navegador y
por los registros). Los metadatos solo anuncian S256, y el servidor ya no hace
otra cosa.
El endpoint de token decide la regla según el registro, nunca según lo que traiga la petición: un cliente confidencial no puede hacerse pasar por público omitiendo su secreto.