einvoice-mcp

einvoice-mcp

MCP server for German e-invoice compliance (XRechnung 3.0 & ZUGFeRD 2.x) enabling AI agents to validate, generate, parse, and check compliance of electronic invoices per EN 16931.

Category
Visit Server

README

einvoice-mcp

CI Python 3.11+ License: MIT Tests Coverage

MCP-Server for German e-invoice compliance — XRechnung 3.0 & ZUGFeRD 2.x

An MCP server that enables AI agents (Claude, Cursor, Copilot) to validate, generate, parse, and check compliance of electronic invoices per EN 16931 — without a single line of integration code.


Why This Exists

Germany mandated e-invoice reception for B2B as of January 2025 (BMF 2024-11-15). Issuance mandates follow in 2027 (Vorjahresumsatz > 800K) and 2028 (all businesses). Every German company needs tooling — this MCP server gives AI agents that capability.


Compliance Proof

675 tests | 100% coverage (2106 stmts) | 0 failures | lint clean (ruff + mypy strict)

Run make test to verify.

EN 16931 / XRechnung 3.0 Field Coverage

Every mandatory Business Term is tested in generated XML output:

BT Field Test Result
BT-1 Invoice number test_contains_invoice_id PASS
BT-2 Issue date test_produces_valid_xml PASS
BT-3 Invoice type code (380/381/384) test_type_code_380_rechnung, test_type_code_381_gutschrift PASS
BT-5 Currency code (EUR) test_currency_eur PASS
BT-10 Buyer reference / Leitweg-ID test_buyer_reference_set PASS
BT-27 Seller name test_contains_seller PASS
BT-31 Seller VAT ID (schemeID=VA) test_tax_registration_scheme_id_correct PASS
BT-32 Seller tax number (schemeID=FC) test_steuernummer_bt32_scheme_fc PASS
BT-34 Seller electronic address (schemeID=EM) test_seller_electronic_address_bt34 PASS
BT-35..38 Seller address test_contains_seller PASS
BT-39 Seller country subdivision test_country_subdivision_seller_buyer PASS
BT-40 Seller country code test_contains_seller PASS
BT-41 Seller contact name (BR-DE-5) test_seller_contact_br_de_5 PASS
BT-42 Seller contact phone test_seller_contact_phone PASS
BT-43 Seller contact email (BR-DE-7) test_seller_contact_email_br_de_7 PASS
BT-44 Buyer name test_contains_buyer PASS
BT-49 Buyer electronic address (schemeID=EM) test_buyer_electronic_address_bt49 PASS
BT-50..53 Buyer address test_contains_buyer PASS
BT-54 Buyer country subdivision test_country_subdivision_seller_buyer PASS
BT-55 Buyer country code test_contains_buyer PASS
BT-71 Delivery date (§14 Abs. 4 Nr. 6 UStG) test_delivery_date_bt71 PASS
BT-20 Payment terms text test_payment_terms_text_roundtrip PASS
BT-22 Invoice note test_invoice_note_roundtrip PASS
BT-73/74 Service period start/end test_service_period_bt73_bt74 PASS
BT-11 Project reference test_project_reference_bt11 PASS
BT-12 Contract reference test_contract_reference_bt12 PASS
BT-13 Purchase order reference test_purchase_order_reference_bt13 PASS
BT-25 Preceding invoice number test_preceding_invoice_bt25 PASS
BT-81 Payment means type code test_payment_means_type_code_custom PASS
BT-83 Remittance information test_remittance_information_roundtrip PASS
BT-84 IBAN (SEPA credit transfer) test_iban_in_xml PASS
BT-9 Due date test_due_date_roundtrip PASS
BT-14 Sales order reference test_sales_order_roundtrip PASS
BT-29 Seller registration ID (GLN) test_seller_registration_id_roundtrip PASS
BT-36/37 Seller address lines 2/3 test_address_lines_full_roundtrip PASS
BT-44 Buyer contact name test_buyer_contact_roundtrip PASS
BT-46 Buyer contact phone test_buyer_contact_roundtrip PASS
BT-47 Buyer contact email test_buyer_contact_roundtrip PASS
BT-51/52 Buyer address lines 2/3 test_address_lines_full_roundtrip PASS
BT-70..80 Delivery location test_delivery_location_roundtrip PASS
BT-127 Line item note test_item_note_roundtrip PASS
BT-155 Seller item identifier test_seller_item_id_roundtrip PASS
BT-156 Buyer item identifier test_buyer_item_id_roundtrip PASS
BT-157 Standard item ID (GTIN) test_standard_item_id_roundtrip PASS
BG-20/21 Document-level allowances/charges test_allowance_roundtrip PASS
BG-27/28 Line-level allowances/charges test_line_allowance_roundtrip PASS
BT-16 Despatch advice reference test_despatch_advice_roundtrip PASS
BT-18 Invoiced object identifier test_invoiced_object_identifier_roundtrip PASS
BT-23 Business process type test_business_process_type_roundtrip PASS
BT-89 SEPA mandate reference (BG-19) test_sepa_direct_debit_roundtrip PASS
BT-91 Buyer IBAN (BG-19) test_sepa_direct_debit_roundtrip PASS
BT-120 VAT exemption reason text (BR-E-10) test_exemption_reason_roundtrip PASS
BT-121 VAT exemption reason code test_exemption_reason_roundtrip PASS
BT-28 Seller trading name test_trading_names_roundtrip PASS
BT-45 Buyer trading name test_trading_names_roundtrip PASS
BT-17 Tender or lot reference test_tender_reference_roundtrip PASS
BT-133 Buyer accounting reference test_bt133_roundtrip PASS
BT-134/135 Line-level billing period test_line_period_roundtrip PASS
BT-147/148 Gross price / price discount test_gross_price_and_discount_roundtrip PASS
BT-158 Item classification (CPV, etc.) test_item_classification_roundtrip PASS
BG-11 Seller tax representative (BT-62..65) test_seller_tax_rep_roundtrip PASS
BG-10 Payee party (BT-59..61) test_payee_party_roundtrip PASS
BG-18 Payment card (BT-87/88) test_payment_card_roundtrip PASS
BT-159 Item country of origin test_country_of_origin_roundtrip PASS
BG-30 Item attributes (BT-160/161) test_single_attribute_roundtrip PASS
BT-15 Receiving advice reference test_receiving_advice_roundtrip PASS
BT-71 Delivery location identifier test_delivery_location_id_roundtrip PASS
BT-82 Payment means text test_payment_means_text_roundtrip PASS
BG-24 Supporting documents (BT-122..125) test_supporting_doc_with_uri PASS
Skonto Payment discount terms test_skonto_roundtrip PASS

