Aller au contenu

Pour les développeurs

Serveur MCP KRONENWERK : connecter un agent IA à votre comptabilité

Dernière vérification SUPPORTED

Traduction de la version anglaise, mise à jour en premier. Les indications réglementaires renvoient aux sources citées et à leur date de consultation.

KRONENWERK expose un serveur Model Context Protocol (MCP) à l'adresse https://kronenwerk.org/api/extern/mcp. Un agent IA parlant MCP sur Streamable HTTP s'authentifie par OAuth 2.1 (Claude, ChatGPT et d'autres assistants hébergés) ou avec la même clé API Bearer que l'API REST, lit les clients, factures, transactions et rapports d'une entreprise, et crée des brouillons, des transactions et des notes. Qu'il puisse aussi émettre une facture, l'envoyer ou enregistrer un paiement relève de l'entreprise : par défaut ces actes restent ceux d'une personne, et l'entreprise peut les autoriser sous Paramètres → Assistants IA jusqu'à une limite de montant qu'elle fixe, chaque acte étant consigné. Le serveur MCP fait partie de l'offre Enterprise.

Ce qu'est le MCP

Le Model Context Protocol est une spécification ouverte, publiée sur modelcontextprotocol.io, qui définit comment une application IA (le client) découvre et appelle des outils offerts par un système externe (le serveur). Les messages sont en JSON-RPC 2.0. Le serveur publie une liste d'outils avec noms, descriptions et schémas d'entrée JSON ; le modèle lit ces descriptions, décide quoi appeler, et le client envoie une requête tools/call en son nom. Le résultat revient sous forme de contenu que le modèle peut lire et, en option, sous forme de JSON structuré.

Deux transports sont standardisés : stdio pour un serveur lancé comme sous-processus local, et Streamable HTTP pour un serveur joint par le réseau. KRONENWERK est un service réseau, il n'implémente donc que Streamable HTTP. Le protocole est versionné par date. Au 3 septembre 2026, la spécification désigne 2026-07-28 comme révision courante ; les révisions antérieures (2025-11-25, 2025-06-18, 2025-03-26) ouvrent une connexion par une poignée de main initialize, tandis que la révision courante porte la version du protocole et l'identité du client dans un objet _meta sur chaque requête et ajoute une méthode server/discover. Un serveur peut servir plusieurs révisions sur le même endpoint, et KRONENWERK le fait.

Endpoint, transport et authentification

Tout se passe à une seule adresse avec une seule méthode HTTP : POST https://kronenwerk.org/api/extern/mcp, corps application/json, un message JSON-RPC par requête.

Authentification
Soit Authorization: Bearer greif_oauth_… — un jeton d'accès OAuth 2.1 obtenu par le flux code d'autorisation + PKCE sur /oauth/authorize et /oauth/token, avec enregistrement dynamique des clients sur /oauth/register et découverte sous /.well-known/oauth-authorization-server (c'est ainsi que Claude et ChatGPT se connectent : le propriétaire de l'entreprise se connecte et consent une fois) — soit Authorization: Bearer greif_live_… / greif_test_…, la même clé API que l'API REST accepte, créée dans les paramètres de KRONENWERK et liée à exactement une entreprise. Une requête sans identifiant valide reçoit 401 avec WWW-Authenticate: Bearer resource_metadata="…/.well-known/oauth-protected-resource", que les clients MCP suivent pour lancer la connexion. Voir authentification.
Tenant
L'entreprise qu'un agent atteint est celle de la clé. Il n'existe de paramètre d'organisation nulle part dans la surface du protocole, si bien qu'un agent ne peut ni sélectionner ni énumérer des entreprises.
Session
Aucune. Le serveur ne conserve pas de session et n'émet pas de MCP-Session-Id. Chaque requête porte son propre identifiant et sa propre version de protocole. GET (le flux optionnel serveur-vers-client) et DELETE (terminaison de session) répondent 405 Method Not Allowed, ce que la spécification prévoit pour les serveurs qui ne les offrent pas.
Versions du protocole
2026-07-28 (_meta par requête), et les versions à poignée de main 2025-11-25, 2025-06-18 et 2025-03-26. Une requête qui nomme une autre version reçoit l'erreur JSON-RPC -32022 avec la liste prise en charge dans data.supported. Une requête qui ne nomme aucune version est servie comme client hérité.
Méthodes
server/discover, initialize, tools/list, tools/call, ping. Pas de ressources, d'invites (prompts), d'échantillonnage ni de notifications ; le serveur n'ouvre jamais de flux. Les lots ne sont pas acceptés ; chaque requête est un message.
Origin
Une requête portant un en-tête Origin d'un autre site est refusée avec 403, comme l'exige la spécification contre le DNS rebinding. Les clients hors navigateur n'envoient pas d'Origin et ne sont pas concernés.
Limite de débit
L'endpoint MCP se trouve dans la même chaîne de filtres que l'API REST, si bien que le budget de la clé de 240 requêtes, se rechargeant à environ deux par seconde, s'applique aux deux ensemble. Au-delà du budget, la réponse est 429 avec Retry-After. Voir limites de débit.
Plan
Une clé valide dont l'entreprise n'est pas sur le plan Enterprise reçoit 403 avec le code d'erreur applicatif 1402 et une phrase l'indiquant. Les plans sont décrits sur la page des tarifs.

Pour les clients sur la révision courante, le serveur vérifie aussi les en-têtes miroirs introduits par la spécification — MCP-Protocol-Version, Mcp-Method et, sur tools/call, Mcp-Name — par rapport au corps, et répond à une discordance par l'erreur -32020 et HTTP 400. Les clients construits sur un SDK MCP maintenu le font automatiquement.

Les outils

Vingt-deux outils existent, en trois classes : les outils de lecture, qui ne changent rien ; les outils de brouillon, qui créent quelque chose d'inerte sur lequel une personne doit encore agir ; et les outils d'action, qui rendent un fait financier vrai et ne sont proposés qu'aux entreprises ayant choisi le niveau Agir dans une limite. tools/list ne renvoie que les outils que les portées de l'identifiant et le niveau de l'entreprise permettent ; une clé avec invoices:read seul voit les lecteurs de factures et rien d'autre, et une entreprise au niveau par défaut ne voit jamais un outil d'action. Les portées sont les mêmes que celles de l'API REST.

OutilClasseCe qu'il faitPortée
search_customerslectureTrouve des clients par une partie du nom, du numéro, de la ville ou du numéro de TVA ; inclusion exacte, jamais floue.customers:read
get_customerlectureLes données de base d'un client : nom, contact, adresse, numéro de TVA, devise.customers:read
list_invoiceslectureFactures émises, les plus récentes d'abord, avec totaux, échéances et état de paiement ; filtres par état et date d'émission.invoices:read
get_invoicelectureUne facture émise par numéro ou identifiant : totaux, montant restant dû, indicateurs en retard et annulée.invoices:read
get_invoice_draftlectureUn brouillon tel que les livres le conservent : chaque ligne avec la quantité, le prix unitaire, la catégorie et le taux de TVA enregistrés, et les totaux que calcule l'émission — ou la raison pour laquelle elle est impossible.invoices:read
list_transactionslectureLes transactions de l'entreprise (missions et commandes) avec étape, client et échéance.transactions:read
get_transactionlectureUne transaction par numéro ou identifiant.transactions:read
list_receivableslectureCe que doivent les clients, ventilé par tranches de retard, en concordance avec le compte collectif clients.reports:read
list_payableslectureCe que l'entreprise doit aux fournisseurs, ventilé de la même façon.reports:read
get_profit_and_losslectureCompte de résultat d'une période depuis le grand livre, avec un indicateur is_final vrai uniquement lorsque chaque période de la fenêtre est clôturée.reports:read
get_balance_sheetlectureBilan à une date depuis le grand livre.reports:read
get_business_attentionlectureCe qui attend une personne : en cours, bientôt dû et en retard dans les deux sens, plus les files non vides ; books_open indique si les comptes ont seulement été ouverts.reports:read
create_invoice_draftbrouillonUn brouillon de facture pour un client, avec lignes en option (quantité, prix unitaire net et taux de TVA en chaînes décimales). Aucun numéro n'est consommé, rien n'est produit ni envoyé.invoices:write
create_transactionbrouillonUne nouvelle transaction (mission ou commande) avec un titre, un client optionnel, une étape, une description et une échéance.transactions:write
add_transaction_notebrouillonAjoute une note à la chronologie d'une transaction ; ne modifie aucun champ.transactions:write
create_quote_draftbrouillonUn devis en brouillon pour un client, avec lignes, devise, référence du client et dossier facultatifs. Un numéro est réservé ; rien n'est envoyé.invoices:write
record_billbrouillonUne facture fournisseur avec ses montants tels qu'imprimés — HT, taxe, TTC, lignes facultatives — et, au choix, le fichier reçu et un dossier. Elle attend la confirmation d'une personne ; rien n'est payé.transactions:write
attach_documentbrouillonConserver un fichier — lettre de transport, bon de commande, devis fournisseur — avec un dossier, une facture fournisseur, un client ou un fournisseur. Aucun montant ne change.transactions:write
link_to_transactionbrouillonFaire figurer un devis, un brouillon de facture, une facture fournisseur, une dépense ou un document reçu sur la page d'un dossier. Simple renvoi.transactions:write
issue_invoiceactionÉmettre un brouillon : consommer le numéro, figer le document, créer l'enregistrement légal. Refusé lorsque le total brut dépasse la limite par acte de l'entreprise ; rien n'est alors émis et aucun numéro consommé.invoices:write
send_invoiceactionEnvoyer par e-mail une facture émise à l'adresse du client enregistrée (ou à une adresse donnée), avec le lien de paiement lorsque l'entreprise en a un.invoices:write
record_paymentactionEnregistrer qu'un client a payé une facture : comptabilise au grand livre et lettre la créance. Refusé au-dessus de la limite par acte. Accepte une clé d'idempotence.invoices:write

Les montants sont renvoyés comme un nombre d'unités mineures avec un code de devise — {"minor": 105910, "currency": "EUR"} vaut 1 059,10 EUR — jamais comme une chaîne formatée. Les dates sont des jours calendaires au format YYYY-MM-DD. Chaque objet créé par un outil de brouillon est enregistré comme créé par cette clé API, et l'entreprise peut voir cette attribution dans le produit. Un modèle ne peut pas faire passer son travail pour celui d'une personne.

Niveaux et limites de sécurité

C'est l'entreprise — ni l'agent ni KRONENWERK — qui décide jusqu'où le logiciel peut aller. Sous Paramètres → Assistants IA, le propriétaire fixe l'un de trois niveaux, qui s'applique de la même façon à chaque assistant connecté et à chaque clé :

  • Lecture seule — les douze outils de lecture. Les brouillons sont désactivés ; un appel de brouillon reçoit une phrase qui le dit.
  • Lire et proposer (par défaut) — les outils de lecture plus les sept outils de brouillon. Rien de ce qu'un agent fait à ce niveau n'est un fait financier ; une personne émet, envoie et enregistre.
  • Agir dans une limite — ajoute issue_invoice, send_invoice et record_payment. Chaque acte est vérifié contre une limite de montant brut dans la devise de base de l'entreprise, dans sa propre transaction, de sorte qu'une facture dépassant la limite est annulée en entier : aucun numéro consommé, aucun enregistrement, aucun e-mail.

Quel que soit le niveau, aucun outil n'annule ni ne corrige un document émis, n'approuve ni ne paie une facture fournisseur, ne passe une écriture, ne clôture une période, ni ne crée, fait tourner ou révoque des identifiants et des paramètres. Cela reste entre les mains d'une personne connectée à KRONENWERK.

Lorsqu'un modèle demande un acte que l'entreprise n'a pas autorisé — record_payment au niveau par défaut, cancel_invoice à tout niveau —, le serveur ne répond pas « outil inconnu », qu'un modèle lit comme un problème de nom et contourne. Il répond par un résultat normal marqué isError: true dont le texte énonce la règle, dit qu'aucune partie de la requête n'a été exécutée et nomme le paramètre qu'une personne changerait. Le modèle relaie quelque chose de vrai et s'arrête.

Chaque acte et chaque brouillon est inscrit au registre d'auteur de l'entreprise avec l'outil, la connexion et l'heure, et les services sous-jacents écrivent leurs lignes d'audit habituelles sous la connexion plutôt que sous une personne, de sorte que la trace dit toujours quel assistant a fait quoi. D'autres propriétés découlent du transport : les lectures sont limitées par les mêmes permissions que l'écran équivalent ; les identifiants d'une autre entreprise sont signalés comme introuvables plutôt qu'interdits ; les défaillances internes sont décrites en une phrase fixe sans trace de pile, de sorte que noms de tables et chemins de fichiers n'entrent jamais dans le contexte d'un modèle ; et une connexion peut être révoquée à tout moment dans les paramètres, ce qui met fin à l'accès de cet agent dès la requête suivante. Les mêmes règles que pour l'API REST s'appliquent — voir sécurité de l'API.

Connecter un client

La plupart des clients MCP acceptent une configuration JSON nommant des serveurs distants. Une entrée générique pour KRONENWERK ressemble à ceci ; les noms de clés de l'objet externe varient selon le client, les champs internes non :

{
  "mcpServers": {
    "kronenwerk": {
      "type": "http",
      "url": "https://kronenwerk.org/api/extern/mcp",
      "headers": {
        "Authorization": "Bearer greif_live_XXXXXXXXXXXXXXXXXXXXXXXX"
      }
    }
  }
}

Utilisez une clé greif_test_ pendant le développement. Elle atteint le même endpoint en mode test pour l'entreprise qui l'a créée ; il n'existe pas d'hôte sandbox distinct. Créez la clé avec uniquement les portées dont l'agent a besoin : un assistant qui répond à « qui nous doit de l'argent » a besoin de reports:read et customers:read et de rien d'autre.

Sans client, l'endpoint peut être exercé avec curl. Une poignée de main de style hérité et un appel d'outil :

curl -s https://kronenwerk.org/api/extern/mcp \
  -H "Authorization: Bearer greif_test_XXXXXXXXXXXXXXXX" \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize",
       "params":{"protocolVersion":"2025-11-25","capabilities":{},
                 "clientInfo":{"name":"curl","version":"1"}}}'

