Create, validate, convert & extract compliant e-invoices (UBL, Factur-X, ZUGFeRD, XRechnung)
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
A Model Context Protocol server that exposes the InvoiceXML API to AI agents. Covers Factur-X, ZUGFeRD, XRechnung, UBL / CII, and Peppol BIS Billing 3.0.
The same codebase runs in two deployment shapes, selected at startup by one environment variable:
| Mode | Who runs it | Auth |
|---|---|---|
| Self-hosted | You, on your own machine or server | A single API key in env or appsettings.json |
| Hosted | InvoiceXML, on its own infrastructure | OAuth 2.1 + Dynamic Client Registration against invoicexml.com |
Both run the same binary; only the configuration differs. The repository is platform-independent β it knows nothing about where or how you host it.
InvoiceXml.Mcp.Core is a small, transport-agnostic SDK:
IInvoiceXmlClient β typed client over the public REST APIHttpInvoiceXmlClient β the only implementation; consumes an HttpClient from IHttpClientFactoryInvoiceXmlClientOptions β base URL, timeout (no auth)AddInvoiceXmlMcpCore(IServiceCollection, IConfiguration) β DI entry point; returns the IHttpClientBuilder so the host attaches auth as a DelegatingHandlerThe SDK never sees credentials. The host applies them through the HTTP pipeline. That seam is what lets one codebase serve both deployment modes.
InvoiceXml.Mcp.Host is an ASP.NET Core 10 app:
Mcp:AuthMode (ApiKey or OAuth) at startupDelegatingHandler onto the Core HTTP client via AddHostAuth(...)POST /, a human-friendly welcome page at GET /, and /healthAdding a new auth mode = one arm in AuthExtensions.cs plus a small folder under
Auth/<Mode>/. Adding a new tool = one [McpServerTool] class. Nothing else changes.
You need a .NET 10 SDK and an InvoiceXML API key.
GET http://localhost:5004/ shows a welcome page in a browser; the MCP endpoint is
POST http://localhost:5004/; GET /health returns { "status": "ok" }.
Environment variable equivalents (double underscore = nesting):
| Variable | Maps to |
|---|---|
INVOICEXML_API_KEY | Mcp:ApiKey:Value (friendly alias) |
Mcp__ApiKey__Value | Mcp:ApiKey:Value |
Mcp__AuthMode | Mcp:AuthMode (ApiKey or OAuth) |
Mcp__OAuth__AuthorizationServer | Mcp:OAuth:AuthorizationServer |
McpUri | McpUri (root-level) |
InvoiceXml__BaseUrl | InvoiceXml:BaseUrl |
When Mcp:AuthMode=OAuth the host stops accepting a static API key and instead:
WWW-Authenticate: Bearer resource_metadata="β¦" for any
POST / that has no Bearer token.GET /.well-known/oauth-protected-resource pointing MCP clients at
invoicexml.com as the authorization server.The dance an MCP client performs:
The host is a standard ASP.NET Core app β run it however you run .NET services (systemd, a container, a PaaS, etc.; the repo doesn't prescribe one):
Set configuration via environment variables on the host (never commit secrets):
ASPNETCORE_ENVIRONMENT=ProductionMcp__AuthMode=ApiKey (or OAuth)Mcp__ApiKey__Value=β¦ / INVOICEXML_API_KEY=β¦ (ApiKey mode)McpUri=https://your-public-url and Mcp__OAuth__AuthorizationServer=https://invoicexml.com (OAuth mode)Terminate TLS at your reverse proxy / load balancer and forward to the host's HTTP port. The server is stateless, so you can run multiple instances behind a load balancer.
MIT β see LICENSE.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/invoicexml)<a href="https://allmcps.com/mcp/invoicexml"><img src="https://allmcps.com/api/badge/invoicexml?style=directory" alt="InvoiceXML on AllMCPs" /></a>