Koskamo

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.

invowerk MCP logo, by invowerkVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by invowerk
You need:Auth: send an `X-API-Key` header (create keys after signing in).Tool calls use the same API key and credits as the REST API.
MCP endpoint (Streamable HTTP)
https://api.invowerk.dev/mcp/
Vendor documentation

What its tools do

6 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

6 of 6 have a description · 6 of 6 declare behavior hints · 6 of 6 with parameters document them all

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

Vendor evidenceRegistry 1.0.1
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
Server-advertised capabilities
{
  "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
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

validate_invoice input schema
{
  "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
}
validate_invoice output schema
{
  "type": "object",
  "additionalProperties": true
}
validate_invoice annotations
{
  "title": "Check an e-invoice",
  "readOnlyHint": true,
  "openWorldHint": true
}
render_invoice — Render an e-invoice as HTML
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

render_invoice input schema
{
  "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
}
render_invoice output schema
{
  "type": "object",
  "additionalProperties": true
}
render_invoice annotations
{
  "title": "Render an e-invoice as HTML",
  "readOnlyHint": true,
  "openWorldHint": true
}
explain_errors — Explain error codes
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

explain_errors input schema
{
  "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
}
explain_errors output schema
{
  "type": "object",
  "additionalProperties": true
}
explain_errors annotations
{
  "title": "Explain error codes",
  "readOnlyHint": true,
  "openWorldHint": false
}
generate_invoice — Create an e-invoice from JSON
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

generate_invoice input schema
{
  "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
}
generate_invoice output schema
{
  "type": "object",
  "additionalProperties": true
}
generate_invoice annotations
{
  "title": "Create an e-invoice from JSON",
  "readOnlyHint": true,
  "openWorldHint": false
}
parse_invoice — Read an e-invoice into JSON
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

parse_invoice input schema
{
  "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
}
parse_invoice output schema
{
  "type": "object",
  "additionalProperties": true
}
parse_invoice annotations
{
  "title": "Read an e-invoice into JSON",
  "readOnlyHint": true,
  "openWorldHint": true
}
convert_invoice — Convert an e-invoice between UBL and CII
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

convert_invoice input schema
{
  "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
}
convert_invoice output schema
{
  "type": "object",
  "additionalProperties": true
}
convert_invoice annotations
{
  "title": "Convert an e-invoice between UBL and CII",
  "readOnlyHint": true,
  "openWorldHint": true
}

Prompts

0 advertised

No prompt definitions available.

Resources

0 advertised

No resource definitions available.

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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http invowerk-mcp https://api.invowerk.dev/mcp/

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add invowerk-mcp --url https://api.invowerk.dev/mcp/

Cursor

Merge this server into .cursor/mcp.json in your project, then enable invowerk-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "invowerk-mcp": {
      "url": "https://api.invowerk.dev/mcp/"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "invowerk-mcp": {
      "type": "streamableHttp",
      "url": "https://api.invowerk.dev/mcp/",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start invowerk-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "invowerk-mcp": {
      "type": "http",
      "url": "https://api.invowerk.dev/mcp/"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http invowerk-mcp https://api.invowerk.dev/mcp/

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://api.invowerk.dev/mcp/

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.

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.

Claim this listing