← Plugin catalog
Productivity

xrio

xrio – Nicolas Goldstrass v1.2.2

Check and create e-invoices

Create a free account to save this plugin.

From the developer

Declared capabilities

  • Validate e-invoices
  • Create e-invoices
  • Render PDF views

Cost & access

xrio sells nothing in ChatGPT and links to no checkout. Calls are charged to the prepaid credit the customer bought in the xrio portal beforehand, at the same prices as the xrio API.

Declared limitations

  • Money transfer is not supported
  • xrio is no archive and deletes no invoices
  • No tax advice

Onboarding example

Create an XRechnung for my last consulting job.
Sources & dates

Developer declarations; not independently tested. Listing last checked Nov 6, 2026. Package observed Nov 5, 2026.

View package source →

Description

From the marketplace listing

xrio validates and creates German e-invoices and renders them as PDF, straight from the chat. Validate: ChatGPT sends an XRechnung or a ZUGFeRD / Factur-X PDF to xrio and gets every finding back in the norm's original wording, with the business term and the XML path. xrio checks against EN 16931 and XRechnung with the official KoSIT validator. A PDF without invoice XML is reported as "not an e-invoice". Create: invoice data becomes an XRechnung, a ZUGFeRD PDF or both. All fields of EN 16931 and eight invoice types, from the invoice to the final construction invoice, are supported. xrio recalculates the amounts and validates every file before returning it; if the data does not meet the rules, all findings come back at once instead of a file. Company data, bank account and logo are stored in the xrio account and placed on the invoice automatically. Make readable: an e-invoice XML can be turned into a PDF view, in the xrio layout with a GiroCode or in the official KoSIT layout. xrio exchanges files through a single-use upload link and a time-limited download link, both on api.xrio.de. Result files are kept for seven days and then deleted. xrio does not analyse your data with AI and does not train models. It quotes legal sources only from official texts and gives no tax advice. xrio is for businesses that issue or receive e-invoices in Germany. It needs an xrio account at app.xrio.de with the company's data; sign-in happens in the browser. All servers are located in Germany.

Language: English · Automatically detected from descriptions.

Changes

No changes recorded yet. Follow this plugin to keep track of future changes.

First seen Oct 29, 2026. Last seen Nov 6, 2026.

Keywords

Files & skills

File archives

Plugin package6 files · 20.5 KBBrowse files →
Skill instructions
xrio9.72 KB

View saved version →

---
name: xrio
description: Check, create and read German e-invoices (XRechnung, ZUGFeRD / Factur-X) with the xrio MCP server. Use when the user wants to validate an e-invoice file, create an e-invoice from invoice data, a document or free text, turn an e-invoice XML into a readable PDF, get a download link for a file xrio created, or keep the company data, bank accounts and logo of the user's invoices.
---

# xrio — German e-invoices

xrio is a processing API with an MCP server named `xrio`. Its tools describe themselves; this
skill adds the order of the steps and the rules around them.

## Rules

- **Never handle the API key.** Do not ask for it, do not accept it in the chat, never write it
  into a file, a command or a tool argument. The user creates it in the xrio portal
  („API-Schlüssel“) and sets it themselves — as the environment variable `XRIO_API_KEY` or in
  the prompt of their client. A client that signs in to xrio through the browser (OAuth — Claude,
  ChatGPT, Claude Code without a key) needs no key at all.
- **Files never travel through the chat.** No file content and no base64 in a tool argument. A
  file to check goes to an upload link with `curl`; created files come back as download links
  on `api.xrio.de` — `curl -o <name> <downloadUrl>` fetches them. In claude.ai an attached file
  sits in your sandbox; sending it needs the user's setting „Ausgehenden Netzwerkverkehr
  erlauben“ (Einstellungen → Funktionen → Codeausführung und Dateierstellung) with `api.xrio.de`
  among the additionally allowed domains — a 403 from the sandbox proxy means it is missing: ask
  the user to add it. A chat
  without a shell, or without that setting, sends the user to the xrio portal instead: the page
  Testen checks a file or makes its PDF view, the page Firmendaten takes the logo. Never ask
  for the file's content.
