Agents IA (MCP)¶
Carbure embarque un serveur MCP (Model Context Protocol) qui permet à un agent IA (Claude, ChatGPT, Cursor, Copilot, Gemini…) de consulter les données du foyer et de répondre à des questions comme « Combien avons-nous dépensé en restaurants cette année ? », « Quelles catégories dépassent leur budget ce mois-ci ? » ou « Comment évolue notre épargne depuis 6 mois ? ».
- Lecture seule : aucun outil ne modifie les données.
- Rien à installer : le serveur est une route de l'API (
/api/mcp), servie par le même serveur web que le portail. - Sous contrôle : désactivé par défaut, un administrateur l'active ; chaque utilisateur crée ses jetons d'accès et les révoque quand il veut.
Confidentialité
Carbure reste hébergé chez vous, mais les données qu'un agent IA consulte (libellés, montants, catégories) sont envoyées à son fournisseur pour être analysées. N'activez cet accès que si cela vous convient.
1. Activer le serveur MCP¶
Onglet Agent IA du portail (menu Administration) : un administrateur active l'interrupteur Serveur MCP
activé (le réglage mcp_enabled est enregistré en base). Tant qu'il est désactivé,
/api/mcp répond 403, même avec un jeton valide, et les utilisateurs ne peuvent pas créer
de jeton.
2. Créer un jeton d'accès¶
Dans l'onglet Agent IA (menu Administration pour un administrateur, menu utilisateur sinon), bouton + : donnez un nom au jeton (par exemple
« Claude Code sur mon portable ») et choisissez sa durée de validité (30 jours, 90 jours,
1 an ou sans expiration ; un jeton expiré est refusé et signalé « Expiré » dans la
liste). Le jeton (cbt_…) n'est affiché qu'une seule fois, avec la configuration prête
à copier pour chaque agent. La liste Mes jetons d'accès montre leur date de création,
de dernière utilisation et d'expiration ; la corbeille révoque un jeton immédiatement.
Chaque utilisateur peut avoir 20 jetons au plus. Seule l'empreinte SHA-256 du jeton est conservée en base.
3. Connecter son agent IA¶
Claude (web, Desktop, mobile) : sans jeton, par OAuth¶
Dans Claude : Paramètres → Connecteurs → Ajouter un connecteur personnalisé, collez
l'URL du serveur MCP (https://<votre-serveur>/api/mcp, affichée dans l'onglet Agent IA)
puis cliquez sur Se connecter. Claude ouvre le portail de Carbure : connectez-vous si
besoin, puis Autoriser. L'accès apparaît dans Mes jetons d'accès, au nom de l'agent
(« Claude »), et se révoque comme les autres jetons. Carbure doit être accessible en HTTPS
depuis Internet (voir Synology, étape 8).
Les autres agents : avec un jeton¶
| Agent | Configuration (proposée par le portail) |
|---|---|
| Claude Code | claude mcp add --transport http carbure <url> --header "Authorization: Bearer <jeton>" |
| ChatGPT | connecteur en mode développeur, URL <url>?token=<jeton> (HTTPS public requis) |
| Cursor | bloc mcpServers de ~/.cursor/mcp.json avec l'en-tête Authorization |
| VS Code (Copilot) | bloc servers de mcp.json (type http) avec l'en-tête Authorization |
| Gemini CLI | gemini mcp add --transport http --header "Authorization: Bearer <jeton>" carbure <url> |
<url> est https://<votre-serveur>/api/mcp. Tout client MCP compatible avec le transport
Streamable HTTP fonctionne de la même façon.
Jeton dans l'URL
Pour les agents qui ne savent pas envoyer d'en-tête (ChatGPT), le jeton peut être passé
en paramètre ?token=. Il n'est pas écrit dans les logs de Carbure, mais peut l'être par
un proxy : préférez l'en-tête quand l'agent le permet.
Outils disponibles¶
| Outil | Rôle |
|---|---|
list_categories |
Catégories : nom, parent, type (dépense, revenu, hors budget) |
list_transactions |
Transactions d'un mois, éventuellement d'une catégorie |
search_transactions |
Transactions dont le libellé contient un texte |
spending_by_category |
Total et nombre de transactions par catégorie sur une période (YYYY-MM) |
get_budget |
Dépensé et budget prévu par catégorie pour un mois |
get_trends |
Débit, crédit, hors budget, budget prévu et épargne mois par mois |
list_rules |
Règles de catégorisation automatique |
Détails techniques¶
- Transport Streamable HTTP sans session :
POST /api/mcpreçoit un message JSON-RPC 2.0 et répond en JSON ; une notification reçoit202sans corps ;GET /api/mcprépond405(pas de flux SSE). - Versions du protocole :
2025-11-25,2025-06-18,2025-03-26,2024-11-05. - Authentification : jeton d'accès (
cbt_…, en-têteAuthorizationou?token=) ou JWT du portail ; sinon401avecWWW-Authenticate: Bearer resource_metadata="…", qui indique à l'agent où trouver comment obtenir un jeton. Une requête portant un en-têteOrigind'un autre site que Carbure,claude.aiouclaude.comest refusée (403), comme toute requête quand le serveur est désactivé. - OAuth 2.1 (agents qui ne prennent qu'une URL), selon la spécification MCP :
métadonnées
/.well-known/oauth-protected-resource(RFC 9728) et/.well-known/oauth-authorization-server(RFC 8414) ; enregistrement dynamique du clientPOST /api/oauth/register(RFC 7591, URI de retour en HTTPS ou surlocalhost) ; autorisationGET /api/oauth/authorize(PKCES256obligatoire), qui renvoie vers la page de consentement du portail ;POST /api/oauth/token(code d'autorisation à usage unique, valable 5 minutes, ou jeton de rafraîchissement, avec rotation). Le jeton d'accès est un jetoncbt_valable 30 jours ; une nouvelle autorisation remplace les jetons précédents du même agent. L'URL publique est déduite de la requête (X-Forwarded-Protodu proxy) ou du réglagepublic_url. - État du serveur :
GET /api/mcp/settings,PUT /api/mcp/settings(enabled, administrateurs), tablesettings. - Les outils s'exécutent avec les droits de l'utilisateur du jeton.
- Code :
src/resources/Mcp.php(protocole et outils),src/resources/ApiToken.php(jetons),src/resources/OAuth.php(OAuth 2.1),portal/modules/oauthModule.js(consentement).