Zum Inhalt springen

Für Entwickler

KRONENWERK MCP-Server: KI-Agent mit der Buchhaltung verbinden

Zuletzt geprüft SUPPORTED

Übersetzung der englischen Fassung, die als Erste gepflegt wird. Rechtliche Angaben beziehen sich auf die genannten Quellen und ihr Lesedatum.

KRONENWERK stellt unter https://kronenwerk.org/api/extern/mcp einen Model-Context-Protocol-Server (MCP) bereit. Ein KI-Agent, der MCP über Streamable HTTP spricht, meldet sich mit OAuth 2.1 (Claude, ChatGPT und andere gehostete Assistenten) oder mit demselben Bearer-API-Schlüssel wie die REST-API an, liest Kunden, Rechnungen, Vorgänge und Auswertungen einer Firma und legt Entwürfe, Vorgänge und Notizen an. Ob er darüber hinaus eine Rechnung ausstellt, versendet oder eine Zahlung erfasst, entscheidet die Firma: Standardmäßig bleiben das Handlungen eines Menschen, und die Firma kann sie unter Einstellungen → KI-Assistenten bis zu einer selbst gesetzten Betragsgrenze freigeben – jede Handlung steht dann im Protokoll. Der MCP-Server ist Teil des Tarifs Enterprise.

Was MCP ist

Das Model Context Protocol ist eine offene Spezifikation, veröffentlicht auf modelcontextprotocol.io, die definiert, wie eine KI-Anwendung (der Client) Tools entdeckt und aufruft, die ein externes System (der Server) anbietet. Nachrichten sind JSON-RPC 2.0. Der Server veröffentlicht eine Liste von Tools mit Namen, Beschreibungen und JSON-Eingabeschemata; das Modell liest diese Beschreibungen, entscheidet, was es aufruft, und der Client sendet in seinem Namen eine tools/call-Anfrage. Das Ergebnis kommt als Inhalt zurück, den das Modell lesen kann, und optional als strukturiertes JSON.

Zwei Transporte sind standardisiert: stdio für einen Server, der als lokaler Unterprozess gestartet wird, und Streamable HTTP für einen Server, der über das Netzwerk erreicht wird. KRONENWERK ist ein Netzwerkdienst und implementiert daher nur Streamable HTTP. Das Protokoll wird nach Datum versioniert. Zum 3. September 2026 nennt die Spezifikation 2026-07-28 als aktuelle Revision; frühere Revisionen (2025-11-25, 2025-06-18, 2025-03-26) eröffnen eine Verbindung mit einem initialize-Handshake, während die aktuelle Revision Protokollversion und Client-Identität in einem _meta-Objekt bei jeder Anfrage mitführt und eine Methode server/discover hinzufügt. Ein Server darf mehr als eine Revision auf demselben Endpunkt bedienen, und KRONENWERK tut das.

Endpunkt, Transport und Authentifizierung

Alles geschieht unter einer Adresse mit einer HTTP-Methode: POST https://kronenwerk.org/api/extern/mcp, Body application/json, eine JSON-RPC-Nachricht pro Anfrage.

