Construye un cliente para el asistente

Inicio de sesión con OAuth

Cómo inicia sesión un asistente sin una clave de API: descubrimiento, registro, consentimiento y tokens, para construir tu propio cliente.

Un asistente de IA inicia sesión en Setherion con OAuth en lugar de una clave de API: la persona pulsa Allow en una página de Setherion, y el asistente recibe un token. Esta página es el contrato para construir tu propio cliente. Si solo quieres conectar Claude, ChatGPT, Cursor o VS Code, sigue MCP: conecta un asistente de IA.

El flujo es OAuth 2.1 tal como lo pide la especificación de autorización de MCP (2025-06-18):

  • el flujo de código de autorización, con PKCE (S256) siempre obligatorio;
  • solo clientes públicos, sin secreto de cliente;
  • registro dinámico de clientes (RFC 7591), para que nadie tenga que pegar un id de cliente en ningún sitio;
  • tokens ligados a un solo recurso, el endpoint MCP (RFC 8707).

Los tokens funcionan en el Servidor MCP y en ningún otro sitio. Los endpoints REST de esta referencia usan una clave de API.

ElementoValor
Issuerhttps://www.setherion.com
Resourcehttps://www.setherion.com/api/mcp
Scopemcp
Access tokenEmpieza por sto_, dura 1 hora
Refresh tokenEmpieza por str_, dura 30 días, se reemplaza cada vez que se usa
Authorization codeEmpieza por stc_, dura 10 minutos, sirve una sola vez

1. Descubre

Envía una petición al endpoint MCP sin ninguna credencial. El 401 apunta a los metadatos del recurso (RFC 9728) en su cabecera WWW-Authenticate:

bash
curl https://www.setherion.com/.well-known/oauth-protected-resource/api/mcp
json
{
  "resource": "https://www.setherion.com/api/mcp",
  "authorization_servers": ["https://www.setherion.com"],
  "bearer_methods_supported": ["header"],
  "scopes_supported": ["mcp"],
  "resource_name": "Setherion"
}

El mismo documento está en /.well-known/oauth-protected-resource. Después lee los metadatos del servidor de autorización (RFC 8414):

bash
curl https://www.setherion.com/.well-known/oauth-authorization-server
json
{
  "issuer": "https://www.setherion.com",
  "authorization_endpoint": "https://www.setherion.com/oauth/authorize",
  "token_endpoint": "https://www.setherion.com/api/oauth/token",
  "registration_endpoint": "https://www.setherion.com/api/oauth/register",
  "response_types_supported": ["code"],
  "grant_types_supported": ["authorization_code", "refresh_token"],
  "code_challenge_methods_supported": ["S256"],
  "token_endpoint_auth_methods_supported": ["none"],
  "scopes_supported": ["mcp"]
}

Ambos documentos, el registro y el endpoint de tokens responden a cualquier origen (Access-Control-Allow-Origin: *), así que un cliente en una página del navegador puede llamarlos.

2. Regístrate

POSThttps://www.setherion.com/api/oauth/register

Plan: Cualquier plan

Regístrate una vez por instalación. Registrarse no concede nada por sí solo: una persona todavía tiene que pulsar Allow, y el código se devuelve solo a las direcciones exactas registradas aquí.

bash
curl -X POST https://www.setherion.com/api/oauth/register \
  -H "Content-Type: application/json" \
  -d '{ "client_name": "My assistant", "redirect_uris": ["http://localhost:8787/callback"] }'
CampoSignificado
redirect_urisObligatorio. Entre 1 y 10 direcciones, cada una de 2000 caracteres como máximo. Los duplicados se descartan.
client_nameOpcional. Se muestra a la persona en la página de consentimiento. Se corta a 100 caracteres; An AI assistant si se omite.
grant_typesOpcional. Solo se aceptan authorization_code y refresh_token.
response_typesOpcional. Solo code.

Una dirección de redirección debe ser https, o http de vuelta a esta máquina (localhost, 127.0.0.1 o [::1]). No puede tener un fragmento ni un nombre de usuario. La única dirección que no es https ni http es cursor://anysphere.cursor-mcp/oauth/callback, para las aplicaciones antiguas de Cursor.

Sea cual sea el método de autenticación que pida un cliente, se registra como cliente público sin secreto, y la respuesta lo dice:

json
{
  "client_id": "5f0c2a9d-4e30-4d7f-b8a5-6f1c2a9d4e30",
  "client_id_issued_at": 1790000000,
  "client_name": "My assistant",
  "redirect_uris": ["http://localhost:8787/callback"],
  "grant_types": ["authorization_code", "refresh_token"],
  "response_types": ["code"],
  "token_endpoint_auth_method": "none"
}

El estado es 201. Los registros están limitados a 20 por hora y por dirección de red.

Errores de registro

Cada error es { "error": "...", "error_description": "..." }.

Estadoerrorerror_description
400invalid_redirect_uriSend between one and ten redirect_uris.
400invalid_redirect_uriRedirect URIs must be HTTPS, or HTTP back to localhost.
400invalid_client_metadataOnly authorization_code and refresh_token are supported.
400invalid_client_metadataOnly the code response type is supported.
429slow_downToo many registrations. Try again later.
503temporarily_unavailableNot configured. o Connecting assistants is not switched on yet.

3. Pregunta a la persona

Abre el endpoint de autorización en el navegador de la persona. Es una página, no una API: la persona inicia sesión en Setherion si aún no lo ha hecho, ve el nombre que registraste y adónde se la enviará de vuelta, y pulsa Allow o Cancel.