Calculation Rules

Rule Description Test Result
BR-CO-14 TaxTotalAmount = sum of per-group CalculatedAmount test_br_co_14_tax_total_equals_sum_of_trade_tax PASS
BR-CO-14 PDF/XML/API totals use identical per-group rounding test_total_tax_uses_per_group_rounding PASS
BR-CO-10 Line item LineTotalAmount quantized to 0.01 test_line_item_net_amount_quantized PASS
BR-DE-23 IBAN mandatory when PaymentMeansCode=58 test_iban_missing_flags_bt84 PASS
§14/4/2 BT-31 or BT-32 must be present test_neither_bt31_nor_bt32_flags_missing PASS
§14/4/6 BT-71 or BT-73/74 must be present test_no_delivery_date_or_period_flags_missing PASS
BT-3 TypeCode validated against EN 16931 codes test_invalid_type_code_rejected PASS
BT-25 Credit note (381) must reference preceding invoice test_credit_note_without_bt25_flags_missing PASS
384-BT-25 Corrective invoice (384) must reference preceding invoice test_384_with_preceding_ref PASS
RC-COUNTRY Reverse charge: seller ≠ buyer country advisory test_ae_same_country_advisory PASS
IC-COUNTRY Intra-community: seller ≠ buyer country required test_k_same_country_error PASS
§13b UStG Reverse charge: seller+buyer VAT IDs, 0% rate test_reverse_charge_* PASS
§4/1b UStG Intra-community (K): buyer VAT ID, 0% rate test_k_* PASS
§19 UStG Kleinunternehmer: exemption note advisory test_exempt_without_note_suggests_ku PASS
LW-FMT Leitweg-ID format advisory test_invalid_leitweg_format PASS
VAT-FMT German USt-IdNr. format advisory (DE + 9 digits) test_invalid_german_vat_format PASS
§4/1a UStG Export (G): 0% tax rate test_export_g_* PASS
§33 UStDV Kleinbetragsrechnung advisory (≤250€) test_small_invoice_gets_kb_hint PASS
BR-E-10 Exemption reason required for TaxCategory E test_compliance_missing_exemption_reason PASS
BR-DE-24 SEPA DD: mandate (BT-89) + buyer IBAN (BT-91) test_dd_missing_mandate_and_iban PASS
BR-DE-15 Payment terms (BT-20) required for XRechnung test_payment_terms_missing PASS
BR-DE-20 Max one payment instruction type (no mix CT+DD) test_mixed_ct_and_dd_flagged PASS
CC-BT-87 Credit card PAN required when code=48 test_credit_card_missing_pan PASS
REP-BT-63 Tax rep VAT ID required when BG-11 present test_tax_rep_without_tax_id PASS
IBAN IBAN format validation (ISO 13616) test_invalid_iban_* PASS
BIC BIC format validation (ISO 9362) test_invalid_bic_* PASS

Parsing Fidelity