- **Official sources, no tax advice.** Report findings with rule, wording and source as xrio
  returns them. Which invoice type, tax category or exemption applies is the user's decision —
  say so instead of choosing.
- **Never guess invoice values.** VAT IDs, tax numbers, IBANs, addresses, dates, amounts and the
  Leitweg-ID come from the user or their documents. Ask for anything missing.

## Check an e-invoice

1. Call `validate_invoice`. It returns `uploadLink` — single use, valid 10 minutes.
2. Send the file as the raw request body: `curl --data-binary @<file> <uploadLink>`.
3. Report the `verdict`: `valid`, `invalid` or `notEInvoice` (a PDF without embedded invoice
   XML). For `invalid`, list each finding with `rule`, `requirement` and `source`; call
   `lookup_rule` with the rule ids when the user wants the full official wording of a rule.
4. A used or expired link answers 404 — call `validate_invoice` again. Files over 10 MB are
   refused (413).

Checking costs the account's validation price from its prepaid credit (the tool description
names the default) for a verdict `valid` or `invalid`; a file xrio created for the account, a
PDF without an e-invoice and errors are free — `costCents` in the answer says what it cost. xrio
keeps nothing of the file.

## Turn an XML into a readable PDF

1. Before the paid call, tell the user the price: one document from the prepaid credit.
2. Call `render_invoice`. It returns `uploadLink` — single use, valid 10 minutes. Send the XML as
   the raw request body: `curl --data-binary @<file> <uploadLink>`.
3. A PDF view comes back in `files` — give the user its `downloadUrl` and pass on every entry
   of `notices`: the PDF view is not an e-invoice, the XML stays legally authoritative. With
   `verdict` `invalid` (the account renders invalid XML by setting) also say that the XML is no
   valid e-invoice and list its findings.
4. An invalid XML without that setting returns its `findings`, the notice `RENDER_NEEDS_CONSENT`
   and costs nothing. Report the findings like a check, then ask the user: a PDF view of the
   invalid XML costs one document and is marked invalid on every page — or the issuer corrects
   the invoice first. Only after an explicit yes call `render_invoice` again with
   `allowInvalid: true` and send the same file to the new link. Never set `allowInvalid` on your
   own. A ZUGFeRD / Factur-X PDF is readable already — check it with `validate_invoice` instead.

## Create an e-invoice

1. Call `describe_invoice_fields` for every field and its requirement. Call
   `describe_invoice_types` when it is unclear whether an invoice, a corrected invoice, a credit
   note or a self-billed invoice is wanted.
2. Collect the values and ask for every required one that is missing. `format` is `zugferd`
   (PDF with embedded XML), `xrechnung` (XML; needs `buyerReference`) or `both`.
3. Before the first paid call, tell the user the price: each e-invoice produced costs the
   account's price per document from its prepaid credit (the tool description names the
   default) — format `both` makes two; rejected calls are free.
4. Call `generate_invoice` with `idempotencyKey` set to the invoice number. The account's
   company data (portal: „Firmendaten“) are the issuer: without `seller`, xrio takes the seller
   from them; for a self-billed invoice (389) the buyer issues, so leave out `buyer` and send
   the supplier as `seller`. Without an
   IBAN, a credit transfer takes the account's default bank account; when the user names another
   one, call `list_bank_accounts` and send its id as `payment.bankAccountId`. `withLogo` puts the
   account's logo on the ZUGFeRD PDF (`true`) or leaves it off (`false`); leave it out to follow
   the account's setting.
5. A rejection is an error result with every finding at once; each names the field
   (`location`, a JSON pointer such as `/lines/1/price` — or the XML path in `xpath` when no
   field fits), the rule, its wording and the `businessTerm`. Correct exactly those values — ask
   the user where the source does not hold them — and call again with the same `idempotencyKey`.
6. On success, pass on every entry of `notices` and give the user the `downloadUrl` of each file
   in `files`.

## Company data, bank accounts and logo

The account keeps its company data (the issuer — the seller, or the buyer of a self-billed invoice), up to 5 bank accounts with one default, and a
logo for its ZUGFeRD PDFs. Every change shows in the account's change log with this key's name.

