Serveur de validation MCP
Factur-X, ZUGFeRD & XRechnung
Serveur MCP pour la validation automatisée de factures électroniques au format Factur-X, ainsi que des formats allemands ZUGFeRD et XRechnung. Renvoie des résultats JSON structurés avec des suggestions de correction concrètes.
1. Aperçu
Le serveur fournit trois outils et une ressource que les agents IA peuvent appeler via le Model Context Protocol.
| Scénario | Outil / Ressource |
|---|---|
| Vérifier une facture avant l'envoi | validate_invoice |
| Lire les données XML d'un PDF ZUGFeRD | extract_xml |
| Vérifier que le PDF et le XML concordent | check_consistency |
| Interroger les formats et jeux de règles disponibles | validation://rules |
2. Architecture & flux de données
Déroulement pour validate_invoice
3. Moteurs de validation
Chaque requête est vérifiée par deux moteurs en même temps. Les résultats sont consolidés, dédupliqués, puis renvoyés.
| Moteur | Version | Formats couverts |
|---|---|---|
| Mustang Project | v2.22.0 | ZUGFeRD 1.0–2.4, Factur-X 1.0, XRechnung (général) |
| Outil de validation KoSIT | v1.6.2 | XRechnung 3.0.2 (CII + UBL), EN 16931 CII/UBL (brut), Factur-X 1.07.3 / 1.08 (tous les profils) |
errors. Les doublons (même ID de règle + message) sont supprimés automatiquement. Les erreurs KoSIT ne sont retenues que si un scénario de validation adapté a été détecté — pour des GuidelineIDs inconnus, Mustang seul prend le relais.
4. Installation & configuration
# 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" } } } }
API REST directe
L'API peut aussi être appelée directement, sans client MCP :
# 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"}'
Variables d'environnement (client MCP)
| Variable | Description | Défaut |
|---|---|---|
ZUGFERD_API_KEY | Clé API du portail | – (obligatoire) |
ZUGFERD_API_URL | URL de base de l'API | https://api.zugferd-validator.de |
5. Outils
Valide une facture électronique (PDF ZUGFeRD/Factur-X ou XML XRechnung) selon la norme EN 16931 et les extensions allemandes. Renvoie des erreurs, avertissements et suggestions de correction structurés.
Schéma d'entrée
data:application/pdf;base64,…) sont retirés automatiquement.
"pdf" pour les PDF ZUGFeRD/Factur-X · "xml" pour les fichiers XML XRechnung/CII purs
rule_id: "PROFILE_MISMATCH" est généré.Valeurs :
minimum · basic_wl · basic · en16931 · extended · xrechnung
Schéma de sortie
{
"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"
}
]
}
Champs de sortie
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
valid | boolean | Oui | true si aucune erreur n'a été trouvée |
format | string | Non | Format détecté, p. ex. "ZUGFeRD 2.x", "CII EN16931", "XRechnung 3.0" — null si aucun XML n'est extractible |
profile | string | Non | Profil détecté en majuscules, p. ex. "EN16931", "XRECHNUNG" — null si aucun XML n'est extractible |
summary | string | Oui | Résumé lisible, p. ex. "2 Fehler, 1 Warnung gefunden" |
errors | array | Oui | Erreurs de validation — rendent la facture non valide |
warnings | array | Oui | Avertissements — la facture peut néanmoins être valide |
notices | array | Non | Remarques informatives sans effet sur la validité |
metadata | object | Non | Données de facture extraites — présentes pour les PDF si le XML intégré a pu être lu, et toujours pour file_type: "xml" |
Extrait le document XML intégré d'un PDF ZUGFeRD/Factur-X. Renvoie le contenu XML complet sous forme de chaîne, avec le format et le profil détectés.
Entrée
Sortie
{
"xml_content": "<?xml version='1.0' encoding='UTF-8'?>\n<rsm:CrossIndustryInvoice ...>...</rsm:CrossIndustryInvoice>",
"format": "ZUGFeRD 2.x",
"profile": "EN16931"
}
xml_content extrait peut être transmis directement (après encodage Base64) à validate_invoice avec file_type: "xml".Vérifie que les données visibles par l'humain dans le PDF (numéro de facture, date, montant total) correspondent aux données machine stockées dans la pièce jointe XML. Révèle les manipulations ou erreurs de saisie.
Entrée
Sortie
{
"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')."
}
]
}
Champs vérifiés & tolérances
| Champ | Motif de détection dans le PDF | Tolérance |
|---|---|---|
invoice_number | Rechnungsnummer:, Rechnung Nr., Invoice No. | Casse, espaces et tirets ignorés |
issue_date | Rechnungsdatum:, Datum:, Invoice Date: | Aucune — les formats de date sont normalisés en ISO 8601 |
total_amount | Gesamtbetrag:, Rechnungsbetrag:, Total: | ±0,01 EUR (différences d'arrondi) |
Crée une facture électronique valide à partir de données structurées — au choix comme PDF ZUGFeRD (PDF/A-3 avec XML CII EN 16931 intégré) ou comme XML XRechnung pur (CII avec CIUS XRechnung 3.0 et Leitweg-ID pour le B2G). Plusieurs lignes, toutes les catégories de TVA (S/Z/E/AE), remises/majorations, informations de paiement. REST : POST /v1/create. Sans état — rien n'est stocké. Montants en centimes, date au format YYYY-MM-DD.
Entrée (extrait)
zugferd (PDF) ou xrechnung (XML)invoice : credit_note (avoir/annulation), corrected, self_billed, prepayment (acompte), partial (facture partielle). En brut via type_code.{ number, date } — pour annulation/correction (BT-25/26)xrechnungfalse.Sortie
{
"format": "zugferd",
"profile": "EN16931",
"pdf_base64": "JVBERi0xLjc…",
"xml": "<?xml version=\"1.0\"…",
"branding": "free_footer"
}
validate_invoice sur le pdf_base64 ou le xml renvoyé — ou en réglant self_check: true pour un aller-retour unique. Le branding (pied de page sur le forfait Gratuit / white-label à partir d'Automatiser) est déterminé côté serveur selon le forfait. Quota hebdomadaire propre : Gratuit 1, Automatiser 20, Scaler illimité.zv_test_…, via GET /v1/keys/me) : pour intégrer librement sans entamer le quota réel. Les factures créées portent un filigrane « DEMO » en mosaïque sur chaque page plus un marqueur XML — entièrement testables, mais sans valeur comme véritable facture. 100/jour, 3/minute ; comptées séparément du quota réel.6. Ressource : validation_rules
Renvoie l'ensemble de règles actuel du serveur : formats et profils pris en charge, ainsi que le moteur de validation utilisé.
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.22.0",
"KoSIT Validierungstool v1.6.2 (XRechnung 3.0.2 + EN 16931 CII)"
],
"last_updated": "2026-04-08"
}
7. Gestion des erreurs
En cas d'erreur, tous les outils renvoient un objet JSON avec un champ error. Il n'y a jamais de sortie d'erreur non structurée.
{
"error": "Kurze Fehlerkategorie",
"details": "Ausführliche Beschreibung mit konkretem Hinweis zur Behebung."
}
| error | Déclencheur |
|---|---|
"Fehlender Parameter" | Champ obligatoire non transmis |
"Ungültiger Parameter" | Valeur incorrecte pour file_type |
"Ungültiger Base64-Input" | Chaîne Base64 non valide transmise |
"Validierungsfehler" | Mustang CLI n'a pas pu démarrer (p. ex. Java absent) ou timeout après 30 s |
"XML-Extraktion fehlgeschlagen" | Aucun fichier XML trouvé dans la pièce jointe du PDF (pour extract / consistency). Pour validate, un notice avec rule_id: "NO_EMBEDDED_XML" est renvoyé à la place et valid: true est défini |
"PDF-Lesefehler" | Le PDF ne peut pas être lu |
"XML-Parsing-Fehler" | Le XML extrait n'est pas un XML valide |
"Interner Fehler" | Erreur d'exécution inattendue |
"error": "Validierungsfehler" est renvoyé. Un timeout de KoSIT est ignoré en silence — les résultats de Mustang sont conservés.8. Types de données communs
ValidationIssue
Utilisé dans les tableaux errors, warnings et notices de validate_invoice.
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
severity | "error" | "warning" | "notice" | Oui | Niveau de gravité du constat |
rule_id | string | Oui | ID de règle, p. ex. "BR-DE-1", "BR-CL-10". Valeur "UNKNOWN" pour les violations de schéma XSD (KoSIT) ou lorsqu'aucune ID de règle n'a pu être déterminée |
field | string | Non | Champ BT concerné, p. ex. "BT-10" |
message | string | Oui | Message d'erreur (en allemand) |
fix_suggestion | string | Non | Conseil de correction concret avec exemple XML |
xpath | string | Non | XPath vers l'élément XML concerné |
InvoiceMetadata
Champ optionnel dans le résultat de validate_invoice (uniquement pour file_type: "xml").
| Champ | Type | Description |
|---|---|---|
invoice_number | string? | Numéro de facture (BT-1) |
issue_date | string? | Date de facture ISO 8601, p. ex. "2026-04-01" |
seller | string? | Nom du vendeur (BT-27) |
buyer | string? | Nom de l'acheteur (BT-44) |
total_amount | string? | Montant total sous forme de chaîne décimale, p. ex. "1190.00" |
currency | string? | Code devise ISO 4217, p. ex. "EUR" |
9. Formats & profils pris en charge
Formats
| Format | Standard | Remarque |
|---|---|---|
| ZUGFeRD 1.0 | ZUGFeRD 1.0 / GEFEG | Version plus ancienne, prise en charge des profils limitée |
| ZUGFeRD 2.0 | FeRD 2.0 | Première version basée sur CII |
| ZUGFeRD 2.1 | Factur-X 1.0 (FR) | Techniquement identique à Factur-X 1.0 |
| ZUGFeRD 2.2 | Factur-X 1.0.05 | Corrections mineures |
| ZUGFeRD 2.3 | Factur-X 1.0.06 | Version antérieure à 2.4 |
| ZUGFeRD 2.x / Factur-X 1.0x | EN 16931 + D16B | Version principale actuelle (2026) — l'API renvoie "ZUGFeRD 2.x" |
| XRechnung 1.2 | XRechnung 1.2 | Version XRechnung plus ancienne |
| XRechnung 2.x | XRechnung 2.0–2.3 | Différentes versions intermédiaires |
| XRechnung 3.0 | XRechnung 3.0 | Version XRechnung actuelle |
Profils (ZUGFeRD/Factur-X)
| ID de profil | Nom affiché | Usage typique |
|---|---|---|
minimum | MINIMUM | Traitement machine simple |
basic_wl | BASIC-WL | Sans détail des lignes |
basic | BASIC | Factures standard |
en16931 | EN 16931 (COMFORT) | Donneurs d'ordre publics, PEPPOL |
extended | EXTENDED | Processus B2B complexes |
xrechnung | XRECHNUNG | Administration publique allemande |
10. Règles & suggestions de correction
Le serveur contient une base de suggestions de correction pour 63 catégories de règles. Les erreurs des deux moteurs de validation (Mustang + KoSIT) sont consolidées — lorsqu'une ID de règle connue est trouvée, la suggestion de correction est ajoutée automatiquement.
Règles BR-DE 26 règles
Extensions allemandes — obligatoires pour les factures conformes à XRechnung.
| ID de règle | Champ | Description courte |
|---|---|---|
BR-DE-1 | BG-16 | PAYMENT INSTRUCTIONS (BG-16) manquantes |
BR-DE-2 | BG-6 | Contact vendeur (BG-6) |
BR-DE-3 | BT-37 | Ville du vendeur (BT-37) |
BR-DE-4 | BT-38 | Code postal du vendeur (BT-38) |
BR-DE-5 | BT-41 | Interlocuteur du vendeur (BT-41) |
BR-DE-6 | BT-42 | Numéro de téléphone du vendeur (BT-42) |
BR-DE-7 | BT-43 | E-mail du vendeur (BT-43) |
BR-DE-8 | BT-52 | Ville de l'acheteur (BT-52) |
BR-DE-9 | BT-53 | Code postal de l'acheteur (BT-53) |
BR-DE-10 | BT-77 | Ville de livraison (BT-77) |
BR-DE-11 | BT-78 | Code postal de livraison (BT-78) |
BR-DE-12 | – | supprimée dans la version XRechnung actuelle |
BR-DE-13 | – | supprimée dans la version XRechnung actuelle |
BR-DE-14 | BT-119 | Taux de TVA (BT-119) |
BR-DE-15 | BT-10 | Référence acheteur / Leitweg-ID (BT-10) |
BR-DE-16 | BT-31 | Numéro de TVA / numéro fiscal du vendeur |
BR-DE-17 | BT-3 | Code de type de facture non autorisé (BT-3) |
BR-DE-18 | BT-20 | Informations d'escompte (BT-20) au mauvais format |
BR-DE-19 | – | supprimée dans la version XRechnung actuelle |
BR-DE-20 | – | supprimée dans la version XRechnung actuelle |
BR-DE-21 | BT-24 | Specification identifier (BT-24) non conforme à XRechnung |
BR-DE-22 | – | Noms de fichiers joints non uniques |
BR-DE-23 | – | supprimée dans la version XRechnung actuelle |
BR-DE-24 | – | supprimée dans la version XRechnung actuelle |
BR-DE-25 | – | supprimée dans la version XRechnung actuelle |
BR-DE-26 | BT-3 | Correction de facture sans facture de référence (BG-3) |
Règles fondamentales EN 16931 (BR-*) 10 règles
| ID de règle | Champ | Description courte |
|---|---|---|
BR-1 | BT-24 | Specification identifier (BT-24) |
BR-2 | BT-1 | Numéro de facture (BT-1) |
BR-3 | BT-2 | Date de facture (BT-2) |
BR-4 | BT-3 | Code de type de facture (BT-3) |
BR-5 | BT-5 | Code devise (BT-5) |
BR-6 | BT-27 | Nom du vendeur (BT-27) |
BR-7 | BT-44 | Nom de l'acheteur (BT-44) |
BR-8 | BG-5 | Adresse postale du vendeur (BG-5) |
BR-9 | BG-5 | Code pays du vendeur (BT-40) |
BR-10 | BG-8 | Adresse postale de l'acheteur (BG-8) |
Règles de calcul (BR-CO-*) & règles de listes de codes (BR-CL-*) 8 règles
| ID de règle | Description courte |
|---|---|
BR-CO-3 | La date de taxe et le code de date de taxe s'excluent mutuellement |
BR-CO-9 | Numéro de TVA du vendeur sans préfixe pays |
BR-CO-10 | La somme des montants nets des lignes est incorrecte |
BR-CO-13 | Montant total hors TVA mal calculé |
BR-CL-10 | schemeID non valide (pas issue d'ISO 6523) |
BR-CL-16 | Code de moyen de paiement non valide (pas issu d'UNTDID 4461) |
BR-CL-17 | Catégorie de TVA non valide au niveau de la ligne |
BR-CL-18 | Catégorie de TVA non valide au niveau du document |
Règles de catégorie de taxe (BR-S/Z/E/AE-*) 4 règles
| ID de règle | Description courte |
|---|---|
BR-S-1 | Montant de taxe indiqué pour le taux normal (S) |
BR-Z-1 | Montant de taxe au taux zéro (Z) = 0 |
BR-E-1 | Montant de taxe en cas d'exonération (E) = 0 |
BR-AE-1 | Montant de taxe en autoliquidation (AE) = 0 |
11. Exemples d'utilisation
Exemple 1 : valider un XML XRechnung
{
"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"
}
}
Exemple 2 : facture erronée avec suggestion de correction
{
"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": []
}
Exemple 3 : extraire et valider le XML
// 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" } }
Exemple 4 : contrôle de cohérence
{
"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')."
}]
}
Exemple 3 : PDF simple sans XML intégré
Une facture PDF classique sans pièce jointe ZUGFeRD/Factur-X renvoie valid: true avec un notice informatif — pas d'erreur, mais une indication qu'aucune donnée structurée n'a pu être vérifiée.
{
"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. Limites & restrictions connues
| Restriction | Détails |
|---|---|
| Timeout | Mustang CLI est interrompu côté serveur après 30 secondes. Les fichiers très volumineux ou corrompus peuvent déclencher ce timeout. |
| Limite de débit | Validation : Gratuit 20/semaine · Automatiser 500/semaine · Scaler illimité. Création (quota propre) : Gratuit 1/semaine · Automatiser 20/semaine · Scaler illimité. Création sandbox : 100/jour, max. 3/minute. En cas de dépassement : HTTP 429. |
| OCR des PDF | check_consistency n'analyse que le texte PDF lisible par machine. Les PDF scannés sans couche OCR ne sont pas pris en charge. |
| Métadonnées pour les PDF | validate_invoice extrait aussi les métadonnées des PDF, à condition qu'un XML intégré soit présent et lisible. Pour les PDF simples sans XML, ce champ est absent. |
| Contrôle de cohérence | Seuls trois champs sont comparés (numéro, date, montant). Les adresses, numéros fiscaux et détails de lignes ne sont pas confrontés. |
| ID de règle inconnues | Si une ID de règle manque dans la base de suggestions, fix_suggestion reste vide. Le message est renvoyé malgré tout. |
| Taille de fichier | Aucune limite de taille explicite, mais les PDF très volumineux (>50 Mo) peuvent provoquer un timeout. |
13. Journal des modifications
Juin 2026 — Création de factures
- Nouvel outil
create_invoice/POST /v1/create: créer des factures électroniques valides à partir de données structurées — comme PDF ZUGFeRD (PDF/A-3) ou XML XRechnung pur (avec Leitweg-ID pour le B2G). - Plusieurs lignes, toutes les catégories de TVA (S/Z/E/AE), remises/majorations, informations de paiement, échéance.
- Types de document : facture, avoir/annulation, correction, autofacturation, facture d'acompte et facture partielle — avec référence à la facture d'origine.
- Branding selon le forfait (pied de page sur le forfait Gratuit / white-label à partir d'Automatiser avec logo optionnel) ; quota hebdomadaire propre, distinct de la validation.
- Clés sandbox/test (
zv_test_…) : intégration libre avec filigrane « DEMO », sans entamer le quota réel.
Avril 2026 — Première publication
- Validation selon EN 16931 (
validate_invoice) pour les PDF ZUGFeRD/Factur-X et les XML XRechnung, avec des suggestions de correction concrètes. - Extraction XML (
extract_xml) et contrôle de cohérence PDF↔XML (check_consistency). - Client MCP pour Claude & autres agents IA ; moteurs Mustang et KoSIT.