Conformo e-invoicing
Create and check EU e-invoices (XRechnung, ZUGFeRD, Factur-X, Peppol) locally. Free, no API key.
What can you do with Conformo e-invoicing?
- No transmission. It makes and checks documents. It does not send them over the Peppol network, to a French plateforme agréée (PA, formerly PDP),
- No FatturaPA or Facturae serializer, reader or validator (the Agenzia delle Entrate schema could not be fetched when v0.2 was built). KSeF FA(3) is limited to domestic PLN invoices at 23/8/5 %, 0 % and exempt, is checked against the Ministry of Fina...
- No legal advice and no archiving. It does not decide whether you are obliged to issue an e-invoice, and it does not do retention.
- XSD validation in the browser is not available; Node has it.
- Official ZUGFeRD / Factur-X sample PDFs were not part of the conformance run (their sites were unreachable when v0.2 was built).
Install
Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).
@conformo/mcp-serverclaude mcp add conformo-e-invoicing -- npx -y @conformo/mcp-server@0.2.1
{
"mcpServers": {
"conformo-e-invoicing": {
"command": "npx",
"args": [
"-y",
"@conformo/mcp-server@0.2.1"
]
}
}
}
Documentation
From the project's README on GitHub, refreshed weekly. Links open on GitHub.
Contents
Conformo
Free, open-source tools to create and check e-invoices for Germany, France and the rest of the EU: XRechnung, ZUGFeRD, Factur-X, UBL and Peppol BIS. Everything runs on your own computer or in your browser. No Java, no server, no account, and your invoice data never goes to us or anyone else.
The web app, unedited: a typo in the authority's Leitweg-ID is caught as you type, the official XRechnung rules accept the finished invoice, and the PDF with the XML inside downloads. Recorded by tools/readme-media.mjs.
Proof, not promises. Conformo checks invoices with the official rule files, unmodified, and agrees 100% with the official KoSIT validator on the official test invoices. CI measures this on every change (conformance report). A daily job watches KoSIT, CEN and OpenPeppol for new rule releases, and a new version only ships if agreement is still 100% (how updates work).
| You are | Start here |
|---|---|
| A freelancer or small business that has to send e-invoices | Make one in your browser. Free, no signup, nothing uploaded. |
| Someone who received an e-invoice or wants to test one | Check it in your browser. Drop the PDF or XML, see what to fix. |
| A developer adding e-invoices to your software | npm install @conformo/toolkit, then the Quickstart below or the developer docs. |
| Building with AI agents (Claude, Cursor and others) | The MCP server lets an agent create and check e-invoices locally. |
Why now: German businesses must be able to receive e-invoices since 2025 and must send them from 2027 (turnover above EUR 800,000) or 2028 (everyone else). France started in September 2026. Short version with code: Germany 2027 guide.
How it works
flowchart LR
A["Your invoice data<br/>JSON, the web form,<br/>or an AI agent via MCP"] --> B["Conformo<br/>one EN 16931 model"]
B --> C["XRechnung<br/>CII or UBL"]
B --> D["ZUGFeRD / Factur-X<br/>PDF with XML inside"]
B --> E["UBL 2.1<br/>Peppol BIS 3.0"]
C & D & E --> F{"Official rule files,<br/>run on your machine<br/>KoSIT · CEN · Peppol · French CTC"}
F -->|passes| G["Accepted:<br/>ready to send"]
F -->|fails| H["What to fix, in plain words,<br/>with the official rule id"]
classDef base fill:#ffffff,stroke:#8a9691,color:#17211d
classDef core fill:#0e6a4e,stroke:#0e6a4e,color:#ffffff
classDef ok fill:#e1f0ea,stroke:#0e6a4e,color:#0b4f3a
classDef bad fill:#fbe9e6,stroke:#b42318,color:#8a1a12
class A,C,D,E,F base
class B core
class G ok
class H bad
It also works the other way: drop in an e-invoice you received (PDF or XML) and Conformo reads it back into the same model and checks it.
What a failed check looks like
The official validators answer with rule ids, German messages and XPath locations. Conformo runs the same rules and then says which field is wrong and how to fix it, with the rule id kept next to it.
Same check from the command line (exit code 1, so it fails a CI pipeline):
$ npx @conformo/cli validate rechnung.xml
Document: ubl-invoice, profile xrechnung, urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0
Rule sets run:
en16931-ubl: EN 16931 (UBL) [CEN eInvoicing-EN16931 validation-1.3.17] — 72 rules checked, 0 failed, 0 advisory
xrechnung-ubl: XRechnung 3.0 CIUS (UBL) [KoSIT validator-configuration-xrechnung 2026-08-31 (XRechnung 3.0.2)] — 19 rules checked, 1 failed, 1 advisory
XSD: passed (UBL 2.1 Invoice)
[FATAL] BR-DE-15 (BT-10)
Das Element "Buyer reference" (BT-10) muss übermittelt werden.
Location: /Q{urn:oasis:names:specification:ubl:schema:xsd:Invoice-2}Invoice[1]
INVALID — 91 rules checked, 1 failed, 1 advisory.
Output trimmed only by removing the advisory block. Every rule set names its publisher and version, so a result can be reproduced.
Quickstart
npm install @conformo/toolkit
import { createXml, validate } from '@conformo/toolkit';
const invoice = {
number: 'INV-1', issueDate: '2027-01-15', currency: 'EUR', buyerReference: 'PO-77',
seller: { name: 'Seller GmbH', vatId: 'DE123456789', street: 'Hauptstrasse 1', postcode: '10115', city: 'Berlin', country: 'DE',
electronicAddress: 'billing@seller.example', electronicAddressScheme: 'EM', contact: { name: 'Ann', phone: '+49 30 1', email: 'ann@seller.example' } },
buyer: { name: 'Buyer GmbH', street: 'Ring 2', postcode: '50667', city: 'Koeln', country: 'DE', electronicAddress: 'ap@buyer.example', electronicAddressScheme: 'EM' },
payment: { meansCode: '58', iban: 'DE89370400440532013000' },
lines: [{ name: 'Work', quantity: 2, unitPriceMinor: 5000, taxCategory: 'S', taxRate: 19 }], // money is integer cents
};
const { xml } = createXml(invoice, 'xrechnung-cii');
const result = await validate(xml);
console.log(result.valid, result.ruleSets.map((r) => r.id)); // true [ 'en16931-cii', 'xrechnung-cii' ]
Leave out a required field and you get one InvoiceInputError listing every problem with its EN 16931 term ({ path, bt, severity, message }), not a
TypeError. This block is executed by test/doctests.test.ts and against the packed npm tarballs by npm run pack:smoke,
so it cannot rot.
Other entry points: CLI (npx @conformo/cli validate invoice.xml), MCP server for agents,
the web app, and docker compose up --build to run the app yourself.
What it does, and the test that proves each cell
"Validate" means the official rule sets and schemas, run locally; result.ruleSets lists what ran. Browser validation runs the Schematron rules;
XSD validation runs in Node only (KNOWN-GAPS).
| Format | Generate | Read | Validate (Node) | Validate (browser) | CLI | MCP |
|---|---|---|---|---|---|---|
| EN 16931 CII (Factur-X / ZUGFeRD EN 16931) | yes | yes | yes, rules + XSD | rules | yes | yes |
| EN 16931 UBL 2.1, Invoice and CreditNote | yes | yes | yes, rules + XSD | rules | yes | yes |
| XRechnung 3.x, CII and UBL | yes | yes | yes, KoSIT rules + XSD | rules | yes | yes |
| Peppol BIS Billing 3.0 (UBL), documents only | yes | yes | yes | rules | yes | yes |
| Factur-X / ZUGFeRD PDF: EN 16931, XRECHNUNG, EXTENDED\* | yes | yes | embedded XML | validator page | yes | yes |
| French CTC rules (BR-FR Flux 2, CII) | partly (fixture) | yes | yes | rules | yes | yes |
| Polish KSeF FA(3), domestic PLN invoices only | yes | no | XSD only | no | yes | yes |
| FatturaPA, Facturae | no | no | no | no | no | no |
\* EXTENDED is written with EN 16931 content only (no EXTENDED-only fields) and only its XSD is checked. MINIMUM and BASIC WL are not offered: they are not EN 16931 invoices and are not accepted for German B2B from 2027.
How well it agrees with the official validators, on the official sample files, is measured and published in docs/CONFORMANCE.md (regenerated in CI). How new KoSIT, CEN and Peppol releases are picked up: docs/UPDATES.md (Deutsch). Every EN 16931 business term and where it lives in the model: docs/EN16931-COVERAGE.md.
What this does not do yet
- No transmission. It makes and checks documents. It does not send them over the Peppol network, to a French plateforme agréée (PA, formerly PDP), to Poland's KSeF, or to Italy's SdI.
- No FatturaPA or Facturae serializer, reader or validator (the Agenzia delle Entrate schema could not be fetched when v0.2 was built). KSeF FA(3) is limited to domestic PLN invoices at 23/8/5 %, 0 % and exempt, is checked against the Ministry of Finance XSD only, and cannot be read back. The dataset below lists all these requirements; the toolkit says what is supported.
- No legal advice and no archiving. It does not decide whether you are obliged to issue an e-invoice, and it does not do retention.
- XSD validation in the browser is not available; Node has it.
- Official ZUGFeRD / Factur-X sample PDFs were not part of the conformance run (their sites were unreachable when v0.2 was built).
Which countries require this
Generated from a sourced, versioned dataset (packages/compliance-data). Issuing and receiving are separate obligations with separate dates, so they are separate columns. A window marked unverified could not be traced to a primary source when it was added.
| Country | B2G issuing | B2B issuing | B2B receiving | Thresholds and phasing | Format(s) | Last verified |
|---|---|---|---|---|---|---|
| Belgium | Mandatory since 2023-11-01 | Mandatory since 2026-01-01 | Mandatory since 2026-01-01 | B2G send 2023-11-01: Phased in by contract value: contracts >= EUR 215,000 from 2022-11-01, >= EUR 30,000 from 2023-05-01, < EUR 30,000 from 2023-11-01. | peppol-bis-3.0 | 2025-08-14, source |
| France | Mandatory since 2019-11-01 | Mandatory since 2026-09-01 | ||||
| Planned from 2027-09-01 | Mandatory since 2026-09-01 | B2B send 2026-09-01: Large and medium-sized enterprises must issue e-invoices from this date. |
B2B send 2027-09-01: Small and micro-enterprises must issue e-invoices from this date.
B2B receive 2026-09-01: All VAT-registered businesses must be able to receive structured e-invoices from this date. | cii, ubl-2.1, factur-x | 2025-08-14, source |
| Germany | Mandatory since 2019-11-01 | Planned from 2027-01-01
Planned from 2028-01-01 | Mandatory since 2025-01-01 | B2B receive 2025-01-01: All companies must be able to accept EN 16931-compliant e-invoices from this date.
B2B send 2027-01-01: Businesses with turnover above EUR 800,000 must issue e-invoices from this date.
B2B send 2028-01-01: All businesses must issue e-invoices from this date. | xrechnung, zugferd, peppol-bis-3.0 | 2025-08-14, source |
| Italy | Mandatory since 2015-03-31 | Mandatory since 2019-01-01 | Mandatory since 2019-01-01 | B2B both 2019-01-01: Universal since January 2024: flat-rate ('forfettario') taxpayers were originally excluded below EUR 65,000 turnover, the threshold was reduced to EUR 25,000 in July 2022, and the exclusion was fully removed as of January 2024. | fatturapa | 2025-08-14, source |
| Netherlands | Mandatory since 2019-11-01 | Voluntary | Voluntary | B2G send 2019-11-01: Applies to public procurement contracts above EU procurement thresholds. | peppol-bis-3.0, ubl-2.1, other | 2025-08-14, source |
| Poland | — | Mandatory since 2026-02-01
Mandatory since 2026-04-01
Unverified from 2027-01-01 | Mandatory since 2026-02-01
Mandatory since 2026-04-01
Unverified from 2027-01-01 | B2G receive 2019-08-01: Contracts >= EUR 30,000 from 2019-04-18; all contracting authorities from 2019-08-01.
B2B both 2026-02-01: Large taxpayers (annual revenue above PLN 200 million) from 2026-02-01.
B2B both 2026-04-01: All other VAT taxpayers from 2026-04-01, except the smallest taxpayers below.
B2B both 2027-01-01: The smallest taxpayers join from 2027-01-01 (the exact size criterion is not recorded here). | peppol-bis-3.0, ksef-fa | 2025-08-14, source, some windows unverified |
| Spain | Mandatory since 2015-01-15 | Planned | Planned | B2G send 2015-01-15: Invoices over EUR 5,000 to public administration suppliers.
B2B both : Under Law 18/2022 ('Crea y Crece'): once the implementing technical regulations are enacted, companies with EUR 8 million+ annual revenue get a 1-year compliance deadline, other businesses a 2-year deadline. | facturae | 2025-02-04, source |
Detail per country: conformo-docs.vercel.app, or npx @conformo/cli requirements DE.
Principles
Money is integer minor units, with exact-decimal helpers for quantities, prices and rates. Output is deterministic (the same invoice gives the same
bytes). No headless browser anywhere in the PDF path. @conformo/core and @conformo/formats have no runtime dependencies. Compliance is shown, not
claimed: the validator reports the rule sets it ran.
Anti-goals
Not accounting, payroll, expenses, inventory, CRM or time tracking. The open-source core and the web app never require an account or a server. An optional, stateless HTTP API and remote MCP server may exist; they hold no data and are self-hostable, so you can run them where your data is.
Contributing / building from source
docs/DEVELOPMENT.md to build, test or run this repo, CONTRIBUTING.md for the invariants, docs/DECISIONS.md for decisions and docs/KNOWN-GAPS.md for what is missing and why.
License
Apache-2.0.
Frequently asked questions
What is Conformo e-invoicing?
Create and check EU e-invoices (XRechnung, ZUGFeRD, Factur-X, Peppol) locally. Free, no API key.
How do I install Conformo e-invoicing?
It runs on your machine. In Claude Code: claude mcp add conformo-e-invoicing -- npx -y @conformo/mcp-server@0.2.1. For other clients, paste the JSON configuration from this page into their MCP settings.
Does Conformo e-invoicing need an API key?
Its registry entry lists no required key or secret. Some features may still need an account with the service it connects to.
Is Conformo e-invoicing open source?
Yes. Its code is on GitHub under the Apache-2.0 license.
Who maintains Conformo e-invoicing?
It is published by arsalmurad. AI.tn lists it but does not maintain or endorse it.
From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.