Validate, generate, convert and extract EN 16931 e-invoices for businesses.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Convert an existing e-invoice from UBL to CII, CII to UBL, or XML to a ZUGFeRD/Factur-X PDF. Also accepts a ZUGFeRD/Factur-X PDF and converts its embedded XML. Validates every output and returns it only if valid. Use this for a format or container change. Do not use it to create an invoice from data (use generate_invoice), to validate only (use validate_invoice), or to extract data (use extract_invoice). Supported profiles are EN 16931 and XRechnung 3.0; other profiles return 422 unsupported_profile. B2B only. Requires the caller's own Electronic Invoice API key, sent either directly as Authorization: Bearer eia_live_... or through an OAuth 2.1 access token issued by this server. A call that reaches the API and returns 200, 400, 422 or 504 counts against the plan quota.
Target. ubl and cii return XML. zugferd and facturx return a PDF/A-3 file. Required.
Add an EPC QR payment page to PDF output. See generate_invoice.
The invoice file the user attached in ChatGPT. Always prefer this when the user attached a file: the server fetches the original bytes and passes them on unchanged, so a PDF is checked as a whole. Only for clients that provide file references. Exactly one of file, content and contentBase64 is required.
Language of the PDF visual. Default de.
Raw invoice XML as UTF-8 text (UBL Invoice/CreditNote or UN/CEFACT CII). Use this only when the XML itself is the invoice. Do not use it for PDFs, and do not extract the XML from a PDF to send it here: the PDF container is then not part of the call. Exactly one of file, content and contentBase64 is required.
Rule set country for validation. Default DE.
PDF profile for to=zugferd or to=facturx. Default follows the input profile. Not valid for ubl or cii.
Optional original filename, for example rechnung.xml or rechnung.pdf. It is used only to derive the result filename and is not sent to the API.
Optional MIME type of the supplied document. Defaults to application/xml for content and to a value derived from filename for contentBase64. Ignored for file, where the file content decides.
Base64-encoded raw bytes of an invoice XML or PDF file. Use this for PDFs and for binary-safe XML when file is not available. Exactly one of file, content and contentBase64 is required.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http mcp https://mcp.electronic-invoice.app/mcp
Convert an existing e-invoice from UBL to CII, CII to UBL, or XML to a ZUGFeRD/Factur-X PDF. Also accepts a ZUGFeRD/Factur-X PDF and converts its embedded XML. Validates every output and returns it only if valid. Use this for a format or container change. Do not use it to create an invoice from data (use generate_invoice), to validate only (use validate_invoice), or to extract data (use extract_invoice). Supported profiles are EN 16931 and XRechnung 3.0; other profiles return 422 unsupported_profile. B2B only. Requires the caller's own Electronic Invoice API key, sent either directly as Authorization: Bearer eia_live_... or through an OAuth 2.1 access token issued by this server. A call that reaches the API and returns 200, 400, 422 or 504 counts against the plan quota.
| Argument | Type | Description |
|---|---|---|
| qr | boolean | Add an EPC QR payment page to PDF output. See generate_invoice. |
| to* | string | Target. ubl and cii return XML. zugferd and facturx return a PDF/A-3 file. Required. |
| file | any | The invoice file the user attached in ChatGPT. Always prefer this when the user attached a file: the server fetches the original bytes and passes them on unchanged, so a PDF is checked as a whole. Only for clients that provide file references. Exactly one of file, content and contentBase64 is required. |
| lang | string | Language of the PDF visual. Default de. |
| content | string | Raw invoice XML as UTF-8 text (UBL Invoice/CreditNote or UN/CEFACT CII). Use this only when the XML itself is the invoice. Do not use it for PDFs, and do not extract the XML from a PDF to send it here: the PDF container is then not part of the call. Exactly one of file, content and contentBase64 is required. |
| country | string | Rule set country for validation. Default DE. |
| profile | string | PDF profile for to=zugferd or to=facturx. Default follows the input profile. Not valid for ubl or cii. |
| filename | string | Optional original filename, for example rechnung.xml or rechnung.pdf. It is used only to derive the result filename and is not sent to the API. |
| contentType | string | Optional MIME type of the supplied document. Defaults to application/xml for content and to a value derived from filename for contentBase64. Ignored for file, where the file content decides. |
| contentBase64 | string | Base64-encoded raw bytes of an invoice XML or PDF file. Use this for PDFs and for binary-safe XML when file is not available. Exactly one of file, content and contentBase64 is required. |
{
"type": "object",
"$defs": {
"uploadedFile": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "File ID provided by ChatGPT."
},
"file_name": {
"type": "string",
"description": "Original file name provided by ChatGPT."
},
"mime_type": {
"type": "string",
"description": "MIME type provided by ChatGPT. Not trusted, the file content decides."
},
"download_url": {
"type": "string",
"description": "Temporary download URL provided by ChatGPT."
}
},
"additionalProperties": false
}
},
"anyOf": [
{
"required": [
"file"
]
},
{
"required": [
"content"
]
},
{
"required": [
"contentBase64"
]
}
],
"required": [
"to"
],
"properties": {
"qr": {
"type": "boolean",
"default": false,
"description": "Add an EPC QR payment page to PDF output. See generate_invoice."
},
"to": {
"enum": [
"ubl",
"cii",
"zugferd",
"facturx"
],
"type": "string",
"description": "Target. ubl and cii return XML. zugferd and facturx return a PDF/A-3 file. Required."
},
"file": {
"$ref": "#/$defs/uploadedFile",
"description": "The invoice file the user attached in ChatGPT. Always prefer this when the user attached a file: the server fetches the original bytes and passes them on unchanged, so a PDF is checked as a whole. Only for clients that provide file references. Exactly one of file, content and contentBase64 is required."
},
"lang": {
"enum": [
"de",
"en"
],
"type": "string",
"default": "de",
"description": "Language of the PDF visual. Default de."
},
"content": {
"type": "string",
"description": "Raw invoice XML as UTF-8 text (UBL Invoice/CreditNote or UN/CEFACT CII). Use this only when the XML itself is the invoice. Do not use it for PDFs, and do not extract the XML from a PDF to send it here: the PDF container is then not part of the call. Exactly one of file, content and contentBase64 is required."
},
"country": {
"enum": [
"DE",
"FR"
],
"type": "string",
"default": "DE",
"description": "Rule set country for validation. Default DE."
},
"profile": {
"enum": [
"en16931",
"xrechnung"
],
"type": "string",
"description": "PDF profile for to=zugferd or to=facturx. Default follows the input profile. Not valid for ubl or cii."
},
"filename": {
"type": "string",
"maxLength": 255,
"description": "Optional original filename, for example rechnung.xml or rechnung.pdf. It is used only to derive the result filename and is not sent to the API."
},
"contentType": {
"enum": [
"application/xml",
"text/xml",
"application/pdf",
"application/octet-stream"
],
"type": "string",
"description": "Optional MIME type of the supplied document. Defaults to application/xml for content and to a value derived from filename for contentBase64. Ignored for file, where the file content decides."
},
"contentBase64": {
"type": "string",
"description": "Base64-encoded raw bytes of an invoice XML or PDF file. Use this for PDFs and for binary-safe XML when file is not available. Exactly one of file, content and contentBase64 is required."
}
},
"additionalProperties": false
}Read data from an existing UBL/CII XML or ZUGFeRD/Factur-X PDF. Returns JSON business terms keyed by BT/BG numbers, CSV with one row per line, or a DATEV Buchungsstapel (EXTF). Does not validate the invoice. Use this for accounting import or data analysis. Do not use it to check validity (use validate_invoice). DATEV export has hard limits: EUR only, one invoice per file, issue date inside the fiscal year, and no booking of prepayments, rounding or Skonto. DATEV output is written to the documented layout and was not tested against a DATEV installation. B2B only. Requires the caller's own Electronic Invoice API key, sent either directly as Authorization: Bearer eia_live_... or through an OAuth 2.1 access token issued by this server. A call that reaches the API and returns 200, 400, 422 or 504 counts against the plan quota.
| Argument | Type | Description |
|---|---|---|
| file | any | The invoice file the user attached in ChatGPT. Always prefer this when the user attached a file: the server fetches the original bytes and passes them on unchanged, so a PDF is checked as a whole. Only for clients that provide file references. Exactly one of file, content and contentBase64 is required. |
| format | string | Output. json returns the EN 16931 term model plus a summary. csv returns one row per line. datev returns a DATEV Buchungsstapel (EXTF, Windows-1252). Default json. |
| labels | boolean | json only: add a map from BT number to xr element name. |
| content | string | Raw invoice XML as UTF-8 text (UBL Invoice/CreditNote or UN/CEFACT CII). Use this only when the XML itself is the invoice. Do not use it for PDFs, and do not extract the XML from a PDF to send it here: the PDF container is then not part of the call. Exactly one of file, content and contentBase64 is required. |
Create a new e-invoice file from structured JSON. Builds XRechnung UBL/CII or a ZUGFeRD/Factur-X PDF, validates the result with the same rule sets, and returns the file only if it is valid. Use this when no invoice file exists yet. Do not use it to validate an existing file (use validate_invoice) or to change an existing file's syntax (use convert_invoice). Supports invoice, credit note, corrected, partial and final invoices, prepayments, and an optional EPC payment QR page for PDF output. B2B only. Requires the caller's own Electronic Invoice API key, sent either directly as Authorization: Bearer eia_live_... or through an OAuth 2.1 access token issued by this server. A call that reaches the API and returns 200, 400, 422 or 504 counts against the plan quota.
| Argument | Type | Description |
|---|---|---|
| qr | boolean | Add an EPC QR payment page to PDF output when IBAN and amount due are present. The response header X-Payment-QR says added or skipped with a reason. Ignored for XML output. |
| lang | string | Language of the PDF visual. Default de. |
| format* | string | Output format. xrechnung-ubl and xrechnung-cii return XML. zugferd-en16931, zugferd-xrechnung and facturx-en16931 return a PDF/A-3 file. Required. |
| country | string | Rule set country for validation of the generated invoice. Default DE. |
| invoice* | object | Invoice data per the Electronic Invoice API schema. Required fields: number, issueDate, seller, buyer, lines. Optional fields include typeCode, dueDate, deliveryDate, currency, buyerReference, notes, payment, documentAllowances, documentCharges, prepayments. Amounts are JSON numbers, dates are YYYY-MM-DD. See the API documentation for the full object. |
Explain the plans, monthly quotas, rate limits, concurrency limits, billable status codes and body size limits of the Electronic Invoice API. Works without an API key and does not call the API. B2B only. Prices and monthly quotas are published on https://electronic-invoice.app/de/api/. Use this for commercial or quota questions, not for invoice validation.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Check whether the Electronic Invoice API is up and which rule set versions it currently runs. Calls GET /v1/health without an API key. Free, not billable, works without an account. B2B only. Use this before diagnosing a failing invoice call, but do not use it as proof that a specific API key or quota is valid.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Open an upload field in the chat where the user chooses an invoice PDF or XML file. The file then goes straight to validate_invoice without passing through the model, so a PDF is checked as a whole, including its PDF/A-3 container. Use this when the user wants a file checked and this client gives you no way to pass the file itself, as with Claude. Never type out a file as base64 and never read the XML out of a PDF instead. This tool needs no input and checks nothing by itself. Clients with a file parameter on validate_invoice should use that. B2B only.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Validate an existing e-invoice file without changing it. Accepts UBL Invoice/CreditNote XML, UN/CEFACT CII XML, or a ZUGFeRD/Factur-X/XRechnung PDF. Checks EN 16931 and the XRechnung 3.0 CIUS, and returns verdict, findings and rule set versions. A PDF is also checked as a PDF/A-3 container, but only if the PDF itself is sent. Report the result of this tool; do not replace it with your own analysis of the file. Use this before sending an invoice, or to inspect a file. Do not use it to create a new invoice (use generate_invoice), to change the format (use convert_invoice), or to read accounting data (use extract_invoice). B2B only. Requires the caller's own Electronic Invoice API key, sent either directly as Authorization: Bearer eia_live_... or through an OAuth 2.1 access token issued by this server. A call that reaches the API and returns 200, 400, 422 or 504 counts against the plan quota.
| Argument | Type | Description |
|---|---|---|
| file | any | The invoice file the user attached in ChatGPT. Always prefer this when the user attached a file: the server fetches the original bytes and passes them on unchanged, so a PDF is checked as a whole. Only for clients that provide file references. Exactly one of file, content and contentBase64 is required. |
| checks | string | Optional opt-in plausibility checks (PL rules): mandatory items of section 14(4) UStG, arithmetic, dates, Skonto, VAT rates, VAT id form. They are an aid, not legal or tax advice. |
| content | string | Raw invoice XML as UTF-8 text (UBL Invoice/CreditNote or UN/CEFACT CII). Use this only when the XML itself is the invoice. Do not use it for PDFs, and do not extract the XML from a PDF to send it here: the PDF container is then not part of the call. Exactly one of file, content and contentBase64 is required. |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 5, 2026.
| filename | string | Optional original filename, for example rechnung.xml or rechnung.pdf. It is used only to derive the result filename and is not sent to the API. |
| delimiter | string | csv only: field delimiter. Default semicolon. |
| datevLabel | string | datev only, optional: Bezeichnung, at most 30 characters. |
| attachments | boolean | json only: include embedded files as base64. |
| contentType | string | Optional MIME type of the supplied document. Defaults to application/xml for content and to a value derived from filename for contentBase64. Ignored for file, where the file content decides. |
| datevClient | integer | datev only, required: Mandantennummer 1 to 99999. |
| datevDueDate | boolean | datev only, optional: write the due date into the DATEV field Faelligkeit. |
| contentBase64 | string | Base64-encoded raw bytes of an invoice XML or PDF file. Use this for PDFs and for binary-safe XML when file is not available. Exactly one of file, content and contentBase64 is required. |
| datevDirection | string | datev only, required: incoming (expense) or outgoing (revenue). |
| datevConsultant | integer | datev only, required: Beraternummer 1001 to 9999999. |
| datevBookingKeys | string | datev only, optional: BU-Schluessel per VAT category and rate, for example S19=9,S7=8. |
| datevAccountLength | integer | datev only, required: Sachkontenlaenge 4 to 8. |
| datevLedgerAccount | string | datev only, required: expense or revenue account, digits only. |
| datevCounterAccount | string | datev only, required: personal account (creditor or debtor), digits only. |
| datevChartOfAccounts | string | datev only, optional: Sachkontenrahmen, for example 03 or 04. |
| datevFiscalYearStart | string | datev only, required: start of the fiscal year as YYYY-MM-DD. The year of the document date is derived from it. |
{
"type": "object",
"$defs": {
"uploadedFile": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "File ID provided by ChatGPT."
},
"file_name": {
"type": "string",
"description": "Original file name provided by ChatGPT."
},
"mime_type": {
"type": "string",
"description": "MIME type provided by ChatGPT. Not trusted, the file content decides."
},
"download_url": {
"type": "string",
"description": "Temporary download URL provided by ChatGPT."
}
},
"additionalProperties": false
}
},
"anyOf": [
{
"required": [
"file"
]
},
{
"required": [
"content"
]
},
{
"required": [
"contentBase64"
]
}
],
"properties": {
"file": {
"$ref": "#/$defs/uploadedFile",
"description": "The invoice file the user attached in ChatGPT. Always prefer this when the user attached a file: the server fetches the original bytes and passes them on unchanged, so a PDF is checked as a whole. Only for clients that provide file references. Exactly one of file, content and contentBase64 is required."
},
"format": {
"enum": [
"json",
"csv",
"datev"
],
"type": "string",
"default": "json",
"description": "Output. json returns the EN 16931 term model plus a summary. csv returns one row per line. datev returns a DATEV Buchungsstapel (EXTF, Windows-1252). Default json."
},
"labels": {
"type": "boolean",
"description": "json only: add a map from BT number to xr element name."
},
"content": {
"type": "string",
"description": "Raw invoice XML as UTF-8 text (UBL Invoice/CreditNote or UN/CEFACT CII). Use this only when the XML itself is the invoice. Do not use it for PDFs, and do not extract the XML from a PDF to send it here: the PDF container is then not part of the call. Exactly one of file, content and contentBase64 is required."
},
"filename": {
"type": "string",
"maxLength": 255,
"description": "Optional original filename, for example rechnung.xml or rechnung.pdf. It is used only to derive the result filename and is not sent to the API."
},
"delimiter": {
"enum": [
"semicolon",
"comma"
],
"type": "string",
"description": "csv only: field delimiter. Default semicolon."
},
"datevLabel": {
"type": "string",
"maxLength": 30,
"description": "datev only, optional: Bezeichnung, at most 30 characters."
},
"attachments": {
"type": "boolean",
"description": "json only: include embedded files as base64."
},
"contentType": {
"enum": [
"application/xml",
"text/xml",
"application/pdf",
"application/octet-stream"
],
"type": "string",
"description": "Optional MIME type of the supplied document. Defaults to application/xml for content and to a value derived from filename for contentBase64. Ignored for file, where the file content decides."
},
"datevClient": {
"type": "integer",
"maximum": 99999,
"minimum": 1,
"description": "datev only, required: Mandantennummer 1 to 99999."
},
"datevDueDate": {
"type": "boolean",
"description": "datev only, optional: write the due date into the DATEV field Faelligkeit."
},
"contentBase64": {
"type": "string",
"description": "Base64-encoded raw bytes of an invoice XML or PDF file. Use this for PDFs and for binary-safe XML when file is not available. Exactly one of file, content and contentBase64 is required."
},
"datevDirection": {
"enum": [
"incoming",
"outgoing"
],
"type": "string",
"description": "datev only, required: incoming (expense) or outgoing (revenue)."
},
"datevConsultant": {
"type": "integer",
"maximum": 9999999,
"minimum": 1001,
"description": "datev only, required: Beraternummer 1001 to 9999999."
},
"datevBookingKeys": {
"type": "string",
"description": "datev only, optional: BU-Schluessel per VAT category and rate, for example S19=9,S7=8."
},
"datevAccountLength": {
"type": "integer",
"maximum": 8,
"minimum": 4,
"description": "datev only, required: Sachkontenlaenge 4 to 8."
},
"datevLedgerAccount": {
"type": "string",
"pattern": "^[0-9]{1,9}$",
"description": "datev only, required: expense or revenue account, digits only."
},
"datevCounterAccount": {
"type": "string",
"pattern": "^[0-9]{1,9}$",
"description": "datev only, required: personal account (creditor or debtor), digits only."
},
"datevChartOfAccounts": {
"type": "string",
"description": "datev only, optional: Sachkontenrahmen, for example 03 or 04."
},
"datevFiscalYearStart": {
"type": "string",
"description": "datev only, required: start of the fiscal year as YYYY-MM-DD. The year of the document date is derived from it."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"invoice",
"format"
],
"properties": {
"qr": {
"type": "boolean",
"default": false,
"description": "Add an EPC QR payment page to PDF output when IBAN and amount due are present. The response header X-Payment-QR says added or skipped with a reason. Ignored for XML output."
},
"lang": {
"enum": [
"de",
"en"
],
"type": "string",
"default": "de",
"description": "Language of the PDF visual. Default de."
},
"format": {
"enum": [
"xrechnung-ubl",
"xrechnung-cii",
"zugferd-en16931",
"zugferd-xrechnung",
"facturx-en16931"
],
"type": "string",
"description": "Output format. xrechnung-ubl and xrechnung-cii return XML. zugferd-en16931, zugferd-xrechnung and facturx-en16931 return a PDF/A-3 file. Required."
},
"country": {
"enum": [
"DE",
"FR"
],
"type": "string",
"default": "DE",
"description": "Rule set country for validation of the generated invoice. Default DE."
},
"invoice": {
"type": "object",
"description": "Invoice data per the Electronic Invoice API schema. Required fields: number, issueDate, seller, buyer, lines. Optional fields include typeCode, dueDate, deliveryDate, currency, buyerReference, notes, payment, documentAllowances, documentCharges, prepayments. Amounts are JSON numbers, dates are YYYY-MM-DD. See the API documentation for the full object.",
"additionalProperties": true
}
},
"additionalProperties": false
}| country | string | Rule set country. DE checks XRechnung and EN 16931. FR uses EN 16931 plus an info finding about French rules that are not covered. Default DE. |
| filename | string | Optional original filename, for example rechnung.xml or rechnung.pdf. It is used only to derive the result filename and is not sent to the API. |
| contentType | string | Optional MIME type of the supplied document. Defaults to application/xml for content and to a value derived from filename for contentBase64. Ignored for file, where the file content decides. |
| contentBase64 | string | Base64-encoded raw bytes of an invoice XML or PDF file. Use this for PDFs and for binary-safe XML when file is not available. Exactly one of file, content and contentBase64 is required. |
{
"type": "object",
"$defs": {
"uploadedFile": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "File ID provided by ChatGPT."
},
"file_name": {
"type": "string",
"description": "Original file name provided by ChatGPT."
},
"mime_type": {
"type": "string",
"description": "MIME type provided by ChatGPT. Not trusted, the file content decides."
},
"download_url": {
"type": "string",
"description": "Temporary download URL provided by ChatGPT."
}
},
"additionalProperties": false
}
},
"anyOf": [
{
"required": [
"file"
]
},
{
"required": [
"content"
]
},
{
"required": [
"contentBase64"
]
}
],
"properties": {
"file": {
"$ref": "#/$defs/uploadedFile",
"description": "The invoice file the user attached in ChatGPT. Always prefer this when the user attached a file: the server fetches the original bytes and passes them on unchanged, so a PDF is checked as a whole. Only for clients that provide file references. Exactly one of file, content and contentBase64 is required."
},
"checks": {
"enum": [
"plausibility"
],
"type": "string",
"description": "Optional opt-in plausibility checks (PL rules): mandatory items of section 14(4) UStG, arithmetic, dates, Skonto, VAT rates, VAT id form. They are an aid, not legal or tax advice."
},
"content": {
"type": "string",
"description": "Raw invoice XML as UTF-8 text (UBL Invoice/CreditNote or UN/CEFACT CII). Use this only when the XML itself is the invoice. Do not use it for PDFs, and do not extract the XML from a PDF to send it here: the PDF container is then not part of the call. Exactly one of file, content and contentBase64 is required."
},
"country": {
"enum": [
"DE",
"FR"
],
"type": "string",
"default": "DE",
"description": "Rule set country. DE checks XRechnung and EN 16931. FR uses EN 16931 plus an info finding about French rules that are not covered. Default DE."
},
"filename": {
"type": "string",
"maxLength": 255,
"description": "Optional original filename, for example rechnung.xml or rechnung.pdf. It is used only to derive the result filename and is not sent to the API."
},
"contentType": {
"enum": [
"application/xml",
"text/xml",
"application/pdf",
"application/octet-stream"
],
"type": "string",
"description": "Optional MIME type of the supplied document. Defaults to application/xml for content and to a value derived from filename for contentBase64. Ignored for file, where the file content decides."
},
"contentBase64": {
"type": "string",
"description": "Base64-encoded raw bytes of an invoice XML or PDF file. Use this for PDFs and for binary-safe XML when file is not available. Exactly one of file, content and contentBase64 is required."
}
},
"additionalProperties": false
}