Scenario Description Test Result
SchemeID stripping DE123456789 (VA)DE123456789 test_str_element_strips_scheme_id PASS
Numeric schemeID 4000000000098 (9930)4000000000098 test_strips_numeric_scheme PASS
Description text Reisekosten (pauschal) preserved test_preserves_lowercase_parens PASS
Unicode safety Artikel (3Ü) preserved (not stripped) test_preserves_unicode_parens PASS
BT-32 roundtrip Steuernummer FC generate → parse test_steuernummer_roundtrip PASS
TypeCode roundtrip 381 Gutschrift generate → parse test_type_code_381_roundtrip PASS
Delivery date roundtrip BT-71 generate → parse test_delivery_date_roundtrip PASS
Service period roundtrip BT-73/74 generate → parse test_service_period_roundtrip PASS
Electronic address roundtrip BT-34 generate → parse test_seller_electronic_address_roundtrip PASS
Invoice note roundtrip BT-22 generate → parse test_invoice_note_roundtrip PASS
Payment terms roundtrip BT-20 generate → parse test_payment_terms_text_roundtrip PASS
Payment terms override BT-20 text overrides days test_payment_terms_text_overrides_days PASS
Purchase order roundtrip BT-13 generate → parse test_purchase_order_reference_bt13 PASS
Contract roundtrip BT-12 generate → parse test_contract_reference_bt12 PASS
Project roundtrip BT-11 generate → parse test_project_reference_bt11 PASS
Preceding invoice roundtrip BT-25 generate → parse test_preceding_invoice_bt25 PASS
Remittance roundtrip BT-83 generate → parse test_remittance_information_roundtrip PASS
Empty scheme stripping "PO-42 ()""PO-42" test_strips_empty_parens PASS
Roundtrip invoice Generate → Parse → Verify key fields test_xrechnung_roundtrip PASS
Due date roundtrip BT-9 generate → parse test_due_date_roundtrip PASS
Address line 2/3 roundtrip BT-36/37, BT-51/52 generate → parse test_address_lines_full_roundtrip PASS
Buyer contact roundtrip BT-44/46/47 generate → parse test_buyer_contact_roundtrip PASS
Registration ID roundtrip BT-29 generate → parse test_seller_registration_id_roundtrip PASS
Sales order roundtrip BT-14 generate → parse test_sales_order_roundtrip PASS
Item identifiers roundtrip BT-155/156/157 generate → parse test_all_item_ids_together PASS
Line item note roundtrip BT-127 generate → parse test_item_note_roundtrip PASS
Delivery location roundtrip BT-70..80 generate → parse test_delivery_location_roundtrip PASS
Allowance roundtrip BG-20 generate → parse test_allowance_roundtrip PASS
Charge roundtrip BG-21 generate → parse test_charge_roundtrip PASS
Line allowance roundtrip BG-27 generate → parse test_line_allowance_roundtrip PASS
Despatch advice roundtrip BT-16 generate → parse test_despatch_advice_roundtrip PASS
Invoiced object roundtrip BT-18 generate → parse test_invoiced_object_identifier_roundtrip PASS
Business process roundtrip BT-23 generate → parse test_business_process_type_roundtrip PASS
SEPA direct debit roundtrip BG-19 generate → parse test_sepa_direct_debit_roundtrip PASS
Skonto roundtrip PaymentDiscountTerms generate → parse test_skonto_roundtrip PASS
BT-133 roundtrip Buyer accounting reference generate → parse test_bt133_roundtrip PASS
Trading names roundtrip BT-28/BT-45 generate → parse test_trading_names_roundtrip PASS
Tender reference roundtrip BT-17 generate → parse test_tender_reference_roundtrip PASS
Exemption reason roundtrip BT-120/BT-121 generate → parse test_exemption_reason_roundtrip PASS
Line period roundtrip BT-134/BT-135 generate → parse test_line_period_roundtrip PASS
Seller tax rep roundtrip BG-11 generate → parse test_seller_tax_rep_roundtrip PASS
Payee roundtrip BT-59/60/61 generate → parse test_payee_party_roundtrip PASS
Payment card roundtrip BT-87/88 generate → parse test_payment_card_roundtrip PASS
Gross price roundtrip BT-147/148 generate → parse test_gross_price_and_discount_roundtrip PASS
Classification roundtrip BT-158 generate → parse test_item_classification_roundtrip PASS
Country of origin roundtrip BT-159 generate → parse test_country_of_origin_roundtrip PASS
Item attributes roundtrip BT-160/161 generate → parse test_single_attribute_roundtrip PASS
Receiving advice roundtrip BT-15 generate → parse test_receiving_advice_roundtrip PASS
Delivery location ID roundtrip BT-71 generate → parse test_delivery_location_id_roundtrip PASS
Payment means text roundtrip BT-82 generate → parse test_payment_means_text_roundtrip PASS
Supporting docs roundtrip BG-24 generate → parse test_supporting_doc_with_uri PASS
Supporting docs + tender ref BG-24 + BT-17 coexistence test_supporting_docs_coexist_with_tender_ref PASS
Country subdivision roundtrip BT-39/BT-54 generate → parse test_country_subdivision_seller_buyer PASS
Payment means type code roundtrip BT-81 generate → parse test_sepa_type_code_roundtrip PASS
Buyer reference roundtrip BT-10 generate → parse test_buyer_reference_roundtrip PASS
Tax rep subdivision roundtrip BG-11 BT-39 generate → parse test_tax_rep_subdivision_roundtrip PASS
Combined item features BT-159 + BG-30 + BT-148 together test_all_item_features_together PASS
Multi-reference coexistence BT-17 + BT-18 in same invoice test_tender_and_invoiced_object_coexist PASS
Non-ASCII party names Cyrillic/Chinese names test_non_ascii_party_names PASS
All type codes 380, 381, 384, 389, 875, 876, 877 test_all_type_codes PASS
All tax categories S, Z, E, AE, K, G, O, L, M test_all_tax_categories PASS
50 line items Large invoice build + parse test_many_line_items PASS
Mixed tax categories S + G items in same invoice test_mixed_tax_category_invoice PASS
Unicode safety (umlauts) ÄÖÜäöüß in all text fields test_unicode_invoice PASS
High-value invoice 50 line items with high amounts test_high_value_invoice PASS
Mixed tax rates 7% + 19% with exact rounding test_reduced_tax_rate PASS
Classification version BT-158-2 version roundtrip test_classification_with_version_roundtrip PASS
UBL detection UBL Invoice/CreditNote rejected test_ubl_invoice_rejected PASS
Defensive handlers Exception in buyer_reference/tax_rep/payee/exemption TestDefensiveExceptionHandlers PASS
Pydantic BT mapping Validation errors show BT numbers test_invalid_iban_shows_bt84 PASS

