Créer un client d’assistant

Connexion avec OAuth

Comment un assistant se connecte sans clé d’API : découverte, enregistrement, consentement et jetons, pour créer votre propre client.

Un assistant d’IA se connecte à Setherion avec OAuth plutôt qu’avec une clé d’API : la personne appuie sur Allow sur une page Setherion, et l’assistant reçoit un jeton. Cette page est le contrat à suivre pour créer votre propre client. Si vous voulez seulement connecter Claude, ChatGPT, Cursor ou VS Code, suivez MCP : connecter un assistant d’IA.

Le flux est OAuth 2.1, tel que le demande la spécification d’autorisation MCP (2025-06-18) :

  • le flux avec code d’autorisation, avec PKCE (S256) toujours exigé ;
  • clients publics uniquement, sans secret client ;
  • l’enregistrement dynamique des clients (RFC 7591), pour que personne n’ait à coller un identifiant de client quelque part ;
  • des jetons liés à une seule ressource, le point d’accès MCP (RFC 8707).

Les jetons fonctionnent sur le Serveur MCP et nulle part ailleurs. Les points d’accès REST de cette référence demandent une clé d’API.

ÉlémentValeur
Issuerhttps://www.setherion.com
Resourcehttps://www.setherion.com/api/mcp
Scopemcp
Jeton d’accèsCommence par sto_, dure 1 heure
Jeton de rafraîchissementCommence par str_, dure 30 jours, remplacé à chaque utilisation
Code d’autorisationCommence par stc_, dure 10 minutes, ne sert qu’une fois

1. Découvrir

Envoyez une requête au point d’accès MCP sans aucun identifiant. Le 401 renvoie vers les métadonnées de la ressource (RFC 9728) dans son en-tête 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"
}

Le même document se trouve à l’adresse /.well-known/oauth-protected-resource. Lisez ensuite les métadonnées du serveur d’autorisation (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"]
}

Les deux documents, l’enregistrement et le point d’accès des jetons répondent à n’importe quelle origine (Access-Control-Allow-Origin: *), de sorte qu’un client dans une page de navigateur peut les appeler.

2. Enregistrer

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

Forfait : Tous les forfaits

Enregistrez-vous une fois par installation. L’enregistrement n’accorde rien par lui-même : une personne doit encore appuyer sur Allow, et le code n’est renvoyé qu’aux adresses exactes enregistrées ici.

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"] }'
ChampSignification
redirect_urisObligatoire. Entre 1 et 10 adresses, chacune d’au plus 2 000 caractères. Les doublons sont écartés.
client_nameFacultatif. Affiché à la personne sur la page de consentement. Coupé à 100 caractères ; An AI assistant s’il est omis.
grant_typesFacultatif. Seuls authorization_code et refresh_token sont acceptés.
response_typesFacultatif. Seulement code.

Une adresse de redirection doit être en https, ou en http vers cette machine (localhost, 127.0.0.1 ou [::1]). Elle ne peut contenir ni fragment ni nom d’utilisateur. La seule adresse qui n’est ni en https ni en http est cursor://anysphere.cursor-mcp/oauth/callback, pour les anciennes applications Cursor.

Quelle que soit la méthode d’authentification demandée par un client, il est enregistré comme client public sans secret, et la réponse le dit :

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"
}

Le statut est 201. Les enregistrements sont limités à 20 par heure et par adresse réseau.

Erreurs d’enregistrement

Chaque erreur a la forme { "error": "...", "error_description": "..." }.

Statuterrorerror_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. ou Connecting assistants is not switched on yet.

3. Demander à la personne

Ouvrez le point d’accès d’autorisation dans le navigateur de la personne. C’est une page, pas une API : la personne se connecte à Setherion si elle ne l’est pas déjà, voit le nom que vous avez enregistré et l’endroit où elle sera renvoyée, puis appuie sur Allow ou 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
ParamètreSignification
response_typeObligatoire. code.
client_idObligatoire. Issu de l’enregistrement.
redirect_uriL’une des adresses enregistrées, comparée à l’identique. Peut être omise uniquement si vous n’en avez enregistré qu’une seule.
code_challengeObligatoire. Le hachage S256 de votre vérificateur, en base64url, de 43 à 128 caractères.
code_challenge_methodObligatoire. S256. plain n’est pas accepté.
stateRecommandé. Renvoyé tel quel. Jusqu’à 1 000 caractères.
resourceFacultatif. S’il est envoyé, il doit être https://www.setherion.com/api/mcp (une barre oblique finale et la casse du schéma et de l’hôte n’ont pas d’importance).

