← xrioCONTENT HISTORY
WHAT CHANGED
Update to xrio
Snapshot Oct 29, 2026 · 12:07 UTC · version 1.2.2
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save xrio and check future changes in Following.
Up to 10 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"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.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 200
}
],
"name": "xrio",
"skill_md_contents": "---\nname: xrio\ndescription: 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.\n---\n\n# xrio — German e-invoices\n\nxrio is a processing API with an MCP server named `xrio`. Its tools describe themselves; this\nskill adds the order of the steps and the rules around them.\n\n## Rules\n\n- **Never handle the API key.** Do not ask for it, do not accept it in the chat, never write it\n into a file, a command or a tool argument. The user creates it in the xrio portal\n („API-Schlüssel“) and sets it themselves — as the environment variable `XRIO_API_KEY` or in\n the prompt of their client. A client that signs in to xrio through the browser (OAuth — Claude,\n ChatGPT, Claude Code without a key) needs no key at all.\n- **Files never travel through the chat.** No file content and no base64 in a tool argument. A\n file to check goes to an upload link with `curl`; created files come back as download links\n on `api.xrio.de` — `curl -o <name> <downloadUrl>` fetches them. In claude.ai an attached file\n sits in your sandbox; sending it needs the user's setting „Ausgehenden Netzwerkverkehr\n erlauben“ (Einstellungen → Funktionen → Codeausführung und Dateierstellung) with `api.xrio.de`\n among the additionally allowed domains — a 403 from the sandbox proxy means it is missing: ask\n the user to add it. A chat\n without a shell, or without that setting, sends the user to the xrio portal instead: the page\n Testen checks a file or makes its PDF view, the page Firmendaten takes the logo. Never ask\n for the file's content.\n- **Official sources, no tax advice.** Report findings with rule, wording and source as xrio\n returns them. Which invoice type, tax category or exemption applies is the user's decision —\n say so instead of choosing.\n- **Never guess invoice values.** VAT IDs, tax numbers, IBANs, addresses, dates, amounts and the\n Leitweg-ID come from the user or their documents. Ask for anything missing.\n\n## Check an e-invoice\n\n1. Call `validate_invoice`. It returns `uploadLink` — single use, valid 10 minutes.\n2. Send the file as the raw request body: `curl --data-binary @<file> <uploadLink>`.\n3. Report the `verdict`: `valid`, `invalid` or `notEInvoice` (a PDF without embedded invoice\n XML). For `invalid`, list each finding with `rule`, `requirement` and `source`; call\n `lookup_rule` with the rule ids when the user wants the full official wording of a rule.\n4. A used or expired link answers 404 — call `validate_invoice` again. Files over 10 MB are\n refused (413).\n\nChecking costs the account's validation price from its prepaid credit (the tool description\nnames the default) for a verdict `valid` or `invalid`; a file xrio created for the account, a\nPDF without an e-invoice and errors are free — `costCents` in the answer says what it cost. xrio\nkeeps nothing of the file.\n\n## Turn an XML into a readable PDF\n\n1. Before the paid call, tell the user the price: one document from the prepaid credit.\n2. Call `render_invoice`. It returns `uploadLink` — single use, valid 10 minutes. Send the XML as\n the raw request body: `curl --data-binary @<file> <uploadLink>`.\n3. A PDF view comes back in `files` — give the user its `downloadUrl` and pass on every entry\n of `notices`: the PDF view is not an e-invoice, the XML stays legally authoritative. With\n `verdict` `invalid` (the account renders invalid XML by setting) also say that the XML is no\n valid e-invoice and list its findings.\n4. An invalid XML without that setting returns its `findings`, the notice `RENDER_NEEDS_CONSENT`\n and costs nothing. Report the findings like a check, then ask the user: a PDF view of the\n invalid XML costs one document and is marked invalid on every page — or the issuer corrects\n the invoice first. Only after an explicit yes call `render_invoice` again with\n `allowInvalid: true` and send the same file to the new link. Never set `allowInvalid` on your\n own. A ZUGFeRD / Factur-X PDF is readable already — check it with `validate_invoice` instead.\n\n## Create an e-invoice\n\n1. Call `describe_invoice_fields` for every field and its requirement. Call\n `describe_invoice_types` when it is unclear whether an invoice, a corrected invoice, a credit\n note or a self-billed invoice is wanted.\n2. Collect the values and ask for every required one that is missing. `format` is `zugferd`\n (PDF with embedded XML), `xrechnung` (XML; needs `buyerReference`) or `both`.\n3. Before the first paid call, tell the user the price: each e-invoice produced costs the\n account's price per document from its prepaid credit (the tool description names the\n default) — format `both` makes two; rejected calls are free.\n4. Call `generate_invoice` with `idempotencyKey` set to the invoice number. The account's\n company data (portal: „Firmendaten“) are the issuer: without `seller`, xrio takes the seller\n from them; for a self-billed invoice (389) the buyer issues, so leave out `buyer` and send\n the supplier as `seller`. Without an\n IBAN, a credit transfer takes the account's default bank account; when the user names another\n one, call `list_bank_accounts` and send its id as `payment.bankAccountId`. `withLogo` puts the\n account's logo on the ZUGFeRD PDF (`true`) or leaves it off (`false`); leave it out to follow\n the account's setting.\n5. A rejection is an error result with every finding at once; each names the field\n (`location`, a JSON pointer such as `/lines/1/price` — or the XML path in `xpath` when no\n field fits), the rule, its wording and the `businessTerm`. Correct exactly those values — ask\n the user where the source does not hold them — and call again with the same `idempotencyKey`.\n6. On success, pass on every entry of `notices` and give the user the `downloadUrl` of each file\n in `files`.\n\n## Company data, bank accounts and logo\n\nThe 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\nlogo for its ZUGFeRD PDFs. Every change shows in the account's change log with this key's name.\n\n- **Read freely:** `get_company_data`, `list_bank_accounts`.\n- **Change only on the user's explicit request** — never because an invoice or a document holds\n other values: `update_company_data` (send only the fields to change), `save_bank_account`\n (without `bankAccountId` it adds one, with it it changes one; `isDefault: true` makes it the\n default), `delete_bank_account`, `set_company_logo`, `delete_company_logo`. Repeat the change\n to the user before the call.\n- The default bank account can only be deleted as the last one. Ask the user which account\n becomes the default, make it the default with `save_bank_account`, then delete.\n- `set_company_logo` returns an upload link like `validate_invoice`: send the PNG or JPEG\n (at most 2 MB) with `curl --data-binary @<file> <uploadLink>`.\n\n## Account settings\n\nThe account's settings decide the layout of its PDF views (`pdfViewLayout`: `xrio` or `kosit`),\nwhether its logo is printed on its ZUGFeRD PDFs (`logoOnZugferd`, needs a kept logo) and whether\nan invalid XML is rendered as a charged, marked PDF view on every channel (`renderInvalid`).\n\n- **Read freely:** `get_account_settings`.\n- **Change only on the user's explicit request:** `update_account_settings`, sending only the\n fields to change. Every change shows in the change log with this key's name.\n- **Switching `renderInvalid` on charges money on every channel, the API included.** Tell the user\n what it costs and ask; send `confirm: true` only after a clear yes. Without it the result is\n `CONFIRMATION_REQUIRED` and nothing changes. A client with its own confirmation dialog shows it\n as well — the change needs both yeses. Switching it off needs no confirmation.\n\n## Download links and earlier results\n\nA download link opens without login for 24 hours; the file is deleted 7 days after it was\ncreated. For a fresh link call `get_download_link` with the `fileId` from `files`.\n\nTo find a result of the last 7 days again — a new chat, a lost `fileId` — call\n`list_history_entries`, best with `idempotencyKey` set to the invoice number; each entry carries\nits files with fresh links. It lists metadata only: there is no search by invoice content.\n\n## Calls that take longer\n\n`generate_invoice` and a PDF view run as jobs. Normally the answer comes within seconds as\nalways. When many calls wait, a call can outlive its wait and answers with `isError`, a\n`jobId` and status `queued` or `running` — it is not lost. Do not send it again: call `get_job`\nwith that `jobId` after a few seconds until the status is `done` (the result is in\n`generateResult` or `renderResult`, a rejection in `problem`) or `failed` (nothing was\ncharged; then send the call again).\n\n## Errors\n\nA failed call is a tool result with `isError`, an `errorCode`, a `detail` and a `traceId`. Give\nthe user the `traceId` for questions to xrio.\n\n- `INSUFFICIENT_CREDIT` — nothing was created or charged. Ask the user to top up their credit in\n the xrio portal („Guthaben“).\n- `VALIDATION_FAILED` — the values break a rule; the `findings` say which.\n- `CONFLICT` — the `idempotencyKey` was used with other values (a different invoice needs its\n own key).\n- `TIMEOUT`, `UNAVAILABLE` — a service did not answer in time. Nothing was charged; retry the\n same call with the same `idempotencyKey`.\n- `NOT_FOUND` — the file or link is unknown or expired.\n- The server refuses the connection (HTTP 401) — the API key is missing, expired or revoked. The\n user creates a new one in the portal and sets it themselves.\n"
}SHA-256 of public snapshot: d4655b142946476de8c57acd797ad21e6347f729863b7900d085a96bd4610264