curl -s https://kronenwerk.org/api/extern/mcp \
  -H "Authorization: Bearer greif_test_XXXXXXXXXXXXXXXX" \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
       "params":{"name":"list_receivables","arguments":{"as_of":"2026-09-03"}}}'

Le résultat du second appel porte le rapport à la fois comme texte lisible dans content et comme JSON dans structuredContent. Un client sur la révision courante envoie les mêmes messages avec la version dans params._meta["io.modelcontextprotocol/protocolVersion"] et les en-têtes miroirs ; le serveur répond aux deux formes.

MCP ou REST : lequel utiliser

Utilisez MCP lorsqu'un modèle de langage décide à l'exécution ce qu'il faut demander. Utilisez l'API REST lorsque votre propre code décide. Les deux surfaces lisent les mêmes données sous la même clé et les mêmes portées, si bien que rien n'impose un choix, et un système peut utiliser les deux.

Serveur MCPAPI REST
AppelantUn agent IA via un client MCPLe code de votre application
Adresse/api/extern/mcp, non versionnée ; le MCP porte sa propre version/api/extern/v1
LecturesClients, factures, transactions, créances, dettes, compte de résultat, bilan, liste d'attentionClients, factures, transactions, rapport des postes ouverts, informations sur la clé
ÉcrituresBrouillon de facture (avec lignes), transaction, note ; avec le niveau d'action : émettre, envoyer, enregistrer un paiementClient, brouillon de facture (client uniquement), transaction
IdempotenceSans objet ; le client réessaie sous le contrôle du modèleEn-tête Idempotency-Key, obligatoire sur POST
ÉvénementsAucun ; le serveur ne pousse jamaisWebhooks signés

