Aller au contenu

Points d'entrée et transport

Endpoint Méthode Rôle
https://api.vibesell.it/v1/mcp POST Le serveur MCP — JSON-RPC sur Streamable HTTP. Exige un jeton bearer.
https://api.vibesell.it/.well-known/oauth-protected-resource/v1/mcp GET Métadonnées de la ressource protégée (RFC 9728). Aussi servies sans le suffixe /v1/mcp.
https://api.vibesell.it/.well-known/oauth-authorization-server GET Métadonnées du serveur d’autorisation (RFC 8414).
https://api.vibesell.it/v1/oauth/register POST Inscription dynamique des clients (RFC 7591).
https://api.vibesell.it/v1/oauth/authorize GET Autorisation — redirige vers la page d’accord de VibeSell.
https://api.vibesell.it/v1/oauth/token POST Échange du code et rafraîchissement (OAuth 2.1).
https://api.vibesell.it/v1/oauth/revoke POST Révocation des jetons (RFC 7009).

Les documents de découverte sont mis en cache une heure (Cache-Control: public, max-age=3600). Le flux d’autorisation est décrit dans Autorisation.

  • Streamable HTTP, sans état. Chaque POST porte un message JSON-RPC, ouvre sa propre instance de serveur avec les accès de son jeton, et la ferme avec la réponse. Il n’y a pas de session : aucun Mcp-Session-Id n’est émis.
  • Pas de push serveur. GET (un flux de notifications) et DELETE (la fermeture d’une session) répondent 405 Method Not Allowed avec Allow: POST.
  • Jeton bearer uniquement. Authorization: Bearer <access token> — ni cookie, ni clé d’API. Sans jeton, le serveur répond 401 avec un défi WWW-Authenticate qui pointe vers les métadonnées.
  • Versions du protocole. Le serveur négocie jusqu’à MCP 2025-11-25 et accepte les versions antérieures jusqu’à 2024-11-05.
Le défi qui lance le flux OAuth
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://api.vibesell.it/.well-known/oauth-protected-resource/v1/mcp", scope="mcp mcp:act"
Requête
curl https://api.vibesell.it/v1/mcp \
-H "Authorization: Bearer $VIBESELL_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"my-client","version":"1.0.0"}}}'
Résultat (abrégé)
{
"protocolVersion": "2025-11-25",
"capabilities": {
"tools": {},
"resources": {}
},
"serverInfo": {
"name": "vibesell",
"title": "VibeSell",
"version": "0.3.0",
"description": "Your VibeSell workspace in the chat: leads, plans, sending setup, campaign and replies.",
"websiteUrl": "https://vibesell.it",
"icons": [
{
"src": "https://vibesell.it/brand/vibesell-icon.png",
"mimeType": "image/png",
"sizes": [
"144x144"
]
}
]
},
"instructions": "VibeSell finds B2B prospects and runs cold email campaigns for the user, from their VibeSell workspace. Start with get_w…"
}

Les instructions diffèrent pour une connexion en lecture seule et pour une connexion qui peut agir : voir Instructions du serveur.

La liste est construite pour chaque jeton :

Outils Listés quand
Outils de lecture (12) Toujours.
Outils d’action (25) Le jeton porte mcp:act.
decide_approval Le jeton porte mcp:act et le client est l’app Claude, qui le cache au modèle (_meta.ui.visibility: ["app"]).

Chaque outil est accompagné de son inputSchema, de son outputSchema, de ses annotations et de la ressource de la carte :

Une entrée de tools/list
{
"name": "estimate_lead_pool",
"title": "Count matching leads",
"description": "Count how many B2B leads (people at companies) VibeSell's lead provider holds for a target…",
"inputSchema": {
"type": "object",
"properties": {
"countries": {
"…": "…"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"kind": {
"const": "lead_count"
}
}
},
"annotations": {
"title": "Count matching leads",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true
},
"_meta": {
"ui": {
"resourceUri": "ui://vibesell/card-2f87d8dc967b"
},
"ui/resourceUri": "ui://vibesell/card-2f87d8dc967b"
}
}
Annotation Valeur
readOnlyHint true pour les outils de lecture, false pour les outils d’action.
destructiveHint Toujours false : rien de destructif ne s’exécute sans carte d’approbation.
idempotentHint Selon que deux appels identiques donnent ou non le même résultat.
openWorldHint Selon que l’outil sollicite ou non un fournisseur (leads, Instantly, Stripe).

Le serveur expose une ressource, la carte VibeSell (text/html;profile=mcp-app), à l’adresse ui://vibesell/card-2f87d8dc967b — le suffixe est un hash du code de la carte. Toute adresse conforme à ui://vibesell/card-{version} renvoie la carte actuelle : un client qui a gardé en cache une ancienne liste d’outils obtient donc quand même une carte. Voir Cartes interactives.