Authentifizierung
Entweder Authorization: Bearer greif_oauth_… – ein OAuth-2.1-Zugangstoken aus dem Authorization-Code-Verfahren mit PKCE unter /oauth/authorize und /oauth/token, mit dynamischer Client-Registrierung unter /oauth/register und Discovery unter /.well-known/oauth-authorization-server (so verbinden sich Claude und ChatGPT: die Inhaberin der Firma meldet sich einmal an und stimmt zu) – oder Authorization: Bearer greif_live_… / greif_test_…, derselbe API-Schlüssel, den die REST-API annimmt, in den Einstellungen von KRONENWERK erstellt und an genau eine Firma gebunden. Eine Anfrage ohne gültige Berechtigung erhält 401 mit WWW-Authenticate: Bearer resource_metadata="…/.well-known/oauth-protected-resource", dem MCP-Clients folgen, um die Anmeldung zu beginnen. Siehe Authentifizierung.
Mandant
Das Unternehmen, das ein Agent erreicht, ist das Unternehmen des Schlüssels. Nirgends in der Protokolloberfläche gibt es einen Organisationsparameter, sodass ein Agent keine Unternehmen auswählen oder aufzählen kann.
Sitzung
Keine. Der Server hält keine Sitzung und gibt keine MCP-Session-Id aus. Jede Anfrage trägt ihre eigenen Zugangsdaten und ihre eigene Protokollversion. GET (der optionale Server-zu-Client-Stream) und DELETE (Sitzungsbeendigung) antworten mit 405 Method Not Allowed, was die Spezifikation für Server vorsieht, die diese nicht anbieten.
Protokollversionen
2026-07-28 (_meta pro Anfrage) sowie die Handshake-basierten 2025-11-25, 2025-06-18 und 2025-03-26. Eine Anfrage, die eine andere Version nennt, erhält den JSON-RPC-Fehler -32022 mit der Liste der unterstützten Versionen in data.supported. Eine Anfrage, die gar keine Version nennt, wird als Legacy-Client bedient.
Methoden
server/discover, initialize, tools/list, tools/call, ping. Keine Resources, Prompts, Sampling oder Notifications; der Server öffnet nie einen Stream. Batches werden nicht akzeptiert; jede Anfrage ist eine Nachricht.
Origin
Eine Anfrage mit einem Origin-Header einer anderen Site wird mit 403 abgewiesen, wie es die Spezifikation gegen DNS-Rebinding verlangt. Nicht-Browser-Clients senden keinen Origin und sind nicht betroffen.
Rate-Limit
Der MCP-Endpunkt sitzt in derselben Filterkette wie die REST-API, sodass das Budget des Schlüssels von 240 Anfragen, das mit etwa zwei pro Sekunde nachgefüllt wird, für beide zusammen gilt. Bei Überschreitung lautet die Antwort 429 mit Retry-After. Siehe Rate-Limits.
Plan
Ein gültiger Schlüssel, dessen Unternehmen nicht im Enterprise-Plan ist, erhält 403 mit dem Anwendungsfehlercode 1402 und einem entsprechenden Satz. Die Pläne sind auf der Preisseite beschrieben.

Für Clients auf der aktuellen Revision prüft der Server außerdem die gespiegelten Header, die die Spezifikation eingeführt hat — MCP-Protocol-Version, Mcp-Method und bei tools/call Mcp-Name — gegen den Body und beantwortet eine Abweichung mit dem Fehler -32020 und HTTP 400. Clients, die auf einem gepflegten MCP-SDK aufbauen, tun das automatisch.

Die Tools

Es gibt zweiundzwanzig Tools in drei Klassen: Lese-Tools, die nichts verändern; Entwurfs-Tools, die etwas Wirkungsloses anlegen, das ein Mensch noch ausführen muss; und Handlungs-Tools, die eine finanzielle Tatsache schaffen und nur Firmen angeboten werden, die die Stufe Handeln bis zu einer Grenze gewählt haben. tools/list liefert nur die Tools, die die Bereiche der Berechtigung und die Stufe der Firma erlauben; ein Schlüssel mit nur invoices:read sieht die Rechnungsleser und sonst nichts, und eine Firma auf der Standardstufe sieht nie ein Handlungs-Tool. Die Bereiche sind dieselben wie in der REST-API.

