Jithox MCP — free EU e-invoice, Peppol, VAT and IBAN checks for AI agents
Jithox runs a remote MCP server with read-onlychecks for e-invoices and payments: Peppol BIS Billing 3.0 rule validation,Peppol participant (receiver) lookup, EU VAT number format and VIES coverage,IBAN structure, supplier bank-detail changes, and turning a CSV/XLSX file intoclean data.
It is for developers and AI agents that prepare an e-invoice or a payment andwant a check before something is sent, submitted to Peppol, or paid.
This repository holds examples and a registry manifest only. It contains noserver code. The server itself is hosted by Jithox.
Connect
https://jithox.com/api/mcp
Transport: Streamable HTTP (POST, JSON-RPC 2.0). No auth needed for the freetools below.
{
"mcpServers": {
"jithox": { "url": "https://jithox.com/api/mcp" }
}
}
Claude Desktop
Open Settings → Developer → Edit Config, and add the block above toclaude_desktop_config.json (macOS:~/Library/Application Support/Claude/claude_desktop_config.json; Windows:%APPDATA%\Claude\claude_desktop_config.json). Restart Claude Desktop. NoOAuth prompt appears — this endpoint needs no login for the free tools.
What works without an account
The endpoint lists 19 tools. 8 of them are free and need no token and noaccount (checked 2026-09-23, curl against production, each with a validpayload — earlier counts of "7 of 18" were stale):
| Tool | What it does |
|---|---|
check_peppol_ready |
Checks an invoice against 21 published Peppol BIS Billing 3.0 rules and names each failing rule with a fix. Not the official validator. |
lookup_peppol_participant |
Asks the live Peppol registers whether a given customer (by enterprise/VAT number) can receive an e-invoice today, and which document types their access point accepts. |
verify_iban |
IBAN structure and check digits (ISO 13616 / ISO 7064). Never claims the account exists or who owns it. |
check_vat_list_format |
Up to 20 EU VAT numbers: empty, malformed, duplicate, or not covered by VIES. Local only — does not ask the VAT register. |
check_payment_change |
A supplier says their bank details changed: checks the new IBAN and says what to verify before updating the record. |
file_to_data_inspect |
Reads a CSV / XLSX / JSON file and proposes a column mapping. |
file_to_data_transform |
Applies exactly the mapping you send and returns rows plus a per-row error report. |
core_condition |
Compares two values and returns a true/false branch. |
The other 11 tools need a Jithox bearer token and cost credits per acceptedcall, among them format_peppol_invoice (generate the UBL/Peppol XML, 5credits), kbo_company_search and check_vat_list (live VIES lookup),review_invoice (full invoice review, 8 credits) and analyze_kbo_financials.Called without a token they return a payment_required error that names thetoken URL — nothing runs and nothing is charged.
Limits: 30 requests per minute per IP on this endpoint; above that you getHTTP 429 with Retry-After. Every answer carries a doesNotProve field or astated limit — read it before you act on a result.
Three calls, all run against production on 2026-09-23
Output is shown as returned; … marks where it was shortened for this page.
1. Will Peppol accept this invoice?
curl -s https://jithox.com/api/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_peppol_ready","arguments":{"invoiceNumber":"INV-2026-0001","issueDate":"2026-09-23","currency":"EUR","buyerReference":"PO-4471","totalWithoutVat":1000,"totalVat":210,"totalWithVat":1210,"lines":[{"description":"Consulting hours","quantity":10,"unitPrice":100,"vatPercent":21}],"supplier":{"name":"Seller BV","countryCode":"BE","endpointId":"0403170701","endpointScheme":"0208"},"customer":{"name":"Buyer NV","countryCode":"BE","endpointId":"0400378485","endpointScheme":"0208"}}}}'
The tool result (result.content[0].text), unwrapped:
{
"kind": "peppol_ready_check",
"data": {
"verdict": "ready",
"failed": [],
"passed": [ … 21 rules, e.g. BR-02, PEPPOL-EN16931-R010, PEPPOL-EN16931-R003 … ],
"notChecked": [],
"summary": "Nothing is wrong among the 21 rules this check covers.",
"rulesChecked": 21,
"doesNotProve": "This checks 21 of the published Peppol BIS Billing 3.0 rules … a clean result here means nothing among these rules is wrong, not that the network will accept the document."
}
}
Change issueDate to "23/09/2026" or drop buyerReference and the samecall returns "verdict": "will_be_rejected" with the specific rule thatfailed (e.g. PEPPOL-EN16931-F001, PEPPOL-EN16931-R003) — checked2026-09-22.
2. Can this customer actually receive it over Peppol?
curl -s https://jithox.com/api/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"lookup_peppol_participant","arguments":{"identifier":"0403170701"}}}'
{
"kind": "peppol_participant_lookup",
"data": {
"participantId": "0208:0403170701",
"reachable": "yes",
"documentTypes": [
{ "profile": "Peppol BIS Billing 3.0", "document": "Invoice", "raw": "…" }
…
]
}
}
This asks the live Peppol directory about a THIRD PARTY. It is never apromise the invoice will arrive, be accepted or be paid — every answer saysso.
3. Clean a list of EU VAT numbers before invoicing
curl -s https://jithox.com/api/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"check_vat_list_format","arguments":{"rows":[{"reference":"acme","vatId":"BE0400378485"},{"vatId":"NL 8558.76.323.B01"},{"vatId":"BE0400378486"},{"vatId":"GB123456789"}]}}}'
{
"kind": "vat_list_check",
"data": {
"ok": true,
"rows": [
{ "index": 0, "reference": "acme", "normalized": "BE0400378485", "local": "well_formed", "register": "not_run", … },
{ "index": 1, "normalized": "NL855876323B01", "local": "well_formed", "register": "not_run", … },
{ "index": 2, "normalized": "BE0400378486", "local": "malformed", "register": "not_run",
"detail": "The last two digits of a Belgian number are a check on the first eight, and here they do not match — usually a typing error. The register was not asked." },
{ "index": 3, "normalized": "GB123456789", "local": "not_covered", "register": "not_run",
"detail": "Great Britain left the EU register (VIES) in 2021, so this number cannot be checked here." }
],
"totals": { "rows": 4, "wellFormed": 2, "malformed": 1, "notCovered": 1, "duplicate": 0, … },
…
}
}
well_formed is not registered: this tool never asks the VAT register (thatis check_vat_list, a paid tool).
Examples in code
examples/python/peppol_ready.py—standard library only:initialize, thencheck_peppol_readyon acompliant invoice, thenlookup_peppol_participanton the buyer. Run withpython examples/python/peppol_ready.py. Real output against production,2026-09-23:server: jithox-engine verdict: ready - Nothing is wrong among the 21 rules this check covers. reachable: yes participant: 0208:0403170701examples/python/free_tools.py— standardlibrary only:initialize,tools/list, thenverify_iban.examples/csharp/Program.cs—HttpClient:initialize, thencheck_vat_list_format. Runs withdotnet runin aconsole project, orcsc -r:System.Net.Http.dll Program.cson .NET Framework 4.x.examples/dogfood/— our owndogfood example (in Dutch): the paidcheck_vat_liston the VAT number of an invoice we received.
Agent Skill: pay-invoices-safely
skills/pay-invoices-safely/SKILL.mdis an Agent Skill for an agent thatis about to pay a supplier invoice or change a supplier's bank account. Itteaches the agent to call check_payment_change on every new IBAN and to holdthe payment for a call-back by a person, to check the invoice with the freePOST /api/invoice/review, and to check VAT numbers against the EU VIESregister with the paid review_invoice. Copy the folder into your agent'sskills directory.
Every example in the skill runs against production. To check that it stilldoes (Node 18+, no dependencies):
node scripts/check-skill.mjs
It checks the spec rules, runs each curl example, requires every tool itcalls to be in the live tools/list, and fails on a euro sign, EUR, USD, a$ amount or " credits" in the text.
Machine-readable pointers
- https://jithox.com/llms.txt
- https://jithox.com/.well-known/mcp.json
server.jsonin this repository, following the official MCPregistry schema (2025-12-11). The server is also published in theofficial MCP registry ascom.jithox/jithox(registry.modelcontextprotocol.io/v0/servers?search=com.jithox/jithox).
What this server does not do
Nothing on this endpoint sends an invoice, submits it to Peppol, posts, paysor delivers anything. Results are technical checks, not legal or tax advice.
License
The examples and files in this repository are MIT-licensed (see LICENSE).The Jithox service itself is not open source.