Skip to content

invowerk

by invowerk.dev · remote · no sign-in to list tools · v1.0.1 · published by dev.invowerk

E-invoice checker for ZUGFeRD, Factur-X, XRechnung and Peppol BIS. Free web tool, API and MCP.

Changes · 3

6 tools: 3 change things and 3 only read.

Scanned Oct 21, 2026

2 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http xrechnung-e-invoice-validator https://api.invowerk.dev/mcp/

Findings

Matches of fixed checks, with the text they matched.

2 warn
  • The server marks "generate_invoice" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "generate_invoice" says "generate": a word for a change.

    What this check looks for
  • The server marks "convert_invoice" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"openWorldHint":true}; The name "convert_invoice" says "convert": a word for a change.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

6 tools

Changes things 3Claude Code: ask
  • convert_invoiceConvert an e-invoice to UBL or CII.1 finding

    Why it is in this group

    • The name "convert_invoice" says "convert": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "convert_invoice" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"openWorldHint":true}; The name "convert_invoice" says "convert": a word for a change.

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Convert an e-invoice between UBL and CII
    • readOnlyHint: true
    • openWorldHint: true
  • generate_invoiceCreate a valid EN 16931 e-invoice (UBL or CII XML) from JSON.1 finding

    Why it is in this group

    • The name "generate_invoice" says "generate": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "generate_invoice" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "generate_invoice" says "generate": a word for a change.

      What this check looks for
    Description, as the server wrote it
    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. 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.

    Annotations the server declares

    • title: Create an e-invoice from JSON
    • readOnlyHint: true
    • openWorldHint: false
  • render_invoiceRender an XML e-invoice (UBL or CII, e.g.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Render an e-invoice as HTML
    • readOnlyHint: true
    • openWorldHint: true
Only reads 3Claude Code: allow
  • explain_errorsExplain rule codes in plain language.No findings

    Why it is in this group

    • The name "explain_errors" says "explain": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Explain error codes
    • readOnlyHint: true
    • openWorldHint: false
  • parse_invoiceRead an existing e-invoice into JSON keyed on EN 16931 Business Terms.No findings

    Why it is in this group

    • The description's first verb is "read": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Read an e-invoice into JSON
    • readOnlyHint: true
    • openWorldHint: true
  • validate_invoiceCheck an e-invoice against EN 16931 and German rules.No findings

    Why it is in this group

    • The name "validate_invoice" says "validate": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Check an e-invoice
    • readOnlyHint: true
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.0.1. Values in angle brackets are yours to fill in.

claude mcp add --transport http xrechnung-e-invoice-validator https://api.invowerk.dev/mcp/

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__xrechnung-e-invoice-validator__validate_invoice",
      "mcp__xrechnung-e-invoice-validator__explain_errors",
      "mcp__xrechnung-e-invoice-validator__parse_invoice"
    ],
    "ask": [
      "mcp__xrechnung-e-invoice-validator__render_invoice",
      "mcp__xrechnung-e-invoice-validator__generate_invoice",
      "mcp__xrechnung-e-invoice-validator__convert_invoice"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as xrechnung-e-invoice-validator. Review it before you use it.