1. Übersicht

Der Server stellt drei Tools und eine Resource bereit, die von KI-Agenten wie Claude über das Model Context Protocol aufgerufen werden können.

SzenarioTool / Resource
Rechnung vor dem Versand prüfenvalidate_invoice
XML-Daten aus ZUGFeRD-PDF lesenextract_xml
Prüfen ob PDF und XML übereinstimmencheck_consistency
Verfügbare Formate und Regelsets abfragenvalidation://rules
Alle Antworten sind strukturiertes JSON. Kein Freitext — jeder Fehler enthält Regel-ID, betroffenes Feld, Fehlermeldung, umsetzbaren Korrekturvorschlag und XPath.

2. Architektur & Datenfluss

KI-Agent (z.B. Claude) │ │ MCP-Nachricht (JSON-RPC über stdio) ▼ ┌─────────────────────────────────────────┐ │ MCP Server (Node.js/TypeScript) │ │ │ │ validate_invoice · extract_xml │ │ check_consistency · validation_rules │ │ │ │ │ Base64 → Temp-Datei │ │ ▼ │ │ Mustang CLI (Java-Subprocess) │ │ java -jar Mustang-CLI.jar │ │ --action=validate / --action=extract │ │ │ │ │ XML-Report │ │ ▼ │ │ Report-Parser + Fix-Suggestions-DB │ └─────────────────┬───────────────────────┘ │ Strukturiertes JSON ▼ KI-Agent erhält Ergebnis

Ablauf für validate_invoice

1
Base64 dekodieren — Eingabe wird validiert und als Byte-Buffer bereitgestellt
2
Temp-Datei schreiben — Mustang CLI benötigt einen Dateipfad
3
Mustang CLI starten — Java-Subprocess mit 30-Sekunden-Timeout
4
XML-Report parsen — Mustang-Output wird zu strukturiertem JSON konvertiert
5
Korrekturvorschläge anreichern — Fix-Suggestions-DB mappt Regel-IDs auf konkrete Lösungshinweise
6
Temp-Datei löschen — garantiert, auch bei Fehlern
7
JSON-Ergebnis zurückgeben

3. Installation & Konfiguration

1
Abhängigkeiten installieren
npm install
2
Mustang CLI JAR herunterladen
npm run setup
3
TypeScript kompilieren
npm run build

MCP-Client-Konfiguration

Claude Desktop

// ~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "zugferd": {
      "command": "node",
      "args": ["/absoluter/pfad/zu/zugferd-mcp-server/dist/index.js"]
    }
  }
}

Docker

docker build -t zugferd-mcp-server .
# In der MCP-Config:
{
  "mcpServers": {
    "zugferd": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "zugferd-mcp-server"]
    }
  }
}

Umgebungsvariablen

VariableBeschreibungStandard
MUSTANG_JARAbsoluter Pfad zum Mustang CLI JARWird automatisch gesucht

4. Tools

validate_invoice TOOL

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

file_content * string Base64-kodierter Inhalt der PDF- oder XML-Datei. Data-URL-Präfixe (data:application/pdf;base64,…) werden automatisch entfernt.
file_type * enum "pdf" für ZUGFeRD/Factur-X-PDFs · "xml" für reine XRechnung/CII-XML-Dateien
profile enum? Optionale Profilangabe. Bei Abweichung zum erkannten Profil wird eine warning mit rule_id: "PROFILE_MISMATCH" erzeugt.
Werte: minimum · basic_wl · basic · en16931 · extended · xrechnung

Output-Schema