Donnez au vérificateur de 43 à 128 caractères parmi A-Z a-z 0-9 - . _ ~, et gardez-le jusqu’à l’étape 4.

La personne est renvoyée vers votre redirect_uri avec :

  • si elle appuie sur Allow : code, state et iss (l’émetteur) ;
  • si elle appuie sur Cancel : error=access_denied, error_description=The request was declined., state et iss ;
  • en cas de problème avec la requête, une fois que le client et l’adresse sont reconnus comme authentiques : error, error_description, state et iss. L’error est unsupported_response_type, invalid_request (PKCE absent, ou méthode autre que S256) ou invalid_target (la ressource n’est pas le point d’accès MCP).

Si le client est inconnu, ou si l’adresse n’en fait pas partie, la page le dit à la personne et n’envoie personne nulle part, de sorte que cette page ne peut jamais servir à rediriger quelqu’un vers une adresse que vous n’avez pas enregistrée.

4. Échanger le code

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

Forfait : Tous les forfaits

Envoyez des champs encodés en formulaire, comme OAuth le prévoit. Du JSON avec les mêmes noms est accepté aussi.

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
ChampSignification
grant_typeauthorization_code.
codeLe code issu de la redirection.
client_idLe client auquel le code a été délivré.
redirect_uriLa même adresse qu’à l’étape 3.
code_verifierLe vérificateur dont vous avez envoyé le hachage S256 comme code_challenge.
resourceFacultatif. S’il est envoyé, il doit correspondre à la ressource du code.
json
{
  "access_token": "sto_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "str_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "scope": "mcp"
}

Envoyez le jeton d’accès au Serveur MCP sous la forme Authorization: Bearer sto_.... Les jetons ne sont jamais mis en cache : la réponse porte Cache-Control: no-store.

5. Rafraîchir

Un jeton d’accès dure une heure. Avant qu’il n’expire, ou lorsque le serveur MCP répond 401, échangez le jeton de rafraîchissement :

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 réponse est la même qu’à l’étape 4, avec un nouveau jeton de rafraîchissement. L’ancien cesse de fonctionner, donc enregistrez le nouveau à chaque fois.

Un jeton de rafraîchissement réutilisé met fin à la connexion

Utiliser un jeton de rafraîchissement une seconde fois est interprété comme une copie volée, et Setherion met fin à toute la connexion : chaque jeton issu de ce consentement cesse de fonctionner et la personne doit appuyer de nouveau sur Allow. La seule exception est le même client qui présente le même jeton dans les 60 secondes alors que la connexion est encore ouverte, ce qui permet à deux processus d’un même assistant, par exemple deux fenêtres, de se rafraîchir en même temps. Un code utilisé deux fois met fin à sa connexion de la même façon.

Erreurs

Chaque erreur du point d’accès des jetons a le statut 400, à l’exception de server_error, et le corps { "error": "...", "error_description": "..." }.

Erreurs de jeton
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. ou This token was issued for another resource.
server_error (statut 500)Not configured. ou Could not issue tokens.

Mettre fin à une connexion

La personne peut déconnecter un assistant dans Settings, puis AI assistants and MCP. Chaque jeton de cette connexion, d’accès comme de rafraîchissement, cesse de fonctionner dès sa toute prochaine requête, et non à la fin de l’heure. Lister et terminer les connexions n’est possible que depuis une session Setherion connectée, donc rien de ce que détient un assistant ne peut le faire.

Utiliser une clé d’API à la place

Un client qui ne peut envoyer qu’un en-tête fixe peut se passer de tout cela et envoyer une clé d’API au serveur MCP. Voir Authentification.

Cette page vous a-t-elle été utile ?

Rejoindre la communauté

Questions, idées et ce que construisent les autres.