ToolKlasseWas es tutScope
search_customerslesenKunden anhand eines Teils von Name, Nummer, Ort oder USt-IdNr. finden; exakte Enthaltensein-Suche, nie unscharf.customers:read
get_customerlesenStammdaten eines Kunden: Name, Kontakt, Adresse, USt-IdNr., Währung.customers:read
list_invoiceslesenGestellte Rechnungen, neueste zuerst, mit Summen, Fälligkeiten und Zahlungsstatus; Filter nach Status und Rechnungsdatum.invoices:read
get_invoicelesenEine gestellte Rechnung nach Nummer oder Kennung: Summen, offener Betrag, Überfällig- und Storniert-Flags.invoices:read
get_invoice_draftlesenEin Entwurf, wie die Bücher ihn halten: jede Position mit Menge, Einzelpreis, Steuerschlüssel und Satz, dazu die Summen, die die Ausstellung rechnet — oder der Grund, warum sie noch nicht möglich ist.invoices:read
list_transactionslesenDie Transaktionen des Unternehmens (Aufträge und Bestellungen) mit Phase, Kunde und Fälligkeit.transactions:read
get_transactionlesenEine Transaktion nach Nummer oder Kennung.transactions:read
list_receivableslesenWas Kunden schulden, nach Überfälligkeitsklassen gestaffelt, abstimmbar mit dem Forderungskonto.reports:read
list_payableslesenWas das Unternehmen Lieferanten schuldet, auf dieselbe Weise gestaffelt.reports:read
get_profit_and_losslesenGewinn und Verlust für einen Zeitraum aus dem Hauptbuch, mit einem is_final-Flag, das nur wahr ist, wenn jede Periode im Zeitfenster abgeschlossen ist.reports:read
get_balance_sheetlesenBilanz zu einem Stichtag aus dem Hauptbuch.reports:read
get_business_attentionlesenWas auf eine Person wartet: offen, bald fällig und überfällig in beide Richtungen, plus nicht leere Warteschlangen; books_open sagt, ob die Bücher überhaupt eröffnet wurden.reports:read
create_invoice_draftEntwurfEin Rechnungsentwurf für einen Kunden, optional mit Positionen (Menge, Nettoeinzelpreis und USt-Satz als Dezimalzeichenketten). Keine Nummer wird verbraucht, nichts wird erzeugt oder versendet.invoices:write
create_transactionEntwurfEine neue Transaktion (Auftrag oder Bestellung) mit Titel, optionalem Kunden, Phase, Beschreibung und Fälligkeit.transactions:write
add_transaction_noteEntwurfEine Notiz an den Verlauf einer Transaktion anhängen; ändert kein Feld.transactions:write
create_quote_draftEntwurfEin Angebotsentwurf für einen Kunden, wahlweise mit Positionen, Währung, Kundenreferenz und einem Vorgang, unter dem es steht. Eine Nummer wird reserviert; nichts wird versendet.invoices:write
record_billEntwurfEine Lieferantenrechnung mit den Beträgen, wie sie gedruckt sind — netto, Steuer, brutto, wahlweise Positionen — und wahlweise mit der Datei, wie sie ankam, und einem Vorgang. Sie wartet auf die Bestätigung einer Person; nichts wird bezahlt.transactions:write
attach_documentEntwurfEine Datei — Frachtbrief, Bestellung, Lieferantenangebot — an einem Vorgang, einer Eingangsrechnung, einem Kunden oder Lieferanten ablegen. Kein Betrag ändert sich.transactions:write
link_to_transactionEntwurfEin Angebot, einen Rechnungsentwurf, eine Eingangsrechnung, eine Ausgabe oder ein empfangenes Dokument auf der Seite eines Vorgangs aufführen. Nur ein Querverweis.transactions:write
issue_invoiceHandlungEinen Entwurf ausstellen: Nummer vergeben, Dokument einfrieren, den rechtlichen Beleg erzeugen. Verweigert, wenn der Bruttobetrag über der Grenze je Handlung liegt; dann wird nichts ausgestellt und keine Nummer verbraucht.invoices:write
send_invoiceHandlungEine ausgestellte Rechnung an die hinterlegte Kundenadresse (oder eine angegebene) mailen, mit Zahlungslink, wo die Firma einen hat.invoices:write
record_paymentHandlungErfassen, dass ein Kunde eine Rechnung bezahlt hat: bucht ins Hauptbuch und gleicht die Forderung aus. Oberhalb der Grenze je Handlung verweigert. Nimmt einen Idempotenzschlüssel an.invoices:write

Beträge werden als Anzahl kleinster Einheiten mit Währungscode zurückgegeben — {"minor": 105910, "currency": "EUR"} ist 1.059,10 EUR —, nie als formatierte Zeichenkette. Daten sind Kalendertage im Format YYYY-MM-DD. Jedes Objekt, das ein Entwurfs-Tool anlegt, wird als von diesem API-Schlüssel erstellt festgehalten, und das Unternehmen sieht diese Zuordnung im Produkt. Ein Modell kann seine Arbeit nicht als die einer Person ausgeben.

Stufen und Sicherheitsgrenzen

Die Firma – nicht der Agent und nicht KRONENWERK – entscheidet, wie weit Software gehen darf. Unter Einstellungen → KI-Assistenten setzt die Inhaberin eine von drei Stufen; sie gilt für jeden verbundenen Assistenten und jeden Schlüssel gleich:

  • Nur lesen – die zwölf Lese-Tools. Entwürfe sind abgeschaltet; ein Entwurfsaufruf antwortet mit einem Satz, der das sagt.
  • Lesen und vorschlagen (Standard) – Lese-Tools plus die sieben Entwurfs-Tools. Nichts, was ein Agent auf dieser Stufe tut, ist eine finanzielle Tatsache; ein Mensch stellt aus, versendet und erfasst.
  • Handeln bis zu einer Grenze – ergänzt issue_invoice, send_invoice und record_payment. Jede einzelne Handlung wird gegen eine Bruttobetragsgrenze in der Basiswährung der Firma geprüft, innerhalb der eigenen Transaktion, sodass eine Rechnung über der Grenze vollständig zurückgerollt wird: keine Nummer verbraucht, kein Beleg, keine E-Mail.