Tax Category Coverage (All 9 EU VAT Categories)

Category Code Description Result
Standard S 19% / 7% USt PASS
Zero Z 0% rated PASS
Exempt E Exempt PASS
Reverse charge AE Reverse charge (Umkehr der Steuerschuld) PASS
Intra-community K EU supply (innergemeinschaftliche Lieferung) PASS
Export G Outside EU (Drittlandslieferung) PASS
Not subject O No VAT PASS
Canary Islands L IGIC PASS
Ceuta/Melilla M IPSI PASS

Security Hardening

Attack Vector Protection Test Result
XXE entity expansion defusedxml pre-screen test_parse_xml_blocks_xxe PASS
Billion laughs (entity bomb) defusedxml pre-screen test_parse_xml_blocks_billion_laughs PASS
External entity injection defusedxml pre-screen test_parse_xml_blocks_external_entity PASS
XML bomb (>10 MB) Size limit test_validate_rejects_oversized_xml PASS
PDF bomb (>50 MB base64) Size limit test_validate_rejects_oversized_pdf PASS
Decoded PDF bomb (>50 MB) Post-decode guard test_validate_rejects_oversized_decoded_pdf PASS
KoSIT response bomb 10 MB + 512 KB cap test_oversized_content_length_header PASS
Input reflection in errors Sanitized test_parse_rejects_unknown_file_type PASS
Error detail leakage Generic messages test_connection_error_no_hostname_in_message_de PASS
SSRF via redirect follow_redirects=False Defense-in-depth HARDENED
Supply chain (Docker) SHA-256 checksum verification Dockerfile.kosit HARDENED
Container privilege Non-root user (both containers) Dockerfile, Dockerfile.kosit HARDENED
Port exposure KoSIT bound to 127.0.0.1 only docker-compose.yml HARDENED
Supply chain (Python) uv.lock for reproducible builds uv.lock HARDENED
IBAN injection ISO 13616 format validation test_invalid_iban_* HARDENED
BIC injection ISO 9362 format validation test_invalid_bic_* HARDENED

Profile Coverage

Profile Generate Parse Validate Compliance
XRechnung 3.0 PASS PASS PASS PASS
ZUGFeRD EN16931 PASS PASS PASS PASS
ZUGFeRD Basic PASS* - - -
ZUGFeRD Extended PASS* - - -

* Generation produces XML with correct guideline URI; full parse/validate/compliance support planned.

Module Coverage

Module Lines Description
config.py 16 Pydantic settings
errors.py 36 Custom exceptions
models/ 600+ Pydantic models (invoice, party, line items, results, enums)
prompts/guides.py 633 14 German tax scenario prompts
prompts/guides_advanced.py 511 8 advanced prompts (EU trade, recurring, Schlussrechnung, Proforma, Drittland, Gutschrift)
prompts/guides_additional.py 304 5 additional prompts (Berichtigung, RC+Steuervertreter, Teilrechnung, IG deep, Skonto)
resources/ 1200+ 24 resources (schemas, reference codes, compliance, SEPA, CPV, BT-23, VAT exemptions, UNCL 5189)
services/invoice_builder.py 576 CII XML generation via drafthorse
services/invoice_data_builder.py 320 Flat parameter builder
services/cii_extractors.py 457 Party, item, attribute extraction
services/kosit.py 80 KoSIT HTTP client
services/pdf_generator.py 182 Visual PDF + factur-x embed
services/xml_parser.py 720 CII/ZUGFeRD XML parser
tools/compliance.py 217 Compliance orchestration
tools/compliance_checks.py 795 BR-DE/BR-CO field checks
tools/arithmetic_checks.py 230 BR-CO-10/11/12/13/14/15/16 math checks
tools/generate.py 50 Generate tools
tools/parse.py 39 Parse tool
tools/validate.py 33 Validation tools

