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ément | Valeur |
|---|---|
| Issuer | https://www.setherion.com |
| Resource | https://www.setherion.com/api/mcp |
| Scope | mcp |
| Jeton d’accès | Commence par sto_, dure 1 heure |
| Jeton de rafraîchissement | Commence par str_, dure 30 jours, remplacé à chaque utilisation |
| Code d’autorisation | Commence 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 :
curl https://www.setherion.com/.well-known/oauth-protected-resource/api/mcp{
"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) :
curl https://www.setherion.com/.well-known/oauth-authorization-server{
"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
https://www.setherion.com/api/oauth/registerForfait : 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.
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"] }'| Champ | Signification |
|---|---|
redirect_uris | Obligatoire. Entre 1 et 10 adresses, chacune d’au plus 2 000 caractères. Les doublons sont écartés. |
client_name | Facultatif. Affiché à la personne sur la page de consentement. Coupé à 100 caractères ; An AI assistant s’il est omis. |
grant_types | Facultatif. Seuls authorization_code et refresh_token sont acceptés. |
response_types | Facultatif. 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 :
{
"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": "..." }.
| Statut | error | error_description |
|---|---|---|
400 | invalid_redirect_uri | Send between one and ten redirect_uris. |
400 | invalid_redirect_uri | Redirect URIs must be HTTPS, or HTTP back to localhost. |
400 | invalid_client_metadata | Only authorization_code and refresh_token are supported. |
400 | invalid_client_metadata | Only the code response type is supported. |
429 | slow_down | Too many registrations. Try again later. |
503 | temporarily_unavailable | Not 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.
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ètre | Signification |
|---|---|
response_type | Obligatoire. code. |
client_id | Obligatoire. Issu de l’enregistrement. |
redirect_uri | L’une des adresses enregistrées, comparée à l’identique. Peut être omise uniquement si vous n’en avez enregistré qu’une seule. |
code_challenge | Obligatoire. Le hachage S256 de votre vérificateur, en base64url, de 43 à 128 caractères. |
code_challenge_method | Obligatoire. S256. plain n’est pas accepté. |
state | Recommandé. Renvoyé tel quel. Jusqu’à 1 000 caractères. |
resource | Facultatif. 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,stateetiss(l’émetteur) ; - si elle appuie sur Cancel :
error=access_denied,error_description=The request was declined.,stateetiss; - en cas de problème avec la requête, une fois que le client et l’adresse sont reconnus comme authentiques :
error,error_description,stateetiss. L’errorestunsupported_response_type,invalid_request(PKCE absent, ou méthode autre queS256) ouinvalid_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
https://www.setherion.com/api/oauth/tokenForfait : 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.
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| Champ | Signification |
|---|---|
grant_type | authorization_code. |
code | Le code issu de la redirection. |
client_id | Le client auquel le code a été délivré. |
redirect_uri | La même adresse qu’à l’étape 3. |
code_verifier | Le vérificateur dont vous avez envoyé le hachage S256 comme code_challenge. |
resource | Facultatif. S’il est envoyé, il doit correspondre à la ressource du code. |
{
"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 :
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-6f1c2a9d4e30La 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
error | error_description |
|---|---|
unsupported_grant_type | Use authorization_code or refresh_token. |
invalid_grant | Unknown code. |
invalid_grant | This code was already used. |
invalid_grant | This code has expired. |
invalid_grant | This code was issued to another application. |
invalid_grant | redirect_uri does not match the one the code was issued for. |
invalid_grant | PKCE verification failed. |
invalid_grant | Unknown refresh token. |
invalid_grant | This refresh token has expired. |
invalid_grant | This token was issued to another application. |
invalid_grant | This refresh token was already used. The connection has been ended for safety. |
invalid_target | This 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 ?
