ZUGFeRD / XRechnung
MCP Validation Server
MCP-Server zur automatisierten Validierung von E-Rechnungen in den Formaten ZUGFeRD, Factur-X und XRechnung. Gibt strukturierte JSON-Ergebnisse mit konkreten Korrekturvorschlägen zurück.
1. Übersicht
Der Server stellt drei Tools und eine Resource bereit, die von KI-Agenten über das Model Context Protocol aufgerufen werden können.
| Szenario | Tool / Resource |
|---|---|
| Rechnung vor dem Versand prüfen | validate_invoice |
| XML-Daten aus ZUGFeRD-PDF lesen | extract_xml |
| Prüfen ob PDF und XML übereinstimmen | check_consistency |
| Verfügbare Formate und Regelsets abfragen | validation://rules |
2. Architektur & Datenfluss
Ablauf für validate_invoice
3. Validierungsengines
Jede Anfrage wird von zwei Engines gleichzeitig geprüft. Die Ergebnisse werden konsolidiert und dedupliziert zurückgegeben.
| Engine | Version | Abgedeckte Formate |
|---|---|---|
| Mustang Project | v2.26.0 | ZUGFeRD 1.0–2.4, Factur-X 1.0, XRechnung (allgemein) |
| KoSIT Validierungstool | v1.6.3 | XRechnung 3.0.2 (CII + UBL), EN 16931 CII/UBL (plain), Factur-X 1.07.3 / 1.08 (alle Profile) |
errors-Liste. Duplikate (gleiche Regel-ID + Meldung) werden automatisch entfernt. KoSIT-Fehler fließen nur ein, wenn ein passendes Validierungsszenario erkannt wurde — bei unbekannten GuidelineIDs übernimmt Mustang allein.
4. Installation & Konfiguration
# Kostenlos registrieren:
https://zugferd-validator.de/portal
npm install -g zugferd-mcp-client
// mcp_config.json (je nach Client abweichender Pfad) { "mcpServers": { "zugferd": { "command": "zugferd-mcp-client", "env": { "ZUGFERD_API_KEY": "zv_dein_key_hier" } } } }
Direkte REST API
Die API kann auch direkt ohne MCP-Client angesprochen werden:
# Beispiel: Validierung per curl curl -X POST https://api.zugferd-validator.de/v1/validate \ -H "Content-Type: application/json" \ -H "X-Api-Key: zv_dein_key_hier" \ -d '{"file_content":"<base64>","file_type":"xml"}'
Umgebungsvariablen (MCP-Client)
| Variable | Beschreibung | Standard |
|---|---|---|
ZUGFERD_API_KEY | API-Key vom Portal | – (Pflicht) |
ZUGFERD_API_URL | API-Basis-URL | https://api.zugferd-validator.de |
5. Tools
Validiert eine E-Rechnung (ZUGFeRD/Factur-X PDF oder XRechnung XML) gegen EN 16931 und die deutschen Erweiterungen. Gibt strukturierte Fehler, Warnungen und Korrekturvorschläge zurück.
Input-Schema
data:application/pdf;base64,…) werden automatisch entfernt.
"pdf" für ZUGFeRD/Factur-X-PDFs · "xml" für reine XRechnung/CII-XML-Dateien
rule_id: "PROFILE_MISMATCH" erzeugt.Werte:
minimum · basic_wl · basic · en16931 · extended · xrechnung
Output-Schema
{
"valid": true,
"format": "ZUGFeRD 2.x",
"profile": "EN16931",
"summary": "Keine Probleme gefunden",
"errors": [],
"warnings": [],
"notices": [],
"metadata": {
"invoice_number": "RE-2026-001",
"issue_date": "2026-04-01",
"seller": "Musterfirma GmbH",
"buyer": "Beispiel AG",
"total_amount": "1190.00",
"currency": "EUR"
}
}
{
"valid": false,
"format": "ZUGFeRD 2.x",
"profile": "EN16931",
"summary": "2 Fehler, 1 Warnung gefunden",
"errors": [
{
"severity": "error",
"rule_id": "BR-DE-15",
"field": "BT-10",
"message": "Die Käuferreferenz / Leitweg-ID (BT-10) muss übermittelt werden.",
"fix_suggestion": "Füge die Käuferreferenz / Leitweg-ID (BT-10) in 'ram:ApplicableHeaderTradeAgreement/ram:BuyerReference' ein.",
"xpath": "//ram:ApplicableHeaderTradeAgreement/ram:BuyerReference"
}
],
"warnings": [
{
"severity": "warning",
"rule_id": "BR-CL-10",
"field": "BT-81",
"message": "Zahlungsmittelcode muss aus UNTDID 4461 stammen.",
"fix_suggestion": "Verwende z.B. '58' für SEPA-Überweisung oder '59' für SEPA-Lastschrift.",
"xpath": "//ram:SpecifiedTradeSettlementPaymentMeans/ram:TypeCode"
}
]
}
Ausgabefelder
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
valid | boolean | Ja | true wenn kein einziger Fehler gefunden wurde |
format | string | Nein | Erkanntes Format, z.B. "ZUGFeRD 2.x", "CII EN16931", "XRechnung 3.0" — null wenn kein XML extrahierbar |
profile | string | Nein | Erkanntes Profil in Großbuchstaben, z.B. "EN16931", "XRECHNUNG" — null wenn kein XML extrahierbar |
summary | string | Ja | Lesbare Zusammenfassung, z.B. "2 Fehler, 1 Warnung gefunden" |
errors | array | Ja | Validierungsfehler — machen die Rechnung ungültig |
warnings | array | Ja | Warnungen — Rechnung kann trotzdem gültig sein |
notices | array | Nein | Informative Hinweise ohne Einfluss auf die Gültigkeit |
metadata | object | Nein | Extrahierte Rechnungsdaten — bei PDFs vorhanden wenn eingebettetes XML erfolgreich gelesen wurde, bei file_type: "xml" immer |
Extrahiert das eingebettete XML-Dokument aus einer ZUGFeRD/Factur-X-PDF. Gibt den vollständigen XML-Inhalt als String zurück, zusammen mit erkanntem Format und Profil.
Input
Output
{
"xml_content": "<?xml version='1.0' encoding='UTF-8'?>\n<rsm:CrossIndustryInvoice ...>...</rsm:CrossIndustryInvoice>",
"format": "ZUGFeRD 2.x",
"profile": "EN16931"
}
xml_content kann direkt (nach Base64-Kodierung) an validate_invoice mit file_type: "xml" weitergegeben werden.Prüft, ob die für Menschen sichtbaren Daten im PDF (Rechnungsnummer, Datum, Gesamtbetrag) mit den im XML-Anhang gespeicherten Maschinendaten übereinstimmen. Deckt Manipulationen oder Erfassungsfehler auf.
Input
Output
{
"consistent": true,
"discrepancies": []
}
{
"consistent": false,
"discrepancies": [
{
"field": "total_amount",
"pdf_value": "1190.00",
"xml_value": "1180.00",
"message": "Gesamtbetrag im PDF ('1190.00') unterscheidet sich von dem im XML ('1180.00')."
}
]
}
Geprüfte Felder & Toleranzen
| Feld | Erkennungsmuster im PDF | Toleranz |
|---|---|---|
invoice_number | Rechnungsnummer:, Rechnung Nr., Invoice No. | Groß-/Kleinschreibung, Leerzeichen, Bindestriche ignoriert |
issue_date | Rechnungsdatum:, Datum:, Invoice Date: | Keiner — Datumformate werden auf ISO 8601 normiert |
total_amount | Gesamtbetrag:, Rechnungsbetrag:, Total: | ±0,01 EUR (Rundungsdifferenzen) |
Erzeugt aus strukturierten Daten eine valide E-Rechnung — wahlweise als ZUGFeRD-PDF (PDF/A-3 mit eingebettetem EN-16931-CII-XML) oder als reine XRechnung-XML (CII mit XRechnung-3.0-CIUS und Leitweg-ID für B2G). Mehrere Positionen, alle USt-Kategorien (S/Z/E/AE), Rabatte/Zuschläge, Zahlungsangaben. REST: POST /v1/create. Stateless — es wird nichts gespeichert. Beträge in Cent, Datum als YYYY-MM-DD.
Input (Auszug)
zugferd (PDF) oder xrechnung (XML)invoice: credit_note (Gutschrift/Storno), corrected, self_billed, prepayment (Anzahlung), partial (Teilrechnung). Roh über type_code.{ number, date } — bei Storno/Korrektur (BT-25/26)xrechnung Pflichtfalse.Output
{
"format": "zugferd",
"profile": "EN16931",
"pdf_base64": "JVBERi0xLjc…",
"xml": "<?xml version=\"1.0\"…",
"branding": "free_footer"
}
validate_invoice auf das zurückgegebene pdf_base64 bzw. xml — oder setzt self_check: true für einen einzigen Roundtrip. Branding (Footer im Prüfen-Tarif / White-Label ab Automatisieren) wird serverseitig aus dem Tarif bestimmt. Eigenes Wochenkontingent: Prüfen 1, Automatisieren 20, Skalieren unbegrenzt.zv_test_…, über GET /v1/keys/me): zum Testen der Rechnungserstellung. Erstellte Rechnungen tragen ein gekacheltes „DEMO"-Wasserzeichen auf jeder Seite plus XML-Marker — voll testbar, aber als echte Rechnung wertlos. 100/Tag, 3/Minute, getrennt vom Live-Kontingent. Prüfungen über den Sandbox-Key zählen dagegen auf dein normales Wochenkontingent: Sie rechnen dasselbe und liefern dasselbe Ergebnis.Macht aus einer bestehenden Rechnung als PDF, Word oder Excel eine E-Rechnung: ZUGFeRD in deinem bisherigen Layout oder XRechnung. Ein Sprachmodell auf unserem eigenen Server liest die Werte aus, wir rechnen sie nach und legen sie als Entwurf vor. Die E-Rechnung entsteht erst, wenn du den Entwurf bestätigst, und kommt nur zurück, wenn sie unsere Prüfung gegen EN 16931 besteht. Ab Automatisieren (20 Umwandlungen im Monat) und Skalieren (100). Umwandlungen zählen nicht auf das Prüf- oder Erstellkontingent.
Ablauf
POST /v1/convertmit einer oder mehreren Dateien. Antwort sofort mit202und je Datei einem Auftrag im Statusqueued.GET /v1/convert/{id}abfragen, bis der Statusdraftist, meist nach ein bis zwei Minuten. Bei mehreren Dateien oder längerer Erkennung kommt zusätzlich eine E-Mail an die Adresse des Kontos.- Den Entwurf prüfen. Was in
uncertainsteht, sollte ein Mensch ansehen;reasonssagt je Feld, warum. POST /v1/convert/{id}/confirmmit den bestätigten Werten. Antwort mit der fertigen Datei als Base64. Danach sind Upload und Entwurf gelöscht.
Voraussetzungen
403 abgelehnt.409 und issuer_profile_missing: true.Hochladen: POST /v1/convert
[{ name, content }], content als Base64. Erlaubt sind PDF, DOCX, XLSX, ODT, ODS, DOC und XLS. Gescannte Rechnungen werden mit Status rejected abgelehnt.{
"batch": "lomvuvzjtl5y94syeglx",
"jobs": [
{ "id": "5113py49uqxfatik47rn", "filename": "RE-2026-121.pdf", "format": "pdf",
"status": "queued", "reason": null,
"created_at": "2026-10-12T11:17:58.000Z", "expires_at": "2026-10-13T11:17:58.000Z" }
],
"note": "Sobald ein Entwurf zur Prüfung bereitliegt, hat er den Status „draft“. …"
}
Status eines Auftrags: queued, processing, draft, done, rejected (Datei nicht umwandelbar, Grund in reason), failed. batch ist bei einer einzelnen Datei null.
Aufträge und Kontingent: GET /v1/convert
{
"jobs": [ … ],
"quota": { "limit": 20, "used": 11, "overage_cents": 399, "overage_possible": true },
"blocked_reason": null
}
Gezählt wird je Kalendermonat, in einem Firmenkonto über die Firma. blocked_reason ist gesetzt, wenn der Tarif das Umwandeln nicht enthält.
Entwurf: GET /v1/convert/{id}
Der Auftrag wie oben, im Status draft zusätzlich mit draft. Beträge in Euro, nicht in Cent. GET /v1/convert/{id}/pdf liefert die hochgeladene Rechnung als PDF, solange der Entwurf besteht.
name, street, postal_code, city, country, vat_id. Der Verkäufer kommt aus deinem Absenderprofil, nicht aus der Datei.description, quantity, unit, unit_code, unit_unknown, unit_price, net_amount, tax_rate. unit ist der Text auf der Rechnung, unit_code der Code nach UN/ECE Rec. 20.type (allowance oder charge), reason, amount nettoAE (Reverse Charge) oder E (steuerbefreit), wenn der Grund im Text steht, sonst nulltotals_add_up, totals_in_text, lines_match_net, buyer_is_not_seller, seller_on_invoiceinvoice_number, issue_date, net_total, tax_total, gross_total, buyer, lines, units, tax_exemption, seller, allowances_charges"units": "Die Einheit „Fass“ kennen wir nicht …"Bestätigen: POST /v1/convert/{id}/confirm
zugferd (deine PDF mit eingebettetem XML) oder xrechnung (nur XML)email (bei XRechnung Pflicht). vat_id ist bei Reverse Charge Pflicht.description, quantity, unit_code, unit_price, net_amount, tax_rate. Fehlt tax_rate, gilt der Satz der Rechnung.422 mit problemsAE oder E422 mit own_invoice_required: true402 mit overage_required: true{
"ok": true,
"filename": "RE-2026-121.pdf",
"mime": "application/pdf",
"content": "JVBERi0xLjc…",
"note": "Die E-Rechnung ist formal gültig und von dir bestätigt. …"
}
Fehler
missing nennt sieoverage_required: true per accept_overage bestätigen; ohne dieses Feld ist Mehrnutzung für das Konto nicht eingerichtetdraft oder schon umgewandeltproblems erklärt es auf DeutschDELETE /v1/convert/{id} verwirft einen Auftrag und löscht die Datei sofort.Listet die Rechnungen, die wir dir gestellt haben, mit Nummer, Datum und Beträgen. GET /v1/invoices/{nummer}/pdf liefert das Dokument als PDF. Die Rechnungen sind selbst gültige E-Rechnungen im ZUGFeRD-Format nach EN 16931, deine Buchhaltung kann sie also einlesen. Dieselbe Liste steht im Konto unter „Rechnungen". Der Aufruf kostet kein Kontingent.
Anmeldung
?api_key=… an die Adresse.Beispiel
curl -H "X-Api-Key: dein_key" https://api.zugferd-validator.de/v1/invoices
curl -H "X-Api-Key: dein_key" \
-o ZF-2026-007.pdf \
https://api.zugferd-validator.de/v1/invoices/ZF-2026-007/pdf
Antwort
{
"invoices": [
{ "number": "ZF-2026-007", "date": "2026-08-17T09:12:03.000Z",
"net": 2000, "vat": 380, "gross": 2380, "currency": "eur" }
]
}
Beträge in Cent. Es werden nur eigene Rechnungen ausgeliefert; die Nummer eines anderen Kontos beantworten wir mit 404.
Liefert das Prüfergebnis als Validierungsbericht im Format PDF/A-3b, zum Ablegen und Weitergeben. Der Bericht nennt das Ergebnis, alle Meldungen mit Regel-ID und Feld, den Prüfzeitpunkt, das erkannte Format samt Profil, die SHA-256-Prüfsumme der geprüften Datei und den Regelstand, also die Versionen der eingesetzten Prüfwerkzeuge. Jeder Aufruf prüft die Datei neu und zählt wie eine Validierung gegen das Wochenkontingent. Als MCP-Werkzeug validation_report und über REST als POST /v1/report.
Input
pdf oder xmlAFRelationship /Source), damit sie maschinell lesbar bleibt. Standard false.de, en, fr — Standard derechnung.pdf bzw. rechnung.xml.Output
Content-Type: application/pdf Content-Disposition: attachment; filename="validierungsbericht-rechnung.pdf" X-Validation-Result: valid | invalid
Beispiel
curl -X POST https://api.zugferd-validator.de/v1/report \
-H "X-Api-Key: $ZV_KEY" \
-H "Content-Type: application/json" \
-d "{\"file_content\": \"$(base64 -w0 rechnung.pdf)\", \"file_type\": \"pdf\", \"attach_source\": true}" \
-o bericht.pdf
403; einen Beispielbericht mit Wasserzeichen gibt es ohne Schlüssel unter GET /v1/report/sample?lang=de|en|fr.6. Resource: validation_rules
Gibt das aktuelle Regelwerk des Servers zurück: unterstützte Formate, Profile und die verwendete Validierungsengine.
URI: validation://rules
{
"supported_formats": [
"ZUGFeRD 1.0", "ZUGFeRD 2.0", "ZUGFeRD 2.1", "ZUGFeRD 2.2",
"ZUGFeRD 2.3", "ZUGFeRD 2.x / Factur-X 1.0x",
"XRechnung 1.2", "XRechnung 2.0", "XRechnung 2.3", "XRechnung 3.0"
],
"supported_profiles": [
"minimum", "basic_wl", "basic", "en16931", "extended", "xrechnung"
],
"validation_engines": [
"Mustang Project v2.26.0",
"KoSIT Validierungstool v1.6.3 (XRechnung 3.0.2 + EN 16931 CII)"
],
"last_updated": "2026-04-08"
}
7. Fehlerbehandlung
Alle Tools geben bei Fehlern ein JSON-Objekt mit einem error-Feld zurück. Es gibt niemals eine unstrukturierte Fehlerausgabe.
{
"error": "Kurze Fehlerkategorie",
"details": "Ausführliche Beschreibung mit konkretem Hinweis zur Behebung."
}
| error | Auslöser |
|---|---|
"Fehlender Parameter" | Pflichtfeld nicht übergeben |
"Ungültiger Parameter" | Falscher Wert für file_type |
"Ungültiger Base64-Input" | Kein gültiger Base64-String übergeben |
"Validierungsfehler" | Mustang CLI konnte nicht starten (z.B. Java fehlt) oder Timeout nach 30s |
"XML-Extraktion fehlgeschlagen" | Keine XML-Datei im PDF-Anhang gefunden (bei extract / consistency). Bei validate wird stattdessen ein Notice mit rule_id: "NO_EMBEDDED_XML" zurückgegeben und valid: true gesetzt |
"PDF-Lesefehler" | PDF kann nicht gelesen werden |
"XML-Parsing-Fehler" | Extrahiertes XML ist kein valides XML |
"Interner Fehler" | Unerwarteter Laufzeitfehler |
"error": "Validierungsfehler" zurückgegeben. Ein KoSIT-Timeout wird still ignoriert — Mustang-Ergebnisse bleiben erhalten.8. Gemeinsame Datentypen
ValidationIssue
Wird in den Arrays errors, warnings und notices von validate_invoice verwendet.
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
severity | "error" | "warning" | "notice" | Ja | Schweregrad des Befundes |
rule_id | string | Ja | Regel-ID, z.B. "BR-DE-1", "BR-CL-10". Wert "UNKNOWN" bei XSD-Schema-Verletzungen (KoSIT) oder wenn keine Regel-ID ermittelbar ist |
field | string | Nein | Betroffenes BT-Feld, z.B. "BT-10" |
message | string | Ja | Fehlermeldung auf Deutsch |
fix_suggestion | string | Nein | Konkreter Korrekturhinweis mit XML-Beispiel |
xpath | string | Nein | XPath zum betroffenen XML-Element |
InvoiceMetadata
Optionales Feld im Ergebnis von validate_invoice (nur bei file_type: "xml").
| Feld | Typ | Beschreibung |
|---|---|---|
invoice_number | string? | Rechnungsnummer (BT-1) |
issue_date | string? | Rechnungsdatum ISO 8601, z.B. "2026-04-01" |
seller | string? | Name des Verkäufers (BT-27) |
buyer | string? | Name des Käufers (BT-44) |
total_amount | string? | Gesamtbetrag als Dezimalstring, z.B. "1190.00" |
currency | string? | ISO 4217 Währungscode, z.B. "EUR" |
9. Unterstützte Formate & Profile
Formate
| Format | Standard | Anmerkung |
|---|---|---|
| ZUGFeRD 1.0 | ZUGFeRD 1.0 / GEFEG | Ältere Version, eingeschränkte Profilunterstützung |
| ZUGFeRD 2.0 | FeRD 2.0 | Erste CII-basierte Version |
| ZUGFeRD 2.1 | Factur-X 1.0 (FR) | Technisch identisch mit Factur-X 1.0 |
| ZUGFeRD 2.2 | Factur-X 1.0.05 | Kleinere Korrekturen |
| ZUGFeRD 2.3 | Factur-X 1.0.06 | Version vor 2.4 |
| ZUGFeRD 2.x / Factur-X 1.0x | EN 16931 + D16B | Aktuelle Hauptversion (2026) — API gibt "ZUGFeRD 2.x" zurück |
| XRechnung 1.2 | XRechnung 1.2 | Ältere XRechnung-Version |
| XRechnung 2.x | XRechnung 2.0–2.3 | Verschiedene Zwischenversionen |
| XRechnung 3.0 | XRechnung 3.0 | Aktuelle XRechnung-Version |
Profile (ZUGFeRD/Factur-X)
| Profil-ID | Anzeigename | Typischer Einsatz |
|---|---|---|
minimum | MINIMUM | Einfache maschinelle Verarbeitung |
basic_wl | BASIC-WL | Ohne Positionsdetails |
basic | BASIC | Standard-Rechnungen |
en16931 | EN 16931 (COMFORT) | Öffentliche Auftraggeber, PEPPOL |
extended | EXTENDED | Komplexe B2B-Prozesse |
xrechnung | XRECHNUNG | Deutsche öffentliche Verwaltung |
10. Regelwerk & Korrekturvorschläge
Der Server enthält eine Datenbank mit Korrekturvorschlägen für 160 Regelkategorien. Fehler beider Validierungsengines (Mustang + KoSIT) werden konsolidiert — wenn eine bekannte Regel-ID gefunden wird, wird der Korrekturvorschlag automatisch angehängt.
BR-DE-Regeln 26 Regeln
Deutsche Erweiterungen — Pflicht für XRechnung-konforme Rechnungen.
| Regel-ID | Feld | Kurzbeschreibung |
|---|---|---|
BR-DE-1 | BG-16 | PAYMENT INSTRUCTIONS (BG-16) fehlen |
BR-DE-2 | BG-6 | SELLER CONTACT (BG-6) |
BR-DE-3 | BT-37 | Stadt des Verkäufers (BT-37) |
BR-DE-4 | BT-38 | PLZ des Verkäufers (BT-38) |
BR-DE-5 | BT-41 | Ansprechpartner des Verkäufers (BT-41) |
BR-DE-6 | BT-42 | Telefonnummer des Verkäufers (BT-42) |
BR-DE-7 | BT-43 | E-Mail des Verkäufers (BT-43) |
BR-DE-8 | BT-52 | Stadt des Käufers (BT-52) |
BR-DE-9 | BT-53 | PLZ des Käufers (BT-53) |
BR-DE-10 | BT-77 | Lieferstadt (BT-77) |
BR-DE-11 | BT-78 | Liefer-PLZ (BT-78) |
BR-DE-12 | – | in aktueller XRechnung-Fassung entfernt |
BR-DE-13 | – | in aktueller XRechnung-Fassung entfernt |
BR-DE-14 | BT-119 | USt-Satz (BT-119) |
BR-DE-15 | BT-10 | Käuferreferenz / Leitweg-ID (BT-10) |
BR-DE-16 | BT-31 | USt-ID/Steuernummer des Verkäufers |
BR-DE-17 | BT-3 | Unzulässiger Rechnungstyp-Code (BT-3) |
BR-DE-18 | BT-20 | Skonto-Angaben (BT-20) im falschen Format |
BR-DE-19 | – | in aktueller XRechnung-Fassung entfernt |
BR-DE-20 | – | in aktueller XRechnung-Fassung entfernt |
BR-DE-21 | BT-24 | Specification identifier (BT-24) nicht XRechnung-konform |
BR-DE-22 | – | Anhang-Dateinamen nicht eindeutig |
BR-DE-23 | – | in aktueller XRechnung-Fassung entfernt |
BR-DE-24 | – | in aktueller XRechnung-Fassung entfernt |
BR-DE-25 | – | in aktueller XRechnung-Fassung entfernt |
BR-DE-26 | BT-3 | Rechnungskorrektur ohne Bezugsrechnung (BG-3) |
EN-16931-Kernregeln (BR-*) 10 Regeln
| Regel-ID | Feld | Kurzbeschreibung |
|---|---|---|
BR-1 | BT-24 | Specification identifier (BT-24) |
BR-2 | BT-1 | Rechnungsnummer (BT-1) |
BR-3 | BT-2 | Rechnungsdatum (BT-2) |
BR-4 | BT-3 | Rechnungstyp-Code (BT-3) |
BR-5 | BT-5 | Währungscode (BT-5) |
BR-6 | BT-27 | Verkäufername (BT-27) |
BR-7 | BT-44 | Käufername (BT-44) |
BR-8 | BG-5 | Postanschrift des Verkäufers (BG-5) |
BR-9 | BG-5 | Ländercode des Verkäufers (BT-40) |
BR-10 | BG-8 | Postanschrift des Käufers (BG-8) |
Berechnungsregeln (BR-CO-*) & Codelistenregeln (BR-CL-*) 8 Regeln
| Regel-ID | Kurzbeschreibung |
|---|---|
BR-CO-3 | Steuerdatum und Steuerdatum-Code schließen sich aus |
BR-CO-9 | USt-ID des Verkäufers ohne Länderpräfix |
BR-CO-10 | Summe der Netto-Positionsbeträge stimmt nicht |
BR-CO-13 | Gesamtbetrag ohne USt falsch berechnet |
BR-CL-10 | Ungültige schemeID (nicht aus ISO 6523) |
BR-CL-16 | Ungültiger Zahlungsart-Code (nicht aus UNTDID 4461) |
BR-CL-17 | Ungültige USt-Kategorie auf Positionsebene |
BR-CL-18 | Ungültige USt-Kategorie auf Belegebene |
Steuerkategorieregeln (BR-S/Z/E/AE-*) 4 Regeln
| Regel-ID | Kurzbeschreibung |
|---|---|
BR-S-1 | Steuerbetrag bei Normalsatz (S) angegeben |
BR-Z-1 | Steuerbetrag bei Nullsatz (Z) = 0 |
BR-E-1 | Steuerbetrag bei Steuerbefreiung (E) = 0 |
BR-AE-1 | Steuerbetrag bei Reverse Charge (AE) = 0 |
11. Nutzungsbeispiele
Beispiel 1: XRechnung-XML validieren
{
"tool": "validate_invoice",
"arguments": {
"file_content": "PD94bWwgdmVyc2lvbj0iMS4wIj8+...",
"file_type": "xml",
"profile": "xrechnung"
}
}
{
"valid": true,
"format": "XRechnung 3.0",
"profile": "XRECHNUNG",
"summary": "Keine Probleme gefunden",
"errors": [],
"warnings": [],
"metadata": {
"invoice_number": "INV-2026-0042",
"issue_date": "2026-04-07",
"seller": "Tech GmbH",
"buyer": "Bundesbehörde X",
"total_amount": "5950.00",
"currency": "EUR"
}
}
Beispiel 2: Fehlerhafte Rechnung mit Korrekturvorschlag
{
"tool": "validate_invoice",
"arguments": {
"file_content": "JVBERi0xLjQK...",
"file_type": "pdf"
}
}
{
"valid": false,
"format": "ZUGFeRD 2.x",
"profile": "EN16931",
"summary": "1 Fehler gefunden",
"errors": [{
"severity": "error",
"rule_id": "BR-DE-23",
"field": "BT-10",
"message": "Käuferreferenz (BT-10) muss für XRechnung angegeben werden.",
"fix_suggestion": "Füge 'ram:BuyerReference' hinzu, z.B. '04011000-1234-34' für Behörden.",
"xpath": "//ram:ApplicableHeaderTradeAgreement/ram:BuyerReference"
}],
"warnings": []
}
Beispiel 3: XML extrahieren und validieren
// Schritt 1 — XML aus PDF extrahieren { "tool": "extract_xml", "arguments": { "pdf_content": "JVBERi0x..." } } // Schritt 2 — Extrahiertes XML validieren (base64-kodiert übergeben) { "tool": "validate_invoice", "arguments": { "file_content": "<base64 des xml_content>", "file_type": "xml" } }
Beispiel 4: Konsistenzprüfung
{
"tool": "check_consistency",
"arguments": { "pdf_content": "JVBERi0xLjQK..." }
}
{
"consistent": false,
"discrepancies": [{
"field": "total_amount",
"pdf_value": "1190.00",
"xml_value": "1180.00",
"message": "Gesamtbetrag im PDF ('1190.00') unterscheidet sich von dem im XML ('1180.00')."
}]
}
Beispiel 3: Plain-PDF ohne eingebettetes XML
Eine normale PDF-Rechnung ohne ZUGFeRD/Factur-X-Anhang gibt valid: true mit einem informativen Notice zurück — kein Fehler, aber ein Hinweis dass keine strukturierten Daten geprüft werden konnten.
{
"tool": "validate_invoice",
"arguments": {
"file_content": "JVBERi0xLjQK...",
"file_type": "pdf"
}
}
{
"valid": true,
"format": null,
"profile": null,
"summary": "2 Hinweise gefunden",
"errors": [],
"warnings": [],
"notices": [
{
"severity": "notice",
"rule_id": "UNKNOWN",
"message": "XML could not be extracted"
},
{
"severity": "notice",
"rule_id": "NO_EMBEDDED_XML",
"message": "Kein eingebettetes XML gefunden. Die PDF ist möglicherweise keine ZUGFeRD/Factur-X Rechnung."
}
]
}
12. Grenzen & Bekannte Einschränkungen
| Einschränkung | Details |
|---|---|
| Timeout | Mustang CLI wird serverseitig nach 30 Sekunden abgebrochen. Sehr große oder korrupte Dateien können diesen Timeout auslösen. |
| Rate-Limit | Validierung: Prüfen 20/Woche · Automatisieren 500/Woche · Skalieren unbegrenzt. Erstellung (eigenes Kontingent): Prüfen 1/Woche · Automatisieren 20/Woche · Skalieren unbegrenzt. Sandbox-Erstellung: 100/Tag, max. 3/Minute. Sandbox-Prüfungen zählen auf das normale Wochenkontingent. Bei Überschreitung: HTTP 429. |
| PDF-OCR | check_consistency wertet nur maschinenlesbaren PDF-Text aus. Eingescannte PDFs ohne OCR-Schicht werden nicht unterstützt. |
| Metadaten bei PDFs | validate_invoice extrahiert Metadaten auch bei PDFs, sofern ein eingebettetes XML vorhanden und lesbar ist. Bei Plain-PDFs ohne XML fehlt dieses Feld. |
| Konsistenzprüfung | Nur drei Felder werden verglichen (Nummer, Datum, Betrag). Adressen, Steuernummern und Positionsdetails werden nicht abgeglichen. |
| Unbekannte Regel-IDs | Fehlt eine Regel-ID in der Fix-Suggestions-DB, bleibt fix_suggestion leer. Die Meldung wird trotzdem zurückgegeben. |
| Dateigröße | Keine explizite Größenbeschränkung, aber sehr große PDFs (>50 MB) können zum Timeout führen. |
13. Changelog
Oktober 2026: Umwandeln
- Neu:
POST /v1/convertmacht aus PDF, Word oder Excel eine E-Rechnung (ZUGFeRD im bisherigen Layout oder XRechnung), mit Entwurf, Bestätigung und Prüfung vor der Ausgabe. - Erkennt mehrere Steuersätze, Rabatte und Zuschläge, Reverse Charge und Einheiten; unsichere Felder mit Begründung.
- Ab Automatisieren (20 im Monat) und Skalieren (100), Mehrnutzung 3,99 € je Umwandlung mit ausdrücklicher Bestätigung.
Juni 2026 — Rechnungserstellung
- Neues Tool
create_invoice/POST /v1/create: valide E-Rechnungen aus strukturierten Daten erzeugen — als ZUGFeRD-PDF (PDF/A-3) oder reine XRechnung-XML (mit Leitweg-ID für B2G). - Mehrere Positionen, alle USt-Kategorien (S/Z/E/AE), Rabatte/Zuschläge, Zahlungsangaben, Fälligkeit.
- Belegtypen: Rechnung, Gutschrift/Storno, Korrektur, Gutschriftverfahren, Anzahlungs- und Teilrechnung — mit Bezug auf die Ursprungsrechnung.
- Tier-abhängiges Branding (Footer im Prüfen-Tarif / White-Label ab Automatisieren mit optionalem Logo); eigenes Wochenkontingent, getrennt von der Validierung.
- Sandbox-/Test-Keys (
zv_test_…): freies Integrieren mit „DEMO"-Wasserzeichen, ohne das Live-Kontingent zu verbrauchen.
April 2026 — Erstveröffentlichung
- Validierung gegen EN 16931 (
validate_invoice) für ZUGFeRD/Factur-X-PDF und XRechnung-XML, mit konkreten Korrekturvorschlägen. - XML-Extraktion (
extract_xml) und Konsistenzprüfung PDF↔XML (check_consistency). - MCP-Client für Claude & andere KI-Agenten; Mustang- und KoSIT-Engines.