io.github.sebastienrousseau/pain001-mcp
PYPI · PAIN001-MCP · SCANNED SEP 20
MCP server for ISO 20022 pain.001/pain.008 payment-file generation and validation.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs poetry.core.masonry.api at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 3 of 41 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency48
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (Apache-2.0 OR MIT).Pass
- Actively maintained (last published 7 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability78
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 6693 tokens (~318/item across 21 items; 21 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (33% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 21 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 21 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the io.github.sebastienrousseau/pain001-mcp server?
io.github.sebastienrousseau/pain001-mcp runs locally as a PyPI package, launched with uvx pain001-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · pain001-mcp
claude mcp add sebastienrousseau-pain001-mcp -- uvx pain001-mcp
{
"mcpServers": {
"sebastienrousseau-pain001-mcp": {
"command": "uvx",
"args": [
"pain001-mcp"
]
}
}
} {
"servers": {
"sebastienrousseau-pain001-mcp": {
"command": "uvx",
"args": [
"pain001-mcp"
]
}
}
} codex mcp add sebastienrousseau-pain001-mcp -- uvx pain001-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"sebastienrousseau-pain001-mcp": {
"type": "local",
"command": [
"uvx",
"pain001-mcp"
],
"enabled": true
}
}
} openclaw mcp add sebastienrousseau-pain001-mcp --command uvx --arg pain001-mcp
mcp_servers:
sebastienrousseau-pain001-mcp:
command: "uvx"
args: ["pain001-mcp"] {
"McpServers": {
"sebastienrousseau-pain001-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"pain001-mcp"
]
}
}
} assistant mcp add sebastienrousseau-pain001-mcp -t stdio -c uvx -a pain001-mcp
{
"mcpServers": {
"sebastienrousseau-pain001-mcp": {
"command": "uvx",
"args": [
"pain001-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 19 Sept 26 +1
- Stability: 0.97 → pass security
- 18 Sept 26 +14
- Malware scan: unverified → pass ▲ security
- Stability: pass → 0.97 functional
- 17 Sept 26 −14
- Malware scan: pass → unverified ▼ security
- Stability: 0.97 → pass security
- 15 Sept 26 +16
- Malware scan: unverified → pass ▲ security
- 14 Sept 26 −15
- Malware scan: pass → unverified ▼ security
- 13 Sept 26 +16
- Malware scan: unverified → pass ▲ security
- 12 Sept 26 −15
- Stability: 0.80 → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Malware scan: pass → unverified ▼ security
- Tool coverage: 41% → 33% ▼ functional
- Schema quality: 5689 → 6693 ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 0.0.65 → 0.0.70 functional
- Package version: 0.0.65 → 0.0.69 functional
- Package version: 0.0.65 → 0.0.67 functional
- Package version: 0.0.65 → 0.0.66 functional
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed pypi/pain001-mcp@0.0.70
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | poetry.core.masonry.api |
Background: Why install scripts are a supply-chain risk →
Dependencies 41 packages
| Packages resolved | 41 |
|---|---|
| Stale | 2 |
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
convert_mt101 Convert MT101 to pain.001 records ~360
Convert a legacy SWIFT MT101 message into pain.001-ready records. Use this to bridge the Nov-2025+ SWIFT MT→MX migration: parse an MT101 (*Request for Transfer*) into the flat records the other tools consume — feed the result straight to ``validate_records`` / ``validate_payment_scheme`` and then ``generate_message`` to emit pain.001.001.09 XML. An MT101 can request many transfers (repeating sequence B), so this returns *one record per transaction*. Operates on the supplied text only; no file is read or written. Wraps :func:`pain001_loader_mt101.loader.parse_mt101`. Sequence-A ordering-customer / account-servicing fields apply to every transaction unless a sequence-B block overrides them; fields the MT101 does not carry are synthesised to schema defaults (``payment_method`` ``"TRF"``, ``service_level_code`` ``"SEPA"``, etc.). Args: mt101_text: The MT101 payload as a string. Returns: A list of flat pain.001 records (one per transaction), or an ``{"error": ...}`` dict if the MT101 is missing a mandatory field (``:20:``, ``:30:``, or per transaction ``:21:`` / ``:32B:`` / a named beneficiary) or is otherwise malformed.
| Name | Type | Req | Description |
|---|---|---|---|
| mt101_text | string | yes | A legacy SWIFT MT101 (Request for Transfer) message as text — a bare ':tag:' field list or a raw '{4:...-}' block-4 envelope. An MT101 may carry several sequence-B transfers; each becomes its own rec… |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
generate_message Generate pain XML from records ~609
Generate a validated ISO 20022 pain XML message from in-memory records. This is the primary generation tool: pass records you already hold in memory. Use ``generate_message_from_file`` when the data lives in a CSV on disk, and ``generate_message_async`` for very large batches you want to run off the event loop. The result is XSD-validated before return; no file is written. Records are normalized before rendering: 'amount'/'currency' aliases, JSON booleans, and bare 'YYYY-MM-DD' dates are accepted, and nb_of_txs/ctrl_sum are computed from the records. On failure the ``{"error": ...}`` payload lists every missing or invalid field at once. IBAN/BIC values are strictly validated, never coerced. Returns the validated XML document as a string, or a JSON-encoded ``{"error": ...}`` payload if generation fails. Args: message_type: A supported ISO 20022 pain message type. records: One or more flat payment records.
| Name | Type | Req | Description |
|---|---|---|---|
| message_type | string | yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '… |
| records | array | yes | One or more flat payment records (dicts of field name → value). Key fields (see get_input_schema for the full contract): id, date (payment-initiation timestamp; 'YYYY-MM-DD' is accepted and rendered… |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
generate_message_async Generate pain XML (async, large batches) ~548
Generate validated pain XML off the event loop, for large batches. Behaves exactly like ``generate_message`` but runs the synchronous renderer in a worker thread so an agent can interleave a long generation with other tool calls. Use ``generate_message`` for small or interactive batches; use this only when the record count is large enough that blocking would matter. Delegates to :func:`pain001.async_adapter.generate_xml_string_async`. Returns the validated XML, or a JSON-encoded ``{"error": ...}`` payload. Args: message_type: A supported ISO 20022 pain message type. records: One or more flat payment records.
| Name | Type | Req | Description |
|---|---|---|---|
| message_type | string | yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '… |
| records | array | yes | Same record shape and ergonomics as generate_message; use this async variant only when the batch is large. One or more flat payment records (dicts of field name → value). Key fields (see get_input_sc… |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
generate_message_from_file Generate pain XML from a CSV file ~423
Generate validated pain XML from a CSV file on the local disk. Use this when the records live in a CSV file rather than in memory; it reads ``data_file_path`` from the local filesystem, then delegates to ``generate_message``. If you already have the records as dicts, call ``generate_message`` directly. Only CSV is supported today (JSON / JSONL / SQLite / Parquet are planned for a follow-up release). Loads ``data_file_path`` via :func:`pain001.csv.load_csv_data.load_csv_data` so the same path-safety guards apply as in the core library. Args: message_type: A supported ISO 20022 pain message type. data_file_path: Path to a CSV file with one record per row. Returns: The validated XML, or a JSON-encoded ``{"error": ...}`` payload.
| Name | Type | Req | Description |
|---|---|---|---|
| data_file_path | string | yes | Local filesystem path to a CSV file with one payment record per row and a header matching the template columns (see inspect_template). Only CSV is supported today. |
| message_type | string | yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '… |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_corpus_coverage Get schema coverage report ~156
Return the schema coverage verdict of one message type's coverage set. Use this to check that the shipped coverage files reach every element path and choice branch of an edition's XSD before relying on them to smoke a parser or a mapping. Delegates to :func:`pain001.corpus.coverage_report`. Args: version: The message type. Returns: The ``coverage.json`` content (path and branch counts and percentages, completeness, missing and exempt lists), or ``{"error": ...}`` when the edition has no set or there is no corpus.
| Name | Type | Req | Description |
|---|---|---|---|
| version | string | yes | The message type, e.g. 'pain.001.001.13'. |
No output schema declared.
No examples provided.
get_corpus_file Get example corpus file ~246
Return the XML of one validated example file from the market corpus. Use this to show a model, a tester or a mapping exercise what a correct file for a given country and rail looks like in a given edition. The text is exactly what pain001 ships; it passed the XSD, the ISO MDR rules, the rail profile and the overlay when it was built. Delegates to :func:`pain001.corpus.get_file`. Args: scenario_id: The scenario. version: The message type. variant: The overlay id of a bank variant, else ``None``. Returns: ``{"scenario_id", "version", "variant", "xml"}``, or ``{"error": ...}`` when there is no such file or no corpus.
| Name | Type | Req | Description |
|---|---|---|---|
| scenario_id | string | yes | The market scenario, e.g. 'gb.chaps.property-purchase' (from list_corpus_files). |
| variant | – | – | An overlay id for the bank variant, e.g. 'gb.example.priority'; omit for the generic file. |
| version | string | yes | The message type, e.g. 'pain.001.001.09'. |
No output schema declared.
No examples provided.
get_corpus_provenance Get example corpus provenance ~222
Return the provenance sidecar of one example file. Use this to know how far to trust a file: the sources it was derived from, the confidence of the evidence (``verified``, ``derived`` or ``assumed``), the validation ladder result per rung, what the builder renamed or dropped to fit the edition, and the file's SHA-256. Delegates to :func:`pain001.corpus.provenance`. Args: scenario_id: The scenario. version: The message type. variant: The overlay id of a bank variant, else ``None``. Returns: The parsed sidecar as a dict, or ``{"error": ...}`` when there is no such file or no corpus.
| Name | Type | Req | Description |
|---|---|---|---|
| scenario_id | string | yes | The market scenario (from list_corpus_files). |
| variant | – | – | An overlay id for the bank variant; omit for the generic file. |
| version | string | yes | The message type, e.g. 'pain.001.001.09'. |
No output schema declared.
No examples provided.
get_input_schema Get input JSON Schema ~287
Return the full JSON Schema for a message type's flat input record. Use this to learn every field, its type, and its constraints before assembling records, or to drive a form/UI. For just the required-field names use ``get_required_fields``; to actually check records against this schema use ``validate_records``. Args: message_type: A supported ISO 20022 pain message type.
| Name | Type | Req | Description |
|---|---|---|---|
| message_type | string | yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '… |
No output schema declared.
No examples provided.
get_required_fields Get required fields ~273
List only the required input field names for a pain message type. Use this for a quick checklist of the mandatory columns before building records. When you need full type/format constraints (not just which fields are required), call ``get_input_schema`` instead. Args: message_type: A supported ISO 20022 pain message type.
| Name | Type | Req | Description |
|---|---|---|---|
| message_type | string | yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '… |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
inspect_template Inspect CSV template columns ~352
Return the CSV column headers the message type's bundled template uses. Use this to see the exact column order for hand-building a CSV before ``generate_message_from_file``. This returns column *names* from the bundled sample; for the typed JSON contract (types, required flags) use ``get_input_schema``. Mirrors the in-tree ``pain001.mcp.server.inspect_template`` tool so an agent can introspect the column layout before assembling rows. Args: message_type: A supported ISO 20022 pain message type. Returns: ``{"message_type": str, "columns": list[str]}`` or ``{"error": ...}`` if the type is unsupported or no template ships.
| Name | Type | Req | Description |
|---|---|---|---|
| message_type | string | yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '… |
No output schema declared.
No examples provided.
list_corpus_files List example corpus files ~308
List the example files pain001 ships: market scenarios and coverage sets. Use this to discover what ready-made, validated ISO 20022 files exist before calling ``get_corpus_file`` or ``get_corpus_provenance``. Market files are realistic payments per country and rail (``scenario_id`` like ``gb.chaps.property-purchase``); a ``variant`` names the bank overlay a file was built with. Coverage files exercise every element and choice branch of one message type and carry no scenario. Delegates to :func:`pain001.corpus.list_files`. Args: kind: ``market``, ``coverage`` or ``None`` for both. country: Optional two-letter country filter for market files. version: Optional message-type filter. Returns: ``{"count", "files": [{"kind", "scenario_id", "version", "country", "family", "variant", "file"}, ...]}``, or ``{"error": ...}`` when the installed pain001 has no corpus.
| Name | Type | Req | Description |
|---|---|---|---|
| country | – | – | Two-letter country code to keep one market pack only, e.g. 'GB' or 'CH'. Ignored for coverage files. |
| kind | – | – | 'market' for the realistic per-country scenarios, 'coverage' for the schema coverage sets, or omit for both. |
| version | – | – | Keep only files of this message type, e.g. 'pain.001.001.09'. |
No output schema declared.
No examples provided.
list_message_types List pain message types ~116
List every supported ISO 20022 pain message type and its human name. Use this first, before any generation or validation call, to discover the exact ``message_type`` strings this server accepts. Do not use it to fetch a type's fields or schema — call ``get_required_fields`` or ``get_input_schema`` for that. Returns a list of ``{"message_type": ..., "name": ...}`` dictionaries, one per supported message type (e.g. ``pain.001.001.09``).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
list_supported_formats List supported input formats ~127
List the on-disk data formats the pain001 loader can read. Use this to tell a user which file types they may supply to ``generate_message_from_file``. This lists *data-source* formats (CSV, SQLite, …); for the list of ISO 20022 *message* types call ``list_message_types`` instead. Returns a list of ``{"id", "name", "extension"}`` dictionaries covering CSV, SQLite, JSON, JSONL, and Parquet (the last requires the ``pain001[parquet]`` extra).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
migrate_records Migrate records between versions ~348
Migrate flat payment records between two pain.001 schema versions. Use this to upgrade/downgrade records when your bank requires a different pain.001 version than your source data uses (e.g. move ``.03`` rows to ``.09``); it reports which fields were renamed, derived, or dropped. This transforms records only — run ``validate_records`` afterwards, then ``generate_message`` to emit XML. Wraps :class:`pain001.migration.VersionMapper`. Returns the migrated rows plus a summary of which fields were renamed, derived, or dropped; ``{"error": ...}`` if either version is unsupported. Args: records: Records in the ``from_version`` shape. from_version: Source pain.001 version (e.g. ``"pain.001.001.03"``). to_version: Target pain.001 version (e.g. ``"pain.001.001.09"``). Returns: ``{"records": [...], "migrated": int, "from": str, "to": str}`` or ``{"error": ...}``.
| Name | Type | Req | Description |
|---|---|---|---|
| from_version | string | yes | Source pain.001 schema version the records currently use, e.g. 'pain.001.001.03' — see list_message_types. |
| records | array | yes | Flat payment records in the from_version shape, each a dict of field name → value, to transform to to_version. |
| to_version | string | yes | Target pain.001 schema version to migrate the records to, e.g. 'pain.001.001.09' — see list_message_types. |
No output schema declared.
No examples provided.
parse_camt053 Parse camt.053 statement file ~300
Parse a camt.053 bank-statement XML file on disk into structured data. Use this to read a bank's account statement (the reply that confirms settlement) into a header + entry list. Reads ``xml_file_path`` from the local filesystem. For the payment-status reply (accepted/rejected per transaction) use ``parse_pain002`` instead; to validate a camt.053 string you already hold, this is not it — this tool needs a file path. Wraps :func:`pain001.parse_camt053_statement`. When ``xsd_file_path`` is provided, the document is first validated against that XSD; on a schema or parse error the tool returns ``{"error": ...}`` rather than raising. Args: xml_file_path: Filesystem path to the camt.053 XML statement. xsd_file_path: Optional path to a camt.053 XSD for upfront validation. Returns: A compact dict with the statement header and entry list, or an ``{"error": ...}`` payload on failure.
| Name | Type | Req | Description |
|---|---|---|---|
| xml_file_path | string | yes | Local filesystem path to the camt.053 bank-statement XML file to parse. |
| xsd_file_path | – | – | Optional local path to a camt.053 XSD; when given, the document is validated against it before parsing. Omit to skip schema validation. |
No output schema declared.
No examples provided.
parse_pain002 Parse pain.002 status report file ~268
Parse a pain.002 payment-status report file on disk into structured data. Use this to read the bank's acknowledgement of a submitted pain.001 — the per-transaction accepted/rejected status and reason codes. Reads ``xml_file_path`` from the local filesystem. For the account statement that later confirms booked entries, use ``parse_camt053`` instead. Wraps :func:`pain001.parse_pain002_report`. When ``xsd_file_path`` is provided, the document is first validated against that XSD; on a schema or parse error the tool returns ``{"error": ...}`` rather than raising. Args: xml_file_path: Filesystem path to the pain.002 XML report. xsd_file_path: Optional path to a pain.002 XSD for upfront validation. Returns: A dict with the group header and transaction statuses, or an ``{"error": ...}`` payload on failure.
| Name | Type | Req | Description |
|---|---|---|---|
| xml_file_path | string | yes | Local filesystem path to the pain.002 payment-status report XML file to parse. |
| xsd_file_path | – | – | Optional local path to a pain.002 XSD; when given, the document is validated against it before parsing. Omit to skip schema validation. |
No output schema declared.
No examples provided.
sanitize_to_iso20022_charset Sanitise text to ISO 20022 charset ~490
Sanitise one free-text field to a SWIFT / ISO 20022 character set. Use this on a single free-text value (name, remittance info) to transliterate accents and drop unsupported symbols before placing it in a record, and to see whether the value changed. Operates on one string; to check a whole batch's rulebook compliance use ``validate_payment_scheme``. Two character sets are supported via ``charset``: * ``"SWIFT_X"`` (default, backward-compatible) - the basic set used in most ISO 20022 / pain.001 fields. Delegates to :func:`pain001.sanitize_to_charset`. * ``"SWIFT_Z"`` - the SWIFT extended set, a strict superset of X that also permits ``= ! " % & * < > ; { @ # _`` (used in narrative / envelope fields). It does not permit ``|`` or ``}``. In both cases accents are transliterated (``é`` -> ``e``) and any remaining out-of-set character is replaced with a space. The result includes flags for whether the original was already valid and whether it changed - useful for surfacing the change to the user before writing it back to a record. Args: value: The text to sanitise. charset: ``"SWIFT_X"`` (default) or ``"SWIFT_Z"``. Returns: ``{"value": str, "sanitised": str, "was_valid": bool, "changed": bool}``.
| Name | Type | Req | Description |
|---|---|---|---|
| charset | string | – | Which SWIFT character set to sanitise against. 'SWIFT_X' (default) is the basic set permitted in most ISO 20022 / pain.001 fields: letters, digits, space and the punctuation / - ? : ( ) . , ' + . 'SW… |
| value | string | yes | A single free-text field value (e.g. a name or remittance line) to transliterate to the ISO 20022 Latin character set. |
No output schema declared.
No examples provided.
validate_identifier Validate IBAN or BIC ~196
Validate a single financial identifier (IBAN or BIC). Use this for a one-off identifier check with a clear pass/fail and reason. To validate identifiers embedded across a whole batch, prefer ``validate_records`` / ``validate_payment_scheme`` instead of calling this per field. Returns ``{"kind": str, "value": str, "valid": bool, "error": str}`` (the ``error`` key is present only when ``valid`` is ``False``). Args: kind: One of ``"iban"`` or ``"bic"`` (case-insensitive). value: The identifier value to check.
| Name | Type | Req | Description |
|---|---|---|---|
| kind | string | yes | Which identifier to validate: 'iban' or 'bic' (case-insensitive). Any other value returns an error. |
| value | string | yes | The identifier string to check — an IBAN or BIC/SWIFT code matching the chosen kind. |
No output schema declared.
No examples provided.
validate_payment_scheme Validate against scheme rulebook ~290
Validate records against a payment-scheme rulebook (e.g. SEPA). Use this after ``validate_records`` to enforce scheme-specific business rules (SEPA field lengths, allowed characters, currency/BIC constraints) that JSON-Schema validation alone does not cover. ``validate_records`` checks structural shape; this checks rulebook compliance for one profile. Delegates to :func:`pain001.validate_scheme`. Supported profiles: ``sepa-sct``, ``sepa-sdd``, ``sepa-inst``, ``xborder-ct``. Args: records: Payment records as a list of flat dicts. profile: The scheme profile name. Returns: ``{"profile", "is_valid", "violations": [...]}`` with structured ``violations`` (each with ``rule``, ``severity``, ``field``, ``message``, ``remediation`` keys), or ``{"error": ...}`` for an unknown profile.
| Name | Type | Req | Description |
|---|---|---|---|
| profile | string | – | The payment-scheme rulebook profile to enforce. One of 'sepa-sct', 'sepa-sdd', 'sepa-inst', or 'xborder-ct'. Defaults to 'sepa-sct'. |
| records | array | yes | Payment records as a list of flat dicts (field name → value) to check against the scheme rulebook. |
No output schema declared.
No examples provided.
validate_records Validate records against schema ~365
Validate flat records against a message type's input JSON Schema. Use this before ``generate_message`` to catch structural/type errors per record and get a row-by-row error report. This checks JSON-Schema shape only; for payment-scheme rulebook checks (SEPA field lengths, charset, etc.) also run ``validate_payment_scheme``. Returns a report ``{"valid": bool, "total": int, "valid_count": int, "errors": [...]}``. Args: message_type: A supported ISO 20022 pain message type. records: One or more flat payment records to validate.
| Name | Type | Req | Description |
|---|---|---|---|
| message_type | string | yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '… |
| records | array | yes | One or more flat payment records to validate, each a dict of field name → value (see get_input_schema for the fields and get_required_fields for the mandatory ones). |
No output schema declared.
No examples provided.
validate_xml_against_schema Validate XML string against XSD ~409
Validate a raw pain.001 / pain.008 XML string against its official XSD. Use this to check XML you already have as a string (e.g. received from another system) without touching the filesystem. To validate records *before* they become XML, use ``validate_records``; to parse a statement or status-report file, use ``parse_camt053`` / ``parse_pain002``. Wraps :func:`pain001.xml.validate_via_xsd.validate_xml_string_via_xsd`. Args: xml_content: The XML document as a string. message_type: A supported ISO 20022 pain message type. Returns: ``{"valid": bool, "message_type": str, "error": str?}`` - ``error`` is present only when ``valid`` is ``False``.
| Name | Type | Req | Description |
|---|---|---|---|
| message_type | string | yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '… |
| xml_content | string | yes | The full pain.001 / pain.008 XML document as a string, validated against the message type's official XSD. |
No output schema declared.
No examples provided.
What is the io.github.sebastienrousseau/pain001-mcp server?
io.github.sebastienrousseau/pain001-mcp is listed in the public MCP registry as io.github.sebastienrousseau/pain001-mcp. MCP server for ISO 20022 pain.001/pain.008 payment-file generation and validation. This page covers its PyPI package (pain001-mcp).
Is the io.github.sebastienrousseau/pain001-mcp server safe to use?
io.github.sebastienrousseau/pain001-mcp scores 86 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.sebastienrousseau/pain001-mcp server expose?
io.github.sebastienrousseau/pain001-mcp exposes 21 tools: list_message_types, get_required_fields, get_input_schema, validate_records, validate_identifier, and 16 more. Their descriptions and schemas cost roughly 6,693 tokens of context every time the server is loaded.
Is the io.github.sebastienrousseau/pain001-mcp server still maintained?
io.github.sebastienrousseau/pain001-mcp is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.sebastienrousseau/pain001-mcp server under?
io.github.sebastienrousseau/pain001-mcp declares the Apache-2.0 OR MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.