{
  "valid":   true,
  "format":  "ZUGFeRD 2.4 / Factur-X 1.0",
  "profile": "EN16931",
  "summary": "Keine Probleme gefunden",
  "errors":  [],
  "warnings": [],
  "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.4 / Factur-X 1.0",
  "profile": "EN16931",
  "summary": "2 Fehler, 1 Warnung gefunden",
  "errors": [
    {
      "severity":       "error",
      "rule_id":        "BR-DE-1",
      "field":          "BT-31 / BT-32",
      "message":        "Die USt-ID (BT-31) oder Steuernummer (BT-32) muss angegeben werden.",
      "fix_suggestion": "Füge 'ram:SpecifiedTaxRegistration' mit schemeID='VA' und USt-ID hinzu.",
      "xpath":          "//ram:SellerTradeParty/ram:SpecifiedTaxRegistration"
    }
  ],
  "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

FeldTypPflichtBeschreibung
validbooleanJatrue wenn kein einziger Fehler gefunden wurde
formatstringNeinErkanntes Format, z.B. "ZUGFeRD 2.4 / Factur-X 1.0"
profilestringNeinErkanntes Profil in Großbuchstaben, z.B. "EN16931"
summarystringJaLesbare Zusammenfassung, z.B. "2 Fehler, 1 Warnung gefunden"
errorsarrayJaValidierungsfehler — machen die Rechnung ungültig
warningsarrayJaWarnungen — Rechnung kann trotzdem gültig sein
noticesarrayNeinInformative Hinweise ohne Einfluss auf die Gültigkeit
metadataobjectNeinExtrahierte Rechnungsdaten (nur bei file_type: "xml")
extract_xml TOOL

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

pdf_content * string Base64-kodierter Inhalt der ZUGFeRD/Factur-X-PDF-Datei.

Output

{
  "xml_content": "<?xml version='1.0' encoding='UTF-8'?>\n<rsm:CrossIndustryInvoice ...>...</rsm:CrossIndustryInvoice>",
  "format":      "ZUGFeRD 2.4 / Factur-X 1.0",
  "profile":     "EN16931"
}
Das extrahierte xml_content kann direkt (nach Base64-Kodierung) an validate_invoice mit file_type: "xml" weitergegeben werden.
check_consistency TOOL

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

pdf_content * string Base64-kodierter Inhalt der ZUGFeRD/Factur-X-PDF-Datei.

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

FeldErkennungsmuster im PDFToleranz
invoice_numberRechnungsnummer:, Rechnung Nr., Invoice No.Groß-/Kleinschreibung, Leerzeichen, Bindestriche ignoriert
issue_dateRechnungsdatum:, Datum:, Invoice Date:Keiner — Datumformate werden auf ISO 8601 normiert
total_amountGesamtbetrag:, Rechnungsbetrag:, Total:±0,01 EUR (Rundungsdifferenzen)
Die Texterkennung basiert auf dem maschinenlesbaren PDF-Text. Gescannte PDFs ohne OCR-Schicht werden nicht unterstützt.

5. 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.4 / Factur-X 1.0",
    "XRechnung 1.2", "XRechnung 2.0", "XRechnung 2.3", "XRechnung 3.0"
  ],
  "supported_profiles": [
    "minimum", "basic_wl", "basic", "en16931", "extended", "xrechnung"
  ],
  "validation_engine": "Mustang Project v2.22.0",
  "last_updated":      "2026-04-01"
}

6. 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."
}
errorAuslö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
"XML-Extraktion fehlgeschlagen"Keine XML-Datei im PDF-Anhang gefunden
"PDF-Lesefehler"PDF kann nicht gelesen werden
"XML-Parsing-Fehler"Extrahiertes XML ist kein valides XML
"Interner Fehler"Unerwarteter Laufzeitfehler
Timeout: Mustang CLI wird nach 30 Sekunden abgebrochen. Bei Timeout gibt das Tool "error": "Validierungsfehler" zurück.

7. Gemeinsame Datentypen

ValidationIssue

Wird in den Arrays errors, warnings und notices von validate_invoice verwendet.

FeldTypPflichtBeschreibung
severity"error" | "warning" | "notice"JaSchweregrad des Befundes
rule_idstringJaRegel-ID, z.B. "BR-DE-1", "BR-CL-10"
fieldstringNeinBetroffenes BT-Feld, z.B. "BT-31 / BT-32"
messagestringJaFehlermeldung auf Deutsch
fix_suggestionstringNeinKonkreter Korrekturhinweis mit XML-Beispiel
xpathstringNeinXPath zum betroffenen XML-Element

InvoiceMetadata

Optionales Feld im Ergebnis von validate_invoice (nur bei file_type: "xml").

FeldTypBeschreibung
invoice_numberstring?Rechnungsnummer (BT-1)
issue_datestring?Rechnungsdatum ISO 8601, z.B. "2026-04-01"
sellerstring?Name des Verkäufers (BT-27)
buyerstring?Name des Käufers (BT-44)
total_amountstring?Gesamtbetrag als Dezimalstring, z.B. "1190.00"
currencystring?ISO 4217 Währungscode, z.B. "EUR"

8. Unterstützte Formate & Profile

Formate

FormatStandardAnmerkung
ZUGFeRD 1.0ZUGFeRD 1.0 / GEFEGÄltere Version, eingeschränkte Profilunterstützung
ZUGFeRD 2.0FeRD 2.0Erste CII-basierte Version
ZUGFeRD 2.1Factur-X 1.0 (FR)Technisch identisch mit Factur-X 1.0
ZUGFeRD 2.2Factur-X 1.0.05Kleinere Korrekturen
ZUGFeRD 2.3Factur-X 1.0.06Version vor 2.4
ZUGFeRD 2.4 / Factur-X 1.0EN 16931 + D16BAktuelle Hauptversion (2026)
XRechnung 1.2XRechnung 1.2Ältere XRechnung-Version
XRechnung 2.xXRechnung 2.0–2.3Verschiedene Zwischenversionen
XRechnung 3.0XRechnung 3.0Aktuelle XRechnung-Version

Profile (ZUGFeRD/Factur-X)

Profil-IDAnzeigenameTypischer Einsatz
minimumMINIMUMEinfache maschinelle Verarbeitung
basic_wlBASIC-WLOhne Positionsdetails
basicBASICStandard-Rechnungen
en16931EN 16931 (COMFORT)Öffentliche Auftraggeber, PEPPOL
extendedEXTENDEDKomplexe B2B-Prozesse
xrechnungXRECHNUNGDeutsche öffentliche Verwaltung

9. Regelwerk & Korrekturvorschläge