server.py excluded — FastMCP Context cannot be unit-tested; helpers tested in test_server_helpers.py.


Tools

Tool Description
einvoice_validate_xrechnung Validates XRechnung XML against the KoSIT Validator
einvoice_validate_zugferd Validates ZUGFeRD PDF (extracts + validates embedded XML)
einvoice_generate_xrechnung Generates an XRechnung-compliant CII XML invoice
einvoice_generate_zugferd Generates a ZUGFeRD hybrid PDF (visual + machine-readable)
einvoice_parse Parses e-invoices (XML or PDF) into structured data
einvoice_check_compliance Checks mandatory fields + KoSIT validation with German suggestions

MCP Resources

Resource URI Description
einvoice://schemas/line-item JSON-Schema für Rechnungspositionen (items-Array)
einvoice://schemas/allowance-charge JSON-Schema für Zu-/Abschläge
einvoice://schemas/item-attribute JSON-Schema für Artikelmerkmale (BG-30)
einvoice://schemas/supporting-document JSON-Schema für Belegdokumente (BG-24)
einvoice://schemas/invoice-data Vollständiges JSON-Schema für InvoiceData
einvoice://reference/type-codes Rechnungstyp-Codes (380, 381, 384, 389, 875, 876, 877)
einvoice://reference/payment-means-codes Zahlungsart-Codes (58=SEPA, 59=Lastschrift, 48=Kreditkarte, …)
einvoice://reference/tax-categories EU-USt-Kategorien (S, Z, E, AE, K, G, O, L, M) mit Erklärungen
einvoice://reference/unit-codes Mengeneinheiten-Codes (H87=Stück, HUR=Stunde, KGM=kg, …)
einvoice://reference/eas-codes Elektronische Adress-Schemata (EM=E-Mail, 9930=USt-IdNr., …)
einvoice://system/kosit-status On-demand KoSIT-Validator Statusabfrage
einvoice://reference/e-rechnung-pflichten Zeitplan E-Rechnungspflichten 2020–2028 mit Rechtsgrundlagen
einvoice://reference/br-de-rules Deutsche Geschäftsregeln (BR-DE-1..24) mit Lösungshinweisen
einvoice://reference/skr04-mapping SKR04-Kontenzuordnung für häufige Rechnungsarten (DATEV)
einvoice://reference/credit-note-reasons Gutschrift-Gründe und Korrektur-Codes mit Empfehlungen
einvoice://reference/leitweg-id-format Leitweg-ID Aufbau (Grobadresse-Feinadresse-Prüfziffer), Regex, Beispiele
einvoice://reference/tax-category-decision-tree Steuerkategorie-Entscheidungsbaum (S/Z/E/AE/K/G/O/L/M) mit Szenarien
einvoice://reference/sepa-mandate-type-codes SEPA-Mandatstypen (CORE/B2B), Sequenztypen (FRST/RCUR/OOFF), Gläubiger-ID
einvoice://reference/cpv-classification-codes CPV-Codes für öffentliche Vergabe (BT-158), IT/Bau/Beratung/Gesundheit
einvoice://reference/business-process-identifiers BT-23 Geschäftsprozesstyp-Kennungen (Peppol BIS, XRechnung)
einvoice://reference/vat-exemption-reason-texts USt-Befreiungsgründe (BT-120/BT-121) — §19, §4, §13b UStG mit Texten
einvoice://reference/uncl-5189-allowance-reason-codes UNCL 5189 Zu-/Abschlagsgrund-Codes (Rabatt, Skonto, Zuschläge)

MCP Prompts