text
https://www.setherion.com/oauth/authorize
  ?response_type=code
  &client_id=5f0c2a9d-4e30-4d7f-b8a5-6f1c2a9d4e30
  &redirect_uri=http%3A%2F%2Flocalhost%3A8787%2Fcallback
  &code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
  &code_challenge_method=S256
  &state=af0ifjsldkj
  &resource=https%3A%2F%2Fwww.setherion.com%2Fapi%2Fmcp
ParámetroSignificado
response_typeObligatorio. code.
client_idObligatorio. Del registro.
redirect_uriUna de las direcciones registradas, comparada de forma exacta. Solo se puede omitir cuando registraste exactamente una.
code_challengeObligatorio. El hash S256 de tu verifier, en base64url, de 43 a 128 caracteres.
code_challenge_methodObligatorio. S256. plain no se acepta.
stateRecomendado. Se devuelve sin cambios. Hasta 1000 caracteres.
resourceOpcional. Si se envía, debe ser https://www.setherion.com/api/mcp (una barra final y las mayúsculas del esquema y del host no importan).

Haz el verifier de 43 a 128 caracteres de A-Z a-z 0-9 - . _ ~, y consérvalo hasta el paso 4.

La persona vuelve a tu redirect_uri con:

  • al pulsar Allow: code, state e iss (el issuer);
  • al pulsar Cancel: error=access_denied, error_description=The request was declined., state e iss;
  • ante un problema con la petición, una vez que se sabe que el cliente y la dirección son genuinos: error, error_description, state e iss. El error es unsupported_response_type, invalid_request (falta PKCE, o el método no es S256) o invalid_target (el recurso no es el endpoint MCP).

Si el cliente es desconocido, o la dirección no es una de las que registró, la página se lo dice a la persona y no envía a nadie a ninguna parte, así que esta página nunca puede usarse para redirigir a alguien a una dirección que no registraste.

4. Intercambia el código

POSThttps://www.setherion.com/api/oauth/token

Plan: Cualquier plan

Envía campos codificados como formulario, como especifica OAuth. También se acepta JSON con los mismos nombres.

bash
curl -X POST https://www.setherion.com/api/oauth/token \
  -d grant_type=authorization_code \
  -d code=stc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
  -d client_id=5f0c2a9d-4e30-4d7f-b8a5-6f1c2a9d4e30 \
  -d redirect_uri=http://localhost:8787/callback \
  -d code_verifier=YOUR_VERIFIER
CampoSignificado
grant_typeauthorization_code.
codeEl código de la redirección.
client_idEl cliente al que se emitió el código.
redirect_uriLa misma dirección que en el paso 3.
code_verifierEl verifier cuyo hash S256 enviaste como code_challenge.
resourceOpcional. Si se envía, debe coincidir con el recurso del código.
json
{
  "access_token": "sto_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "str_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "scope": "mcp"
}

Envía el access token al Servidor MCP como Authorization: Bearer sto_.... Los tokens nunca se guardan en caché: la respuesta lleva Cache-Control: no-store.

5. Renueva

Un access token dura una hora. Antes de que termine, o cuando el servidor MCP responda 401, intercambia el refresh token:

bash
curl -X POST https://www.setherion.com/api/oauth/token \
  -d grant_type=refresh_token \
  -d refresh_token=str_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
  -d client_id=5f0c2a9d-4e30-4d7f-b8a5-6f1c2a9d4e30

La respuesta es la misma que en el paso 4, con un refresh token nuevo. El anterior deja de funcionar, así que guarda el nuevo cada vez.

Un refresh token reutilizado pone fin a la conexión

Usar un refresh token por segunda vez se interpreta como una copia robada, y Setherion pone fin a toda la conexión: todos los tokens de ese consentimiento dejan de funcionar y la persona debe pulsar Allow otra vez. La única excepción es el mismo cliente presentando el mismo token en 60 segundos mientras la conexión sigue abierta, que es como dos procesos de un mismo asistente, como dos ventanas, pueden renovar a la vez. Un código usado dos veces pone fin a su conexión de la misma manera.

Errores

Cada error del endpoint de tokens tiene el estado 400, salvo server_error, y el cuerpo { "error": "...", "error_description": "..." }.

Errores de token
errorerror_description
unsupported_grant_typeUse authorization_code or refresh_token.
invalid_grantUnknown code.
invalid_grantThis code was already used.
invalid_grantThis code has expired.
invalid_grantThis code was issued to another application.
invalid_grantredirect_uri does not match the one the code was issued for.
invalid_grantPKCE verification failed.
invalid_grantUnknown refresh token.
invalid_grantThis refresh token has expired.
invalid_grantThis token was issued to another application.
invalid_grantThis refresh token was already used. The connection has been ended for safety.
invalid_targetThis code was issued for another resource. o This token was issued for another resource.
server_error (estado 500)Not configured. o Could not issue tokens.

Poner fin a una conexión

La persona puede desconectar un asistente en Settings y luego AI assistants and MCP. Todos los tokens de esa conexión, de acceso y de renovación, dejan de funcionar en su siguiente petición, no cuando se acaba la hora. Listar y poner fin a las conexiones solo es posible desde una sesión de Setherion iniciada, así que nada de lo que tiene un asistente puede hacerlo.

Usar una clave de API en su lugar

Un cliente que solo puede enviar una cabecera fija puede saltarse todo esto y enviar una clave de API al servidor MCP. Consulta Autenticación.

¿Te ha sido útil esta página?

Únete a la comunidad

Preguntas, ideas y lo que otros están construyendo.