finisma – ZUGFeRD e-invoices
Server Details
Create ZUGFeRD e-invoices from JSON or PDF, verify Factur-X, check VAT IDs and Peppol.
- Status
- Healthy
- Uptime
- 100.0% over 19 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 9 tools
Most tools target clearly distinct actions and resources (create vs extract vs verify ZUGFeRD, parse vs validate bank statements, validate payment files). The only mild overlap is between check_peppol_participant and check_vat_id, which both validate a business partner identifier, though their descriptions make the boundary clear.
All names use consistent snake_case with a verb_noun pattern (check_*, create_*, extract_*, parse_*, request_*, validate_*, verify_*). Minor deviation: the same invoice concept is named 'zugferd' in create/verify but 'invoice' in extract, and the near-synonyms validate/verify are used for different purposes.
Nine tools is well-scoped for an e-invoicing and payment-file validation domain, with each tool earning its place across creation, extraction, verification, and validation workflows.
The surface covers the core lifecycle: create/extract/verify ZUGFeRD, validate payment files, and parse/validate bank statements, plus Peppol and VAT lookups. Minor gaps exist, such as no payment-file or bank-statement generation and no Peppol send/transmit operation, but these are workable given the validation-focused scope.
Available Tools
9 toolscheck_peppol_participantPeppol-Erreichbarkeit prüfenARead-onlyIdempotentInspect
Prüft per SML/SMP-Lookup, ob ein Geschäftspartner im Peppol-Netz erreichbar ist, und listet seine registrierten Dokumenttypen. Akzeptiert eine volle Kennung ("0088:4399901550926"), eine nackte GLN, eine deutsche USt-IdNr. oder eine Leitweg-ID. registered:false ist ein normales Ergebnis, kein Fehler. Kostenlos.
| Name | Required | Description | Default |
|---|---|---|---|
| participant | Yes | Kennung des Partners: volle Peppol-Kennung ("0088:4399901550926"), nackte GLN, deutsche USt-IdNr. ("DE123456789") oder Leitweg-ID ("991-33333TEST-33"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Name laut Peppol Directory, falls gelistet |
| input | Yes | |
| value | Yes | |
| cached | Yes | |
| scheme | Yes | |
| checkedAt | Yes | Zeitpunkt der echten Prüfung (ISO 8601) |
| registered | Yes | |
| countryCode | No | |
| documentTypes | Yes | registrierte Dokumenttypen laut SMP (leer bei registered:false) |
| participantId | Yes | volle Kennung inkl. Meta-Schema, z. B. "iso6523-actorid-upis::0088:4399901550926" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: it names the underlying SML/SMP lookup mechanism, clarifies that registered:false is a normal result rather than an error (a real gotcha for retry logic), and notes the call is free.
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?
Three tightly-packed sentences with the purpose front-loaded, followed by accepted input forms and the key behavioral caveat. Every sentence earns its place with zero redundancy.
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, so return values need no explanation; the description still adds the important normal-result semantics around registered:false. For a single-parameter, read-only lookup, 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 100%, so the participant parameter's accepted formats are already documented and the description largely mirrors them (full Peppol identifier, bare GLN, German VAT ID, Leitweg-ID). No additional semantics such as normalization or fallback behavior are added beyond the schema.
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: SML/SMP lookup to check whether a partner is reachable in the Peppol network, plus a secondary output (registered document types). This is clearly distinct from sibling check_vat_id, which validates a VAT number rather than network reachability.
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 — you'd call this to verify a partner before sending a Peppol document — but the description never states when to use this versus the closely related check_vat_id sibling, nor any prerequisites or exclusions. The implied context is clear, but no explicit routing guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_vat_idUSt-IdNr. prüfen (VIES)ARead-onlyIdempotentInspect
Prüft eine USt-IdNr. live gegen VIES (EU-Bestätigungsverfahren): Gültigkeit plus Firmenname, sofern der Mitgliedsstaat ihn herausgibt. Antwort-Status ist valid, invalid oder unavailable (VIES nicht erreichbar — keine Aussage). Kostenlos.
| Name | Required | Description | Default |
|---|---|---|---|
| vat_id | Yes | Die zu prüfende USt-IdNr. mit Länderpräfix, z. B. "DE325821677" oder "ATU12345675". Leerzeichen, Punkte und Bindestriche werden toleriert. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Firmenname laut Mitgliedsstaat, oft nicht herausgegeben |
| vatId | Yes | normalisierte Nummer, wie geprüft wurde |
| cached | Yes | |
| status | Yes | |
| checkedAt | Yes | Zeitpunkt der echten Prüfung (ISO 8601) |
| countryCode | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Die Beschreibung geht über die Annotationen hinaus: Sie erklärt das Antwortformat (valid, invalid, unavailable), die Live-Abfrage bei VIES und dass VIES nicht erreichbar sein kann. Das ist wertvolle Information, die nicht in den Annotationen steht. Allerdings fehlen Details zu Rate-Limits oder Fehlerbehandlung.
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?
Die Beschreibung ist kompakt und front-loaded: Kernaussage zuerst, dann Details zum Status und der Kosten. Es gibt keine überflüssigen Sätze.
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?
Für ein Tool mit einem Parameter, vollständiger Schema-Beschreibung und Output-Schema ist die Beschreibung ausreichend. Sie erklärt den Rückgabestatus und den externen Dienst. Es fehlt der Hinweis, dass die Prüfung live erfolgt und daher Latenz auftreten kann, aber das ist angesichts der Annotationen (idempotent, readOnly) und des Output-Schemas vertretbar.
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?
Der Parameter vat_id ist im Schema vollständig beschrieben (100% Abdeckung), sodass die Beschreibung keine zusätzlichen semantischen Informationen liefert. Sie wiederholt lediglich, dass eine USt-IdNr. geprüft wird.
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?
Der Beschreibung nennt klar das Verb und die Ressource ('Prüft eine USt-IdNr. live gegen VIES') und grenzt damit die Funktion von den Geschwistertools ab. Allerdings wird nicht explizit erwähnt, dass es sich um eine externe, kostenlose Prüfung handelt, was die Abgrenzung verbessern würde.
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?
Es wird impliziert, wann das Tool zu nutzen ist (Prüfung einer USt-IdNr.), aber es fehlen explizite Hinweise, wann es nicht zu verwenden ist oder welche Alternativen es gibt. Geschwistertools wie check_peppol_participant werden nicht erwähnt.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_zugferdZUGFeRD-Rechnung erzeugenAIdempotentInspect
Erzeugt eine ZUGFeRD-PDF aus strukturierten EN-16931-Daten (kein LLM). Mit visueller PDF (pdf_base64/upload_id) wird das XML in diese PDF eingebettet; ohne PDF wird die Rechnung aus den Daten gesetzt, optional mit Logo (logo_base64: PNG, JPEG oder SVG, max. 500 KB) und Sprache (lang: de oder en). Verletzen die Daten EN-16931-Geschäftsregeln, liefert der Remote-Kanal (Chat-Connector) strukturierte Issues statt einer Datei zurück — invoice korrigieren (siehe extract_invoice) und mit denselben Quelldaten (upload_id/pdf_base64) erneut aufrufen. Ohne aktives Abo kostenlos mit Konto (API-Key): die PDF trägt dann das finisma-Prüfsiegel als Wasserzeichen, standardmäßig bis zu 5 Rechnungen pro Tag; mit Abo ohne Wasserzeichen und ohne Tageslimit. Rabatte und Zuschläge je Position (lines[].allowanceCharges) dürfen als Prozentsatz ohne Betrag kommen: amount = round2(Menge × unitPriceNet × percent / 100); ebenso auf die ganze Rechnung (allowanceCharges): Grundbetrag ohne Angabe ist die Summe der lineNetAmount mit ratePercent. lineNetAmount, vatBreakdown und die Summen muss der Aufrufer mit diesen Beträgen rechnen. Für öffentliche Auftraggeber erzeugt invoice.profile='xrechnung' eine XRechnung 3.0 (nur als reines XML über die REST-API mit format=xml; Pflichten: Leitweg-ID in buyerReference, Verkäufer-Kontakt mit Telefon und E-Mail, payment, electronicAddress beider Parteien).
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Sprache der aus den Daten gesetzten Rechnung (Beschriftungen, Zahlen- und Datumsformat). Standard: de. | |
| invoice | Yes | Strukturierte Rechnungsdaten nach EN 16931 (wird gegen Schema und Geschäftsregeln geprüft). | |
| filename | No | Dateiname der erzeugten Rechnung (Standard: invoice.pdf). | |
| logo_mime | No | Optional; der Typ wird sonst aus dem Inhalt erkannt. | |
| upload_id | No | Referenz auf eine zuvor über request_upload_link hochgeladene Datei, anstelle von pdf_base64. Höchstens eines von beiden angeben. | |
| pdf_base64 | No | Optional: die visuelle Rechnungs-PDF, Base64-kodiert (max. 25 MB). In sie wird das CII-XML eingebettet. Alternativ 'upload_id' angeben. Ohne beides wird die Rechnung aus den Daten gesetzt. Chat-Clients, die eine angehängte Datei nicht zuverlässig als Base64 übergeben können, rufen zuerst request_upload_link auf. | |
| attachments | No | Optionale Anhänge (z. B. Stundennachweise). Erlaubt: PDF, PNG, JPEG, CSV, XLSX, ODS, XML; je max. 10 MB. | |
| logo_base64 | No | Optionales Logo für die aus den Daten gesetzte Rechnung (nur ohne PDF): PNG, JPEG oder SVG, Base64-kodiert oder als data:-URI, max. 500 KB. Steht rechts oben im Kopf. SVG nur ohne Skripte und ohne Verweise auf andere Dateien. |
Output Schema
| Name | Required | Description |
|---|---|---|
| bytes | No | Größe der erzeugten PDF in Bytes. |
| issues | No | Nur gesetzt, wenn die übergebenen Rechnungsdaten EN-16931-Geschäftsregeln verletzen: es wurde keine Datei erzeugt (Korrekturschleife, T20). Felder anhand der Issues korrigieren und create_zugferd mit denselben Quelldaten (upload_id/pdf_base64) und dem korrigierten invoice erneut aufrufen. |
| generated | No | true, wenn die Rechnung ohne Eingabe-PDF aus den Daten gesetzt wurde. |
| expires_at | No | ISO-8601-Zeitpunkt, ab dem download_url verfällt (nur mit download_url gesetzt). |
| pdf_base64 | No | Die erzeugte ZUGFeRD-Rechnung (PDF/A-3 mit eingebettetem CII-XML). Gesetzt, wenn die Eingabe als 'pdf_base64' kam oder die Rechnung über WebMCP aus den Daten gesetzt wurde; sonst steht download_url im Ergebnis. |
| watermarked | No | true, wenn die PDF aus dem kostenlosen Tageskontingent stammt und das finisma-Prüfsiegel als Wasserzeichen trägt (Aufruf ohne aktives Abo). |
| download_url | No | Kurzlebiger Download-Link zur erzeugten PDF. Gesetzt, wenn die Eingabe als 'upload_id' kam (Chat-Client-Fallback) oder die Rechnung über den Remote-Kanal aus den Daten gesetzt wurde. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false): it discloses that rule violations return structured issues instead of a file, the free-tier watermark and 5-per-day cap versus the subscription tier, caller responsibility for computing lineNetAmount/vatBreakdown/totals, and the extra obligations for xrechnung. No contradiction with the annotations.
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 PDF embedding, error handling, billing tier, calculation formula and xrechnung profile — a sensible order. It is a single dense block with no formatting, which makes it harder to scan, but almost every sentence carries information an agent needs.
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 complex 8-parameter, deeply nested tool, the description covers generation paths, validation-failure behavior, licensing limits and the public-sector profile variant. With an output schema present it need not describe return values, and 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 coverage is 100%, so the baseline is 3, but the description adds genuine semantics the schema does not: the rounding formula for percentage allowances (round2(quantity × unitPriceNet × percent / 100)) and the explicit warning that the caller must compute lineNetAmount, vatBreakdown and the totals themselves. It also reinforces the 500 KB / PNG-JPEG-SVG logo constraint.
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?
"Erzeugt eine ZUGFeRD-PDF aus strukturierten EN-16931-Daten (kein LLM)" gives a specific verb, resource, input format and a hard constraint in one clause. It is immediately distinguishable from verify_zugferd (checks) and extract_invoice (reads data out of invoices).
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?
It states the three mutually exclusive paths (pdf_base64 vs upload_id vs no PDF, documented as "Höchstens eines von beiden") and when each applies. It also names the recovery branch explicitly: on business-rule violations, correct the invoice (referencing extract_invoice) and re-call with the same source data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_invoiceRechnungsdaten aus PDF auslesenAInspect
Extrahiert EN-16931-Rechnungsdaten aus einer hochgeladenen PDF (Formularfelder) plus Validierungs-Issues, als Korrekturschritt vor create_zugferd: Felder und Issues dem Nutzer zeigen, korrigieren lassen, danach create_zugferd mit dem korrigierten invoice und derselben upload_id aufrufen. Unsichere Felder stehen als Platzhalter 'KORRIGIEREN' (Text) bzw. '1900-01-01' (Datum) drin und werden als Issue mit Code EXTRACTION_UNCERTAIN gemeldet — diese Felder müssen vor create_zugferd korrigiert werden. Enthält die PDF bereits eine eingebettete E-Rechnung (ZUGFeRD/Factur-X), kommen die Felder deterministisch aus der XML (source='xml') statt aus einer Sprachmodell-Lesung des Druckbilds. Erfordert ein Konto mit aktivem Abo oder Guthaben.
| Name | Required | Description | Default |
|---|---|---|---|
| upload_id | No | Referenz auf eine zuvor über request_upload_link hochgeladene Datei, anstelle von pdf_base64. Genau eines von beiden angeben. Wird im Ergebnis erneut zurückgegeben und kann anschließend bei create_zugferd als 'upload_id' verwendet werden, damit dieselbe Quell-PDF eingebettet wird. | |
| pdf_base64 | No | Die zu extrahierende PDF-Rechnung, Base64-kodiert (max. 25 MB). Alternativ 'upload_id' angeben. Chat-Clients, die eine angehängte Datei nicht zuverlässig als Base64 übergeben können, rufen zuerst request_upload_link auf. |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | Herkunft der Felder: 'xml' = deterministisch aus der in der PDF eingebetteten E-Rechnung übernommen, 'llm' = per Sprachmodell aus dem Druckbild extrahiert. |
| invoice | Yes | Extrahierte EN-16931-Rechnungsdaten (Formularfelder). Vor create_zugferd prüfen und korrigieren, insbesondere Felder mit dem Wert 'KORRIGIEREN' bzw. '1900-01-01'. |
| upload_id | Yes | Bei create_zugferd als 'upload_id' übergeben, damit dieselbe Quell-PDF eingebettet wird. |
| expires_at | Yes | ISO-8601-Zeitpunkt, ab dem upload_id verfällt. Danach erneut request_upload_link und extract_invoice aufrufen. |
| validation_issues | Yes | Offene Probleme der extrahierten Daten. severity='error' blockiert create_zugferd (dort wird dieselbe Prüfung erneut ausgeführt), 'warning' nicht. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true). The description adds genuinely useful behavior: uncertain fields appear as 'KORRIGIEREN' / '1900-01-01' placeholders flagged with code EXTRACTION_UNCERTAIN and must be fixed before create_zugferd, source='xml' vs. model reading of the rendered page, and the subscription/credit requirement. It does not mention rate limits or result payload size, but the disclosure is well beyond the annotations.
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?
Purpose and pipeline role are front-loaded in the first sentence, and the remaining sentences each carry distinct constraints (placeholders, XML branch, account requirement). It is dense and somewhat run-on as a single block, but 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?
With an output schema present, return values need no explanation, and the description still covers what an agent needs: prerequisites (upload_id or pdf_base64), the correction workflow, sentinel values to fix, the deterministic XML path, and the billing prerequisite. Nothing material 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 100%, so the schema already documents both upload_id and pdf_base64, including the mutual-exclusivity rule and base64 size limit. The description reiterates the upload_id reuse for embedding the same source PDF in create_zugferd, which is workflow context rather than new parameter semantics. Baseline 3 is appropriate.
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 — extracting EN-16931 invoice data (fields plus validation issues) from an uploaded PDF — and names its role in the pipeline relative to create_zugferd. An agent can distinguish it from verify_zugferd, parse_bank_statement, and other siblings without opening any schema.
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 explicit ordering: run as a correction step before create_zugferd, show fields/issues to the user, correct them, then call create_zugferd with the corrected invoice and the same upload_id. It also covers the branch where the PDF already contains an embedded E-Rechnung, so the agent knows the XML path applies. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_bank_statementKontoauszug auslesen (camt)ARead-onlyIdempotentInspect
Liest Kontoauszüge, Kontoberichte und Avise (camt.052, camt.053, camt.054, Versionen .02 und .08) und Gebührenabrechnungen (camt.086, .01 bis .05) in strukturiertes JSON; auch mehrere Dateien als ZIP. 052/053/054: Konten, Salden und Buchungen (Buchungs- und Valutadatum, Betrag, Währung, Soll/Haben, je Transaktion Gegenpartei mit IBAN, Verwendungszweck, End-to-End-Referenz, Buchungscode BkTxCd mit GVC). 086: Abrechnungen mit Services und Summen je Währung. Kostenlos bis 5 Aufrufe pro Monat und Konto. Mit dem Zahlungsverkehr-Abo (Feature payments) ohne Limit. Ohne Abo kostet jeder weitere Aufruf 1 Credit. Ein Konto (API-Key oder OAuth) ist immer nötig.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | No | Die Datei als XML-Text (max. 10 MB). Alternativ 'file_base64'. | |
| filename | No | Optionaler Dateiname, erscheint in den Meldungen. | |
| file_base64 | No | Die Datei Base64-kodiert: eine XML-Datei oder ein ZIP mit mehreren XML-Dateien (max. 10 MB). Alternativ 'xml'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| files | Yes | |
| billing | Yes | Womit der Aufruf bezahlt wurde: free_quota (Freikontingent), subscription (Zahlungsverkehr-Abo), check_block (Prüfblock: 1 Credit für 10 Prüfungen) oder credit (Guthaben). |
| skipped | Yes | Dateien im ZIP-Archiv, die keine unterstützte camt-Datei sind. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantially more than the structured fields: rate limits and cost model, the mandatory account (API key or OAuth) requirement, and the 10 MB input ceiling. These are exactly the operational facts an agent needs before invoking and are not derivable from the annotations.
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 and supported formats, then the per-format field breakdown, then the cost/auth rules. It is dense and the long field enumeration is somewhat list-like, but every sentence carries actionable information and nothing is 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?
Covers formats, accepted input forms, size limit, quota/pricing, and authentication, which is complete for a read-only parsing tool. An output schema exists, so the extra field enumeration is redundant but harmless; nothing an agent needs to call 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 100%, so the baseline is 3. The description adds only marginal parameter meaning — that a ZIP containing multiple XML files may be supplied (relevant to file_base64) and the 10 MB limit — which the schema already documents, so no credit above the baseline is earned.
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 (liest/parses) plus the exact resource family (camt.052/.053/.054/.086 fee statements) and the output (strukturiertes JSON). It implicitly distinguishes itself from the sibling validate_bank_statement by describing extraction into structured data including ZIP batches, so an agent can tell what this tool does versus validation.
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?
Clear operational context: which message versions are supported, batch-via-ZIP support, the free quota (5 calls/month/account), the payments subscription removing the limit, and the credit cost per extra call. However it never names the closest alternative (validate_bank_statement) nor states when to prefer one over the other, so the routing guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_upload_linkUpload-Link für PDF anfordernAInspect
Erzeugt einen kurzlebigen Upload-Link für eine PDF-Rechnung. Nötig für Chat-Clients (ChatGPT, Claude), die eine angehängte Datei nicht zuverlässig als pdf_base64 an ein Tool übergeben können. Zwei Wege: Der Nutzer lädt die PDF über upload_url im Browser hoch, ODER der Client mit Shell und Netzzugriff lädt sie selbst hoch, per POST als Multipart-Feld 'file' an upload_api_url (curl -F "file=@rechnung.pdf"). Für den direkten Weg muss die Domain finisma.de erreichbar sein; in Claude-Umgebungen mit Netz-Sandbox heißt das, finisma.de in der Domain-Allowlist einzutragen. Die zurückgegebene upload_id kann danach bei create_zugferd/verify_zugferd anstelle von pdf_base64 verwendet werden.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| upload_id | Yes | An create_zugferd/verify_zugferd als 'upload_id' übergeben. |
| expires_at | Yes | ISO-8601-Zeitpunkt, ab dem der Link verfällt. |
| upload_url | Yes | Dem Nutzer zum Öffnen im Browser geben, dort die PDF hochladen. |
| upload_api_url | Yes | Direkter Upload-Endpunkt für Clients mit Netzzugriff auf finisma.de: die PDF per POST als Multipart-Feld 'file' hierher senden, dann entfällt der Browser-Schritt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly=false, idempotent=false, destructive=false); the description adds the lifespan ('kurzlebige'), the two operating modes, the exact multipart field name and curl form, and a real environmental prerequisite (finisma.de must be reachable, and added to the sandbox allowlist). That is substantive operational context beyond the structured fields.
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?
Purpose is front-loaded in the first sentence, followed by rationale, then the two paths and the prerequisite. Every sentence carries information, but the path/sandbox explanation runs long and could be tightened without loss.
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, so return values need not be re-explained, and the description still adds the prerequisites and workflow an agent needs. Nothing required to invoke this zero-parameter 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?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. The description names the returned identifiers (upload_url, upload_api_url, upload_id), which helps but is not required since the schema has no inputs.
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 ('Erzeugt einen kurzlebigen Upload-Link für eine PDF-Rechnung') rather than restating the tool name. It also explicitly positions itself against siblings by framing the link as an alternative input to create_zugferd/verify_zugferd, so an agent can distinguish it without opening any schema.
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 an explicit when-to-use trigger ('Nötig für Chat-Clients ... die eine angehängte Datei nicht zuverlässig als pdf_base64 übergeben können') and then enumerates two concrete usage paths with the conditions that select each (browser upload vs. client-side multipart POST). The alternative route (reusing pdf_base64 with create_zugferd) is also named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_bank_statementKontoauszug prüfen (camt)ARead-onlyIdempotentInspect
Prüft Kontoauszüge, Kontoberichte und Avise (camt.052, camt.053, camt.054 in den Versionen .02 und .08) sowie Gebührenabrechnungen (camt.086, .01 bis .05); auch mehrere Dateien als ZIP. Liefert je Datei Nachricht, Version, die Befunde der Prüfregeln (Salden, Summen, IBAN-Prüfziffern, Reihenfolge), das Ergebnis der Schemaprüfung (mit Zeile und Spalte) und ein Gesamturteil. Kostenlos bis 5 Aufrufe pro Tag und Konto. Mit dem Zahlungsverkehr-Abo (Feature payments) ohne Limit. Ohne Abo kauft 1 Credit einen Prüfblock mit 10 weiteren Prüfungen (für Zahlungsdateien und Kontoauszüge gemeinsam, ohne Ablaufdatum). Ein Konto (API-Key oder OAuth) ist immer nötig.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | No | Die Datei als XML-Text (max. 10 MB). Alternativ 'file_base64'. | |
| filename | No | Optionaler Dateiname, erscheint in den Meldungen. | |
| file_base64 | No | Die Datei Base64-kodiert: eine XML-Datei oder ein ZIP mit mehreren XML-Dateien (max. 10 MB). Alternativ 'xml'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| files | Yes | |
| billing | Yes | Womit der Aufruf bezahlt wurde: free_quota (Freikontingent), subscription (Zahlungsverkehr-Abo), check_block (Prüfblock: 1 Credit für 10 Prüfungen) oder credit (Guthaben). |
| skipped | Yes | Dateien im ZIP-Archiv, die keine unterstützte camt-Datei sind. |
| verdict | Yes | |
| schemaChecked | No | false, wenn die Schemaprüfung für mindestens eine Datei nicht verfügbar war. |
| deliveryFindings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description goes further by disclosing rate limits/credit consumption and the auth requirement (an account is always needed), plus what each run returns (per-file message, version, rule findings, schema check with line/column, overall verdict), which is context the annotations do not carry.
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 purpose and supported formats are front-loaded, and the semicolon-separated clauses each carry distinct information (formats, output, pricing, auth). It is dense and somewhat long, but little of it is filler.
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?
With an output schema present and full parameter coverage, the definition needs only to cover scope, cost and prerequisites, all of which it does. The only gap is the lack of explicit routing against the sibling validate/parse tools.
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 100%, so xml, filename and file_base64 are fully documented in the schema. The description only adds that multiple files may be supplied as a ZIP, which matches the base64 field's own text; baseline 3 applies when the schema does the heavy lifting.
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 ("Prüft") plus the exact resources validated (Kontoauszüge, Kontoberichte, Avise, Gebührenabrechnungen) and even pins the message types/versions (camt.052/.053/.054/.02/.08, camt.086). This clearly separates it from sibling parse_bank_statement, which reads rather than validates.
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?
It gives cost/limit context (free up to 5 calls/day, subscription removes the limit, 1 credit buys 10 checks) and that an account/API key is always required, which is useful operational guidance. However it never states when to choose this over parse_bank_statement or validate_payment_file, so the when/when-not routing is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_payment_fileZahlungsdatei prüfen (pain.001)ARead-onlyIdempotentInspect
Prüft eine Zahlungsdatei pain.001 (SEPA-Überweisung oder Auslandszahlung AXZ, Versionen .09 und .03). Erkennt das Profil selbst, fasst den Zahllauf zusammen (Anzahl, Summe je Währung), liefert die Befunde der fachlichen Prüfregeln (Code, Schwere, Meldung, Pfad), das Ergebnis der Schemaprüfung (mit Zeile und Spalte) und ein Gesamturteil. Kostenlos bis 5 Aufrufe pro Tag und Konto. Mit dem Zahlungsverkehr-Abo (Feature payments) ohne Limit. Ohne Abo kauft 1 Credit einen Prüfblock mit 10 weiteren Prüfungen (für Zahlungsdateien und Kontoauszüge gemeinsam, ohne Ablaufdatum). Ein Konto (API-Key oder OAuth) ist immer nötig.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | No | Die Datei als XML-Text (max. 10 MB). Alternativ 'file_base64'. | |
| profile | No | Profil der Prüfung: auto (Erkennung aus der Datei), sct (SEPA-Überweisung) oder axz (Auslandszahlung). | auto |
| filename | No | Optionaler Dateiname, erscheint in den Meldungen. | |
| file_base64 | No | Die XML-Datei Base64-kodiert (max. 10 MB). Alternativ 'xml'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| xsd | Yes | Schemaprüfung über den Validierungsdienst. available=false heißt: nicht verfügbar, das Urteil beruht dann nur auf den Prüfregeln. |
| billing | Yes | Womit der Aufruf bezahlt wurde: free_quota (Freikontingent), subscription (Zahlungsverkehr-Abo), check_block (Prüfblock: 1 Credit für 10 Prüfungen) oder credit (Guthaben). |
| message | Yes | |
| profile | Yes | |
| summary | Yes | |
| verdict | Yes | |
| version | Yes | |
| findings | Yes | |
| profileSource | No | |
| schemaChecked | No | |
| profileReasons | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses rate limits (5 free calls/day), the subscription model (feature payments unlimited), the credit-based fallback (1 credit = 10 further validations), and the mandatory account requirement. This is rich behavioral context an agent cannot get from annotations alone.
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?
Purpose is front-loaded and the output summary is efficient, but the pricing/subscription explanation spans three sentences and is comparatively verbose for a definition where the schema and annotations already carry much of the load.
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?
With an output schema present, annotations covering the safety profile, and 100% parameter coverage, the description fills the remaining gap (cost/limit/auth) and leaves nothing an agent needs to call it 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 100%, so both input alternatives (xml vs file_base64), the profile enum, and filename are fully documented in the schema. The description adds no parameter detail beyond what the schema already provides; baseline 3 applies.
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 (prüft/validates) and resource (Zahlungsdatei pain.001) with scope qualifiers (SEPA-Überweisung, Auslandszahlung AXZ, versions .09/.03). An agent can distinguish it from validate_bank_statement without opening either schema.
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 usage through the pain.001 scope and the credit note covering 'payment files and bank statements together', but it never names an alternative tool or states when NOT to use this one. Usage guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_zugferdE-Rechnung prüfenARead-onlyIdempotentInspect
Prüft eine ZUGFeRD-/Factur-X-PDF: Struktur, EN-16931-Regeln, PDF/A-3-Anhänge.
| Name | Required | Description | Default |
|---|---|---|---|
| upload_id | No | Referenz auf eine zuvor über request_upload_link hochgeladene Datei, anstelle von pdf_base64. Genau eines von beiden angeben. | |
| pdf_base64 | No | Die zu prüfende PDF-Datei, Base64-kodiert (max. 25 MB). Alternativ 'upload_id' angeben. Chat-Clients, die eine angehängte Datei nicht zuverlässig als Base64 übergeben können, rufen zuerst request_upload_link auf. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pdfa3 | No | PDF/A-3-Anbindung der eingebetteten Dateien (ISO 19005-3 §6.8). |
| en16931 | No | EN-16931-Prüfung; null, wenn keine XML eingebettet war. |
| structure | Yes | Strukturelle Prüfung der PDF (ohne die eingebettete XML). |
| attachments | Yes | Im CII referenzierte Anhänge (BT-125). |
| authoritative | Yes | Autoritative Prüfung: PDF/A-Konformität (ISO 19005-3), XML-Syntax (XSD) und Geschäftsregeln des erkannten Profils. available=false, wenn der Validator-Service nicht erreichbar war; das Ergebnis basiert dann nur auf der Schnellprüfung. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuinely useful information beyond that by disclosing the depth of validation performed (structure, EN 16931 rule conformance, PDF/A-3 attachment checks), which tells the agent what a positive or negative result means.
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?
A single front-loaded sentence with zero filler: verb, resource, and scope in order of importance. It is arguably thinner than a multi-step validation tool warrants, but nothing is redundant or padded.
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?
With an output schema present the description need not explain return values, and annotations plus full schema coverage handle safety and inputs, so the remaining burden is small. The one real gap is task routing – nothing tells the agent when to prefer this over extract_invoice – which keeps it short of a 5.
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 100% – both upload_id and pdf_base64 are documented in the schema, including the 'exactly one of the two' constraint and the 25 MB limit. The description adds no parameter detail of its own, so the baseline of 3 for schema-driven parameters applies.
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 names a specific verb ('Prüft') and a precise resource ('ZUGFeRD-/Factur-X-PDF') and enumerates the validation scope (Struktur, EN-16931-Regeln, PDF/A-3-Anhänge), so an agent immediately knows this is a validator, not a generator or extractor. It does not, however, distinguish itself from siblings like extract_invoice or create_zugferd by naming them or contrasting scope.
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?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives. The only routing hint in the whole definition lives in the schema for pdf_base64 (call request_upload_link first for chat clients), not in the description itself, so an agent gets no help choosing between this and extract_invoice or create_zugferd.
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.
1 tool update
- Changed
create_zugferd8 fields changed- added
Input schema / properties / langAdded value: +{ + "description": "Sprache der aus den Daten gesetzten Rechnung (Beschriftungen, Zahlen- und Datumsformat). Standard: de.", + "enum": [ + "de", + "en" + ], + "type": "string" +} - added
Input schema / properties / logo_base64Added value: +{ + "contentEncoding": "base64", + "description": "Optionales Logo für die aus den Daten gesetzte Rechnung (nur ohne PDF): PNG, JPEG oder SVG, Base64-kodiert oder als data:-URI, max. 500 KB. Steht rechts oben im Kopf. SVG nur ohne Skripte und ohne Verweise auf andere Dateien.", + "type": "string" +} - added
Input schema / properties / logo_mimeAdded value: +{ + "description": "Optional; der Typ wird sonst aus dem Inhalt erkannt.", + "enum": [ + "image/png", + "image/jpeg", + "image/svg+xml" + ], + "type": "string" +} - changed
Input schema / properties / pdf_base64 / descriptionPrevious value: -"Die visuelle Rechnungs-PDF, Base64-kodiert (max. 25 MB). In sie wird das CII-XML eingebettet. Alternativ 'upload_id' angeben. Chat-Clients, die eine angehängte Datei nicht zuverlässig als Base64 übergeben können, rufen zuerst request_upload_link auf."New value: +"Optional: die visuelle Rechnungs-PDF, Base64-kodiert (max. 25 MB). In sie wird das CII-XML eingebettet. Alternativ 'upload_id' angeben. Ohne beides wird die Rechnung aus den Daten gesetzt. Chat-Clients, die eine angehängte Datei nicht zuverlässig als Base64 übergeben können, rufen zuerst request_upload_link auf." - changed
Input schema / properties / upload_id / descriptionPrevious value: -"Referenz auf eine zuvor über request_upload_link hochgeladene Datei, anstelle von pdf_base64. Genau eines von beiden angeben."New value: +"Referenz auf eine zuvor über request_upload_link hochgeladene Datei, anstelle von pdf_base64. Höchstens eines von beiden angeben." - changed
Output schema / properties / download_url / descriptionPrevious value: -"Kurzlebiger Download-Link zur erzeugten PDF. Nur gesetzt, wenn die Eingabe als 'upload_id' kam (Chat-Client-Fallback)."New value: +"Kurzlebiger Download-Link zur erzeugten PDF. Gesetzt, wenn die Eingabe als 'upload_id' kam (Chat-Client-Fallback) oder die Rechnung über den Remote-Kanal aus den Daten gesetzt wurde." - added
Output schema / properties / generatedAdded value: +{ + "description": "true, wenn die Rechnung ohne Eingabe-PDF aus den Daten gesetzt wurde.", + "type": "boolean" +} - changed
Output schema / properties / pdf_base64 / descriptionPrevious value: -"Die erzeugte ZUGFeRD-Rechnung (PDF/A-3 mit eingebettetem CII-XML). Nur gesetzt, wenn die Eingabe als 'pdf_base64' kam; wurde 'upload_id' verwendet, steht stattdessen download_url im Ergebnis."New value: +"Die erzeugte ZUGFeRD-Rechnung (PDF/A-3 mit eingebettetem CII-XML). Gesetzt, wenn die Eingabe als 'pdf_base64' kam oder die Rechnung über WebMCP aus den Daten gesetzt wurde; sonst steht download_url im Ergebnis."
5 tool updates
- Changed
create_zugferd2 fields changed- added
Input schema / properties / invoice / properties / delivery / properties / glnAdded value: +{ + "maxLength": 20, + "type": "string" +} - added
Input schema / properties / invoice / properties / seller / properties / customerAssignedIdAdded value: +{ + "maxLength": 100, + "type": "string" +}
- Changed
extract_invoice2 fields changed- added
Output schema / properties / invoice / properties / delivery / properties / glnAdded value: +{ + "maxLength": 20, + "type": "string" +} - added
Output schema / properties / invoice / properties / seller / properties / customerAssignedIdAdded value: +{ + "maxLength": 100, + "type": "string" +}
- Added
parse_bank_statement - Added
validate_bank_statement - Added
validate_payment_file
6 tool updates
- First observed
check_peppol_participant - First observed
check_vat_id - First observed
create_zugferd - First observed
extract_invoice - First observed
request_upload_link - First observed
verify_zugferd
Related MCP Connectors
XRechnung and ZUGFeRD e-invoicing (EN 16931): create, validate, check Leitweg-IDs, German VAT.
Validate, parse and render EU e-invoices: XRechnung, ZUGFeRD, Factur-X, Peppol BIS 3.0, KSeF.
Create, validate, convert & extract compliant e-invoices (UBL, Factur-X, ZUGFeRD, XRechnung)
Generate & validate EN 16931 e-invoices (Factur-X, ZUGFeRD, XRechnung); verification certificates
Related MCP Servers
- 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.615 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.50122 PyPI2Apache 2.0

rechnungsapi-mcpofficial
AlicenseAqualityBmaintenanceEnables AI assistants and agents to create, validate, read and convert German and EU e-invoices in ZUGFeRD, XRechnung and Factur-X formats, including extracting structured data from scanned or PDF invoices and embedding XML into PDF/A-3 files. It can run as a hosted remote server or locally, with each request authenticated by the caller's own API token.1028 npmMIT- AlicenseAqualityCmaintenanceValidates electronic invoices (XRechnung, ZUGFeRD, Factur-X, Peppol BIS, etc.) against authority-pinned rules and explains failures.2137 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.