La surface REST est décrite dans la vue d'ensemble de l'API comptable, la référence et le démarrage rapide. Les modèles d'intégration au niveau applicatif sont couverts dans connecter votre SaaS.

Comment KRONENWERK gère cela

SUPPORTED Le serveur MCP est en service sur https://kronenwerk.org/api/extern/mcp pour les entreprises de l'offre Enterprise, parle Streamable HTTP pour les révisions 2026-07-28, 2025-11-25, 2025-06-18 et 2025-03-26, s'authentifie par OAuth 2.1 ou clé API, et propose à chaque entreprise les douze outils de lecture et les sept outils de brouillon, et aux entreprises ayant autorisé l'action sous Paramètres → Assistants IA les trois outils d'action — chaque acte borné par la limite propre de l'entreprise et consigné. Annuler, corriger, payer les fournisseurs, passer des écritures, clôturer et configurer restent sans outil, par conception. Le même serveur fonctionne avec une clé greif_test_ en mode test. Le serveur MCP, l'API REST, les webhooks et l'annuaire d'intégrations font partie de l'offre Enterprise ; voir les tarifs et l'aperçu développeur.

Questions fréquentes

Un agent peut-il émettre une facture via le serveur MCP ?

Seulement si l'entreprise l'autorise. Au niveau par défaut, il peut créer un brouillon, avec des lignes, pour un client ; une personne le relit et l'émet dans KRONENWERK, où il est validé comme facture électronique structurée pour le pays du vendeur. Si le propriétaire fixe le niveau Agir dans une limite, l'agent peut émettre, envoyer et enregistrer des paiements lui-même, chaque acte jusqu'au montant brut fixé par l'entreprise ; au-delà, la requête reçoit un refus écrit et rien n'est fait.