Prompt Description
gutschrift_erstellen Schritt-für-Schritt: Gutschrift (381) erstellen
reverse_charge_checkliste Checkliste: Reverse Charge (§13b UStG, Kategorie AE)
xrechnung_schnellstart Schnellstart: XRechnung für öffentliche Auftraggeber
korrekturrechnung_erstellen Anleitung: Korrekturrechnung (384) erstellen
abschlagsrechnung_guide Abschlagsrechnung / Teilrechnung (TypeCode 875/876/877)
ratenzahlung_rechnung Rechnung mit Ratenzahlung erstellen
handwerkerrechnung_35a Handwerkerrechnung nach §35a EStG
typecode_entscheidungshilfe Entscheidungshilfe: Welcher TypeCode für welchen Anlass?
b2b_pflicht_2027 Checkliste: B2B E-Rechnungspflicht ab 2027 vorbereiten
steuerprüfung_checkliste E-Rechnungen für Betriebsprüfung vorbereiten (GoBD, §147 AO)
kleinunternehmer_guide Kleinunternehmer (§19 UStG) — E-Rechnung ohne Umsatzsteuer
bauleistungen_13b_guide Bauleistungen / §13b UStG — Reverse Charge im Baugewerbe
differenzbesteuerung_25a_guide Differenzbesteuerung (§25a UStG) für Gebrauchtwarenhändler
stornobuchung_workflow Stornierung: 381 vs 384 vs neue 380 — Entscheidungsbaum
reiseleistungen_25_guide Reiseleistungen (§25 UStG) — Margenbesteuerung
innergemeinschaftliche_lieferung_guide Innergemeinschaftliche Lieferung (§4 Nr. 1b / §6a UStG)
dauerrechnung_guide Dauerrechnung / Monatsrechnung für wiederkehrende Leistungen
steuernummer_vs_ustidnr_guide Steuernummer vs. USt-IdNr. — Entscheidungshilfe (BR-DE-26)
schlussrechnung_nach_abschlag Schlussrechnung nach Abschlagszahlungen (prepaid_amount, BT-113)
proforma_rechnung_guide Proforma-Rechnung — rechtliche Einordnung, E-Rechnungs-Behandlung
drittlandlieferung_guide Export außerhalb EU (§4 Nr. 1a UStG, Steuerkategorie G, Incoterms)
gutschriftverfahren_389_guide Gutschriftverfahren / Self-Billing (TypeCode 389, §14 Abs. 2)
rechnungsberichtigung_vs_storno 381 vs 384: Gutschrift, Korrektur oder Storno? Entscheidungsbaum
reverse_charge_steuervertreter_combined Reverse Charge + Steuervertreter (BG-11): Kombiniertes Szenario
teilrechnung_workflow 875 → 877 Lifecycle: Abschlag, Teilrechnung, Schlussrechnung
innergemeinschaftliche_deep_dive IG Lieferung: Gelangensbestätigung, ZM, Nachweispflichten, eVatR
skonto_berechnung_guide Skonto: Berechnung, BT-20 Kodierung, §17 UStG Steuerbehandlung

Quick Start

Prerequisites

  • Python 3.11+
  • Docker (for the KoSIT Validator)

Installation

git clone https://github.com/Mavengence/einvoice-mcp.git
cd einvoice-mcp
pip install -e ".[dev]"

Start KoSIT Validator

make docker-up

Starts the KoSIT Validator (v1.6.2, XRechnung scenarios v2026-01-31) on port 8081.

Local Operation (stdio)

make dev

Configuration

Claude Desktop

{
  "mcpServers": {
    "einvoice": {
      "command": "python",
      "args": ["-m", "einvoice_mcp"],
      "env": {
        "KOSIT_URL": "http://localhost:8081"
      }
    }
  }
}

Claude Code

claude mcp add einvoice -- python -m einvoice_mcp

Cursor

Add to .cursor/mcp.json:

{
  "mcpServers": {
    "einvoice": {
      "command": "python",
      "args": ["-m", "einvoice_mcp"],
      "env": {
        "KOSIT_URL": "http://localhost:8081"
      }
    }
  }
}

Environment Variables

Variable Default Description
KOSIT_URL http://localhost:8081 KoSIT Validator URL
LOG_LEVEL INFO Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)

Example Prompts

Validiere diese XRechnung: [XML einfügen]

Erstelle eine Rechnung von TechCorp GmbH (DE123456789) an ClientCorp GmbH
für 40 Stunden Software-Beratung à 150€/Stunde mit 19% USt.

Parse diese E-Rechnung und zeig mir die Positionen.

Prüfe ob diese Rechnung XRechnung-konform ist und gib Verbesserungsvorschläge.

Advanced Examples

Erstelle eine Gutschrift (TypeCode 381) für Rechnung RE-2025-099 über
200€ netto mit 19% USt.

Erstelle eine Rechnung mit Reverse Charge (§13b UStG, Kategorie AE):
Verkäufer DE123456789, Käufer ATU12345678, Dienstleistung 5.000€.

Erstelle eine Rechnung mit 2% Skonto bei Zahlung innerhalb von 10 Tagen.

Erstelle eine Rechnung mit SEPA-Lastschrift (PaymentMeansCode 59),
Käufer-IBAN DE89370400440532013000, Mandatsreferenz MREF-2025-001.

Erstelle eine Rechnung mit Lieferort: Lager Hamburg, Hafenstraße 42,
20457 Hamburg.

Erstelle eine innergemeinschaftliche Lieferung (Kategorie K) an
einen französischen Kunden (FR12345678901).

Erstelle eine steuerbefreite Rechnung (§19 UStG, Kleinunternehmer)
mit Befreiungsgrund und Code vatex-eu-132.

Erstelle eine Rechnung für ein Vergabeverfahren mit Losnummer VERGABE-2026-42
und Kontierungsreferenz KST-4711 pro Position.

Erstelle eine Korrekturrechnung (TypeCode 384) für die fehlerhafte Rechnung
RE-2026-001 mit korrigiertem Steuersatz.