- **Read freely:** `get_company_data`, `list_bank_accounts`.
- **Change only on the user's explicit request** — never because an invoice or a document holds
  other values: `update_company_data` (send only the fields to change), `save_bank_account`
  (without `bankAccountId` it adds one, with it it changes one; `isDefault: true` makes it the
  default), `delete_bank_account`, `set_company_logo`, `delete_company_logo`. Repeat the change
  to the user before the call.
- The default bank account can only be deleted as the last one. Ask the user which account
  becomes the default, make it the default with `save_bank_account`, then delete.
- `set_company_logo` returns an upload link like `validate_invoice`: send the PNG or JPEG
  (at most 2 MB) with `curl --data-binary @<file> <uploadLink>`.

## Account settings

The account's settings decide the layout of its PDF views (`pdfViewLayout`: `xrio` or `kosit`),
whether its logo is printed on its ZUGFeRD PDFs (`logoOnZugferd`, needs a kept logo) and whether
an invalid XML is rendered as a charged, marked PDF view on every channel (`renderInvalid`).

- **Read freely:** `get_account_settings`.
- **Change only on the user's explicit request:** `update_account_settings`, sending only the
  fields to change. Every change shows in the change log with this key's name.
- **Switching `renderInvalid` on charges money on every channel, the API included.** Tell the user
  what it costs and ask; send `confirm: true` only after a clear yes. Without it the result is
  `CONFIRMATION_REQUIRED` and nothing changes. A client with its own confirmation dialog shows it
  as well — the change needs both yeses. Switching it off needs no confirmation.

## Download links and earlier results

A download link opens without login for 24 hours; the file is deleted 7 days after it was
created. For a fresh link call `get_download_link` with the `fileId` from `files`.

To find a result of the last 7 days again — a new chat, a lost `fileId` — call
`list_history_entries`, best with `idempotencyKey` set to the invoice number; each entry carries
its files with fresh links. It lists metadata only: there is no search by invoice content.

## Calls that take longer

`generate_invoice` and a PDF view run as jobs. Normally the answer comes within seconds as
always. When many calls wait, a call can outlive its wait and answers with `isError`, a
`jobId` and status `queued` or `running` — it is not lost. Do not send it again: call `get_job`
with that `jobId` after a few seconds until the status is `done` (the result is in
`generateResult` or `renderResult`, a rejection in `problem`) or `failed` (nothing was
charged; then send the call again).

## Errors

A failed call is a tool result with `isError`, an `errorCode`, a `detail` and a `traceId`. Give
the user the `traceId` for questions to xrio.

- `INSUFFICIENT_CREDIT` — nothing was created or charged. Ask the user to top up their credit in
  the xrio portal („Guthaben“).
- `VALIDATION_FAILED` — the values break a rule; the `findings` say which.
- `CONFLICT` — the `idempotencyKey` was used with other values (a different invoice needs its
  own key).
- `TIMEOUT`, `UNAVAILABLE` — a service did not answer in time. Nothing was charged; retry the
  same call with the same `idempotencyKey`.
- `NOT_FOUND` — the file or link is unknown or expired.
- The server refuses the connection (HTTP 401) — the API key is missing, expired or revoked. The
  user creates a new one in the portal and sets it themselves.

Referenced files: 1 — file references are metadata, not package contents.

Release notes

First version: validate, create and render German e-invoices (XRechnung, ZUGFeRD / Factur-X) through the xrio MCP server, with the xrio skill.

Declared in the saved package. Remote tools may change independently.

Package details

Publisher declarations from the archived package. These are separate from our research and the live service's terms.

Package author
xrio – Nicolas Goldstrass
Keywords
See keywords
Listing translations
de-DE
Commerce declaration
Does not support commerceThis does not establish whether access is free or paid.
Review scenarios
5 positive · 3 negativeScenario counts, not test results.

Declared capabilities

  • Validate e-invoices
  • Create e-invoices
  • Render PDF views
  • Look up EN 16931 rules

Package observed Nov 5, 2026.

Technical details
First seen
Oct 29, 2026 · 12:00 UTC
Last seen
Nov 6, 2026 · 00:00 UTC
Collection status
Collected

plugin_asdk_app_6acf9cdd5118819184b4b6ab9a209709

Download plugin data (JSON)