Skip to main content
Glama
B -->|delegates to| C["pain001"]
C -->|render + validate| D["ISO 20022 pain.001 XML"]

---

## When not to use pain001-mcp

- **You're not driving an MCP-aware agent.** Use the CLI
  (`pain001 …`) or the REST API (`pain001 serve`) directly — both expose
  the same surface with less indirection.
- **You need editor diagnostics, not agent tools.** Use
  [`pain001-lsp`](https://pypi.org/project/pain001-lsp/) — it speaks
  the Language Server Protocol to VS Code, Neovim, Helix, Emacs, etc.
- **You need to extend the tool surface in-tree.** The companion
  [`pain001[mcp]`](https://github.com/sebastienrousseau/pain001) extra
  exposes the same FastMCP instance and is easier to fork inside an
  organisation's pain001 install.

---

## Development

`pain001-mcp` uses [Poetry](https://python-poetry.org/) and
[mise](https://mise.jdx.dev/).

```bash
git clone https://github.com/sebastienrousseau/pain001-mcp.git
cd pain001-mcp
mise install
poetry install

A Makefile orchestrates the quality gates (kept in lockstep with CI):

Target

What it runs

make check

All gates (REQUIRED before commit)

make test

pytest --cov=pain001_mcp --cov-branch --cov-fail-under=100

make lint

ruff check + black --check

make type-check

mypy --strict

make docs

interrogate --fail-under=100 (docstring coverage)

Current state (v0.0.57): 71 tests passing, 100% line + branch coverage against a 100% enforced floor, mypy --strict clean, interrogate 100%.


Security

  • No filesystem writes from tools. generate_message and generate_message_from_file return the XML as a string; no tool writes to disk.

  • XML parsing of camt.053 and pain.002 is routed through defusedxml (via the core pain001 library); XXE and entity expansion are rejected.

  • Validation failures are returned as structured {"error": ...} payloads — never as stack traces — so the agent never sees an internal path leak.

  • Dependencies are pinned via poetry.lock and audited by pip-audit and Bandit in CI.

To report a vulnerability, please use GitHub private vulnerability reporting rather than a public issue.


Related MCP server: MCP Tool Server

Documentation


Contributing

Contributions are welcome — see the contributing instructions. Thanks to all the contributors who have helped build pain001-mcp.


Part of the ISO 20022 MCP Suite — open-source, Apache-2.0 licensed MCP servers for banking and financial-services AI agents:

Server

Purpose

pacs008-mcp

Generate, validate, parse & scheme-check ISO 20022 pacs.008 FI-to-FI credit transfers + Nov-2026 address linting

camt053-mcp

Parse & reconcile ISO 20022 camt.053 bank-to-customer statements — CBPR+/HVPS+ ready

acmt001-mcp

Generate & validate ISO 20022 acmt account-management messages

bankstatementparser-mcp

Parse bank statements (BAI2, MT940/MT942, CAMT.053, OFX, CSV) into structured transactions

noyalib-mcp

Lossless YAML 1.2 parsing, formatting & validation (Rust, 100% spec compliance)


MCP Registry

mcp-name: io.github.sebastienrousseau/pain001-mcp


License

Licensed under the Apache License, Version 2.0. Any contribution submitted for inclusion shall be licensed as above, without additional terms.


Available Tools

21 tools
convert_mt101Convert MT101 to pain.001 recordsA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
mt101_textYesA 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 record.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=true, idempotentHint=true, destructiveHint=false, which the description reinforces by stating it operates on supplied text only, no file I/O. It also explains error handling for missing mandatory fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a one-line summary, usage context, and details. It is slightly lengthy but efficient, earning its place with useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and annotations cover behavior, the description is complete. It explains the purpose, usage, parameters, and return types adequately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 100% of the single parameter with a description. The description adds value beyond the schema by explaining what constitutes MT101 text (bare tag list or block-4 envelope) and its repeating sequences.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title and description clearly state the tool converts MT101 to pain.001 records. It specifies the context (SWIFT MT→MX migration) and distinguishes itself from sibling tools like parse_camt053 by focusing specifically on MT101 input.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool ('bridge the Nov-2025+ SWIFT MT→MX migration') and directs the output to other tools. It does not explicitly state when not to use it, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_messageGenerate pain XML from recordsA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
recordsYesOne 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 as midnight), initiator_name, payment_id, requested_execution_date ('YYYY-MM-DD'), debtor_name, debtor_account_IBAN, debtor_agent_BIC, creditor_name, creditor_account_IBAN, creditor_agent_BIC, payment_amount (alias: 'amount'; max two decimals), currency (alias: 'payment_currency'; ISO 4217, e.g. 'EUR'), remittance_information. batch_booking accepts JSON true/false. nb_of_txs and ctrl_sum are computed automatically from the records and may be omitted. payment_method defaults to 'TRF' and charge_bearer to 'SLEV'. IBAN and BIC values are strictly validated and never coerced.
message_typeYesA 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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds material behavior: the result is XSD-validated before return, no file is written, records are normalized (aliases, JSON booleans, bare dates, computed nb_of_txs/ctrl_sum), failures list every bad field at once, and IBAN/BIC are strictly validated and never coerced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose and sibling routing come first, then behavior, then return values, then Args. Some normalization detail duplicates the schema text, but no sentence is wasted enough to undercut structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter generator with an output schema and full annotation coverage, the description covers purpose, alternatives, validation, normalization, and failure shape. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters in depth, including aliases, defaults, and validation rules. The description's Args block restates the same ground ('A supported ISO 20022 pain message type'), adding little over the enum and schema text; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Generate a validated ISO 20022 pain XML message from in-memory records') and explicitly contrasts itself with the two nearest siblings. An agent can identify this as the in-memory primary generator without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing guidance: use this for records held in memory, use generate_message_from_file when data lives in a CSV on disk, and generate_message_async for very large batches off the event loop. Both when-to-use and alternative conditions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_message_asyncGenerate pain XML (async, large batches)A
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
recordsYesSame 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_schema for the full contract): id, date (payment-initiation timestamp; 'YYYY-MM-DD' is accepted and rendered as midnight), initiator_name, payment_id, requested_execution_date ('YYYY-MM-DD'), debtor_name, debtor_account_IBAN, debtor_agent_BIC, creditor_name, creditor_account_IBAN, creditor_agent_BIC, payment_amount (alias: 'amount'; max two decimals), currency (alias: 'payment_currency'; ISO 4217, e.g. 'EUR'), remittance_information. batch_booking accepts JSON true/false. nb_of_txs and ctrl_sum are computed automatically from the records and may be omitted. payment_method defaults to 'TRF' and charge_bearer to 'SLEV'. IBAN and BIC values are strictly validated and never coerced.
message_typeYesA 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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds genuinely new behavior: rendering runs in a worker thread so an agent can interleave other calls, and failures return a JSON-encoded error payload. The return-value mention slightly duplicates the output schema, and nothing is said about concurrency limits or multiple simultaneous invocations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the async/large-batch distinction in the first sentence and keeps the usage rule tight. The 'Delegates to pain001.async_adapter.generate_xml_string_async' line is internal implementation detail of marginal value to an agent picking a tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a rich input schema, an output schema, and full annotation coverage, the description only needs to supply selection guidance and async semantics — both are present. An agent has everything required to choose and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the 'records' schema already enumerates key fields, aliases, defaults, and validation strictness in detail. The Args block merely restates the two parameter names, adding no meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Generate validated pain XML') plus a distinguishing scope modifier ('off the event loop, for large batches'). It explicitly names the sibling it mirrors and differs from (generate_message), so an agent can select between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use and when-not: 'Use generate_message for small or interactive batches; use this only when the record count is large enough that blocking would matter.' The alternative and the selecting condition are both named, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_message_from_fileGenerate pain XML from a CSV fileA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
message_typeYesA 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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'.
data_file_pathYesLocal 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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and open-world behavior. The description adds useful context: it reads from the local filesystem, delegates to generate_message, applies path-safety guards, and returns validated XML or a JSON error payload.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and usage, and most sentences earn their place. However, the Args and Returns sections duplicate information already covered by the input schema and output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter file-to-XML generator with full schema coverage and an output schema, the description supplies the missing usage context, sibling routing, format limitation, and path-safety note. Nothing critical is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents both parameters including enum aliases and CSV header requirements. The description's Args section largely restates those schema descriptions without adding syntax or constraints, so the baseline is 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb ('Generate'), resource ('validated pain XML'), and source ('CSV file on the local disk'). It explicitly distinguishes from generate_message by contrasting file-based records with in-memory records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use this when records live in a CSV file rather than in memory, and tells the agent to call generate_message directly when records are already dicts. It also states the current CSV-only limitation, which is clear when-not guidance for other formats.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_corpus_coverageGet schema coverage reportA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
versionYesThe message type, e.g. 'pain.001.001.13'.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, closed-world. Description adds useful detail: it delegates to a specific function and returns coverage.json content with path/branch counts, percentages, completeness, missing/exempt lists, or an error when there is no set or corpus.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then usage, delegation, Args, and Returns. The Args/Returns sections are somewhat redundant with structured data but appropriate for a docstring-style definition and not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the burden of explaining return values. It does so clearly: coverage.json content or an error object, including the specific fields returned. Also explains the check's role in the workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and already documents the 'version' parameter with an example. Description adds no syntax or format detail beyond 'The message type', so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb + resource: returns the schema coverage verdict of one message type's coverage set. Clearly distinguishes from corpus file listing/reading siblings by focusing on coverage report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use it: '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.' Gives a clear context but does not name alternatives or when-not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_corpus_fileGet example corpus fileA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
variantNoAn overlay id for the bank variant, e.g. 'gb.example.priority'; omit for the generic file.
versionYesThe message type, e.g. 'pain.001.001.09'.
scenario_idYesThe market scenario, e.g. 'gb.chaps.property-purchase' (from list_corpus_files).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world). The description adds real behavioral context: the returned text is exactly what pain001 ships and passed XSD, ISO MDR, rail profile, and overlay checks, plus the error-shape fallback when no file exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and efficiently sized. The Args section is largely redundant with a fully-covered schema, and the 'Delegates to pain001.corpus.get_file' line is internal-hint filler, but the Returns block earns its place since there is no output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema present, the description supplies the critical return shape ({"scenario_id", "version", "variant", "xml"}) and the error alternative, which an agent otherwise could not know. Nothing needed to call or interpret the call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema descriptions are in fact richer (they supply concrete examples like 'gb.chaps.property-purchase' and 'gb.example.priority'). The Args block in the description only restates those parameters in vaguer terms ('The scenario', 'The message type'), so it adds little beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (the XML of one validated example file from the market corpus), and immediately distinguishes it from the list_corpus_files sibling by being the single-file fetch. An agent knows exactly what this returns without opening anything else.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete use context — showing a model, tester, or mapping exercise what a correct file looks like for a country/rail/edition. It does not name an explicit alternative or exclusion, but the context is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_corpus_provenanceGet example corpus provenanceA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
variantNoAn overlay id for the bank variant; omit for the generic file.
versionYesThe message type, e.g. 'pain.001.001.09'.
scenario_idYesThe market scenario (from list_corpus_files).

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint/idempotentHint already covering safety, the description adds real behavioral value: the confidence vocabulary (verified/derived/assumed), the per-rung validation ladder, renames/drops applied by the builder, and an explicit failure mode returning {"error": ...} when no file or corpus exists. It lacks any note on cost, pagination or caching, keeping it below the top mark.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line purpose followed by usage rationale, then Args/Returns. The Args section is somewhat redundant given the fully documented schema, but nothing is bloated and structure aids scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the Returns block (parsed dict or error dict) legitimately fills a gap, and annotations cover the safety profile. An agent has enough to call it correctly, though the upstream delegation to pain001.corpus.provenance adds little for the caller.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The Args block largely restates the schema ('The scenario', 'The message type') and only marginally enriches it by noting variant is the bank-variant overlay id or None.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('return the provenance sidecar of one example file') and implicitly contrasts with the sibling get_corpus_file / list_corpus_files by scoping to provenance metadata only. An agent can distinguish this from the file-fetching siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to know how far to trust a file' gives a clear motivating context for when to reach for the tool. It does not explicitly name the alternative sibling (get_corpus_file) or state exclusions, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_input_schemaGet input JSON SchemaA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
message_typeYesA 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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'.

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety profile is covered. The description adds that the schema represents a 'flat input record' and that field constraints are included, but doesn't describe output format (JSON Schema structure) or whether there are size limits. With annotations carrying the safety profile, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with zero waste: first states purpose, second gives usage context, third names alternatives with their specific function. Front-loaded with the core action and appropriately concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a read-only schema retrieval tool with no output schema, one fully documented parameter, and annotations covering safety. The description provides enough for an agent to understand when and how to call it correctly, including routing to alternatives.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the parameter is fully documented in the schema with enum values and alias explanation. The description only repeats that message_type is 'a supported ISO 20022 pain message type', adding no additional syntax or format details beyond the schema. Baseline 3 is correct when schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the full JSON Schema for a message type's flat input record') and names a clear scope. It distinguishes itself from siblings get_required_fields and validate_records by describing exactly what each alternative returns or does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives the purpose ('learn every field, its type, and its constraints before assembling records, or to drive a form/UI') and routes to sibling tools with distinct conditions: use get_required_fields for only required names, and validate_records to check records against this schema. No inference needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_required_fieldsGet required fieldsA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
message_typeYesA 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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuine behavioral detail beyond that: the output is narrow (field names only, not type/format constraints), which is exactly the distinction an agent needs when choosing between this and get_input_schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the scope limit followed by usage and the alternative. The Args block is mildly redundant with the schema but costs almost nothing and no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the single parameter is fully documented in the schema. For a one-argument, read-only lookup tool, the description plus structured fields leave no gap an agent would need to guess around.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the enum description already lists every accepted value plus the pain.001/pain.008 alias behavior, so the schema carries the parameter semantics. The description's only addition is the one-line restatement 'A supported ISO 20022 pain message type', which does not extend meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (required input field names) with an explicit scope limiter ('only the required' for 'a pain message type'). This clearly separates it from get_input_schema, which the description names as the sibling covering the broader case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('quick checklist of the mandatory columns before building records') and explicit when-to-use-something-else ('When you need full type/format constraints... call get_input_schema instead'). Routing conditions are unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_templateInspect CSV template columnsA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
message_typeYesA 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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior, so the safety profile is covered. The description adds genuinely new context: results come from the bundled sample, and the call can return an error if the type is unsupported or no template ships.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and the routing to get_input_schema are front-loaded in the first two sentences, which is efficient. The Args/Returns block is slightly redundant against a 100%-covered schema, and the 'Mirrors the in-tree ...' sentence is meta-commentary rather than task-relevant, but overall the text is tight and well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description supplies the return shape ({"message_type": str, "columns": list[str]}) and the error variant, which is exactly what an agent needs. Alternatives and preconditions are also covered, leaving no functional gap for a single-parameter read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema description coverage is 100%, so the enum values, aliasing rules, and constraints are already fully documented in the schema. The description's 'A supported ISO 20022 pain message type' merely restates the schema, adding no new meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the CSV column headers the message type's bundled template uses') with explicit scope tied to the bundled sample. It also differentiates itself from get_input_schema, so an agent can pick between them without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete use case ('hand-building a CSV before generate_message_from_file') and names the alternative tool plus the condition that selects it ('for the typed JSON contract ... use get_input_schema'). Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_corpus_filesList example corpus filesA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
kindNo'market' for the realistic per-country scenarios, 'coverage' for the schema coverage sets, or omit for both.
countryNoTwo-letter country code to keep one market pack only, e.g. 'GB' or 'CH'. Ignored for coverage files.
versionNoKeep only files of this message type, e.g. 'pain.001.001.09'.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered. The description goes beyond them by disclosing the empty-corpus failure mode ('{"error": ...} when the installed pain001 has no corpus') and by explaining the structural meaning of scenario_id and variant, which annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and the use-before rule, then organized into Args/Returns blocks. Some material (the scenario_id example, the variant explanation) is dense, but every part maps to a decision the caller makes; nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the return-value burden and does so by spelling out the exact JSON shape including the flat file records and the error case. Combined with the file-family semantics and argument guidance, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter dictionary is already documented, making 3 the baseline. The description adds genuine semantic texture on top: what 'variant' means (bank overlay a file was built with), how coverage files differ from market files, and a concrete scenario_id example, which helps interpret the returned values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List the example files pain001 ships') and immediately scopes it to two file families, market scenarios and coverage sets. It also names the sibling tools it precedes (get_corpus_file, get_corpus_provenance), so an agent can position it in the workflow without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it ('to discover what ready-made, validated ISO 20022 files exist before calling get_corpus_file or get_corpus_provenance'), which is a clear use-before condition. It differentiates market vs coverage files so the caller knows which result it wants, but it does not state when the tool is unnecessary (e.g. if you already have a scenario_id).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_message_typesList pain message typesA
Read-onlyIdempotent

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``).
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses return format (list of dictionaries with message_type and name) and complements annotations (readOnlyHint, etc.) with specific behavioral detail beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose, then usage guidance, then return format. Every sentence adds value; no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete explanation for a zero-parameter tool: purpose, usage context with exclusions, and return structure. No gaps given the tool's simplicity and rich annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so the baseline is 4. The description adds no parameter-specific details, but none are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'List every supported ISO 20022 pain message type and its human name.' It also distinguishes from siblings by directing users to other tools for schema retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use ('first, before any generation or validation call'), what not to use it for, and names alternatives ('get_required_fields' or 'get_input_schema').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_supported_formatsList supported input formatsA
Read-onlyIdempotent

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).
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint. Description adds return format (list of dictionaries with id/name/extension) and a dependency note about Parquet extra, providing value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with purpose and usage, no redundancy, every sentence adds value. Well structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite output schema existing externally, description succinctly covers return format and extra requirement. For a zero-parameter, read-only tool, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so baseline is 4. Schema coverage is 100%, and description correctly has no param info needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verb 'list' and resource 'on-disk data formats the pain001 loader can read'. Distinguishes from sibling list_message_types by clarifying it lists data-source formats vs message types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this to tell a user which file types they may supply to generate_message_from_file' and directs to list_message_types for message types, providing clear alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

migrate_recordsMigrate records between versionsA
Read-onlyIdempotent

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": ...}``.
ParametersJSON Schema
NameRequiredDescriptionDefault
recordsYesFlat payment records in the from_version shape, each a dict of field name → value, to transform to to_version.
to_versionYesTarget pain.001 schema version to migrate the records to, e.g. 'pain.001.001.09' — see list_message_types.
from_versionYesSource pain.001 schema version the records currently use, e.g. 'pain.001.001.03' — see list_message_types.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds significant behavioral context: it transforms records only (not XML), reports which fields are renamed/derived/dropped, wraps VersionMapper, returns both migrated rows and a summary, and returns error if version is unsupported. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose statement, usage context, workflow, technical reference, return format, and parameter list. Every sentence serves a purpose, and the most critical information is front-loaded. It is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (schema version migration), the description is thorough. It explains the transformation process, error handling, return format, and the expected workflow after migration (validate and generate). It references sibling tools for version listing. No gaps remain for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with descriptions. The description's Args section reinforces and adds context, such as examples ('pain.001.001.03'), the shape of records ('each a dict of field name → value'), and references to list_message_types for version options. This adds value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool migrates flat payment records between two pain.001 schema versions, with clear examples ('move .03 rows to .09'). It distinguishes itself from sibling tools like validation and generation tools by specifying the transformation scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides detailed when-to-use guidance: 'when your bank requires a different pain.001 version than your source data uses'. It also outlines the recommended workflow (run validate_records afterwards, then generate_message). However, it does not explicitly state when NOT to use this tool or mention alternatives directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_camt053Parse camt.053 statement fileA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
xml_file_pathYesLocal filesystem path to the camt.053 bank-statement XML file to parse.
xsd_file_pathNoOptional local path to a camt.053 XSD; when given, the document is validated against it before parsing. Omit to skip schema validation.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses reading from local filesystem, optional XSD validation, and error return style ({"error": ...}) instead of exceptions. Annotations confirm read-only, non-destructive, idempotent; description aligns with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured: main purpose first, then usage guidance, then details. Every sentence adds value; no redundancy. Efficiently conveys all needed info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Completes the picture: explains input (file path), optional validation, output format (header + entry list or error). No output schema needed given compact description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and description adds context about local filesystem reading and error behavior, but parameter descriptions are already clear in schema. Adds moderate value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it parses a camt.053 bank-statement XML file into structured data, using specific verb 'Parse' and resource. It distinguishes from sibling tool parse_pain002 which handles payment-status replies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (for account statements) and when not (for payment-status replies, for in-memory strings). Names alternative tool parse_pain002 and notes this tool requires a file path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_pain002Parse pain.002 status report fileA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
xml_file_pathYesLocal filesystem path to the pain.002 payment-status report XML file to parse.
xsd_file_pathNoOptional local path to a pain.002 XSD; when given, the document is validated against it before parsing. Omit to skip schema validation.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly, idempotent, non-destructive. Description adds specific error handling behavior (returns error on schema/parse failure), optional XSD validation, and that it reads from filesystem. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, well-structured with summary, usage, parameters, returns. Front-loaded with purpose and context. Every sentence provides necessary information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given low complexity (2 params, no enums, no nested objects) and full schema coverage, the description fully explains behavior, including optional validation and error returns. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% description coverage, so baseline is 3. Description adds value by explaining the effect of providing xsd_file_path (validation before parsing) and the return structure on failure, which aids correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool parses a pain.002 file into structured data, identifies the specific resource and action, and distinguishes it from the sibling parse_camt053 by specifying it handles payment-status reports while parse_camt053 handles account statements.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (to read bank's acknowledgement of pain.001) and when not (for account statements, use parse_camt053). Provides context about per-transaction status and reason codes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sanitize_to_iso20022_charsetSanitise text to ISO 20022 charsetA
Read-onlyIdempotent

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}``.
ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesA single free-text field value (e.g. a name or remittance line) to transliterate to the ISO 20022 Latin character set.
charsetNoWhich 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 / - ? : ( ) . , ' + . 'SWIFT_Z' is the extended superset that additionally allows = ! " % & * < > ; { @ # _ (used in narrative / envelope fields); it does NOT allow | or }. Pick SWIFT_Z only when the target field is documented as Z-set.SWIFT_X

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: it explains that accents are transliterated, out-of-set characters are replaced with spaces, and the result includes flags (was_valid, changed) for surfacing changes. This goes beyond the annotations by describing the transformation behavior and return flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: it starts with the core purpose, then usage context, then charset details, then behavior, then parameters and return. Every sentence earns its place, and the use of bullet points for charsets improves readability. It is detailed but not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (2 params, 1 enum, no output schema), the description is complete. It covers what the tool does, when to use it, how the charsets differ, the transformation behavior, and the return structure. An agent has everything needed to call it correctly without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters well. The description adds value by explaining the practical implications of each charset (e.g., SWIFT_Z is a strict superset, does not permit | or }), and by clarifying the purpose of the value parameter (single free-text field). It also explains the return structure, which is not in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: sanitize a single free-text field to a SWIFT/ISO 20022 character set, with specific actions (transliterate accents, drop unsupported symbols) and a clear resource (one string). It distinguishes itself from sibling tools like validate_payment_scheme by explicitly noting it operates on one string versus a whole batch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: on a single free-text value before placing it in a record, and to check if the value changed. It also names the alternative (validate_payment_scheme) for batch compliance checks, and explains the two charset options with their use cases (SWIFT_X default, SWIFT_Z for narrative/envelope fields).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_identifierValidate IBAN or BICA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesWhich identifier to validate: 'iban' or 'bic' (case-insensitive). Any other value returns an error.
valueYesThe identifier string to check — an IBAN or BIC/SWIFT code matching the chosen kind.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnly, idempotent, and non-destructive hints. The description adds meaningful behavioral details: return shape (kind, value, valid, error only when invalid), case insensitivity for kind, and that invalid kind returns error. This goes beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (8 lines) and well-structured: purpose, usage guidance, return format, then parameter descriptions in a list. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the description covers everything needed: purpose, usage guidance, return format, and parameter constraints. No output schema exists, so the description adequately explains return values. Safety is covered by annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description repeats the parameter descriptions from the schema without adding significant new semantics. It briefly mentions that invalid kind returns error, which is already in the schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Validate a single financial identifier (IBAN or BIC).' It uses a specific verb and resource, and distinguishes itself from sibling tools by mentioning alternative batch validation methods.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises when to use this tool ('one-off identifier check') and when not to ('To validate identifiers embedded across a whole batch, prefer validate_records / validate_payment_scheme'). Provides clear alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_payment_schemeValidate against scheme rulebookA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
profileNoThe payment-scheme rulebook profile to enforce. One of 'sepa-sct', 'sepa-sdd', 'sepa-inst', or 'xborder-ct'. Defaults to 'sepa-sct'.sepa-sct
recordsYesPayment records as a list of flat dicts (field name → value) to check against the scheme rulebook.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint. The description adds that validation returns a structured violations object with specific keys and mentions delegation to a function, providing useful behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear paragraphs. Front-loads purpose and usage. A bit verbose with the function reference but overall efficient for the detail provided.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 params, no nested objects, no output schema) and rich annotations, the description fully covers purpose, usage, return format, and supported profiles. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for both parameters. The description adds the list of supported profiles and the structure of the return value (including violations keys), compensating for the missing output schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool validates records against a payment-scheme rulebook (e.g., SEPA) and distinguishes it from sibling 'validate_records' by specifying it enforces scheme-specific business rules not covered by JSON-Schema validation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to use after 'validate_records' and contrasts the two tools. No explicit when-not-to-use, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_recordsValidate records against schemaA
Read-onlyIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
recordsYesOne 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).
message_typeYesA 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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds genuine behavioral context beyond that: it discloses that checks are JSON-Schema shape only, that a row-by-row error report is produced, and it gives the concrete return payload shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then the when-to-use guidance, then the return shape. The trailing Args section is largely redundant with the schema, costing a little efficiency, but the prose itself is tight and well-ordered.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, two-parameter validator with no output schema, the description supplies everything an agent needs: purpose, ordering relative to generate_message, scope limits, and an explicit return schema shape. No material gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema's parameter descriptions (including the enum aliasing note) are richer than the terse Args block, which merely restates 'message_type' and 'records'. Baseline 3 is appropriate since the schema carries the semantic load and the description adds no format or example detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Validate flat records against a message type's input JSON Schema') and immediately bounds the scope to structural/type checking per record. It clearly distinguishes itself from sibling validation tools like validate_payment_scheme and validate_xml_against_schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent when to use it ('before generate_message to catch structural/type errors') and names the alternative plus its condition ('for payment-scheme rulebook checks ... also run validate_payment_scheme'). Both the intended workflow position and the exclusion boundary are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_xml_against_schemaValidate XML string against XSDA
Read-onlyIdempotent

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``.
ParametersJSON Schema
NameRequiredDescriptionDefault
xml_contentYesThe full pain.001 / pain.008 XML document as a string, validated against the message type's official XSD.
message_typeYesA 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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, local-only. The description adds the filesystem-independence constraint and describes the return shape including the conditional 'error' key present only when invalid, which is genuine behavioral context beyond the annotations. Missing details like whether it short-circuits on first error or reports all errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by routing guidance, then Args/Returns. Efficient overall, though the Args section is redundant with the 100%-covered schema and the cross-reference to pain001.xml.validate_via_xsd.validate_xml_string_via_xsd is implementation leakage that adds little for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by documenting the return dict with its conditional error field. Combined with full parameter coverage and explicit sibling routing, an agent has enough to invoke correctly. Could note error detail granularity for higher completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the enum values are fully documented in the schema, including the alias behavior for bare 'pain.001'/'pain.008'. The description's Args block merely restates what the schema already provides, so it adds no meaning beyond the structured data. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope ('Validate a raw pain.001 / pain.008 XML string against its official XSD') and explicitly distinguishes itself from siblings by naming validate_records, parse_camt053, and parse_pain002.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('check XML you already have as a string ... without touching the filesystem') and named alternatives for adjacent use cases (validate_records for pre-XML records, parse_camt053/parse_pain002 for statement/status files). Routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.0.67
    • Changedgenerate_message2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.001.001.13",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.008.001.08",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedgenerate_message_async2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.001.001.13",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.008.001.08",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedgenerate_message_from_file2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.001.001.13",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.008.001.08",
        +  "pain.001",
        +  "pain.008"
        +]
    • Addedget_corpus_coverage
    • Addedget_corpus_file
    • Addedget_corpus_provenance
    • Changedget_input_schema2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.001.001.13",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.008.001.08",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedget_required_fields2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.001.001.13",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.008.001.08",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedinspect_template2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.001.001.13",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.008.001.08",
        +  "pain.001",
        +  "pain.008"
        +]
    • Addedlist_corpus_files
    • Changedvalidate_records2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.001.001.13",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.008.001.08",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedvalidate_xml_against_schema2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.008.001.08', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.001.001.13",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.008.001.08",
        +  "pain.001",
        +  "pain.008"
        +]
  2. 1 tool updatev0.0.62
    • Changedsanitize_to_iso20022_charset1 field changed
      • addedInput schema / properties / charset
        Added value: +{
        +  "default": "SWIFT_X",
        +  "description": "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 / - ? : ( ) . , ' + . 'SWIFT_Z' is the extended superset that additionally allows = ! \" % & * < > ; { @ # _ (used in narrative / envelope fields); it does NOT allow | or }. Pick SWIFT_Z only when the target field is documented as Z-set.",
        +  "enum": [
        +    "SWIFT_X",
        +    "SWIFT_Z"
        +  ],
        +  "title": "Charset",
        +  "type": "string"
        +}
  3. 8 tool updates
    • Changedgenerate_message2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
    • Addedgenerate_message_async
    • Changedgenerate_message_from_file2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedget_input_schema2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedget_required_fields2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedinspect_template2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedvalidate_records2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedvalidate_xml_against_schema2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.001.001.13', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02",
        -  "pain.001",
        -  "pain.008"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.001.001.13",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
  4. 14 tool updatesv0.0.60
    • Addedconvert_mt101
    • Addedgenerate_message
    • Addedgenerate_message_from_file
    • Addedget_input_schema
    • Addedget_required_fields
    • Addedinspect_template
    • Addedlist_message_types
    • Addedlist_supported_formats
    • Addedparse_camt053
    • Addedsanitize_to_iso20022_charset
    • Addedvalidate_identifier
    • Addedvalidate_payment_scheme
    • Addedvalidate_records
    • Addedvalidate_xml_against_schema
  5. 15 tool updates
    • Removedconvert_mt101
    • Removedgenerate_message
    • Removedgenerate_message_async
    • Removedgenerate_message_from_file
    • Removedget_input_schema
    • Removedget_required_fields
    • Removedinspect_template
    • Removedlist_message_types
    • Removedlist_supported_formats
    • Removedparse_camt053
    • Removedsanitize_to_iso20022_charset
    • Removedvalidate_identifier
    • Removedvalidate_payment_scheme
    • Removedvalidate_records
    • Removedvalidate_xml_against_schema
  6. 8 tool updates
    • Changedgenerate_message3 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
      • changedInput schema / properties / records / description
        Previous value: -"One or more flat payment records (each a dict of field name → value) to render into the XML; validate them first with validate_records. See get_input_schema for the fields."New value: +"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 as midnight), initiator_name, payment_id, requested_execution_date ('YYYY-MM-DD'), debtor_name, debtor_account_IBAN, debtor_agent_BIC, creditor_name, creditor_account_IBAN, creditor_agent_BIC, payment_amount (alias: 'amount'; max two decimals), currency (alias: 'payment_currency'; ISO 4217, e.g. 'EUR'), remittance_information. batch_booking accepts JSON true/false. nb_of_txs and ctrl_sum are computed automatically from the records and may be omitted. payment_method defaults to 'TRF' and charge_bearer to 'SLEV'. IBAN and BIC values are strictly validated and never coerced."
    • Changedgenerate_message_async3 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
      • changedInput schema / properties / records / description
        Previous value: -"One or more flat payment records (each a dict of field name → value) to render into the XML; use this async variant only when the batch is large. See get_input_schema."New value: +"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_schema for the full contract): id, date (payment-initiation timestamp; 'YYYY-MM-DD' is accepted and rendered as midnight), initiator_name, payment_id, requested_execution_date ('YYYY-MM-DD'), debtor_name, debtor_account_IBAN, debtor_agent_BIC, creditor_name, creditor_account_IBAN, creditor_agent_BIC, payment_amount (alias: 'amount'; max two decimals), currency (alias: 'payment_currency'; ISO 4217, e.g. 'EUR'), remittance_information. batch_booking accepts JSON true/false. nb_of_txs and ctrl_sum are computed automatically from the records and may be omitted. payment_method defaults to 'TRF' and charge_bearer to 'SLEV'. IBAN and BIC values are strictly validated and never coerced."
    • Changedgenerate_message_from_file2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedget_input_schema2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedget_required_fields2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedinspect_template2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedvalidate_records2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
    • Changedvalidate_xml_against_schema2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02', 'pain.001', 'pain.008' (see list_message_types). The bare family names 'pain.001' and 'pain.008' are accepted as aliases for 'pain.001.001.09' and 'pain.008.001.02'."
      • changedInput schema / properties / message_type / enum
        Previous value: -[
        -  "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",
        -  "pain.001.001.10",
        -  "pain.001.001.11",
        -  "pain.001.001.12",
        -  "pain.008.001.02"
        -]New value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02",
        +  "pain.001",
        +  "pain.008"
        +]
  7. 1 tool update
    • Addedconvert_mt101
  8. 8 tool updatesv0.0.57
    • Changedgenerate_message2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"The target ISO 20022 pain message type to render, e.g. 'pain.001.001.09' — see list_message_types."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."
      • addedInput schema / properties / message_type / enum
        Added value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02"
        +]
    • Changedgenerate_message_async2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"The target ISO 20022 pain message type to render, e.g. 'pain.001.001.09' — see list_message_types."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."
      • addedInput schema / properties / message_type / enum
        Added value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02"
        +]
    • Changedgenerate_message_from_file2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"The target ISO 20022 pain message type to render, e.g. 'pain.001.001.09' — see list_message_types."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."
      • addedInput schema / properties / message_type / enum
        Added value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02"
        +]
    • Changedget_input_schema2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"A supported ISO 20022 pain message type, e.g. 'pain.001.001.09' — see list_message_types for the exact accepted strings."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."
      • addedInput schema / properties / message_type / enum
        Added value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02"
        +]
    • Changedget_required_fields2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"A supported ISO 20022 pain message type, e.g. 'pain.001.001.09' — see list_message_types for the exact accepted strings."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."
      • addedInput schema / properties / message_type / enum
        Added value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02"
        +]
    • Changedinspect_template2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"A supported ISO 20022 pain message type whose bundled CSV template columns to return, e.g. 'pain.001.001.09' — see list_message_types."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."
      • addedInput schema / properties / message_type / enum
        Added value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02"
        +]
    • Changedvalidate_records2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"A supported ISO 20022 pain message type whose input JSON Schema the records are checked against, e.g. 'pain.001.001.09' — see list_message_types."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."
      • addedInput schema / properties / message_type / enum
        Added value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02"
        +]
    • Changedvalidate_xml_against_schema2 fields changed
      • changedInput schema / properties / message_type / description
        Previous value: -"The ISO 20022 pain message type whose XSD to validate against, e.g. 'pain.001.001.09' — see list_message_types."New value: +"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', 'pain.001.001.10', 'pain.001.001.11', 'pain.001.001.12', 'pain.008.001.02' (see list_message_types)."
      • addedInput schema / properties / message_type / enum
        Added value: +[
        +  "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",
        +  "pain.001.001.10",
        +  "pain.001.001.11",
        +  "pain.001.001.12",
        +  "pain.008.001.02"
        +]
  9. 14 tool updatesv0.0.56
    • Changedgenerate_message2 fields changed
      • addedInput schema / properties / message_type / description
        Added value: +"The target ISO 20022 pain message type to render, e.g. 'pain.001.001.09' — see list_message_types."
      • addedInput schema / properties / records / description
        Added value: +"One or more flat payment records (each a dict of field name → value) to render into the XML; validate them first with validate_records. See get_input_schema for the fields."
    • Changedgenerate_message_async2 fields changed
      • addedInput schema / properties / message_type / description
        Added value: +"The target ISO 20022 pain message type to render, e.g. 'pain.001.001.09' — see list_message_types."
      • addedInput schema / properties / records / description
        Added value: +"One or more flat payment records (each a dict of field name → value) to render into the XML; use this async variant only when the batch is large. See get_input_schema."
    • Changedgenerate_message_from_file2 fields changed
      • addedInput schema / properties / data_file_path / description
        Added value: +"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."
      • addedInput schema / properties / message_type / description
        Added value: +"The target ISO 20022 pain message type to render, e.g. 'pain.001.001.09' — see list_message_types."
    • Changedget_input_schema1 field changed
      • addedInput schema / properties / message_type / description
        Added value: +"A supported ISO 20022 pain message type, e.g. 'pain.001.001.09' — see list_message_types for the exact accepted strings."
    • Changedget_required_fields1 field changed
      • addedInput schema / properties / message_type / description
        Added value: +"A supported ISO 20022 pain message type, e.g. 'pain.001.001.09' — see list_message_types for the exact accepted strings."
    • Changedinspect_template1 field changed
      • addedInput schema / properties / message_type / description
        Added value: +"A supported ISO 20022 pain message type whose bundled CSV template columns to return, e.g. 'pain.001.001.09' — see list_message_types."
    • Changedmigrate_records3 fields changed
      • addedInput schema / properties / from_version / description
        Added value: +"Source pain.001 schema version the records currently use, e.g. 'pain.001.001.03' — see list_message_types."
      • addedInput schema / properties / records / description
        Added value: +"Flat payment records in the from_version shape, each a dict of field name → value, to transform to to_version."
      • addedInput schema / properties / to_version / description
        Added value: +"Target pain.001 schema version to migrate the records to, e.g. 'pain.001.001.09' — see list_message_types."
    • Changedparse_camt0532 fields changed
      • addedInput schema / properties / xml_file_path / description
        Added value: +"Local filesystem path to the camt.053 bank-statement XML file to parse."
      • addedInput schema / properties / xsd_file_path / description
        Added value: +"Optional local path to a camt.053 XSD; when given, the document is validated against it before parsing. Omit to skip schema validation."
    • Changedparse_pain0022 fields changed
      • addedInput schema / properties / xml_file_path / description
        Added value: +"Local filesystem path to the pain.002 payment-status report XML file to parse."
      • addedInput schema / properties / xsd_file_path / description
        Added value: +"Optional local path to a pain.002 XSD; when given, the document is validated against it before parsing. Omit to skip schema validation."
    • Changedsanitize_to_iso20022_charset1 field changed
      • addedInput schema / properties / value / description
        Added value: +"A single free-text field value (e.g. a name or remittance line) to transliterate to the ISO 20022 Latin character set."
    • Changedvalidate_identifier2 fields changed
      • addedInput schema / properties / kind / description
        Added value: +"Which identifier to validate: 'iban' or 'bic' (case-insensitive). Any other value returns an error."
      • addedInput schema / properties / value / description
        Added value: +"The identifier string to check — an IBAN or BIC/SWIFT code matching the chosen kind."
    • Changedvalidate_payment_scheme2 fields changed
      • addedInput schema / properties / profile / description
        Added value: +"The payment-scheme rulebook profile to enforce. One of 'sepa-sct', 'sepa-sdd', 'sepa-inst', or 'xborder-ct'. Defaults to 'sepa-sct'."
      • addedInput schema / properties / records / description
        Added value: +"Payment records as a list of flat dicts (field name → value) to check against the scheme rulebook."
    • Changedvalidate_records2 fields changed
      • addedInput schema / properties / message_type / description
        Added value: +"A supported ISO 20022 pain message type whose input JSON Schema the records are checked against, e.g. 'pain.001.001.09' — see list_message_types."
      • addedInput schema / properties / records / description
        Added value: +"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)."
    • Changedvalidate_xml_against_schema2 fields changed
      • addedInput schema / properties / message_type / description
        Added value: +"The ISO 20022 pain message type whose XSD to validate against, e.g. 'pain.001.001.09' — see list_message_types."
      • addedInput schema / properties / xml_content / description
        Added value: +"The full pain.001 / pain.008 XML document as a string, validated against the message type's official XSD."
  10. 16 tool updates
    • First observedgenerate_message
    • First observedgenerate_message_async
    • First observedgenerate_message_from_file
    • First observedget_input_schema
    • First observedget_required_fields
    • First observedinspect_template
    • First observedlist_message_types
    • First observedlist_supported_formats
    • First observedmigrate_records
    • First observedparse_camt053
    • First observedparse_pain002
    • First observedsanitize_to_iso20022_charset
    • First observedvalidate_identifier
    • First observedvalidate_payment_scheme
    • First observedvalidate_records
    • First observedvalidate_xml_against_schema

TDQS

A4.2/5.0

Scored across 21 tools

Disambiguation4/5

Most tools target clearly distinct resources or actions, and descriptions explicitly cross-reference alternatives such as validate_records vs validate_payment_scheme and parse_camt053 vs parse_pain002. Minor overlap remains between generate_message and generate_message_async (same operation with different execution context) and between get_required_fields and get_input_schema (subset vs full schema), so misselection is still possible but uncommon.

Naming Consistency5/5

Every tool uses snake_case with a leading verb (list_*, get_*, validate_*, generate_*, parse_*, convert_*, inspect_*, sanitize_*), and domain-specific names like parse_camt053 and convert_mt101 still fit the verb-noun pattern. There is no camelCase or mixed convention.

Tool Count3/5

21 tools is on the heavy side for a single server. While the ISO 20022 domain is broad, some tools are thin variants (generate_message_async) and several introspection tools could potentially be consolidated, placing this in the borderline 16-25 range.

Completeness4/5

The surface covers discovery, schema and required-field inspection, record and XML validation, scheme validation, generation from memory and CSV, migration, MT101 conversion, charset sanitisation, and parsing of camt.053 and pain.002 replies. Minor gaps remain: there is no parse_pain001 round-trip from XML back to records and no explicit listing of payment-scheme profiles, though agents can work around these.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Pactus is an MCP server for parsing and validating ISO 20022 payment messages directly from chat. It exposes nine tools that let AI assistants inspect or validate pacs.008, pacs.002, pain.001, and camt.053 messages — the message types at the centre of the CBPR+ migration — without leaving the conversation.
    9
    2
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    A Model Context Protocol server that advertises tools with JSON schemas and executes tool calls safely, enabling AI agents to perform actions on real systems.
    -
  • F
    license
    A
    quality
    A
    maintenance
    MCP server that enables AI agents to parse, validate, and reverse ISO 20022 bank statements, with tools for discovering message types and return reasons.
    24
    1
    -
  • F
    license
    A
    quality
    A
    maintenance
    An MCP server that exposes the pacs008 ISO 20022 FI-to-FI Customer Credit Transfer library as tools for AI agents and assistants, enabling generation, validation, and parsing of pacs.008 credit transfer XML messages.
    16
    1
    -