Auf keiner Stufe storniert oder korrigiert ein Tool ein ausgestelltes Dokument, gibt eine Eingangsrechnung frei oder bezahlt sie, bucht einen Journalsatz, schließt eine Periode oder erstellt, rotiert oder widerruft Berechtigungen und Einstellungen. Das bleibt bei einem in KRONENWERK angemeldeten Menschen.

Fragt ein Modell nach einer Handlung, die die Firma nicht freigegeben hat – record_payment auf der Standardstufe, cancel_invoice auf jeder Stufe –, antwortet der Server nicht mit »unbekanntes Tool«, was ein Modell als Namensproblem liest und umgeht. Er antwortet mit einem normalen Ergebnis mit isError: true, dessen Text die Regel nennt, sagt, dass kein Teil der Anfrage ausgeführt wurde, und die Einstellung nennt, die ein Mensch ändern würde. Das Modell gibt etwas Wahres weiter und hört auf.

Jede Handlung und jeder Entwurf wird mit Tool, Verbindung und Zeit im Urheberschaftsprotokoll der Firma vermerkt, und die Dienste darunter schreiben ihre üblichen Prüfspur-Zeilen unter der Verbindung statt unter einer Person, sodass die Spur immer sagt, welcher Assistent was getan hat. Weitere Eigenschaften folgen aus dem Transport: Lesezugriffe unterliegen denselben Rechten wie der entsprechende Bildschirm; Kennungen anderer Firmen werden als nicht gefunden statt als verboten gemeldet; interne Fehler werden in einem festen Satz ohne Stacktrace beschrieben, sodass Tabellennamen und Dateipfade nie in den Kontext eines Modells gelangen; und eine Verbindung kann jederzeit in den Einstellungen widerrufen werden, was den Zugang dieses Agenten bei der nächsten Anfrage beendet. Es gelten dieselben Regeln wie für die REST-API – siehe API-Sicherheit.

Einen Client verbinden

Die meisten MCP-Clients akzeptieren eine JSON-Konfiguration, die entfernte Server benennt. Ein generischer Eintrag für KRONENWERK sieht so aus; die Schlüsselnamen des äußeren Objekts variieren je nach Client, die inneren Felder nicht:

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

Verwenden Sie während der Entwicklung einen greif_test_-Schlüssel. Er erreicht denselben Endpunkt im Testmodus für das Unternehmen, das ihn erstellt hat; es gibt keinen separaten Sandbox-Host. Legen Sie den Schlüssel nur mit den Scopes an, die der Agent braucht: Ein Assistent, der „Wer schuldet uns Geld?“ beantwortet, braucht reports:read und customers:read und sonst nichts.

Ohne Client lässt sich der Endpunkt mit curl ausprobieren. Ein Handshake im Legacy-Stil und ein Tool-Aufruf:

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"}}}'

Das Ergebnis des zweiten Aufrufs trägt den Bericht sowohl als lesbaren Text in content als auch als JSON in structuredContent. Ein Client auf der aktuellen Revision sendet dieselben Nachrichten mit der Version in params._meta["io.modelcontextprotocol/protocolVersion"] und den gespiegelten Headern; der Server beantwortet beide Formen.

MCP oder REST: was Sie verwenden sollten

Verwenden Sie MCP, wenn ein Sprachmodell zur Laufzeit entscheidet, was es fragt. Verwenden Sie die REST-API, wenn Ihr eigener Code entscheidet. Beide Oberflächen lesen dieselben Daten unter demselben Schlüssel und denselben Scopes, sodass nichts eine Wahl erzwingt, und ein System darf beide nutzen.

