rechnungsapi-mcp
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@rechnungsapi-mcpTurn this PDF invoice into a ZUGFeRD e-invoice"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Germany's e-invoicing obligation (E-Rechnungspflicht) is being phased in, and structured invoices such as XRechnung and ZUGFeRD are becoming the standard. RechnungsAPI is the REST API that takes care of the hard parts. This server connects it to your AI assistant through the Model Context Protocol, so the assistant can do the e-invoicing work for you, right inside the conversation.
Start free · Documentation · Pricing · SDK for developers
Ask in plain language
You say | What happens |
"Validate this XRechnung and tell me what is wrong." |
|
"Create an XRechnung for this order: customer, three line items, 19% VAT." |
|
"Read this invoice PDF and give me the data as JSON." |
|
"Turn this PDF invoice into a ZUGFeRD e-invoice." |
|
Files travel as base64 text, which suits single invoices. For bulk or large-file workflows use the SDK or the REST API directly.
Related MCP server: InvoiceXML
Connect in a minute
You need a RechnungsAPI token, and it is free to start: create an account, open Profile and copy the token. See Authentication for how it is sent.
Hosted by RechnungsAPI, nothing to install. Add this to your MCP client, for example as .mcp.json in your project for Claude Code:
{
"mcpServers": {
"rechnungsapi": {
"type": "http",
"url": "https://mcp.rechnungsapi.de/mcp",
"headers": { "Authorization": "Bearer your-api-token" }
}
}
}Or run it locally with npx (needs Node.js 20 or newer). The same mcpServers entry works for Claude Code and for Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"rechnungsapi": {
"command": "npx",
"args": ["-y", "rechnungsapi-mcp"],
"env": {
"RECHNUNGSAPI_TOKEN": "your-api-token"
}
}
}
}It works with Claude Code, Claude Desktop and Open WebUI, and with any MCP client that speaks Streamable HTTP with a custom header, or stdio.
Why teams use it
Nothing to install. Use the hosted server at
mcp.rechnungsapi.de, or run the same server locally with onenpxline.Your token, your data. Every request carries the caller's own token, so nothing is shared between customers. The server stores no invoices, and its logs hold request metadata only (path, status, timing), never invoice data, tool arguments or tokens.
Complete. Ten tools cover creating, validating and reading e-invoices, including asynchronous analysis for big files.
Built for Germany and the EU. RechnungsAPI is built for EN 16931, GoBD and GDPR, with data processed on German servers, and supports ZUGFeRD, XRechnung and Factur-X.
Open source and typed. MIT licensed and built on the
rechnungsapi-sdk.Free to start. Try it without a credit card.
Tools
Tool | Description |
| Create a ZUGFeRD PDF/A-3 from structured invoice JSON + a visual PDF |
| Create an XRechnung XML from structured invoice JSON |
| Embed an existing XRechnung XML into a visual PDF |
| Extract the embedded XRechnung XML from a ZUGFeRD PDF as JSON |
| Validate an XRechnung XML against schema and business rules |
| Validate a ZUGFeRD PDF's embedded XML |
| Extract structured invoice JSON from a scanned/PDF invoice |
| Async analysis for large files |
| Convert a PDF/scan directly into a validated ZUGFeRD PDF |
Each tool maps to one RechnungsAPI endpoint. The API documentation shows its request and response.
Documentation
API documentation: every endpoint these tools call, with request, response and error codes (English and German)
MCP server & SDK guide: how to connect AI clients to RechnungsAPI's hosted MCP server
Authentication: where your API token comes from and how it is sent
Invoice object reference: the fields the
create_*tools expect ininvoice(EN 16931 business terms)Errors: what the HTTP status codes and validation results mean
Environment variables (local mode)
Variable | Required | Description |
| Yes | Your RechnungsAPI Bearer token |
| No | Override the gateway base URL (e.g. a staging or self-hosted gateway) |
| No | Override the v2 analyzer host |
Self-hosting (Streamable HTTP)
By default this runs as a local stdio process, spawned per-user by their own AI client. That is what the npx setup above does, and it is the standard way MCP servers work. If instead you want to run one shared, always-on server that many users connect to remotely (no local install on their end at all, just a URL), use the HTTP mode.
The key architectural difference: stdio mode reads one fixed RECHNUNGSAPI_TOKEN from the environment at startup and reuses it for the whole process's life. HTTP mode instead reads each request's own token from its Authorization: Bearer <token> header, and builds a fresh, isolated client per request, so many different customers can safely share the same running server, each authenticated as themselves, never seeing each other's data.
Run it
yarn build
yarn start:http # listens on $PORT, default 3939Or via Docker:
docker build -t rechnungsapi-mcp .
docker run -p 127.0.0.1:3939:3939 rechnungsapi-mcpOr with Docker Compose: docker compose up -d builds the image from this repo's Dockerfile (see docker-compose.yml).
Or as a Portainer stack: paste deploy/portainer-stack.yml into Stacks → Add stack → Web editor and deploy. It needs no build, because the container installs the published package from npm when it starts. To upgrade, change the version in its command and redeploy. (Use this file rather than docker-compose.yml in the web editor: there is no build context there for build: . to use.)
No RECHNUNGSAPI_TOKEN is configured on the server itself in this mode, because each caller supplies their own.
Server settings (HTTP mode)
Variable | Default | Description |
|
| Port to listen on |
|
| Largest accepted request body. Invoices arrive as base64 PDFs, so this is generous; anything larger is answered with |
| production gateway | Override the gateway base URL |
| production v2 host | Override the v2 analyzer host |
Endpoints
Endpoint | Description |
| The MCP endpoint. Requires |
| Health check (used by Docker's |
| A small page that says what the server is and links the documentation. |
Putting it behind a domain
See deploy/nginx-mcp.conf for a ready-to-use reverse proxy config (e.g. for mcp.rechnungsapi.de), including the settings needed so nginx doesn't buffer or break the SSE streaming responses. Pair it with certbot --nginx -d mcp.rechnungsapi.de for HTTPS, which is required in practice since real API tokens travel in every request. Also redirect plain HTTP to HTTPS (Nginx Proxy Manager: enable Force SSL on the proxy host), so a mistyped http:// URL never sends a token unencrypted.
Two proxy settings matter for real invoices. First, the body limit: nginx refuses request bodies over 1 MB by default (413, before the request reaches this server), so the shipped config sets client_max_body_size 64m to match MAX_BODY_MB. In Nginx Proxy Manager, add the same line under the proxy host's Advanced tab if you ever see those 413s. Second, the timeout: analysing a large scan can take a while, so the shipped config raises proxy_read_timeout; clients can also use the async tools for big files.
Troubleshooting a client that "can't reach" the server
Every request is logged, so start with the container logs while the client tries to connect:
docker logs -f rechnungsapi-mcp
# [http] POST /mcp -> 200 12ms auth=yes rpc=initialize proto=- ua="..."What you see | What it means |
Nothing at all | The request never arrived. Check DNS, the reverse proxy and firewalls. |
| The client isn't sending an |
| The header arrived but the token is empty or wrong. Copy it again from your profile (see Authentication). The |
| Expected. This server doesn't offer the optional server-push SSE stream; compliant clients continue over |
| Expected: a browser-based client's CORS preflight. |
| The request body exceeded |
The client gets | The reverse proxy refused the body before it reached this server. nginx's default limit is 1 MB, so set |
| The body wasn't valid JSON (JSON-RPC parse error |
Log lines record JSON-RPC method names only (e.g. rpc=tools/call), never arguments, so invoice data and tokens don't end up in your logs.
Start free
RechnungsAPI is free to start, with no credit card required. Create your account, copy your token and connect your assistant in minutes. Questions about plans, integration or your project? Talk to us or write to support@rechnungsapi.de.
Development
yarn install
yarn typecheck
yarn test # builds first, then runs the stdio and HTTP suites against a stub API
yarn buildTest locally with the MCP Inspector:
RECHNUNGSAPI_TOKEN=your-token yarn inspectNote:
@modelcontextprotocol/sdkis pinned to an exact version rather than^1.x. This server is reachable from the internet, so the library only changes after the test suite has run against the new version. Releases before 1.26.0 have published security advisories (they show up innpm audit), so don't go back to an older one.
Found a security problem? Please read SECURITY.md.
License
MIT © RechnungsAPI · rechnungsapi.de · support@rechnungsapi.de
Available Tools
10 toolsanalyze_pdf_invoiceAnalyze a PDF/scanned invoiceB
Extract structured invoice JSON from a scanned or digital PDF/PNG/JPEG/TIFF invoice using the high-accuracy analyzer.
| Name | Required | Description | Default |
|---|---|---|---|
| pdfBase64 | Yes | Base64-encoded PDF, PNG, JPEG, or TIFF invoice | |
| withLineItems | No | Also extract individual line items |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden, yet it only offers the vague quality claim 'high-accuracy analyzer.' It does not state that this is a read-only extraction, whether processing is synchronous or may take time, any size/rate limits, or what happens on unparseable input — all relevant for an OCR-style tool.
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 the verb and output first, followed by input formats. No filler, no redundant restatement of the tool name.
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 2-parameter extraction tool with 100% schema coverage this is roughly minimally adequate, but with no output schema the description should say more about the shape of the returned invoice JSON, and with no annotations it should clarify safety and the sync-vs-async choice among its many siblings.
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 pdfBase64 and withLineItems are already documented in the schema, establishing a baseline of 3. The description adds nothing beyond what the schema provides (it repeats the supported formats already in the pdfBase64 description).
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+resource ('Extract structured invoice JSON') and enumerates accepted input formats (PDF/PNG/JPEG/TIFF), so the agent knows exactly what the tool produces and consumes. It does not distinguish itself from the sibling async variants (analyze_pdf_invoice_async_submit/status) or from create_zugferd_from_pdf, so it stays at 4.
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?
No when-to-use or when-not-to-use guidance is given. The description never mentions that synchronous analysis is the alternative to the async submit/status siblings, nor when to prefer a create_zugferd_from_pdf path over plain extraction. Usage is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_pdf_invoice_async_statusCheck async PDF analysis statusB
Poll the status of an asynchronous PDF invoice analysis job submitted via analyze_pdf_invoice_async_submit.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | The job_id returned by analyze_pdf_invoice_async_submit |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that the operation is a status poll tied to a prior submission, but says nothing about polling cadence, terminal status values, behavior for an unknown/expired jobId, or retention of results — all material for a polling tool with zero annotation coverage.
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?
One sentence, no filler, and the operative verb is front-loaded with the origin of the jobId as a trailing clause. Nothing could be trimmed without losing routing information.
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?
There is no output schema and no annotations, so the description must explain the return contract — but it never mentions what statuses come back (e.g. pending/running/succeeded/failed) or what the caller should expect next. For a polling tool whose entire value is the returned status, this is a significant incompleteness.
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% and the single jobId parameter is already documented as 'the job_id returned by analyze_pdf_invoice_async_submit.' The description adds no format, validation, or lifecycle detail beyond the schema, so the 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+resource ('Poll the status of an asynchronous PDF invoice analysis job') and ties the resource to the exact sibling that creates it (analyze_pdf_invoice_async_submit). An agent can distinguish this polling tool from the submit tool and from the synchronous analyze_pdf_invoice 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?
The description implies the usage context by referencing the submit tool, so an agent can infer 'call this after submitting a job.' However it gives no explicit guidance on when to call, how often to poll, or what to do when the job reaches a terminal state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_pdf_invoice_async_submitSubmit a large PDF invoice for async analysisA
Submit a large scanned/PDF invoice for asynchronous analysis (for files too large for the synchronous analyzer). Returns a job_id — poll it with analyze_pdf_invoice_async_status.
| Name | Required | Description | Default |
|---|---|---|---|
| pdfBase64 | Yes | Base64-encoded PDF, PNG, JPEG, or TIFF invoice | |
| withLineItems | No | Also extract individual line items |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the asynchronous nature and the job_id return, which is genuinely useful behavioral context. It omits size limits, retention/failure behavior, or auth requirements, so it is adequate but not rich.
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?
Two sentences, zero filler, with the key constraint (too large for sync) and the return/polling contract front-loaded. Every clause earns its place.
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?
No output schema exists, and the description compensates by naming the return value (job_id) and the polling tool, which is the essential missing piece. It stops short of documenting practical limits or failure handling, so a small gap remains.
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 pdfBase64 and withLineItems are already documented in the schema. The description adds no format, encoding, or size guidance beyond that, so the 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 (submit) and resource (large scanned/PDF invoice) with the operational mode (asynchronous analysis), and explicitly positions it against the sibling analyze_pdf_invoice by scoping to files too large for the synchronous path. An agent can route between the sync and async analyzers without opening the 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 parenthetical 'for files too large for the synchronous analyzer' gives the exact selection condition versus the sibling tool, and the description names the follow-up tool (analyze_pdf_invoice_async_status) with the job_id needed to call it. This is explicit when-to-use plus the required next step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_xrechnungCreate XRechnung (XML)C
Create an XRechnung XML document from structured invoice JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice | Yes | Structured invoice data as a JSON object: header, seller, buyer, line items, VAT, totals and payment instructions (EN 16931 business terms). Field reference: https://rechnungsapi.de/api-docs#invoice-object | |
| transport | No | Optional email delivery: when set, the generated invoice is also sent by email in the same call. Options: https://rechnungsapi.de/api-docs#email-transport |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it only restates the transformation. It omits whether auth is required, whether the operation is idempotent, what happens on validation failure, and that the optional transport triggers an email send in the same call.
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 no filler; the core verb and resource lead the line. It is efficient though perhaps too terse given what it needs to convey.
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 no output schema and no annotations, a creation tool should say what it returns (the XML string, a file handle, a URL) and how errors surface. The description says nothing about the return value or failure behavior, leaving a real gap for an agent invoking it blind.
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 parameters are already documented in the schema with references to the EN 16931 business terms and transport options. The description adds nothing beyond what the schema already conveys, matching the baseline 3.
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 (create), resource (XRechnung XML document), and input (structured invoice JSON). The format distinction from the ZUGFeRD siblings is implied by 'XRechnung' and 'XML,' but no sibling is named or contrasted.
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 guidance on when to use this tool versus create_zugferd_invoice, create_zugferd_pdf, or validate_xrechnung_xml. The agent must infer the choice of e-invoice format and validation workflow on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_zugferd_from_pdfConvert a PDF/scan directly into a ZUGFeRD PDFB
Convert a PDF or scanned image invoice directly into a validated ZUGFeRD PDF/A-3 in one call (analyzes, validates, and embeds in a single step).
| Name | Required | Description | Default |
|---|---|---|---|
| fileName | No | Original filename, used to name the resulting PDF | |
| pdfBase64 | Yes | Base64-encoded PDF, PNG, JPEG, or TIFF invoice |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the internal pipeline (analysis, validation, embedding) and that the output is validated PDF/A-3. It does not state what happens on validation failure, whether the call is synchronous or long-running, any input size limits, or how the resulting PDF is returned — all material for a heavy conversion operation.
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 the core action first and the pipeline detail in a parenthetical; no filler. Slightly dense, but every clause earns its place.
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 conversion tool with no output schema and no annotations, the description should say what comes back (base64 payload, file path, download URL?) and how failures surface. It conveys the product but leaves the return contract unstated, which is the main gap an agent needs to plan around.
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 parameters are already documented (fileName, pdfBase64 with accepted formats). The description adds no syntax, encoding, or size detail beyond the schema, so the 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 and resource: convert a PDF or scanned image invoice into a validated ZUGFeRD PDF/A-3. The input-domain phrase ('from a PDF or scanned image') implicitly separates it from create_zugferd_pdf, but the sibling is never named, so the agent must infer the distinction rather than being told it.
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?
'in one call (analyzes, validates, and embeds in a single step)' implies when this is preferable to the multi-step analyze_* + create_zugferd_pdf path, which is useful implied guidance. However, no alternative is named explicitly and no preconditions (e.g. input must already be an invoice) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_zugferd_invoiceCreate ZUGFeRD invoiceA
Create a ZUGFeRD PDF/A-3 e-invoice (visual PDF with embedded XRechnung XML) from structured invoice JSON plus a visual PDF template.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice | Yes | Structured invoice data as a JSON object: header, seller, buyer, line items, VAT, totals and payment instructions (EN 16931 business terms). Field reference: https://rechnungsapi.de/api-docs#invoice-object | |
| transport | No | Optional email delivery: when set, the generated invoice is also sent by email in the same call. Options: https://rechnungsapi.de/api-docs#email-transport | |
| invoicePdf64 | Yes | Base64-encoded visual PDF the XML will be embedded into |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses the output format (PDF/A-3 with embedded XRechnung XML), but says nothing about permissions, failure modes, or the email side effect that the transport parameter triggers. For a creation tool with zero annotation coverage this is adequate but incomplete.
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 tight sentence, front-loaded with the verb and the produced artifact, with parenthetical clarification of the embedded XML. Nothing extraneous.
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 no output schema, the description should say what is returned (e.g., generated PDF bytes/base64 or a download reference), and it does not. It also omits the email-delivery behavior when transport is set. Given nested-object inputs and a mutation-style tool, this leaves meaningful gaps.
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 all three parameters are already documented in the schema, including the EN 16931 field reference and the email-transport link. The description restates the inputs at a high level without adding syntax or format details beyond the schema, so 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 (Create) and resource (ZUGFeRD PDF/A-3 e-invoice) and clarifies the artifact ('visual PDF with embedded XRechnung XML'), which separates it from create_xrechnung (XML only) and create_zugferd_pdf. It doesn't explicitly name a sibling to route against, so it stops short of a 5.
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?
Input prerequisites are implied ('from structured invoice JSON plus a visual PDF template'), telling the agent it needs both JSON data and a base PDF. However there is no explicit when-to-use guidance or naming of alternatives such as create_zugferd_from_pdf or create_zugferd_pdf, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_zugferd_pdfEmbed XRechnung XML into a PDFB
Embed an existing XRechnung XML document into a visual PDF to produce a ZUGFeRD PDF.
| Name | Required | Description | Default |
|---|---|---|---|
| invoicePdf64 | Yes | Base64-encoded visual PDF | |
| xrechnungXml | Yes | XRechnung XML to embed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden, yet it discloses only the transformation itself. It says nothing about the response shape (base64 string vs. file/URL) despite there being no output schema, nor whether the XML is validated before embedding, nor whether the operation is synchronous. The output-schema gap is the most consequential omission.
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 that states the operation, its inputs, and its output with no filler or 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?
For a two-parameter, fully documented transformation the core is covered, but with no annotations and no output schema the description should at least say what comes back (e.g. a base64 ZUGFeRD PDF). That single missing detail leaves the call contract slightly incomplete.
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% and both parameters are documented in the schema (invoicePdf64 = base64 PDF, xrechnungXml = XML to embed), so baseline 3 applies. The description adds only the qualifier 'existing' and the visual/PDF framing, adding little beyond the structured fields.
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 gives a precise verb (embed), both inputs (an existing XRechnung XML and a visual PDF), and the resulting artifact (a ZUGFeRD PDF). This implicitly separates it from create_zugferd_from_pdf, which starts from a PDF rather than an already-prepared XML, though no sibling is named explicitly.
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 only implied by the word 'existing' — an agent can infer this tool is for when an XRechnung XML already exists. There is no explicit when-to-use/when-not statement and no pointer to the alternatives (create_xrechnung, create_zugferd_from_pdf, validate_xrechnung_xml) that a routing agent would need.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_xrechnung_from_zugferdExtract XRechnung from ZUGFeRD PDFB
Extract the embedded XRechnung XML from a ZUGFeRD PDF and return it as structured JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| zugferd64 | Yes | Base64-encoded ZUGFeRD PDF |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden alone. It usefully discloses the return format ('structured JSON'), but says nothing about failure modes such as a PDF lacking an embedded XRechnung or an invalid ZUGFeRD container, nor about side effects or permissions.
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 waste; the operation and its output are stated immediately.
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 one-parameter extraction tool with no output schema, the description is adequate but thin: it promises 'structured JSON' without indicating the shape of that JSON, and gives no error-behavior context. It covers the happy path only.
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% and the description adds nothing about the single zugferd64 parameter (base64 encoding is already documented in the schema). 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?
Specific verb (Extract) plus resource (embedded XRechnung XML) and source (ZUGFeRD PDF), making the operation unambiguous. However, it does not differentiate itself from siblings like analyze_pdf_invoice or validate_zugferd_pdf, which also consume PDFs, so it lands at 4 rather than 5.
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?
No statement of when to choose this tool over the sibling extractors, validators, or analyzers, and no prerequisites or exclusions are given. The use case is only loosely implied by the operation itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_xrechnung_xmlValidate XRechnung XMLB
Validate an XRechnung XML document against schema and business rules.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | Yes | The XRechnung XML content to validate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that validation covers two layers (XSD schema plus business rules), which is more than the name conveys, but says nothing about outcome reporting, error detail, severity levels, or whether a failed document still returns results.
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 no filler; the verb and scope come first and every word earns its place.
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 validator with no annotations and no output schema, the description should at minimum tell the agent what a call returns (pass/fail flag, list of violations, severity) and which XRechnung profile/version is enforced. None of that is present, so an agent cannot anticipate the result.
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?
Only one parameter exists and schema description coverage is 100%, so the schema already documents 'xml' fully. The description adds no format constraints (size limits, encoding, whether the XML can be a file reference vs inline content), which is the baseline for a fully-covered 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 (validate) and resource (XRechnung XML document) and adds the validation dimensions. It is clearly distinct from the create_/extract_/analyze_ siblings, though it never explicitly contrasts itself with the similar-looking validate_zugferd_pdf, leaving that separation to the resource noun.
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 and no mention of alternatives, despite validate_zugferd_pdf sitting in the sibling list as the obvious near-neighbour. Usage is only inferable from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_zugferd_pdfValidate ZUGFeRD PDFC
Validate a ZUGFeRD PDF's embedded XML content.
| Name | Required | Description | Default |
|---|---|---|---|
| zugferdFile64 | Yes | Base64-encoded ZUGFeRD PDF | |
| comparePDF2XML | No | Also cross-check the embedded XML against the visual PDF content |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It narrows validation to the embedded XML (useful scoping), but says nothing about what is checked, whether the PDF/A conformance or visual content is validated, what a failure returns, or whether external services/files are required.
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 tight sentence with the key scope qualifier (embedded XML) front-loaded; no filler. It is arguably under-specified rather than over-long, but structurally clean.
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 no annotations and no output schema, the description must explain the validation outcome and error semantics, and it does neither. Given a sibling validate_xrechnung_xml and a family of ZUGFeRD tools, an agent also lacks the differentiation needed to pick 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%, with both zugferdFile64 and comparePDF2XML documented in the schema, so the baseline is 3. The description adds no meaning beyond the schema, and notably never mentions the comparePDF2XML cross-check option.
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 (validate) and a specific resource (a ZUGFeRD PDF's embedded XML content), which is meaningfully narrower than validating the PDF as a whole. It does not, however, distinguish itself from the sibling validate_xrechnung_xml or explain how it relates to create_zugferd_from_pdf / extract_xrechnung_from_zugferd.
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 statement of when to reach for this tool versus validate_xrechnung_xml (a sibling validation tool) or the various create/extract siblings. The agent must infer usage purely from the name and the format label.
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.
10 tool updates
v0.4.0- First observed
analyze_pdf_invoice - First observed
analyze_pdf_invoice_async_status - First observed
analyze_pdf_invoice_async_submit - First observed
create_xrechnung - First observed
create_zugferd_from_pdf - First observed
create_zugferd_invoice - First observed
create_zugferd_pdf - First observed
extract_xrechnung_from_zugferd - First observed
validate_xrechnung_xml - First observed
validate_zugferd_pdf
TDQS
Scored across 10 tools
Most tools have clearly distinct purposes, but create_zugferd_from_pdf overlaps with the analyze_pdf_invoice + create_zugferd_invoice two-step workflow, and create_zugferd_invoice vs create_zugferd_pdf differ only by input type (JSON vs XML), which could cause minor misselection.
All tool names use snake_case with a consistent verb_noun pattern (analyze_pdf_invoice, create_xrechnung, validate_zugferd_pdf, etc.), including the async variants which follow a predictable prefix-based convention.
10 tools is well-scoped for an e-invoicing API covering analysis, creation, validation, extraction, and async operations; each tool earns its place without redundancy.
The surface covers the full lifecycle: analyze PDF/image to JSON, create XRechnung XML, create ZUGFeRD PDF from JSON or XML, convert PDF to ZUGFeRD, extract XRechnung from ZUGFeRD, and validate both XRechnung XML and ZUGFeRD PDF, with async support for large files.
Maintenance
Related MCP Connectors
Create, validate, convert & extract compliant e-invoices (UBL, Factur-X, ZUGFeRD, XRechnung)
Validate, generate & convert EU e-invoices (UBL, CII, XRechnung, Factur-X) — EN 16931 pre-validated.
Verify ZUGFeRD/Factur-X e-invoices, convert PDF invoices to ZUGFeRD, check VAT IDs and Peppol.
Generate & validate EN 16931 e-invoices (Factur-X, ZUGFeRD, XRechnung); verification certificates
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for German e-invoice compliance (XRechnung 3.0 & ZUGFeRD 2.x) enabling AI agents to validate, generate, parse, and check compliance of electronic invoices per EN 16931.61MIT

InvoiceXMLofficial
AlicenseNot gradedqualityCmaintenanceInvoiceXML brings e-invoice compliance to your AI agent. Create, validate, convert, render, and extract structured invoices across UBL (Peppol BIS Billing 3.0, used worldwide), CII, Factur-X, ZUGFeRD, and XRechnung, all checked against the EN 16931 standard and official Schematron rules. Ask your assistant to generate a compliant invoice, validate one for errors, or convert between formats, with n5MIT- FlicenseNot gradedqualityDmaintenanceEnables AI agents to create and manage e-invoices through natural language, supporting EU compliance formats like ZUGFeRD and XRechnung, as well as US plain PDF invoices.7-
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to locally parse, validate, audit, explain, generate, and convert XRechnung and ZUGFeRD/Factur-X e-invoices using official rule sets, fully offline with no API keys required.Apache 2.0