invowerk MCP
An official MCP server provided by invowerk that enables AI agents to validate, create, and manage German and European e-invoices. It supports formats such as ZUGFeRD, Factur-X, XRechnung, and Peppol BIS, allowing users to check compliance and generate structured electronic documents directly through tool calls.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://api.invowerk.dev/mcp/What its tools do
6 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to invowerk.dev ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Validate ZUGFeRD and Factur-X invoice compliance
- Generate XRechnung and Peppol BIS e-invoices
- Check e-invoicing requirements by country
- Create PDF invoices with embedded XML data
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- invowerk 1
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 6 advertised
- Resources
- 0 advertised
- Resource templates
- 0 advertised
- Prompts
- 0 advertised
{
"tools": {
"listChanged": true
},
"logging": {},
"prompts": {
"listChanged": true
},
"resources": {
"subscribe": false,
"listChanged": true
},
"extensions": {
"io.modelcontextprotocol/ui": {}
},
"experimental": {}
}Tools
6 advertised
validate_invoice — Check an e-invoice
Check an e-invoice against EN 16931 and German rules. Input: `invoice_base64` is the base64 of an XML invoice (UBL or CII) or a ZUGFeRD / Factur-X PDF, at most 4 MB decoded; or pass the file as a download link in `file`. `explain=true` adds an explanation to findings whose rule has one, in `lang` ("de" or "en"). `valid` is the result. For XRechnung the KoSIT validator decides. If it is unreachable, invowerk's own check with the same rules decides, `verdict_source` is "local" and `official_degraded` is true. `disagreement` is true when both ran and differ. `findings` lists each problem with `rule_id`, `severity` and `message`; pass the codes to `explain_errors` (free). `pdfa_verdict` is the PDF/A check of a PDF. `hints` never change `valid`. Unreadable input returns a finding, not an error. It fails with an error when the check is busy (`engine_busy`), ran longer than 20 s (`engine_timeout`) or the XML has more than 100,000 elements (`document_too_complex`). Credits: 1 per call.
{
"type": "object",
"properties": {
"file": {
"type": "object",
"default": null,
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "An identifier for the file. ChatGPT sets it; other clients may pass any label, such as the file name."
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string",
"description": "A public https URL of the file."
}
},
"description": "The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL."
},
"lang": {
"enum": [
"de",
"en"
],
"type": "string",
"default": "de",
"description": "Language of the explanations: \"de\" (default) or \"en\"."
},
"explain": {
"type": "boolean",
"default": false,
"description": "true adds an explanation to each finding whose rule has one."
},
"invoice_base64": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The invoice file, base64-encoded. At most 4 MB decoded."
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"title": "Check an e-invoice",
"readOnlyHint": true,
"openWorldHint": true
}render_invoice — Render an e-invoice as HTML
Render an XML e-invoice (UBL or CII, e.g. XRechnung) as a readable HTML page. invowerk uses the KoSIT XRechnung visualization. Use it to show a person what an e-invoice contains. Input: `invoice_base64` is the base64 of the XML, at most 4 MB decoded, or pass the file as a download link in `file`. PDFs are not accepted. `lang` sets the label language, "de" (default) or "en". Returns `html` (a complete HTML document), `lang`, `flavor` (e.g. "xrechnung") and `syntax` (e.g. "ubl_invoice"). A file that is not an XML invoice, malformed XML or XML with a DOCTYPE fails with an error message, and so does a busy (`engine_busy`) or overrunning (`engine_timeout`) render. Credits: 1 per call.
{
"type": "object",
"properties": {
"file": {
"type": "object",
"default": null,
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "An identifier for the file. ChatGPT sets it; other clients may pass any label, such as the file name."
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string",
"description": "A public https URL of the file."
}
},
"description": "The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL."
},
"lang": {
"enum": [
"de",
"en"
],
"type": "string",
"default": "de",
"description": "Language of the labels: \"de\" (default) or \"en\"."
},
"invoice_base64": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The invoice file, base64-encoded. At most 4 MB decoded."
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"title": "Render an e-invoice as HTML",
"readOnlyHint": true,
"openWorldHint": true
}explain_errors — Explain error codes
Explain rule codes in plain language. Works without an API key. Covers the codes of `validate_invoice` findings and hints: EN 16931, XRechnung, ZUGFeRD and invowerk's own hint codes (IW-*). Input: `codes` is a list of one or more codes, e.g. ["BR-CO-18", "BR-DE-21"]. Duplicates are removed. `lang` is "de" (default) or "en". Returns `lang` and `explanations`. Each explanation has `title`, `meaning`, `causes`, `fixes`, `severity`, `standard`, `bt_refs`, `xpath_hints` and `explain_url` (the German page for the code). If any code is unknown, the call fails and names the unknown codes. Credits: free. This tool is not metered.
{
"type": "object",
"required": [
"codes"
],
"properties": {
"lang": {
"enum": [
"de",
"en"
],
"type": "string",
"default": "de",
"description": "Language of the explanations: \"de\" (default) or \"en\"."
},
"codes": {
"type": "array",
"items": {
"type": "string"
},
"description": "One or more rule codes from validate_invoice, e.g. [\"BR-CO-18\", \"BR-DE-21\"]."
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"title": "Explain error codes",
"readOnlyHint": true,
"openWorldHint": false
}generate_invoice — Create an e-invoice from JSON
Create a valid EN 16931 e-invoice (UBL or CII XML) from JSON. Input: `invoice` is a JSON object keyed on EN 16931 Business Terms, the same schema as `POST /v1/generate`, at most 4 MB. Main fields: `syntax` ("ubl" default, or "cii"), `flavor` ("en16931" default, or "xrechnung", which requires `buyer_reference`, the Leitweg-ID BT-10, and `payment_iban`), `invoice_number`, `issue_date` (YYYY-MM-DD), `currency`, `seller`, `buyer`, `lines`, `tax_breakdown`, `totals`. invowerk writes your amounts as given. It does not compute or correct them. Input that breaks an EN 16931 or XRechnung rule returns an error naming each rule, e.g. BT-112 = BT-109 + BT-110 (BR-CO-15). Dates are YYYY-MM-DD, amounts go up to 999,999,999.99. Returns `xml`, `syntax`, `flavor` and `self_validation`. invowerk checks the XML before answering and never returns an invalid document. Invalid input, or XML that fails the check, returns an error, as does a busy (`engine_busy`) or overrunning (`engine_timeout`) generate. Credits: 5 per call.
{
"type": "object",
"required": [
"invoice"
],
"properties": {
"invoice": {
"type": "object",
"description": "The invoice as a JSON object keyed on EN 16931 Business Terms, the schema of POST /v1/generate and of parse_invoice's `model`: syntax, flavor, invoice_number, issue_date, currency, seller, buyer, lines, tax_breakdown, totals.",
"additionalProperties": true
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"title": "Create an e-invoice from JSON",
"readOnlyHint": true,
"openWorldHint": false
}parse_invoice — Read an e-invoice into JSON
Read an existing e-invoice into JSON keyed on EN 16931 Business Terms. The JSON is the input format of `generate_invoice`, so you can edit it and create the invoice again. Input: `invoice_base64` is the base64 of an XML invoice (UBL or CII) or a ZUGFeRD / Factur-X PDF, at most 4 MB decoded; or pass the file as a download link in `file`. A PDF may have at most 500 pages and 16 attachments. Returns `model` (the invoice as JSON), `detection` (`syntax`, `flavor`, `customization_id`) and `source` ("xml" or "pdf-embedded"). A file that cannot be read fails with an error that starts with an error code, e.g. a PDF without embedded XML, a UBL credit note, malformed XML, or a busy (`engine_busy`) or overrunning (`engine_timeout`) read. Credits: 2 per call.
{
"type": "object",
"properties": {
"file": {
"type": "object",
"default": null,
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "An identifier for the file. ChatGPT sets it; other clients may pass any label, such as the file name."
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string",
"description": "A public https URL of the file."
}
},
"description": "The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL."
},
"invoice_base64": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The invoice file, base64-encoded. At most 4 MB decoded."
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"title": "Read an e-invoice into JSON",
"readOnlyHint": true,
"openWorldHint": true
}convert_invoice — Convert an e-invoice between UBL and CII
Convert an e-invoice to UBL or CII. The result is checked before it is returned. Input: `invoice_base64` is the base64 of an XML invoice or a ZUGFeRD / Factur-X PDF, at most 4 MB decoded; or pass the file as a download link in `file`. `target_syntax` is "ubl" or "cii". `target_flavor` is optional, "en16931" or "xrechnung"; without it the flavor of the source is kept. Returns `xml`, `syntax`, `flavor` and `self_validation` (`valid`, `finding_count`). invowerk checks the converted XML before answering and never returns an invalid document. Input that cannot be read or converted fails with an error message. Credits: 3 per call.
{
"type": "object",
"required": [
"target_syntax"
],
"properties": {
"file": {
"type": "object",
"default": null,
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "An identifier for the file. ChatGPT sets it; other clients may pass any label, such as the file name."
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string",
"description": "A public https URL of the file."
}
},
"description": "The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL."
},
"target_flavor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional: \"en16931\" or \"xrechnung\". Without it the flavor of the source is kept."
},
"target_syntax": {
"type": "string",
"description": "Syntax to convert to: \"ubl\" or \"cii\"."
},
"invoice_base64": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The invoice file, base64-encoded. At most 4 MB decoded."
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"title": "Convert an e-invoice between UBL and CII",
"readOnlyHint": true,
"openWorldHint": true
}Prompts
0 advertised
Resources
0 advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1859 ms
- 95th percentile latency
- 1859 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1859 ms · metadata changed · 6 tool(s), 0 resource(s), 0 resource template(s), 0 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http invowerk-mcp https://api.invowerk.dev/mcp/Codex
codex mcp add invowerk-mcp --url https://api.invowerk.dev/mcp/Cursor
{
"mcpServers": {
"invowerk-mcp": {
"url": "https://api.invowerk.dev/mcp/"
}
}
}Cline
{
"mcpServers": {
"invowerk-mcp": {
"type": "streamableHttp",
"url": "https://api.invowerk.dev/mcp/",
"disabled": false
}
}
}VS Code
{
"servers": {
"invowerk-mcp": {
"type": "http",
"url": "https://api.invowerk.dev/mcp/"
}
}
}Gemini CLI
gemini mcp add --transport http invowerk-mcp https://api.invowerk.dev/mcp/Claude Desktop
https://api.invowerk.dev/mcp/Windsurf
{
"mcpServers": {
"invowerk-mcp": {
"serverUrl": "https://api.invowerk.dev/mcp/"
}
}
}Let your agent find its tools
Find servers like invowerk MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other commerce servers
Do you run invowerk MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.