Quels clients MCP fonctionnent avec lui ?

Tout client qui implémente Streamable HTTP et vous laisse définir un en-tête Authorization. Le serveur accepte à la fois la révision courante par requête et les anciennes révisions à poignée de main, si bien que les clients construits sur l'une ou l'autre génération se connectent.

Le serveur MCP a-t-il besoin de sa propre clé API ?

Non. Il utilise les clés et les portées de l'API REST. Il est de bonne pratique de créer une clé distincte, à portée étroite, par agent, afin de pouvoir la révoquer isolément.

Existe-t-il un bac à sable ?

Une clé greif_test_ atteint le même endpoint en mode test pour l'entreprise qui l'a créée. Il n'existe pas d'hôte distinct.

Pourquoi mon client reçoit-il 405 sur GET ?

Le serveur n'offre ni flux serveur-vers-client ni session, si bien que le flux GET optionnel et la terminaison de session DELETE répondent 405, ce que la spécification prévoit pour ce cas. Les clients se rabattent sur des réponses POST simples.

Que voit l'agent des autres entreprises que je gère ?

Rien. Une clé est liée à une seule entreprise ; un agent muni de cette clé ne peut ni lister, ni sélectionner, ni atteindre aucune autre. Les configurations multi-entreprises utilisent une clé par entreprise.

Sources

  1. Model Context Protocol — Versioning consulté le
  2. Model Context Protocol — Transports (Streamable HTTP) consulté le
  3. KRONENWERK developer documentation consulté le

Commencer l'intégration

Lire le démarrage rapide Référence

À lire ensuite