Architecture

[AI Client] --> stdio --> [FastMCP Server]
                              |-- drafthorse (CII XML generation/parsing)
                              |-- factur-x (PDF/A-3 embedding/extraction)
                              |-- reportlab (Visual PDF rendering)
                              |-- defusedxml (XXE protection on all parse paths)
                              '-- httpx --> [KoSIT Validator :8081]

KoSIT Validator Stack

Component Version Source
KoSIT Validator v1.6.2 (SHA-256 verified) itplr-kosit/validator
XRechnung Scenarios v2026-01-31 (SHA-256 verified) itplr-kosit/validator-configuration-xrechnung
Java Runtime Eclipse Temurin 17 OpenJDK

Development

make install    # Install dependencies
make test       # Run tests with coverage
make lint       # Ruff + mypy strict
make fmt        # Format code
make docker-up  # Start Docker stack

Supported Business Terms (EN 16931)

BT/BG Field Generate Parse Compliance
BT-1 Invoice number Yes Yes Yes
BT-2 Issue date Yes Yes Yes
BT-3 Type code (380/381/384) Yes Yes Yes
BT-5 Currency code Yes Yes Yes
BT-9 Due date Yes Yes
BT-10 Buyer reference / Leitweg-ID Yes Yes Yes
BT-11 Project reference Yes Yes
BT-12 Contract reference Yes Yes
BT-13 Purchase order reference Yes Yes
BT-14 Sales order reference Yes Yes
BT-16 Despatch advice reference Yes Yes
BT-17 Tender or lot reference Yes Yes
BT-18 Invoiced object identifier Yes Yes
BT-20 Payment terms text Yes Yes
BT-22 Invoice note Yes Yes
BT-23 Business process type Yes Yes
BT-25 Preceding invoice (credit notes) Yes Yes Yes
BT-27..40 Seller party + address (incl. lines 2/3, subdivision) Yes Yes Yes
BT-28 Seller trading name Yes Yes
BT-29 Seller registration ID (GLN) Yes Yes
BT-31 Seller VAT ID (schemeID=VA) Yes Yes Yes
BT-32 Seller tax number (schemeID=FC) Yes Yes Yes
BT-34 Seller electronic address Yes Yes Yes
BT-41 Seller contact name Yes Yes Yes
BT-42 Seller contact phone Yes Yes Yes
BT-43 Seller contact email Yes Yes Yes
BT-44..55 Buyer party + address (incl. lines 2/3, subdivision) Yes Yes Yes
BT-45 Buyer trading name Yes Yes
BT-46 Buyer registration ID (GLN) Yes Yes
BT-49 Buyer electronic address Yes Yes Yes
BT-70..80 Delivery location (name + address) Yes Yes
BT-71 Delivery date Yes Yes Yes
BT-73/74 Service period Yes Yes Yes
BT-81 Payment means type code Yes Yes
BT-83 Remittance information Yes Yes
BT-84 Seller IBAN Yes Yes Yes
BT-86 BIC Yes Yes
BT-89 SEPA mandate reference Yes Yes Yes
BT-91 Buyer IBAN (SEPA direct debit) Yes Yes Yes
BT-120 VAT exemption reason text Yes Yes Yes
BT-121 VAT exemption reason code Yes Yes
BT-127 Line item note Yes Yes
BT-155 Seller item identifier Yes Yes
BT-156 Buyer item identifier Yes Yes
BT-157 Standard item ID (GTIN/EAN) Yes Yes
BT-159 Item country of origin Yes Yes
BT-160/161 Item attributes (BG-30, name/value) Yes Yes
BG-20/21 Document-level allowances/charges Yes Yes
BG-27/28 Line-level allowances/charges Yes Yes
BT-15 Receiving advice reference Yes Yes
BT-71 Delivery location identifier Yes Yes
BT-82 Payment means text Yes Yes
BG-24 Supporting documents (BT-122..125) Yes Yes
BT-133 Buyer accounting reference Yes Yes
Skonto Payment discount terms (percent, days) Yes Yes

Gutschrift (Credit Note) Support

For credit notes (TypeCode 381), the server:

  • Sets XML header name to "GUTSCHRIFT" and PDF title accordingly
  • Requires BT-25 (preceding invoice number) in compliance checks
  • Shows "Bezug: [Rechnungsnummer]" in the PDF header
  • Validates against EN 16931 type code whitelist (380, 381, 384, 389, 875, 876, 877)

Example: type_code="381", preceding_invoice_number="RE-2025-099"


Profile Selection Guide

Profile Use Case Guideline URI
XRECHNUNG German public sector (B2G), Leitweg-ID required urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0
ZUGFERD_EN16931 B2B invoices (default for ZUGFeRD PDF) urn:cen.eu:en16931:2017
ZUGFERD_BASIC Simplified B2B invoices urn:cen.eu:en16931:2017#compliant#urn:factur-x.eu:1p0:basic
ZUGFERD_EXTENDED Extended B2B invoices with additional fields urn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extended

