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/authorizeund/oauth/token, mit dynamischer Client-Registrierung unter/oauth/registerund Discovery unter/.well-known/oauth-authorization-server(so verbinden sich Claude und ChatGPT: die Inhaberin der Firma meldet sich einmal an und stimmt zu) – oderAuthorization: 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ält401mitWWW-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-Idaus. Jede Anfrage trägt ihre eigenen Zugangsdaten und ihre eigene Protokollversion.GET(der optionale Server-zu-Client-Stream) undDELETE(Sitzungsbeendigung) antworten mit405 Method Not Allowed, was die Spezifikation für Server vorsieht, die diese nicht anbieten. - Protokollversionen
2026-07-28(_metapro Anfrage) sowie die Handshake-basierten2025-11-25,2025-06-18und2025-03-26. Eine Anfrage, die eine andere Version nennt, erhält den JSON-RPC-Fehler-32022mit der Liste der unterstützten Versionen indata.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 mit403abgewiesen, wie es die Spezifikation gegen DNS-Rebinding verlangt. Nicht-Browser-Clients senden keinenOriginund 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
429mitRetry-After. Siehe Rate-Limits. - Plan
- Ein gültiger Schlüssel, dessen Unternehmen nicht im Enterprise-Plan ist, erhält
403mit dem Anwendungsfehlercode1402und 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.
| Tool | Klasse | Was es tut | Scope |
|---|---|---|---|
search_customers | lesen | Kunden anhand eines Teils von Name, Nummer, Ort oder USt-IdNr. finden; exakte Enthaltensein-Suche, nie unscharf. | customers:read |
get_customer | lesen | Stammdaten eines Kunden: Name, Kontakt, Adresse, USt-IdNr., Währung. | customers:read |
list_invoices | lesen | Gestellte Rechnungen, neueste zuerst, mit Summen, Fälligkeiten und Zahlungsstatus; Filter nach Status und Rechnungsdatum. | invoices:read |
get_invoice | lesen | Eine gestellte Rechnung nach Nummer oder Kennung: Summen, offener Betrag, Überfällig- und Storniert-Flags. | invoices:read |
get_invoice_draft | lesen | Ein 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_transactions | lesen | Die Transaktionen des Unternehmens (Aufträge und Bestellungen) mit Phase, Kunde und Fälligkeit. | transactions:read |
get_transaction | lesen | Eine Transaktion nach Nummer oder Kennung. | transactions:read |
list_receivables | lesen | Was Kunden schulden, nach Überfälligkeitsklassen gestaffelt, abstimmbar mit dem Forderungskonto. | reports:read |
list_payables | lesen | Was das Unternehmen Lieferanten schuldet, auf dieselbe Weise gestaffelt. | reports:read |
get_profit_and_loss | lesen | Gewinn 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_sheet | lesen | Bilanz zu einem Stichtag aus dem Hauptbuch. | reports:read |
get_business_attention | lesen | Was 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_draft | Entwurf | Ein 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_transaction | Entwurf | Eine neue Transaktion (Auftrag oder Bestellung) mit Titel, optionalem Kunden, Phase, Beschreibung und Fälligkeit. | transactions:write |
add_transaction_note | Entwurf | Eine Notiz an den Verlauf einer Transaktion anhängen; ändert kein Feld. | transactions:write |
create_quote_draft | Entwurf | Ein 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_bill | Entwurf | Eine 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_document | Entwurf | Eine Datei — Frachtbrief, Bestellung, Lieferantenangebot — an einem Vorgang, einer Eingangsrechnung, einem Kunden oder Lieferanten ablegen. Kein Betrag ändert sich. | transactions:write |
link_to_transaction | Entwurf | Ein Angebot, einen Rechnungsentwurf, eine Eingangsrechnung, eine Ausgabe oder ein empfangenes Dokument auf der Seite eines Vorgangs aufführen. Nur ein Querverweis. | transactions:write |
issue_invoice | Handlung | Einen 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_invoice | Handlung | Eine ausgestellte Rechnung an die hinterlegte Kundenadresse (oder eine angegebene) mailen, mit Zahlungslink, wo die Firma einen hat. | invoices:write |
record_payment | Handlung | Erfassen, 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_invoiceundrecord_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-Server | REST-API | |
|---|---|---|
| Aufrufer | Ein KI-Agent über einen MCP-Client | Ihr Anwendungscode |
| Adresse | /api/extern/mcp, unversioniert; MCP trägt seine eigene Version | /api/extern/v1 |
| Lesezugriffe | Kunden, Rechnungen, Transaktionen, Forderungen, Verbindlichkeiten, GuV, Bilanz, Aufmerksamkeitsliste | Kunden, Rechnungen, Transaktionen, Bericht über offene Posten, Schlüsselinformationen |
| Schreibzugriffe | Rechnungsentwurf (mit Positionen), Transaktion, Notiz; mit Handlungsstufe: ausstellen, versenden, Zahlung erfassen | Kunde, Rechnungsentwurf (nur Kunde), Transaktion |
| Idempotenz | Nicht anwendbar; der Client wiederholt unter Kontrolle des Modells | Idempotency-Key-Header, Pflicht bei POST |
| Ereignisse | Keine; der Server pusht nie | Signierte 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
- Model Context Protocol — Versioning — gelesen am
- Model Context Protocol — Transports (Streamable HTTP) — gelesen am
- KRONENWERK developer documentation — gelesen am