Der Server enthält eine Datenbank mit Korrekturvorschlägen für 48 Regelkategorien. Wenn Mustang einen Fehler mit bekannter Regel-ID meldet, wird der Korrekturvorschlag automatisch angehängt.

BR-DE-Regeln 26 Regeln

Deutsche Erweiterungen — Pflicht für XRechnung-konforme Rechnungen.

Regel-IDFeldKurzbeschreibung
BR-DE-1BT-31 / BT-32USt-ID oder Steuernummer des Verkäufers
BR-DE-2BT-35Straße des Verkäufers
BR-DE-3BT-37Stadt des Verkäufers
BR-DE-4BT-38PLZ des Verkäufers
BR-DE-5BT-40Land des Verkäufers
BR-DE-6BT-50Straße des Käufers
BR-DE-7BT-52Stadt des Käufers
BR-DE-8BT-53PLZ des Käufers
BR-DE-9BT-55Land des Käufers
BR-DE-10BT-81Zahlungsmitteltyp-Code
BR-DE-11BT-84IBAN des Zahlungskontos
BR-DE-12BT-86BIC des Zahlungsdienstleisters
BR-DE-13BT-20Zahlungsbedingung als Freitext
BR-DE-14BT-22Rechnungsanmerkung nicht leer
BR-DE-15BT-7Steuerdatum wenn abweichend
BR-DE-16BT-6Steuerkurs-Code
BR-DE-17BT-92Nachlass-Grund auf Belegebene
BR-DE-18BT-98Abschlags-Grund auf Belegebene
BR-DE-19BT-132Nachlass-Grund auf Positionsebene
BR-DE-20BT-140Abschlags-Grund auf Positionsebene
BR-DE-21BT-23Prozessart
BR-DE-22BT-24Spezifikationskennung
BR-DE-23BT-10Käuferreferenz / Leitweg-ID
BR-DE-24BT-48USt-ID oder Steuer-ID des Käufers
BR-DE-25BT-131Nettobetrag der Position positiv
BR-DE-26BT-129Abgerechnete Menge > 0

EN-16931-Kernregeln (BR-*) 10 Regeln

Regel-IDFeldKurzbeschreibung
BR-1BT-1Rechnungsnummer
BR-2BT-2Rechnungsdatum
BR-3BT-3Rechnungstyp-Code
BR-4BT-5Währungsangabe
BR-5BT-27Name des Verkäufers
BR-6BT-44Name des Käufers
BR-7BT-22Rechnungsanmerkung nicht leer
BR-8BT-19Bestellreferenz mit Inhalt
BR-9BT-14Vertragsnummer mit Inhalt
BR-10BT-13Bestellnummer mit Inhalt

Berechnungsregeln (BR-CO-*) & Codelistenregeln (BR-CL-*) 8 Regeln

Regel-IDKurzbeschreibung
BR-CO-3Gesamtbetrag korrekt berechnet
BR-CO-9Nettobetrag korrekt berechnet
BR-CO-10Gesamtsteuer korrekt berechnet
BR-CO-13Summe der Positionsnettobeträge korrekt
BR-CL-10Zahlungsmittelcode aus UNTDID 4461
BR-CL-16Steuerbefreiungscode aus VATEX-Liste
BR-CL-17Steuercode aus UNCL5305 (S, Z, E, AE, K)
BR-CL-18Maßeinheitencode aus UN/ECE Rec. 20

Steuerkategorieregeln (BR-S/Z/E/AE-*) 4 Regeln

Regel-IDKurzbeschreibung
BR-S-1Steuerbetrag bei Normalsatz (S) angegeben
BR-Z-1Steuerbetrag bei Nullsatz (Z) = 0
BR-E-1Steuerbetrag bei Steuerbefreiung (E) = 0
BR-AE-1Steuerbetrag bei Reverse Charge (AE) = 0

10. 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.4 / Factur-X 1.0",
  "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')."
  }]
}

11. Grenzen & Bekannte Einschränkungen

EinschränkungDetails
Java-AbhängigkeitMustang CLI benötigt zwingend Java 21+. Ohne Java starten alle Validierungs-Tools mit einem Fehler.
Mustang JARDas JAR muss vor dem ersten Start heruntergeladen werden (npm run setup).
TimeoutMustang CLI wird nach 30 Sekunden abgebrochen. Sehr große oder korrupte Dateien können diesen Timeout auslösen.
PDF-OCRcheck_consistency wertet nur maschinenlesbaren PDF-Text aus. Eingescannte PDFs ohne OCR-Schicht werden nicht unterstützt.
Metadaten nur bei XMLvalidate_invoice extrahiert Metadaten nur bei file_type: "xml". Bei PDFs fehlt dieses Feld.
KonsistenzprüfungNur drei Felder werden verglichen (Nummer, Datum, Betrag). Adressen, Steuernummern und Positionsdetails werden nicht abgeglichen.
Unbekannte Regel-IDsFehlt eine Regel-ID in der Fix-Suggestions-DB, bleibt fix_suggestion leer. Die Meldung wird trotzdem zurückgegeben.
DateigrößeKeine explizite Größenbeschränkung, aber sehr große PDFs (>50 MB) können zum Timeout führen.