sepa-validator-mcp
Validates SEPA credit-transfer XML files (ISO 20022 pain.001.001.03 and pain.001.001.09) through checksepa.com, returning structure and EPC findings such as errors and warnings for control sums, IBANs, transaction counts, charge bearers, and schema requirements.
Click 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., "@sepa-validator-mcpValidate the pain.001 file at samples/valid-pain001-001-03.xml"
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.
SEPA pain.001 validator — free API, CLI, and MCP server
Client tools for the free, keyless validator at checksepa.com. Send one SEPA credit-transfer XML file (ISO 20022 pain.001.001.03 or pain.001.001.09) and get structure and EPC findings back.
This repository is only the public client: CLI, MCP server, OpenAPI copy, samples, and examples. It does not contain the validator engine.
The file is uploaded to POST https://checksepa.com/v1/validate for that request. The service does not store it.
Free limits
Limit | Value |
API key | none |
Per IP per hour | 30 validations |
Per IP per UTC day | 200 validations |
Max upload | 2 MB |
Over the hourly or daily limit | HTTP 429 and |
Over 2 MB | HTTP 413 |
Higher limits and API keys: waitlist (joining is free; planned from EUR 79/month, charged only after confirmation). Docs: https://checksepa.com/docs. Machine-readable contract: openapi.json (copy in openapi/openapi.json).
A file can pass here and still be rejected by a bank. Bank implementation guidelines are out of scope. This is not a bank login, EBICS client, Verification of Payee check, or payment initiation.
pain.008 and camt messages are recognised (format and version) and returned with valid: false. They are not rule-checked yet.
Related MCP server: eleata e-invoice MCP server
curl
Using the published valid sample:
curl -F "file=@samples/valid-pain001-001-03.xml" https://checksepa.com/v1/validateRaw XML body:
curl -X POST https://checksepa.com/v1/validate \
-H "Content-Type: application/xml" \
--data-binary @samples/valid-pain001-001-09.xmlexamples/curl.sh wraps the multipart request.
Sample request and response
curl -F "file=@samples/invalid-pain001-001-03.xml" https://checksepa.com/v1/validateThe invalid sample is published as failing. The report has seven errors. The first one:
{
"valid": false,
"format": "pain.001",
"version": "pain.001.001.03",
"errors": [
{
"code": "EPC-CTRLSUM",
"message": "CtrlSum is 999.00 but the transactions sum to 175.50.",
"path": "/Document/CstmrCdtTrfInitn/GrpHdr/CtrlSum",
"line": 8
}
],
"warnings": []
}valid: true means the file passed the free baseline. errors and warnings use code, message, path, and line. line is 1-based, or null when the parser cannot place the finding.
Samples
Copied from the checksepa.com sample set. Synthetic data and dummy IBANs, not real payments.
File | What to expect |
Valid pain.001.001.03. Pass, no errors. | |
Valid pain.001.001.09. Pass, no errors. | |
Fail. Includes EPC-CTRLSUM, EPC-IBAN, EPC-NBOFTXS, EPC-CHRGBR, and XSD-REQUIRED. |
CLI
Python 3.9+, package sepa-check. The only dependency is requests.
pip install ./cli
sepa-check samples/valid-pain001-001-03.xml
sepa-check samples/invalid-pain001-001-03.xml --jsonNode 18+, package sepa-check, no dependencies:
npx ./cli-node samples/valid-pain001-001-03.xml
node cli-node/bin/sepa-check.js samples/invalid-pain001-001-03.xml --jsonHuman output prints each finding with its code, path, and line. --json prints the report. Exit 0 when valid is true, 1 when the file fails, 2 on usage, file, or HTTP errors (including 413 and 429).
After publish, the same commands are pip install sepa-check and npx sepa-check file.xml. They are not on PyPI or npm yet. Names checked on 19 October 2026: sepa-check was unused on both registries, and sepa-validator-mcp was unused on npm. See Publishing.
MCP server
mcp/ is a stdio MCP server, package sepa-validator-mcp. It exposes one tool, validate_sepa, with file_path or xml. The result is valid, format, version, errors[], and warnings[].
Registry metadata is in mcp/server.json (io.github.wenboteng/sepa-validator). Config snippets for Claude Desktop, Cursor, and VS Code are in mcp/README.md. Not submitted to the MCP registry yet.
Examples
Short snippets that post the file field. Each run spends one free validation.
Language | File |
curl | |
Python ( | |
Node ( | |
PHP | |
C# | |
Java |
Links
OpenAPI: https://checksepa.com/openapi.json
API waitlist: https://checksepa.com/api-waitlist
Samples on the site: https://checksepa.com/samples
Deutsch
Kostenlose Client-Werkzeuge für die Prüfung von SEPA-Überweisungen (ISO 20022 pain.001.001.03 und pain.001.001.09) auf checksepa.com. Kein API-Schlüssel. Dieses Repository enthält nur Clients, Beispiele und die öffentliche OpenAPI-Datei, nicht die Validator-Engine.
Die Datei geht an POST https://checksepa.com/v1/validate und wird für diese eine Anfrage geprüft. Sie wird nicht gespeichert.
Grenzen: 30 Prüfungen pro IP und Stunde, 200 pro IP und UTC-Tag, maximal 2 MB. Darüber HTTP 429 mit Retry-After, bei mehr als 2 MB HTTP 413. Höhere Limits und API-Schlüssel über die Warteliste (ab 79 €/Monat geplant, Zahlung erst nach Bestätigung).
curl -F "file=@samples/valid-pain001-001-03.xml" https://checksepa.com/v1/validateDie Beispieldateien unter samples/ sind synthetisch, mit Dummy-IBANs: gültige pain.001.001.03, gültige pain.001.001.09, und eine ungültige pain.001.001.03 (unter anderem EPC-CTRLSUM und EPC-IBAN).
Antwortfelder: valid, format (zum Beispiel pain.001), version (zum Beispiel pain.001.001.03), errors[] und warnings[]. Jeder Fund hat code, message, path und line.
CLI: sepa-check datei.xml (Python) oder npx sepa-check datei.xml (Node, nach Veröffentlichung). Exit-Code 0 bei gültig, 1 bei ungültig, 2 bei Aufruf- oder HTTP-Fehler. --json gibt den Bericht aus.
pain.008 und camt werden erkannt und mit valid: false zurückgegeben. Sie werden noch nicht regelgeprüft. Eine bestandene Datei kann von der Bank trotzdem abgelehnt werden (bankeigene MIG). Kein Bank-Login, kein EBICS, keine Zahlungsauslösung.
Links: API-Doku, OpenAPI, Warteliste.
Development
GitHub Actions lints the Python and Node clients, typechecks the MCP server, boots it over stdio, and runs live checks of the published samples. Those live checks skip when checksepa.com:443 cannot be reached.
python -m pip install ./cli
python -m unittest discover -s tests -p 'test_*.py' -v
node --test cli-node/test/*.test.js
cd mcp && npm ci && npm run build && node --test test/*.test.js && node scripts/stdio-smoke.mjsnode mcp/scripts/stdio-smoke.mjs samples/valid-pain001-001-03.xml performs one extra live tool call. Do not loop it: the free quota is 30 per IP per hour.
Publishing
Nothing in this repo is on npm, PyPI, or the MCP registry. Names checked on 19 October 2026 while preparing this tree: sepa-check (PyPI and npm) and sepa-validator-mcp (npm) were unused (registry 404). Do not publish from CI. Do not publish from this checkout unless you mean to.
PyPI, from a machine logged in via ~/.pypirc or an API token:
cd cli
python -m pip install build twine
python -m build
python -m twine upload dist/*npm CLI (unscoped package, public by default):
cd cli-node
npm login
npm publishnpm MCP server. npm publish runs prepack, which compiles TypeScript. Publish this package before the registry entry, because the registry checks mcpName in the published package.json.
cd mcp
npm login
npm publishMCP registry, only after that npm publish. Use the official mcp-publisher binary from modelcontextprotocol/registry, not the unrelated npm package named mcp-publisher.
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
sudo mv mcp-publisher /usr/local/bin/
cd mcp
mcp-publisher validate server.json
mcp-publisher login github
mcp-publisher publishThe metadata points at https://github.com/wenboteng/sepa-validator. That remote is not created by this tree.
License
MIT. Copyright (c) 2026 Bobook Limited. See LICENSE.
The API is operated by Bobook Limited. Contact published on the service: info@bobook.club.
This server cannot be deployed
Maintenance
Related MCP Connectors
Generate and validate SEPA ISO 20022 XML (pain.001, pain.008) and SWIFT MT103 payment messages.
Validate, parse and render EU e-invoices: XRechnung, ZUGFeRD, Factur-X, Peppol BIS 3.0, KSeF.
Generate, validate and read EN 16931 and Peppol BIS 3.0 e-invoices, in UBL and CII.
Validate JSON, YAML, XML and CSV with exact line/column errors and silent-corruption warnings.
Related MCP Servers
- AlicenseAqualityAmaintenanceIBAN validation across 89 countries, BIC/SWIFT and Swiss clearing lookup, batch validation, payment-reference, postal-address and Swiss QR-bill checks for AI agents. Connect via MCP or the REST API. Includes free quotas, paid credits and a Pro subscription. SEPA and country-risk indicators support payment-data checks; they do not confirm account ownership or replace beneficiary AML/KYC screening.1327 npm3MIT
- AlicenseAqualityDmaintenanceValidates EU electronic invoices (Peppol, XRechnung, FatturaPA, etc.) and explains validation error codes, enabling AI coding agents to check invoice validity and get fixes before rejection.317 npmMIT
- AlicenseAqualityCmaintenanceValidates electronic invoices (XRechnung, ZUGFeRD, Factur-X, Peppol BIS, etc.) against authority-pinned rules and explains failures.2165 npmMIT
- AlicenseNot gradedqualityDmaintenanceEU e-invoice validation, as a developer API. Check whether an electronic invoice conforms to EN 16931 — the European standard behind France, Germany, Belgium, Poland and the 2030 ViDA mandate — with a single REST call. Structured JSON errors mapped to the official BR-* business rules. No enterprise sales call required.MIT