German Compliance Guide

See docs/GERMAN_COMPLIANCE_GUIDE.md for:

  • TypeCode decision tree (380/381/384/875/876/877)
  • Tax category decision tree (S/Z/E/AE/K/G/O/L/M)
  • Leitweg-ID format and sources
  • Reverse charge vs. intra-community supply
  • Handwerkerrechnung §35a EStG
  • Pflichtfelder-Checkliste for XRechnung 3.0

Limitations

  • ZUGFeRD Basic/Extended: Generation produces XML with correct guideline URIs, but parsing, validation, and compliance checks are tested for XRechnung 3.0 and ZUGFeRD EN16931 only.
  • Batch processing: Each tool call processes one invoice. For bulk operations, call the tools in sequence.

Troubleshooting

KoSIT Validator nicht erreichbar

Fehler: KoSIT-Validator nicht erreichbar. Bitte prüfen Sie die Verbindung.
  1. Start the Docker containers: make docker-up
  2. Wait for healthy status: docker compose -f docker/docker-compose.yml ps
  3. Verify manually: curl http://localhost:8081/server/health
  4. Check if port 8081 is blocked by firewall or another process

Docker Container startet nicht

# Check logs
docker compose -f docker/docker-compose.yml logs kosit

# Common issue: port already in use
lsof -i :8081

# Restart clean
docker compose -f docker/docker-compose.yml down
docker compose -f docker/docker-compose.yml up -d

UBL-Format erkannt

Fehler: UBL-Format erkannt. Dieses Tool unterstützt nur CII.

The parser only supports CII (Cross Industry Invoice) XML, which is the standard for XRechnung and ZUGFeRD. If you have a UBL invoice, convert it to CII first using an external tool.

Pydantic Validation Errors

When generating invoices, field errors now reference BT numbers:

Fehler: Ungültige Rechnungsdaten:
  - BT-84 (IBAN): String should match pattern ...
  - BT-27 (Verkäufername): String should have at least 1 character

Check the German Compliance Guide for field requirements.

Tests laufen nicht

# Install dev dependencies
pip install -e ".[dev]"

# Run unit tests only (no Docker needed)
make test

# Run integration tests (requires Docker)
make docker-up
pytest -m integration

Regulatory References

  • EN 16931 — European standard for electronic invoicing
  • XRechnung 3.0 (Szenarien 3.0.2) — German CIUS (Core Invoice Usage Specification)
  • ZUGFeRD 2.x / Factur-X 1.08 — Hybrid PDF/A-3 invoice format
  • BMF 2024-11-15 — German Federal Ministry of Finance e-invoice mandate
  • §14 UStG — German VAT Act invoice requirements
  • §14 Abs. 4 Nr. 2 UStG — Steuernummer or USt-IdNr. required (BT-31 / BT-32)
  • §14 Abs. 4 Nr. 6 UStG — Delivery date or service period required (BT-71 / BT-73/74)
  • BR-CO-14 — Tax total must equal sum of per-group calculated amounts
  • BR-DE-5 — Seller contact person (mandatory for XRechnung)
  • BR-DE-7 — Seller contact email (mandatory for XRechnung)
  • BR-DE-23 — IBAN mandatory when PaymentMeansCode = 58 (SEPA)
  • §13b UStG — Reverse charge: seller + buyer VAT IDs required, 0% tax rate
  • §4 Nr. 1b UStG — Intra-community supply: buyer VAT ID required, 0% tax rate
  • §19 UStG — Kleinunternehmerregelung: exemption note advisory for TaxCategory E
  • BG-19 — SEPA direct debit (PaymentMeansCode = 59, buyer IBAN, mandate reference)
  • BR-DE-20 — Max one payment instruction type (no mixing credit transfer + direct debit)
  • BR-DE-24 — SEPA direct debit: mandate reference + buyer IBAN required
  • BR-E-10 — VAT exemption reason (BT-120) required for TaxCategory E
  • §4 Nr. 1a UStG — Export outside EU (TaxCategory G): 0% tax rate required
  • §33 UStDV — Kleinbetragsrechnung advisory (invoices ≤250€ gross)
  • Skonto — Early payment discount terms (PaymentDiscountTerms in CII)
  • 384 Korrekturrechnung — Corrective invoice must reference preceding invoice (BT-25)
  • RC-COUNTRY — Reverse charge: seller/buyer country advisory (§13b allows domestic)
  • IC-COUNTRY — Intra-community: seller ≠ buyer country required
  • §632a BGB — Abschlagsrechnung for construction/service contracts
  • §35a Abs. 3 EStG — Handwerkerleistungen tax deduction (20% of labor, max 1.200€/year)
  • §271 BGB — Payment due date per agreement (Ratenzahlung)
  • ISO 13616 — IBAN format validation (seller + buyer)
  • ISO 9362 — BIC/SWIFT format validation

License

MIT

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured