Serveur MCP

Branchez n’importe quel client MCP — Claude Code, Cursor, votre propre agent — sur Spunto, et laissez-le faire tout ce que fait l’API.

Spunto fournit un serveur MCP (Model Context Protocol) sur POST /mcp. Par lui, un agent IA peut faire tout ce que fait l’API REST de Spunto : créer une sandbox et y lancer des commandes, démarrer et suivre des tâches, gérer projets et secrets — pas de SDK à écrire, pas d’API REST à lui apprendre.

https://spunto.net/mcp

Deux façons d’entrer : vous connecter avec votre compte Spunto (OAuth — rien à copier), ou donner au client une clé d’API comme token Bearer (vous choisissez ses scopes).

Ajoutez le serveur par sa seule URL. Le client trouve tout seul la connexion de Spunto (il suit la spécification d’autorisation MCP : découverte, inscription dynamique du client, PKCE), ouvre une page Spunto qui vous demande de l’autoriser, puis reste connecté de lui-même.

1

Ajouter le serveur

Avec Claude Code :

claude mcp add --transport http spunto https://spunto.net/mcp

puis lancez /mcp dans Claude Code et choisissez spunto pour vous connecter. Dans Claude.ai, Cursor, VS Code ou tout client qui accepte les serveurs distants, ajoutez un serveur avec l’URL https://spunto.net/mcp.

2

L’autoriser

Votre navigateur ouvre la page de consentement de Spunto. Elle nomme le client (tel qu’il se décrit lui-même : Spunto ne vérifie pas ce nom) et vous laisse choisir : Do everything you can (le défaut), ou Read only. Cliquez sur Allow.

Un client connecté agit en votre nom, dans chaque organisation dont vous êtes membre — ou se contente de lire, requêtes GET seulement, si vous avez choisi Read only. Comme une clé d’API, il ne peut ni gérer les clés d’API ou les membres, ni renommer ou supprimer une organisation : il faut pour cela que vous soyez connecté au dashboard. Vous le voyez et pouvez le déconnecter dans Account Settings → Connected apps, ce qui le révoque immédiatement.

Pour un agent sans navigateur (CI, script), ou pour choisir vous-même les scopes.

1

Créer une clé d’API

Depuis Organization settings → API keys, créez une clé dont les scopes correspondent à ce que l’agent doit pouvoir faire — projects:read pour faire le tour, workers:write et workers:exec pour créer des sandboxes et y lancer des commandes.

2

Ajouter le serveur à votre client

Avec Claude Code :

claude mcp add --transport http spunto https://spunto.net/mcp \
  --header "Authorization: Bearer spk_your_key"

Ou, dans tout client qui lit un mcp.json :

{
  "mcpServers": {
    "spunto": {
      "type": "http",
      "url": "https://spunto.net/mcp",
      "headers": { "Authorization": "Bearer spk_your_key" }
    }
  }
}
3

Demander quelque chose

« Liste mes projets Spunto », « quel projet clone le dépôt api ? » — l’agent choisit lui-même les outils.

Remarque

L’endpoint est aussi affiché, avec un bouton de copie, dans la carte MCP server de Organization settings → API keys.

Toute l’API, en trois outils. Plutôt qu’un outil par endpoint, l’agent parcourt le propre spec OpenAPI de l’API et appelle ce qu’il y a trouvé — tout ce que peut faire l’API, l’agent le peut, et un nouvel endpoint est disponible le jour où il sort.

OutilCe qu’il fait
find_api_operationsSans argument, les sections de l’API. Avec query (par exemple sandbox exec) ou tag, les opérations correspondantes : METHOD /path — operationId — summary
describe_api_operationLes paramètres, le schéma du corps de requête et les réponses d’une opération
call_apiExécute la requête (method, path, query, body) et renvoie le statut HTTP et le corps. Un statut d’erreur est une réponse que l’agent lit — un scope manquant, un conflit — pas un plantage

Les terminaux en direct et les flux de logs (WebSockets) ne sont pas joignables par une requête ; POST …/sandboxes/{id}/exec lance une commande et renvoie sa sortie.

Quelques outils taillés pour les premières questions :

OutilCe qu’il fait
list_organizationsLes organisations dans lesquelles le token peut agir
searchUne recherche sur les projets de l’organisation — le chemin le plus court d’un nom à un id
list_projects, get_projectLes projets et leur configuration

orgId est partout optionnel : une clé d’API appartient à exactement une organisation, et un client connecté ou une session qui n’a qu’une organisation utilise celle-là. Connecté à plusieurs organisations, l’agent passe orgId (il en obtient la liste par list_organizations).

Un client MCP peut faire exactement ce que son token pouvait déjà faire en REST — sa clé d’API, ou pour un client connecté, votre compte, limité à la lecture si vous l’avez choisi — et rien de plus. Chaque appel d’outil est rejoué dans les propres routes de l’API avec le token de l’appelant : les mêmes vérifications de scope et d’organisation s’appliquent.

  • une clé sans projects:write reçoit de call_api une erreur « missing scope » quand elle essaie de créer un projet ;
  • une clé limitée à une organisation ne peut pas en lire une autre, même en passant orgId explicitement ;
  • révoquer la clé, ou déconnecter un client connecté, l’arrête immédiatement.

Conseil

Donnez à la clé l’ensemble de scopes le plus étroit dont l’agent a réellement besoin. C’est la seule chose qui sépare un agent autonome du reste de votre organisation.

Le serveur est en Streamable HTTP stateless : pas de Mcp-Session-Id, pas de flux initié par le serveur. GET /mcp et DELETE /mcp répondent 405 avec une erreur JSON-RPC qui l’explique — les clients n’ont qu’à faire des POST. Les réponses sont du JSON simple (Content-Type: application/json) : envoyez donc Accept: application/json, text/event-stream et acceptez l’un ou l’autre.

Les métadonnées d’autorisation sont à /.well-known/oauth-protected-resource/mcp (également indiquées par le WWW-Authenticate: Bearer resource_metadata=… du 401) et à /.well-known/oauth-authorization-server. Les clients s’inscrivent par POST /api/oauth/register et sont publics (token_endpoint_auth_method: none, PKCE S256 obligatoire) ; les access tokens durent une heure, les refresh tokens 30 jours, avec rotation à chaque utilisation. Une redirection loopback (http://127.0.0.1:{port}/…) accepte n’importe quel port.