MCP-ServerREST-API
AufruferEin KI-Agent über einen MCP-ClientIhr Anwendungscode
Adresse/api/extern/mcp, unversioniert; MCP trägt seine eigene Version/api/extern/v1
LesezugriffeKunden, Rechnungen, Transaktionen, Forderungen, Verbindlichkeiten, GuV, Bilanz, AufmerksamkeitslisteKunden, Rechnungen, Transaktionen, Bericht über offene Posten, Schlüsselinformationen
SchreibzugriffeRechnungsentwurf (mit Positionen), Transaktion, Notiz; mit Handlungsstufe: ausstellen, versenden, Zahlung erfassenKunde, Rechnungsentwurf (nur Kunde), Transaktion
IdempotenzNicht anwendbar; der Client wiederholt unter Kontrolle des ModellsIdempotency-Key-Header, Pflicht bei POST
EreignisseKeine; der Server pusht nieSignierte Webhooks

Die REST-Oberfläche ist in der Übersicht zur Buchhaltungs-API, der Referenz und dem Schnellstart beschrieben. Integrationsmuster auf Anwendungsebene behandelt Ihre SaaS anbinden.

Wie KRONENWERK damit umgeht

SUPPORTED Der MCP-Server ist unter https://kronenwerk.org/api/extern/mcp für Firmen im Tarif Enterprise live, spricht Streamable HTTP für die Protokollfassungen 2026-07-28, 2025-11-25, 2025-06-18 und 2025-03-26, authentifiziert mit OAuth 2.1 oder API-Schlüssel und bietet jeder Firma die zwölf Lese- und sieben Entwurfs-Tools sowie den Firmen, die unter Einstellungen → KI-Assistenten das Handeln freigegeben haben, die drei Handlungs-Tools – jede Handlung durch die eigene Grenze der Firma begrenzt und protokolliert. Stornieren, Korrigieren, Lieferanten bezahlen, Buchen, Abschließen und Konfigurieren bleiben absichtlich ohne Tool. Derselbe Server funktioniert mit einem greif_test_-Schlüssel im Testmodus. MCP-Server, REST-API, Webhooks und Integrationsverzeichnis sind Teil des Tarifs Enterprise; siehe Preise und die Entwicklerübersicht.

Häufige Fragen

Kann ein Agent über den MCP-Server eine Rechnung stellen?

Nur, wenn die Firma es erlaubt. Auf der Standardstufe kann er einen Entwurf mit Positionen für einen Kunden anlegen; ein Mensch prüft ihn und stellt ihn in KRONENWERK aus, wo er als strukturierte E-Rechnung für das Land des Verkäufers geprüft wird. Setzt die Inhaberin die Stufe Handeln bis zu einer Grenze, darf der Agent selbst ausstellen, versenden und Zahlungen erfassen, jede Handlung bis zum Bruttobetrag, den die Firma gesetzt hat; darüber erhält die Anfrage eine schriftliche Absage, und nichts geschieht.

Welche MCP-Clients funktionieren damit?

Jeder Client, der Streamable HTTP implementiert und das Setzen eines Authorization-Headers erlaubt. Der Server akzeptiert sowohl die aktuelle Revision mit Version pro Anfrage als auch die älteren Handshake-basierten, sodass Clients beider Generationen verbinden.

Braucht der MCP-Server einen eigenen API-Schlüssel?

Nein. Er verwendet die Schlüssel und Scopes der REST-API. Es ist gute Praxis, pro Agent einen separaten, eng gescopten Schlüssel anzulegen, damit er einzeln widerrufen werden kann.

Gibt es eine Sandbox?

Ein greif_test_-Schlüssel erreicht denselben Endpunkt im Testmodus für das Unternehmen, das ihn erstellt hat. Es gibt keinen separaten Host.

Warum erhält mein Client bei GET ein 405?

Der Server bietet keinen Server-zu-Client-Stream und keine Sitzung, sodass der optionale GET-Stream und der DELETE-Sitzungsabschluss mit 405 antworten, was die Spezifikation für diesen Fall vorsieht. Clients fallen auf einfache POST-Antworten zurück.

Was sieht der Agent von anderen Unternehmen, die ich verwalte?

Nichts. Ein Schlüssel ist an ein Unternehmen gebunden; ein Agent mit diesem Schlüssel kann kein anderes auflisten, auswählen oder erreichen. Konstellationen mit mehreren Unternehmen verwenden einen Schlüssel pro Unternehmen.

Quellen

  1. Model Context Protocol — Versioning gelesen am
  2. Model Context Protocol — Transports (Streamable HTTP) gelesen am
  3. KRONENWERK developer documentation gelesen am

Weiter mit der Dokumentation

Schnellstart lesen Referenz

Weiterlesen