Brancher un agent par MCP
Le serveur MCP de Bastide donne à votre agent de code les mêmes gestes que la console : créer un projet, déployer, lire les journaux, revenir en arrière. Cette page explique comment brancher Claude Code, Claude Desktop, Cursor ou tout autre client MCP, comment l'agent découvre ses outils, et ce que coûtent leurs réponses en jetons.
Ce qu'il faut savoir d'abord
- L'adresse du serveur est unique pour toutes les organisations :
https://mcp.bastide.app/mcp. C'est le jeton présenté qui dit qui vous êtes et ce que vous pouvez faire. - Le serveur n'exécute aucun modèle de langage et n'appelle aucun serveur MCP tiers. Le raisonnement a lieu chez votre agent, avec votre abonnement.
- Chaque outil appelle l'API de Bastide sous votre identité : votre rang sur l'organisation ou le projet, borné par les portées du jeton. Un agent ne peut jamais faire plus que vous. Le détail est dans Ce qu'un agent peut faire.
- Un outil MCP porte le nom de son opération, les points remplacés par des soulignés :
deployment.createdevientdeployment_create.
Deux façons de s'authentifier
| Méthode | Comment | Pour qui |
|---|---|---|
| Autorisation OAuth | Le client ouvre votre navigateur sur la console, vous consentez, il reçoit un jeton d'agent de trente minutes qu'il renouvelle seul. | Les clients qui savent se désigner par un document de métadonnées (Client ID Metadata Document). |
| Jeton personnel en en-tête | Vous frappez un jeton dans la console et le posez dans l'en-tête Authorization: Bearer … de la configuration du client. | Tout client qui permet de poser un en-tête HTTP. |
Note. L'enregistrement dynamique des clients OAuth (RFC 7591) n'est pas ouvert sur
bastide.app. Un client qui ne connaît que ce mode, comme Cursor aujourd'hui, se branche avec un jeton personnel en en-tête.
L'autorisation OAuth
- Le client appelle le serveur sans jeton. Le serveur répond
401avec l'en-têteWWW-Authenticate, qui désigne ses métadonnées :https://mcp.bastide.app/.well-known/oauth-protected-resource/mcp. Le serveur d'autorisation esthttps://api.bastide.app. - Le client ouvre votre navigateur sur l'écran Autoriser un client MCP de la console (
https://console.bastide.app/autoriser). Connectez-vous si besoin. - L'écran montre le nom que le client se donne, son adresse, l'adresse de retour et les portées demandées. Le nom est écrit par le client : vérifiez l'adresse. Choisissez Autoriser ou Refuser. La demande expire au bout de dix minutes.
- Le client reçoit un jeton d'agent valable trente minutes et un jeton de renouvellement valable trente jours, qui change à chaque usage. Le code d'échange est lié au défi PKCE (S256), vit soixante secondes et ne sert qu'une fois.
Un client qui ne demande aucune portée reçoit la seule portée project:read. Les portées accordées ne dépassent jamais votre rang.
Retirer un client autorisé
Ouvrez Compte, section « Clients MCP autorisés ». Chaque client y figure avec ses portées, la date de l'autorisation et celle de son dernier jeton. Retirer refuse ses jetons dès l'appel suivant. Les opérations sous-jacentes sont mcp_client.list et mcp_client.revoke ; elles ne sont pas des outils MCP, un agent ne gère pas ses propres autorisations.
Le jeton personnel
Ouvrez Compte, section « Vos jetons », puis Frapper un jeton. Donnez-lui un nom, une durée (de 7 à 365 jours) et les portées nécessaires. Pour le parcours de déploiement, project:read, project:write et deploy:write suffisent ; ajoutez secrets:write si l'agent doit écrire des variables. Le jeton n'est montré qu'une fois. Voir Comptes de service et jetons.
Claude Code
Avec l'autorisation OAuth, ajoutez le serveur, puis lancez /mcp dans une session pour ouvrir la connexion dans le navigateur :
claude mcp add --transport http bastide https://mcp.bastide.app/mcp
Avec un jeton personnel, passez l'en-tête :
claude mcp add --transport http bastide https://mcp.bastide.app/mcp \
--header "Authorization: Bearer $BASTIDE_TOKEN"
Pour partager la configuration avec l'équipe sans y écrire le jeton, utilisez le fichier .mcp.json à la racine du dépôt. Claude Code y remplace ${BASTIDE_TOKEN} par la variable d'environnement de chacun :
{
"mcpServers": {
"bastide": {
"type": "http",
"url": "https://mcp.bastide.app/mcp",
"headers": { "Authorization": "Bearer ${BASTIDE_TOKEN}" }
}
}
}
Claude Desktop
Ajoutez un connecteur personnalisé (« Add custom connector ») avec l'adresse https://mcp.bastide.app/mcp. Pour l'identité du client OAuth, choisissez l'identité publiée de Claude, qui repose sur un document de métadonnées : c'est le mode que Bastide accepte. Le connecteur vous envoie alors sur l'écran Autoriser un client MCP à la première connexion. L'emplacement exact du menu dépend de votre version et de votre offre Claude : reportez-vous à la documentation de Claude.
Cursor
Cursor lit .cursor/mcp.json dans le projet, ou ~/.cursor/mcp.json pour tous vos projets. Sa connexion OAuth passe par l'enregistrement dynamique, qui n'est pas ouvert : utilisez un jeton personnel, lu d'une variable d'environnement.
{
"mcpServers": {
"bastide": {
"url": "https://mcp.bastide.app/mcp",
"headers": { "Authorization": "Bearer ${env:BASTIDE_TOKEN}" }
}
}
}
Tout autre client MCP
- Transport HTTP « streamable » : des enveloppes JSON-RPC 2.0 postées sur
https://mcp.bastide.app/mcp. Le serveur ne tient aucune session et n'ouvre aucun flux : unGETreçoit405. - Révisions acceptées à l'ouverture (
initialize) :2025-11-25,2025-06-18et2025-03-26. - Méthodes servies :
initialize,ping,tools/list,tools/call,resources/list,resources/read. - Le premier appel sans en-tête
Authorizationreçoit le défi401: c'est lui qui déclenche la découverte OAuth chez un client qui la connaît.
Attention. Sur ces révisions du protocole, une opération qui demande la confirmation d'une personne ne peut pas être confirmée depuis le client : l'outil rend une erreur qui vous renvoie à la console. C'est le cas de la suppression d'un projet ou d'un domaine.
Découvrir les outils
Le serveur sert trois profils d'outillage, choisis par le paramètre profile de l'adresse :
| Profil | Adresse | Contenu |
|---|---|---|
essentiel (défaut) | https://mcp.bastide.app/mcp | Seize outils : le parcours d'un dépôt jusqu'à une adresse de production. |
complet | https://mcp.bastide.app/mcp?profile=complet | Tous les outils servis, soixante-quatre au plus. |
lecture | https://mcp.bastide.app/mcp?profile=lecture | Les seuls outils sans effet. |
Le profil essentiel comprend project_list, project_read, project_create, project_settings_write, deployment_create, deployment_read, deployment_log_read, task_read, deployment_cancel, deployment_rollback, env_list, env_pull_nonproduction, env_write_nonproduction, backend_read, action_undo, et l'outil de découverte toolset_read. L'écriture des variables de production n'y est pas, à dessein. project_create_with_backend, qui crée le projet, sa base et son premier déploiement en un appel, est dans complet.
Deux outils sont servis par le serveur lui-même, sans appeler l'API :
toolset_readrend, pour un domaine (l'objet du nom d'outil :deployment,env,database…), le schéma d'entrée de chaque outil, un exemple d'appel et les clés de sa sortie. Un agent lit ainsi trois schémas au lieu de charger tout le catalogue.documentation_searchcherche dans la documentation de la plateforme (opérations, codes d'erreur, ressources) et rend des extraits bornés par un budget de jetons, chacun avec l'adresse de sa source. L'appariement est lexical : aucun modèle n'est appelé.
Chaque outil publie dans son _meta sa classe de réversibilité (bastide/reversibility), sa portée et son rang minimal, ses codes d'erreur, ses limites de débit et s'il exige une confirmation. Le catalogue complet, avec le schéma de chaque entrée, est publié dans mcp-tools.json et dans la référence MCP. La liste des outils se met en cache une heure : elle est la même pour tous.
Le budget de jetons des résultats
Votre agent paie ses jetons. Chaque outil annonce dans _meta le budget indicatif de son résultat (bastide/tokenBudget) : 700 pour task_read, 1 200 pour deployment_read, 8 000 pour deployment_log_read, par exemple. Les lectures longues sont découpées pour tenir dans ce budget :
deployment_log_reads'arrête àlimitelignes ou au budget, etnextRankdit où reprendre (argumentdepuis).- Les listes sont paginées par curseur, cent éléments au plus par page.
documentation_searchaccepte un argumenttokenBudget, de 100 à 4 800 jetons (1 200 par défaut), que la réponse ne dépasse jamais.
Les ressources MCP
Une ressource se lit par resources/read, sans appel d'outil. Cinq sont servies :
| Adresse | Contenu | Cache |
|---|---|---|
glowsoft://catalogue/tools | Le catalogue des outils par domaine, avec portée, rang et réversibilité. | public, une heure |
glowsoft://docs/llms.txt | La carte de ce que la plateforme publie pour un agent. | public, une heure |
glowsoft://docs/errors | Chaque code d'erreur, sa cause en français et en anglais, et l'appel suivant à faire. | public, une heure |
glowsoft://project/{projectId} | L'état d'un projet, ses environnements et sa dérive de configuration. | privé, une minute |
glowsoft://project/{projectId}/schema | Le schéma de la base du projet et les tables exposées sans politique. | privé, une minute |
Une ressource privée est servie par la même opération qu'un outil (project.read, database.posture.read), sous les mêmes droits. Les ressources d'incident et de conventions d'un projet ne sont pas encore disponibles.
Limites
Elles ne dépendent pas du palier.
- Par jeton, 600 appels par minute, dont 60 écritures, comme l'API.
- Par jeton présenté au serveur MCP, 2 000 appels par heure, dont 200 qui modifient quelque chose. Au-delà, le serveur répond
429avecRetry-After. Un client qui insiste malgré ce délai (vingt refus dans l'heure) voit son jeton gelé, au plus vingt-quatre heures, et vous êtes prévenu. - Cinq créations de projet par jour glissant et par organisation par la voie des agents.
Erreurs fréquentes
| Symptôme | Cause | Remède |
|---|---|---|
401 au premier appel, le client ne propose pas de connexion | Le client ne sait pas suivre la découverte OAuth, ou seulement par enregistrement dynamique. | Branchez-le avec un jeton personnel en en-tête. |
unauthenticated après quelques semaines | Le jeton personnel est échu, révoqué, ou désactivé après 90 jours sans usage. | Frappez-en un autre, ou réactivez-le depuis Compte. |
token_scope_missing | Le jeton ne porte pas la portée de l'outil. | Frappez un jeton avec la portée, ou réautorisez le client. |
insufficient_rank | Votre rang sur le projet est trop bas. | Demandez le rang à un administrateur de l'organisation. |
| L'outil attendu n'apparaît pas | Il n'est pas dans le profil essentiel. | Ajoutez ?profile=complet à l'adresse. |
| « Cette opération demande la confirmation d'une personne » | L'opération est irréversible. | Faites-la depuis la console. |
Chaque erreur porte un code stable, sa cause et l'appel suivant à faire, sous le nom de l'outil. Le catalogue complet est la ressource glowsoft://docs/errors.