invowerk
Server Details
E-invoice checker for ZUGFeRD, Factur-X, XRechnung and Peppol BIS. Free web tool, API and MCP.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- invowerk-dev/invowerk
- GitHub Stars
- 0
TDQS
Scored across 6 tools
Each tool targets a clearly distinct operation: parse, generate, convert, validate, render, and explain errors. Inputs, outputs, and primary purposes do not overlap, so an agent can easily select the right tool.
All tool names follow a consistent snake_case verb_noun pattern: convert_invoice, explain_errors, generate_invoice, parse_invoice, render_invoice, validate_invoice. The sole deviation (explain_errors instead of explain_invoice_errors) still adheres to the same pattern.
Six tools is well-scoped for an e-invoicing utility. Each tool provides a unique, necessary operation without redundancy, and the count falls comfortably within the typical 3-15 range.
The set covers the full e-invoice handling lifecycle: reading (parse_invoice), creating (generate_invoice), transforming (convert_invoice), validating (validate_invoice), visualizing (render_invoice), and error explanation (explain_errors). Editing is supported via the parse→generate round-trip, leaving no obvious gaps.
Available Tools
6 toolsconvert_invoiceConvert an e-invoice between UBL and CIIARead-onlyInspect
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. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| target_flavor | No | ||
| target_syntax | Yes | ||
| invoice_base64 | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring readOnlyHint and openWorldHint, the description carries real behavioral weight: it discloses the 4 MB decoded size limit, that the output is self-validated and invalid documents are never returned, and the error behavior for unreadable/unconvertible input. It also states the 3-credit cost, which annotations never surface.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then clean Input/Returns/Credits sections that are easy to scan. Slight redundancy in stating twice that the result is checked/validated before returning, but overall every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter conversion tool with an output schema, the description covers inputs, defaults, limits, validation guarantees, failure behavior, and cost. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: invoice_base64 is explained as base64 XML or ZUGFeRD/Factur-X PDF with a size cap, target_syntax values are given as "ubl"/"cii", and target_flavor is explained as optional with its default (source flavor retained) plus its "en16931"/"xrechnung" values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Convert an e-invoice to UBL or CII') and scopes it to a well-defined transformation. It is clearly distinguishable from siblings like parse_invoice, generate_invoice, and validate_invoice, which do different jobs on the same resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the conversion context and clarifies acceptable inputs, but offers no explicit when-to-use guidance or exclusions relative to siblings such as validate_invoice. An agent can infer the purpose, but routing decisions are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_errorsExplain error codesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | de | |
| codes | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safety profile, the description adds real behavioral context beyond annotations: no API key required, free/not metered, duplicate codes are removed, and the call fails naming unknown codes. It does not detail rate limits or payload size limits, but the added disclosure is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then input contract, then return shape and failure behavior, then cost. Slightly long, and the return-field enumeration partly duplicates the output schema, but every sentence carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still usefully names the failure mode (unknown codes abort the call) and the cost model. Combined with the schema and annotations, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry both parameters, and it does: `codes` is a list of one or more codes with duplicates removed (with an example), and `lang` is 'de' (default) or 'en'. It compensates well for the empty schema, though enum values for lang are only implicitly given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Explain rule codes in plain language') and enumerates the code families covered (EN 16931, XRechnung, ZUGFeRD, IW-*). It also ties itself to the sibling validate_invoice by naming whose findings it explains, so it is distinguishable from the other invoice tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes the context of use: decoding codes surfaced by validate_invoice findings and hints. It gives no explicit when-not-to-use or alternative-tool routing, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_invoiceCreate an e-invoice from JSONARead-onlyInspect
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), 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.
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.
Credits: 5 per call.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: 4 MB input cap, an explicit non-behavior ('invowerk writes your amounts as given. It does not compute or correct them.'), a self-validation guarantee ('never returns an invalid document'), the failure path (invalid input or failed check returns an error), and cost (5 credits per call). This is exactly the kind of context readOnlyHint/openWorldHint cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line contract, then input field inventory, then return/error behavior, then cost. Dense but mostly non-redundant; the field enumeration is a long list that could be compressed, keeping it just short of the top mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one parameter, nested objects, an output schema, and annotations covering safety, nothing an agent needs to call this correctly is missing: input shape and limits, conditional requirements, failure behavior, cost, and returns are all stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single top-level parameter `invoice` has 0% schema description coverage, so the description carries the burden and largely succeeds by enumerating syntax (ubl default / cii), flavor (en16931 default / xrechnung), invoice_number, issue_date format, currency, parties, lines, tax_breakdown and totals. It still defers nested field detail to an external schema reference ('same schema as POST /v1/generate') and doesn't state which nested fields are required beyond the xrechnung case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource with format precision: create an EN 16931 e-invoice (UBL or CII XML) from JSON keyed on EN 16931 Business Terms. Input/output contract is clear enough to separate it from parse_invoice/validate_invoice, but no sibling is named, so the 5-level 'distinguishes from siblings' bar is only implicitly met.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than directed: the description notes equivalence to POST /v1/generate and gives a conditional prerequisite (flavor "xrechnung" requires buyer_reference / Leitweg-ID BT-10). There is no explicit when-to-use/when-not and no routing to convert_invoice, validate_invoice, or render_invoice, which the agent must infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_invoiceRead an e-invoice into JSONARead-onlyInspect
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. 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 or malformed XML.
Credits: 2 per call.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_base64 | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations by disclosing hard input limits (4 MB decoded, 500 pages, 16 attachments), cost (2 credits per call), and failure behavior (errors prefixed with an error code, with named failure modes). This is exactly the operational context an agent needs before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then input, then returns, then failure modes, then cost. Every sentence carries information; no filler or restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description usefully previews `model`, `detection`, and `source`, and adds limits, error semantics, and cost. Nothing needed to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single parameter, so the description must carry the burden — and it does, specifying that `invoice_base64` is base64 of UBL or CII XML or a ZUGFeRD/Factur-X PDF, plus decoded-size, page, and attachment caps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Read an existing e-invoice into JSON') and even states the output convention (EN 16931 Business Terms). It relates itself to the sibling generate_invoice as a round-trip pair, though it does not explicitly distinguish itself from convert_invoice or validate_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: the result is the input format for `generate_invoice`, so it can be edited and re-submitted. This tells the agent when the tool fits in a workflow, but offers no explicit exclusion criteria against the other read/convert siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_invoiceRender an e-invoice as HTMLARead-onlyInspect
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. 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.
Credits: 1 per call.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | de | |
| invoice_base64 | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, the description discloses real behavioral traits: a 4 MB decoded size cap, PDF rejection, DOCTYPE rejection, failure on malformed XML, the exact response fields, and a 1-credit cost per call. These are the kind of operation-specific constraints annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded with the purpose, then input constraints, then outputs and failure modes, then cost. Every sentence carries information an agent needs; nothing is redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Inputs, limits, failure modes, credit cost, and return fields are all covered, and although an output schema exists the description still names the returned fields helpfully. Nothing needed to invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully carry parameter meaning, and it does: invoice_base64 is defined as base64 of the XML with a 4 MB decoded limit and no PDFs, and lang is documented with allowed values 'de' (default) and 'en'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Render an XML e-invoice (UBL or CII, e.g. XRechnung) as a readable HTML page') and adds the intent 'show a person what an e-invoice contains', which implicitly separates it from parse_invoice or validate_invoice. It does not explicitly name a sibling or contrast itself with the conversion tool, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it to show a person what an e-invoice contains' gives a clear condition for selecting this tool versus machine-oriented siblings. There is no explicit when-not guidance or named alternative, so it does not reach 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_invoiceCheck an e-invoiceARead-onlyInspect
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. 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.
Credits: 1 per call.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | de | |
| explain | No | ||
| invoice_base64 | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=false. The description says an external KoSIT validator decides XRechnung outcomes and may be unreachable, implying an open-world external dependency that conflicts with openWorldHint=false. Otherwise it richly describes fallback, verdict_source, disagreement, findings, pdfa_verdict, hints, and cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and input requirements, then behavior. Dense but mostly useful; some return-field detail (verdict_source, disagreement, pdfa_verdict) may duplicate the output schema, making it slightly longer than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers input formats, size limit, fallback behavior, output meaning, and cost, which is sufficient for a complex validation tool. The unresolved openWorldHint contradiction and absence of sibling routing beyond explain_errors are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden. It documents invoice_base64 format (base64 XML UBL/CII or ZUGFeRD/Factur-X PDF, max 4 MB decoded), the explain boolean effect, and lang allowed values ('de'/'en').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check'), resource ('e-invoice'), and validation standards (EN 16931 and German rules). It distinguishes itself from the explanation sibling by directing rule codes to explain_errors, though it does not explicitly contrast with parse/convert/render siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use: validate XML/PDF e-invoices against standards, with input limit and explain/lang options. Mentions explain_errors as a follow-up for findings, but does not explicitly state when not to use it versus parse_invoice or convert_invoice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
- First observed
convert_invoice - First observed
explain_errors - First observed
generate_invoice - First observed
parse_invoice - First observed
render_invoice - First observed
validate_invoice
Related MCP Connectors
XRechnung and ZUGFeRD e-invoicing (EN 16931): create, validate, check Leitweg-IDs, German VAT.
Validate, generate & convert EU e-invoices (UBL, CII, XRechnung, Factur-X) — EN 16931 pre-validated.
Validiert E-Rechnungen (ZUGFeRD/Factur-X, XRechnung) gegen EN 16931 mit Korrekturvorschlägen.
Generate & validate EN 16931 e-invoices (Factur-X, ZUGFeRD, XRechnung); verification certificates
Related MCP Servers
- AlicenseAqualityDmaintenanceValidates electronic invoices (XRechnung, ZUGFeRD, Factur-X, Peppol BIS, etc.) against authority-pinned rules and explains failures.2151 npmMIT
- AlicenseAqualityDmaintenanceMCP server for DACH e-invoicing. Create XRechnung (UBL) and ZUGFeRD 2.3 (Factur-X CII) invoices, validate against EN 16931 rules, extract data from XML, and convert between UBL, CII and JSON formats.630 npm2MIT
- AlicenseAqualityAmaintenanceModel Context Protocol (MCP) server for German Electronic Invoicing (ZUGFeRD 2.x / XRechnung 3.x). Provides tools to validate, generate, parse, and convert invoices compliant with EN 16931 and KoSIT.502Apache 2.0

InvoiceInofficial
AlicenseAqualityAmaintenanceReads and validates any European e-invoice a business receives — XRechnung, UBL, CII, ZUGFeRD/Factur-X PDF, Peppol BIS 3, FatturaPA, KSeF FA(3) — into canonical EN 16931 JSON with plain-language fix hints in EN/DE/PL/IT/FR, plus PDF, CSV and DATEV export. Nothing is stored; works without a key on a small daily quota.25MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.