io.github.sebastienrousseau/pain001-mcp
PYPI · PAIN001-MCP
ISO 20022 payment files for agents: generate, validate, and convert pain.001, pain.008, MT101.
Available components
Last scanned (15 hours ago)
Scores higher than 82% of PyPI servers
Category Finance and Payments
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 Security50
- Malware scan not yet available for this package.Unverified
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs poetry.core.masonry.api at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 3 of 43 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to sebastienrousseau/pain001-mcp). View diagnostics → Pass
- 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 Usability77
- 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 8659 tokens (~333/item across 26 items; 26 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 (100% 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 26 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 26 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
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.
- 4 Nov 26 −15
- Malware scan: pass → unverified ▼ security
- 3 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- 31 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- 30 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 28 Oct 26 0
- Package version: 0.0.74 → 0.0.75 functional
- 27 Oct 26 +1
- Stability: 0.97 → pass security
- 26 Oct 26 −16
- Malware scan: pass → unverified ▼ security
- Stability: pass → 0.97 functional
- 24 Oct 26 +15
- Malware scan: unverified → pass ▲ security
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 4 Nov 2026 · Analysed pypi/pain001-mcp@0.0.75
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | sebastienrousseau/pain001-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/sebastienrousseau/pain001-mcp/.github/workflows/release.yml@refs/tags/v0.0.75 |
| Rekor log index | 3538258279 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:6dfe4fce0802ae2a0eb9d6a8c2b2c68fdfbe4af91be11a16af2cc8c087e9f7b5 |
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 43 packages
| Packages resolved | 43 |
|---|---|
| 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 →
commit_payment_batch Commit staged payment batch with dual control ~182
Commit an authorized staged payment batch with dual-control authorization. Verifies the stage ID and validates the secondary confirmation token using constant-time cryptographic comparison (preventing timing attacks). Transitions the order status from 'staged' to 'committed'. Optionally writes the verified XML payload to the specified destination path. Args: stage_id: Staging identifier from stage_payment_batch. confirmation_token: Secondary secret confirmation token. output_file_path: Optional path to write the committed XML document. Returns: CommitPaymentBatchResult with commit timestamp and fingerprint, or {"error": ...}.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation_token | string | yes | Secondary authorization token required to execute the dual-control commit. |
| output_file_path | – | – | Optional local filesystem destination path to write the committed XML document. |
| stage_id | string | yes | The staging identifier returned by stage_payment_batch. |
| Name | Type | Req | Description |
|---|---|---|---|
| committed_at | string | – | – |
| error | string | – | – |
| output_file_path | – | – | – |
| sha256_fingerprint | string | – | – |
| stage_id | string | – | – |
| status | string | – | – |
| total_transactions | integer | – | – |
No examples provided.
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'. |
| Name | Type | Req | Description |
|---|---|---|---|
| branches | – | – | – |
| complete | boolean | – | – |
| error | string | – | – |
| exempt | array | – | – |
| files | array | – | – |
| message_type | string | – | – |
| missing_branches | array | – | – |
| missing_paths | array | – | – |
| paths | – | – | – |
| sources | array | – | – |
| unknown | array | – | – |
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'. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string | – | – |
| scenario_id | string | – | – |
| variant | – | – | – |
| version | string | – | – |
| xml | string | – | – |
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'. |
| Name | Type | Req | Description |
|---|---|---|---|
| build | object | – | – |
| constraints | array | – | – |
| country | string | – | – |
| description | string | – | – |
| error | string | – | – |
| family | string | – | – |
| message_type | string | – | – |
| provenance | object | – | – |
| scenario | string | – | – |
| sha256 | string | – | – |
| twins | object | – | – |
| validation | object | – | – |
| variant | – | – | – |
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', '… |
| Name | Type | Req | Description |
|---|---|---|---|
| additionalProperties | boolean | – | – |
| description | string | – | – |
| error | string | – | – |
| properties | object | – | – |
| required | array | – | – |
| title | string | – | – |
| type | string | – | – |
| version | string | – | – |
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', '… |
| Name | Type | Req | Description |
|---|---|---|---|
| columns | array | – | – |
| error | string | – | – |
| message_type | string | – | – |
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'. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| error | string | – | – |
| files | array | – | – |
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. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string | – | – |
| from | string | – | – |
| migrated | integer | – | – |
| records | array | – | – |
| to | string | – | – |
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. |
| Name | Type | Req | Description |
|---|---|---|---|
| currency | string | – | – |
| electronic_sequence_number | string | – | – |
| entries | array | – | – |
| error | string | – | – |
| iban | string | – | – |
| statement_id | string | – | – |
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. |
| Name | Type | Req | Description |
|---|---|---|---|
| creation_datetime | string | – | – |
| error | string | – | – |
| group_status | string | – | – |
| message_id | string | – | – |
| original_message_id | string | – | – |
| original_message_name_id | string | – | – |
| payment_statuses | array | – | – |
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. |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | boolean | – | – |
| sanitised | string | – | – |
| value | string | – | – |
| was_valid | boolean | – | – |
No examples provided.
simulate_clearing Simulate clearing network execution ~214
Simulate settlement and clearing network execution for a staged batch. Evaluates network-specific rulebooks and clearing constraints: - EPC-SEPA: EUR currency mandate, SEPA-zone IBAN prefixes, SLEV charge bearer. - FedNow: USD instant gross settlement eligibility. - US-ACH: USD next-day clearing cycle routing. - SWIFT-MX: Cross-border correspondent banking BIC routing. - CHAPS: Same-day RTGS high-value GBP clearing. - BACS: Three-day GBP direct credit clearing. Args: stage_id: Staging identifier from stage_payment_batch. clearing_system: Clearing rail profile to simulate. Returns: SimulateClearingResult with verdict (ACCEPTED / REJECTED), detailed checks, and estimated settlement window, or {"error": ...}.
| Name | Type | Req | Description |
|---|---|---|---|
| clearing_system | string | – | Target clearing system simulation profile to evaluate settlement eligibility, cut-off windows, and routing constraints. |
| stage_id | string | yes | The staging identifier returned by stage_payment_batch. |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | – | – |
| clearing_status | string | – | – |
| clearing_system | string | – | – |
| error | string | – | – |
| settlement_window | string | – | – |
| stage_id | string | – | – |
No examples provided.
simulate_payment_batch Simulate payment batch ~614
Simulate and pre-flight a payment batch before XML generation. Performs comprehensive pre-flight verification without generating XML or staging files: 1. Validates records against the message type's JSON Schema. 2. Validates records against an optional payment-scheme rulebook. 3. Computes control sums grouped by currency. 4. Calculates unique debtor and creditor account counts. 5. Detects intra-batch duplicate transactions (same debtor, creditor, amount, currency, and execution date). Returns a structured verdict with totals, sums by currency, duplicate findings, and schema/scheme errors. Args: message_type: A supported ISO 20022 pain message type. records: One or more flat payment records to simulate. scheme: Optional payment scheme profile to validate against.
| 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 simulate and pre-flight before generating XML. One or more flat payment records (dicts of field name → value). Key fields (see get_input_schema for the full contra… |
| scheme | – | – | Optional payment-scheme rulebook profile to enforce (e.g. 'sepa-sct', 'sepa-sdd', 'sepa-inst', 'xborder-ct'). Omit to skip scheme-specific rulebook validation. |
| Name | Type | Req | Description |
|---|---|---|---|
| control_sum_by_currency | object | – | – |
| duplicates | array | – | – |
| error | string | – | – |
| schema_errors | array | – | – |
| scheme_violations | array | – | – |
| total | integer | – | – |
| unique_creditors | integer | – | – |
| unique_debtors | integer | – | – |
| valid | boolean | – | – |
| valid_count | integer | – | – |
No examples provided.
stage_payment_batch Stage payment batch for simulation and approval ~625
Stage a payment batch for simulation and dual-control approval. Creates an in-memory staged payment order with zero fund movement and a 1-hour expiration window. Computes: 1. Schema validation against the message type's JSON Schema. 2. Optional scheme compliance verification (SEPA, BACS, etc.). 3. Multi-currency control sums and fee estimation. 4. Multi-factor risk scoring (detecting duplicates, high transaction amounts, and generic remittance narratives). 5. In-memory XML compilation and SHA-256 fingerprinting. 6. Cryptographic dual-control confirmation token for subsequent authorization. Args: message_type: A supported ISO 20022 pain message type. records: One or more flat payment records to stage. scheme: Optional payment scheme profile to validate against. Returns: StagedBatchResult with staging metadata, risk assessment, fingerprint, and confirmation token, or {"error": ...}.
| 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 | Flat payment records to stage (zero fund movement). One or more flat payment records (dicts of field name → value). Key fields (see get_input_schema for the full contract): id, date (payment-initiati… |
| scheme | – | – | Optional payment scheme profile to validate against, e.g. 'sepa-sct', 'sepa-instant', 'bacs', or 'cbpr-plus'. |
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation_token | string | – | – |
| control_sum_by_currency | object | – | – |
| error | string | – | – |
| estimated_fees | object | – | – |
| expires_at | string | – | – |
| risk_factors | array | – | – |
| risk_level | string | – | – |
| risk_score | integer | – | – |
| sha256_fingerprint | string | – | – |
| stage_id | string | – | – |
| status | string | – | – |
| total_transactions | integer | – | – |
No examples provided.
suggest_record_fix Suggest review-only record fixes ~331
Suggest deterministic, review-only fixes to non-financial fields. Returns patches or a cannot_autofix reason. Never changes IBANs, BICs, accounts, amounts or currencies, even for whitespace. Review every candidate and validate the full record before generating a payment. Args: record: A flat payment record, left unchanged. validation_error: Finding with field (or path) and rule keys. message_type: Supported schema supplying trusted field bounds.
| Name | Type | Req | Description |
|---|---|---|---|
| message_type | string | – | 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', '… |
| record | object | yes | One flat payment record; never modified. |
| validation_error | object | yes | Finding with field (or path) and rule keys. |
Structured output declared, but exposes no named fields.
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. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string | – | – |
| kind | string | – | – |
| valid | boolean | – | – |
| value | string | – | – |
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. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string | – | – |
| is_valid | boolean | – | – |
| profile | string | – | – |
| violations | array | – | – |
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). |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string | – | – |
| errors | array | – | – |
| total | integer | – | – |
| valid | boolean | – | – |
| valid_count | integer | – | – |
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. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string | – | – |
| message_type | string | – | – |
| valid | boolean | – | – |
No examples provided.
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
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. ISO 20022 payment files for agents: generate, validate, and convert pain.001, pain.008, MT101. 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 81 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. 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 26 tools: list_message_types, get_required_fields, get_input_schema, validate_records, suggest_record_fix, and 21 more. Their descriptions and schemas cost roughly 8,659 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 4 November 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.