pain001-mcp
Expose pain001 ISO 20022 payment validation, XML generation, inspection, migration, parsing, simulation, and dual-control staging/commit as MCP tools.
Discover supported pain message types and CSV input formats.
Fetch required fields and full JSON Schemas for each pain message type.
Validate flat payment records against JSON Schemas or scheme rulebooks (SEPA, SCT, SDD, instant, cross-border).
Validate individual IBAN/BIC identifiers and raw XML against official XSDs.
Generate validated pain.001 / pain.008 XML from in-memory records, async batches, or local CSV files.
Suggest deterministic, review-only fixes for non-financial record errors; never alters financial fields.
Migrate records between pain.001 versions and convert legacy SWIFT MT101 into pain.001-ready records.
Parse camt.053 bank statements and pain.002 status reports from disk.
Inspect bundled CSV template columns and sanitize free text to ISO 20022/SWIFT charsets.
List, fetch, and inspect provenance/coverage for shipped example corpus files.
Simulate/pre-flight payment batches, including duplicates, control sums, fees, and risk scoring.
Stage batches for approval, simulate clearing-network execution, and commit with dual-control confirmation tokens.
Does not perform real settlement or bank approval; outputs require review before use.
Generates and validates SEPA payment initiation messages (pain.001 for credit transfers, pain.008 for direct debits) and applies scheme rulebooks (SEPA SCT, SDD, INST, B2B) via dedicated tools.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pain001-mcpGenerate a credit transfer XML for EUR 1000 to DE89370400440532013000"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Contents
Getting started
Install — PyPI and source
Requirements — toolchain floor, platforms
Quick Start — use the installed companion
The pain001-mcp ecosystem
The pain001-mcp ecosystem — core and this companion
Library reference
Capabilities at a glance — the current surface by theme
Ecosystem comparison — short matrix; full table at
docs/COMPARISON.mdBenchmarks — headline numbers; full table at
docs/BENCHMARKS.mdFeatures — module-level capability list
Configuration — core options
Examples — runnable example index
Operational
When not to use pain001-mcp — limitations
Development — make targets, fuzzing, CI
Security — guarantees and compliance
Documentation — all reference docs
Stability guarantees — SemVer axis, output stability, minimum toolchain discipline
Related MCP server: MCP Tool Server
Install
As a Python library
python -m pip install pain001-mcpPublished packages and development branches are distinct. Test unreleased
changes on this companion's feat/v0.0.71 branch against the matching core
branch. No PyPI release or version bump is part of this work.
Requirements
Python 3.10 or newer. CI tests 3.10–3.14 on Linux. See toolchain policy; no distro-system-Python claim is made.
Quick Start
pain001-mcp --help
pain001-mcpThe second command starts the stdio MCP server and waits for a client.
Configure your client to launch pain001-mcp. Use generated help for optional
HTTP/SSE transports; secure network access before exposing any listener.
The pain001-mcp ecosystem
This independently installed companion delegates payment behavior to core. Coordinated versioning does not imply branch changes have been released.
Component | Purpose | Use case |
Generation and validation | Shared contracts and XML engine |
Capabilities at a glance
Area | Capability | Status |
Integration | Payment validation and generation tools | Test-gated; new branch work is unreleased |
Ecosystem comparison
This matrix describes the repository's scope, not an independently benchmarked comparison with competitors.
Project | Generate payment XML | Real settlement | Synthetic bank replies |
pain001-mcp | Delegates to core | No | Not a bank service |
See docs/COMPARISON.md for the evidence and complete matrix.
Benchmarks
CI smoke-runs benchmarks. No hardware-independent throughput or latency promise is made; use the generated run report for measurements.
Scenario | Result | Environment |
Adapter operations | Run-specific | Python, hardware and dependency versions recorded per run |
See docs/BENCHMARKS.md for methodology and full results.
Features
The authoritative tool catalogue is generated from the server.
It covers validation, identifiers, generation, migration, bank-report parsing,
corpus access and the unreleased suggest_record_fix tool. Suggestions require
review; financial fields are refused, never guessed. Test unreleased tools with
the matching core feature branch. In-tree core MCP is a separate smaller surface.
Configuration
Run pain001-mcp --help for transport, host and port options. Stdio is default.
See the tool catalogue for request shapes rather than a copied
tool count.
Examples
Run the self-checking scripts under examples/. Tests cover valid and malformed inputs and integration with the core contract.
When not to use pain001-mcp
Not a bank, settlement engine or autonomous payment approver. Review outputs before use. Transport support is not bank certification.
Development
poetry install
poetry run make check
poetry run make security
poetry run python scripts/tool_catalogue.py --check
poetry run python scripts/render_readme.py --checkCoverage is gated at 100% line and branch. See CONTRIBUTING.md
and DEVELOPMENT.md. README is generated from the canonical
layout and docs/readme-values.json; CI rejects drift.
Security
Treat requests as untrusted. Protect HTTP listeners and avoid real secrets in logs. Tools may read authorized input paths. Corrections never patch IBANs, BICs, amounts or currencies.
Report vulnerabilities according to SECURITY.md.
Documentation
What is pain.001? · User manual · API reference · Developer guide · Family map
Stability guarantees
Versions advance in coordinated 0.0.1 steps with core. The maintainer opens
releases; this branch does not bump versions. Contract and output changes need
compatibility review. No stronger platform or stability guarantee is implied.
MCP Registry
mcp-name: io.github.sebastienrousseau/pain001-mcp
License
Dual-licensed under Apache-2.0 OR MIT, at your option. See LICENSE. Dependencies retain their own licences.
Available Tools
26 toolscommit_payment_batchCommit staged payment batch with dual controlA
Commit an authorized staged payment batch with dual-control authorization.
Verifies the stage ID and validates the secondary confirmation token
using constant-time cryptographic comparison (preventing timing attacks).
Transitions the order status from 'staged' to 'committed'. Optionally
writes the verified XML payload to the specified destination path.
Args:
stage_id: Staging identifier from stage_payment_batch.
confirmation_token: Secondary secret confirmation token.
output_file_path: Optional path to write the committed XML document.
Returns:
CommitPaymentBatchResult with commit timestamp and fingerprint,
or {"error": ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| stage_id | Yes | The staging identifier returned by stage_payment_batch. | |
| output_file_path | No | Optional local filesystem destination path to write the committed XML document. | |
| confirmation_token | Yes | Secondary authorization token required to execute the dual-control commit. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| status | No | |
| stage_id | No | |
| committed_at | No | |
| output_file_path | No | |
| sha256_fingerprint | No | |
| total_transactions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the safety profile is partly covered. The description adds genuinely useful behavioral context beyond that: constant-time cryptographic comparison to prevent timing attacks, the concrete state transition from 'staged' to 'committed', and that it writes a file when a path is given. It omits what happens on a second commit (idempotentHint=false), which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then organized into Args and Returns sections. Every sentence carries weight (security mechanism, state transition, optional file write). Slightly verbose for the payload but well structured and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, an output schema exists, and annotations cover the safety profile, the description is nearly complete: it covers parameters, the state change, the security mechanism, and an error return. The only meaningful omission is idempotency/re-commit behavior, which matters for a non-idempotent mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 all three parameters, including that output_file_path is optional and that stage_id comes from staging. The description restates these without adding syntax, format, or validation detail beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Commit) and resource (authorized staged payment batch) and qualifies the operation with 'dual-control authorization'. This clearly distinguishes it from the sibling stage_payment_batch, which only stages. An agent can tell the two apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the workflow by noting stage_id comes from stage_payment_batch, giving implicit context that this is the post-staging step. However, it never explicitly says when to use this versus simulate_payment_batch (the simulation sibling) or what preconditions must hold before committing. Guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_mt101Convert MT101 to pain.001 recordsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| mt101_text | Yes | A legacy SWIFT MT101 (Request for Transfer) message as text — a bare ':tag:' field list or a raw '{4:...-}' block-4 envelope. An MT101 may carry several sequence-B transfers; each becomes its own record. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 recordsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| records | Yes | One or more flat payment records (dicts of field name → value). Key fields (see get_input_schema for the full contract): id, date (payment-initiation timestamp; 'YYYY-MM-DD' is accepted and rendered 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_type | Yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '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
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| records | Yes | Same record shape and ergonomics as generate_message; use this async variant only when the batch is large. One or more flat payment records (dicts of field name → value). Key fields (see get_input_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_type | Yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '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
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 fileARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| message_type | Yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '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_path | Yes | Local filesystem path to a CSV file with one payment record per row and a header matching the template columns (see inspect_template). Only CSV is supported today. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 reportARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | The message type, e.g. 'pain.001.001.13'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| files | No | |
| paths | No | |
| exempt | No | |
| sources | No | |
| unknown | No | |
| branches | No | |
| complete | No | |
| message_type | No | |
| missing_paths | No | |
| missing_branches | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral detail beyond annotations: it delegates to pain001.corpus.coverage_report and explicitly describes the error return shape when no coverage set or corpus exists. No contradiction 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose, usage context, delegation, then Args/Returns. Every sentence contributes useful information, and there is no fluff or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with a rich output schema and strong annotations, the description covers purpose, usage context, return contents, and error behavior. Nothing an agent needs to decide whether and how to call this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 version as 'The message type, e.g. pain.001.001.13.' The description's Args section merely repeats 'version: The message type' without adding format constraints, defaults, or additional meaning. Baseline 3 is appropriate since the schema carries the semantic weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return the schema coverage verdict of one message type's coverage set.' It clearly distinguishes this from sibling corpus tools like get_corpus_file and get_corpus_provenance by focusing on coverage verdicts rather than file contents or provenance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use case: '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.' It does not explicitly name alternatives or when not to use it, but the context is strong enough for an agent to select it appropriately.
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 fileARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| variant | No | An overlay id for the bank variant, e.g. 'gb.example.priority'; omit for the generic file. | |
| version | Yes | The message type, e.g. 'pain.001.001.09'. | |
| scenario_id | Yes | The market scenario, e.g. 'gb.chaps.property-purchase' (from list_corpus_files). |
Output Schema
| Name | Required | Description |
|---|---|---|
| xml | No | |
| error | No | |
| variant | No | |
| version | No | |
| scenario_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description adds valuable behavior: the file is validated against XSD, ISO MDR rules, rail profile, and overlay; it is exactly what pain001 ships; it delegates to pain001.corpus.get_file; and it returns an error when the file or corpus is missing. This is rich, non-obvious context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, followed by a concise use case, validation guarantees, delegation note, and a structured Args/Returns section. Every sentence adds useful information and the length is appropriate for a tool with three parameters and a custom return shape.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, when to use it, what guarantees the returned XML has, the parameters, the return structure, and the error case. Nothing an agent needs to invoke it correctly is missing, especially given the annotations and schema already present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 all three parameters with examples. The Args section in the description mostly restates the schema ('scenario_id: The scenario', 'version: The message type', 'variant: The overlay id...') without adding new semantic detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return the XML of one validated example file from the market corpus.' This clearly distinguishes it from sibling tools like list_corpus_files, get_corpus_provenance, and get_corpus_coverage by focusing on retrieving a single file's XML content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit use cases: '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.' It does not mention when not to use it or name alternatives, but the context is clear enough for an agent to select it appropriately.
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 provenanceARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| variant | No | An overlay id for the bank variant; omit for the generic file. | |
| version | Yes | The message type, e.g. 'pain.001.001.09'. | |
| scenario_id | Yes | The market scenario (from list_corpus_files). |
Output Schema
| Name | Required | Description |
|---|---|---|
| build | No | |
| error | No | |
| twins | No | |
| family | No | |
| sha256 | No | |
| country | No | |
| variant | No | |
| scenario | No | |
| provenance | No | |
| validation | No | |
| constraints | No | |
| description | No | |
| message_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark this as read-only, idempotent, and non-destructive, and the description adds meaningful behavioral detail beyond that: it returns a parsed dict, returns an error dict when the file or corpus is missing, and delegates to pain001.corpus.provenance. It also discloses the provenance contents the agent should expect, which is valuable behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and use case, and the provenance contents list is informative rather than filler. The Args and Returns sections duplicate schema information and could be trimmed, but the overall size is reasonable and every section serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read-only tool, the description is complete: it states what the tool returns, what the return looks like, when an error is returned, and what the provenance data means. Combined with full schema coverage and supportive annotations, an agent has everything needed to invoke and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents scenario_id, version, and variant, including the version example and the variant's 'omit for generic file' guidance. The description's Args section repeats this information without adding new parameter semantics, so it earns the baseline score and no more.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return the provenance sidecar of one example file.' This is clearer than the title and makes the tool's artifact obvious. However, it does not explicitly differentiate itself from sibling tools such as get_corpus_file or get_corpus_coverage, so it stops short of full sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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' provides a clear, concrete usage context and explains what kind of information the result carries. It does not name alternative tools or state when not to use this tool, so there is clear context but no exclusions or alternates.
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 SchemaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| message_type | Yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '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
| Name | Required | Description |
|---|---|---|
| type | No | |
| error | No | |
| title | No | |
| version | No | |
| required | No | |
| properties | No | |
| description | No | |
| additionalProperties | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile with readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds behavioral context by specifying that the result is the 'full' schema and the record shape is 'flat', which meaningfully clarifies expectations without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose first, then use cases, then explicit alternatives, then a minimal Args section. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one required parameter, an exhaustive enum in the schema, a rich schema description, an output schema, and annotations covering side effects. The description adds the missing use-case and sibling-selection context, making it complete for an agent deciding how and when to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema itself fully documents the enum values and aliases for message_type. The description's Args line adds only a brief restatement rather than new semantic detail, so the schema carries the parameter-documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return the full JSON Schema for a message type's flat input record.' It clearly distinguishes this tool from siblings by naming get_required_fields and validate_records, and the 'flat input record' phrasing clarifies the exact shape of what is returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: to learn fields, types, and constraints before assembling records, or to drive a form/UI. It also gives clear alternatives with conditions: use get_required_fields for just required-field names, and validate_records to check records against the schema.
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 fieldsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| message_type | Yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '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
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 columnsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| message_type | Yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '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
| Name | Required | Description |
|---|---|---|
| error | No | |
| columns | No | |
| message_type | No |
TDQS
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 useful behavioral context: it returns column names from the bundled sample, returns an error for unsupported types or missing templates, and clarifies the alias behavior for bare family names. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the core function, the second gives usage context, and the third distinguishes from a sibling. The Args/Returns sections are minimal and directly useful. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only introspection tool with one parameter, a full output schema, and rich annotations, the description is complete. It covers the return shape, error behavior, and the relationship to sibling tools. 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.
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 the parameter fully, including the enum values and alias behavior. The description adds a concise restatement of the parameter's purpose and the return contract, which is helpful but not strictly necessary. Baseline 3 is exceeded slightly because the description clarifies the alias semantics in the context of the tool's purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Return the CSV column headers') and resource ('the message type's bundled template'), and distinguishes it from siblings by naming get_input_schema and generate_message_from_file. An agent can tell exactly what this tool does and how it differs from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('to see the exact column order for hand-building a CSV before generate_message_from_file') and when not to ('for the typed JSON contract ... use get_input_schema'). It also notes the mirroring of an in-tree tool, giving clear context for selection.
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 filesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | 'market' for the realistic per-country scenarios, 'coverage' for the schema coverage sets, or omit for both. | |
| country | No | Two-letter country code to keep one market pack only, e.g. 'GB' or 'CH'. Ignored for coverage files. | |
| version | No | Keep only files of this message type, e.g. 'pain.001.001.09'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| error | No | |
| files | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior, so the description only needs to add context. It meaningfully explains what the two file kinds are, that coverage files carry no scenario, and that a missing corpus yields an error, all without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the description is well organized into usage guidance, args, and returns. The delegation note and return-shape block are somewhat redundant with schema/output schema, but the overall structure remains easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with full schema coverage, clear filtering rules, and an output schema, the description covers the discovery workflow, file-kind distinction, error case, and parameter semantics. Nothing critical is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents kind, country, and version with examples, so the description does not need to add much. It accurately reiterates the parameters and gives useful high-level context, but it does not materially exceed what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly identifies the resource ('example files pain001 ships') and the specific listing verb, then breaks the result down into market scenarios and coverage sets. It distinguishes itself from siblings like get_corpus_file and get_corpus_provenance by being the discovery step, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this tool before calling get_corpus_file or get_corpus_provenance, which pins down the workflow position. It also gives selection context around market vs coverage files and country/version filtering, making when-to-use clear.
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 typesARead-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``).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 formatsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 versionsARead-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": ...}``.
| Name | Required | Description | Default |
|---|---|---|---|
| records | Yes | Flat payment records in the from_version shape, each a dict of field name → value, to transform to to_version. | |
| to_version | Yes | Target pain.001 schema version to migrate the records to, e.g. 'pain.001.001.09' — see list_message_types. | |
| from_version | Yes | Source pain.001 schema version the records currently use, e.g. 'pain.001.001.03' — see list_message_types. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | No | |
| from | No | |
| error | No | |
| records | No | |
| migrated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds real behavioral context beyond that: it reports renamed/derived/dropped fields, returns migrated rows plus a summary, and returns an error object if either version is unsupported. The 'transforms records only' statement clarifies there is no persistent side effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage, then workflow, then return contract. It is readable and well organized, though somewhat redundant: the renamed/derived/dropped summary appears twice, and the Args/Returns sections duplicate the input schema and output schema rather than adding new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter transformation tool with rich annotations and an output schema, the description is complete. It covers the trigger condition, the transformation semantics, the error case, the return shape, and the correct surrounding workflow with validate_records and generate_message. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 even without extra parameter detail. The description's Args section mostly repeats the schema, and the examples it adds ('pain.001.001.03', 'pain.001.001.09') are already present in the schema. It does not meaningfully compensate beyond what the structured schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Migrate flat payment records between two pain.001 schema versions.' It clearly distinguishes itself from siblings by noting it 'transforms records only' and naming the downstream validate_records/generate_message steps, so an agent can tell this apart from XML generation or validation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear trigger condition: use when a bank requires a different pain.001 version than the source data uses, with a concrete .03-to-.09 example. It also prescribes the follow-up workflow ('run validate_records afterwards, then generate_message'), but it does not explicitly mention alternatives or when not to use this tool, such as the sibling convert_mt101.
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 fileARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| xml_file_path | Yes | Local filesystem path to the camt.053 bank-statement XML file to parse. | |
| xsd_file_path | No | Optional local path to a camt.053 XSD; when given, the document is validated against it before parsing. Omit to skip schema validation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| iban | No | |
| error | No | |
| entries | No | |
| currency | No | |
| statement_id | No | |
| electronic_sequence_number | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint, and the description adds meaningful behavior beyond that: optional XSD validation precedes parsing, errors are returned as an {"error": ...} payload rather than raised, and the wrapped function is identified. This gives an agent accurate expectations about side effects and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and tool-selection guidance, then gives error behavior and args in a standard structure. It is slightly redundant with the input schema in the Args block, but every major section earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with rich annotations and an output schema, the description covers prerequisites (file path), optional validation semantics, error return shape, and the sibling alternative. Nothing an agent needs to decide whether and how to invoke it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters already have clear descriptions, so the baseline is 3. The description's Args block largely repeats the schema rather than adding new semantics; it does not materially deepen parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb ('Parse'), a specific resource ('camt.053 bank-statement XML file on disk'), and the output ('structured data'). It explicitly distinguishes from parse_pain002 by contrasting statement reply vs payment-status reply, so an agent can select it correctly without inspecting sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use context: reading an account statement into a header + entry list. It names the alternative tool parse_pain002 for payment-status replies and warns that validating an already-held camt.053 string is not this tool's purpose because it requires a file path. This is strong routing guidance.
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 fileARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| xml_file_path | Yes | Local filesystem path to the pain.002 payment-status report XML file to parse. | |
| xsd_file_path | No | Optional local path to a pain.002 XSD; when given, the document is validated against it before parsing. Omit to skip schema validation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| message_id | No | |
| group_status | No | |
| payment_statuses | No | |
| creation_datetime | No | |
| original_message_id | No | |
| original_message_name_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses that the tool reads from the local filesystem, optionally validates against an XSD before parsing, and returns an {"error": ...} payload on schema or parse errors instead of raising. It also notes the wrapped function, adding useful implementation context without contradicting any annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured: a clear one-sentence summary, a usage rationale, an explicit sibling alternative, technical behavior, and a compact Args/Returns section. Every sentence serves a distinct purpose, and the key differentiator is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a two-parameter parse tool with rich annotations. It covers what the tool does, when to use it, what the XSD parameter does, the error behavior, and the return shape. Nothing an agent needs to select and call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description's Args section mostly restates what the schema already documents, though it adds a small amount of contextual clarity around local filesystem access and the upfront-validation behavior. It does not meaningfully expand the semantic meaning of the parameters beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Parse a pain.002 payment-status report file on disk into structured data.' It also distinguishes itself from the sibling parse_camt053 by clarifying that this tool reads the bank's acknowledgement of a submitted pain.001, not the later account statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool — to read per-transaction accepted/rejected statuses and reason codes for a pain.001 — and when to use parse_camt053 instead. It also explains when to provide xsd_file_path, making the selection criteria and invocation context unambiguous.
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 charsetARead-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}``.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | A single free-text field value (e.g. a name or remittance line) to transliterate to the ISO 20022 Latin character set. | |
| charset | No | 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. | SWIFT_X |
Output Schema
| Name | Required | Description |
|---|---|---|
| value | No | |
| changed | No | |
| sanitised | No | |
| was_valid | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is known. The description adds valuable behavioral detail beyond the annotations: accents are transliterated, out-of-set characters are replaced with a space, and the result includes flags for validity and change. It also discloses charset limitations such as SWIFT_Z not permitting '|' or '}'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage, then uses clear bullets and an Args/Returns section. It is longer than strictly necessary—some charset details repeat what the schema already states—but every major section contributes to correct invocation, so the structure earns a strong score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the input value, both charset options, the transformation behavior, and the exact return shape. It also routes to the correct sibling for batch validation. With a rich output schema and safety-bearing annotations present, there are no meaningful gaps for an agent deciding whether and how to call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter semantics are already well documented in the input schema. The description still adds value by framing charset as 'SWIFT_X' default and backward-compatible, noting SWIFT_Z is a strict superset, and clarifying the practical distinction between basic and extended character sets.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Sanitise one free-text field to a SWIFT / ISO 20022 character set.' It clearly differentiates from the sibling tool validate_payment_scheme by noting that this operates on one string while that checks a whole batch's rulebook compliance. The two supported charsets are also explicitly named and contrasted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: apply this to a single free-text value before placing it in a record, and use it to surface whether the value changed. It also names the alternative for batch-level checks (validate_payment_scheme) and explains when to choose SWIFT_Z versus SWIFT_X, leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
simulate_clearingSimulate clearing network executionARead-onlyIdempotent
Simulate settlement and clearing network execution for a staged batch.
Evaluates network-specific rulebooks and clearing constraints:
- EPC-SEPA: EUR currency mandate, SEPA-zone IBAN prefixes, SLEV charge bearer.
- FedNow: USD instant gross settlement eligibility.
- US-ACH: USD next-day clearing cycle routing.
- SWIFT-MX: Cross-border correspondent banking BIC routing.
- CHAPS: Same-day RTGS high-value GBP clearing.
- BACS: Three-day GBP direct credit clearing.
Args:
stage_id: Staging identifier from stage_payment_batch.
clearing_system: Clearing rail profile to simulate.
Returns:
SimulateClearingResult with verdict (ACCEPTED / REJECTED), detailed
checks, and estimated settlement window, or {"error": ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| stage_id | Yes | The staging identifier returned by stage_payment_batch. | |
| clearing_system | No | Target clearing system simulation profile to evaluate settlement eligibility, cut-off windows, and routing constraints. | EPC-SEPA |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| checks | No | |
| stage_id | No | |
| clearing_status | No | |
| clearing_system | No | |
| settlement_window | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and non-destructive, so the safe, repeatable nature is covered. The description adds genuine context beyond that: it discloses that it evaluates network-specific rulebooks (per-rail currency/IBAN/charge-bearer/cut-off constraints) and the shape of the outcome (verdict, checks, settlement window, error).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then uses bullets efficiently to convey per-rail semantics that would otherwise be opaque enum values. The trailing Args/Returns block largely duplicates the input schema and the output schema, which is minor waste rather than a structural flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the return detail is optional but harmless; the annotations cover safety. The description supplies the domain context an agent needs (rail-specific rule profiles, staged-batch input) to invoke it correctly, leaving only the sibling-boundary with simulate_payment_batch unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds real meaning to the clearing_system enum by spelling out what each rail enforces (EPC-SEPA EUR+IBAN+SLEV, FedNow instant gross, US-ACH next-day, SWIFT-MX BIC routing, CHAPS RTGS, BACS three-day), helping the agent choose a profile. The stage_id note merely restates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (simulate) and resource (settlement and clearing network execution) scoped to 'a staged batch', plus a concrete per-rail breakdown. It is clearly distinct from validation/generation siblings, though it never names the nearest sibling, simulate_payment_batch, to draw the boundary explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it works on 'a staged batch' whose stage_id comes from stage_payment_batch, and each rail's intended use case is sketched. There is no explicit when-to-use-this-vs-simulate_payment_batch guidance and no exclusions or prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
simulate_payment_batchSimulate payment batchARead-onlyIdempotent
Simulate and pre-flight a payment batch before XML generation.
Performs comprehensive pre-flight verification without generating XML
or staging files:
1. Validates records against the message type's JSON Schema.
2. Validates records against an optional payment-scheme rulebook.
3. Computes control sums grouped by currency.
4. Calculates unique debtor and creditor account counts.
5. Detects intra-batch duplicate transactions (same debtor, creditor,
amount, currency, and execution date).
Returns a structured verdict with totals, sums by currency, duplicate
findings, and schema/scheme errors.
Args:
message_type: A supported ISO 20022 pain message type.
records: One or more flat payment records to simulate.
scheme: Optional payment scheme profile to validate against.
| Name | Required | Description | Default |
|---|---|---|---|
| scheme | No | Optional payment-scheme rulebook profile to enforce (e.g. 'sepa-sct', 'sepa-sdd', 'sepa-inst', 'xborder-ct'). Omit to skip scheme-specific rulebook validation. | |
| records | Yes | One or more flat payment records to simulate and pre-flight before generating XML. One or more flat payment records (dicts of field name → value). Key fields (see get_input_schema for the full 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_type | Yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '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
| Name | Required | Description |
|---|---|---|
| error | No | |
| total | No | |
| valid | No | |
| duplicates | No | |
| valid_count | No | |
| schema_errors | No | |
| unique_debtors | No | |
| unique_creditors | No | |
| scheme_violations | No | |
| control_sum_by_currency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description usefully adds that no XML is generated and no files are staged, plus it outlines the internal checks and the returned verdict. It does not cover permissions, rate limits, or cost, so it adds solid but not exhaustive context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line summary followed by a scannable numbered list of the five verifications is well structured. The trailing Args section largely duplicates schema content and is the one redundant element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description need not detail return values, yet it still states a structured verdict with totals, per-currency sums, duplicates, and errors. Combined with the explicit no-side-effect statement, it is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself documents scheme, records (with aliases, formats, defaults), and message_type in rich detail, including the bare-family aliases. The description's Args block only restates these minimally, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (simulate/pre-flight) and resource (payment batch) and enumerates the five concrete checks performed. This clearly distinguishes it from siblings like validate_records, stage_payment_batch, and generate_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Positions the tool precisely: 'pre-flight a payment batch before XML generation' and 'without generating XML or staging files,' which implicitly routes agents away from stage_payment_batch/generate_message for dry-run checks. It never explicitly names those alternatives or states when-not to use it, so a full 5 is not earned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stage_payment_batchStage payment batch for simulation and approvalA
Stage a payment batch for simulation and dual-control approval.
Creates an in-memory staged payment order with zero fund movement and
a 1-hour expiration window. Computes:
1. Schema validation against the message type's JSON Schema.
2. Optional scheme compliance verification (SEPA, BACS, etc.).
3. Multi-currency control sums and fee estimation.
4. Multi-factor risk scoring (detecting duplicates, high transaction
amounts, and generic remittance narratives).
5. In-memory XML compilation and SHA-256 fingerprinting.
6. Cryptographic dual-control confirmation token for subsequent authorization.
Args:
message_type: A supported ISO 20022 pain message type.
records: One or more flat payment records to stage.
scheme: Optional payment scheme profile to validate against.
Returns:
StagedBatchResult with staging metadata, risk assessment, fingerprint,
and confirmation token, or {"error": ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| scheme | No | Optional payment scheme profile to validate against, e.g. 'sepa-sct', 'sepa-instant', 'bacs', or 'cbpr-plus'. | |
| records | Yes | Flat payment records to stage (zero fund movement). One or more flat payment records (dicts of field name → value). Key fields (see get_input_schema for the full contract): id, date (payment-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_type | Yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '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
| Name | Required | Description |
|---|---|---|
| error | No | |
| status | No | |
| stage_id | No | |
| expires_at | No | |
| risk_level | No | |
| risk_score | No | |
| risk_factors | No | |
| estimated_fees | No | |
| confirmation_token | No | |
| sha256_fingerprint | No | |
| total_transactions | No | |
| control_sum_by_currency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false/destructiveHint=false/idempotentHint=false; the description adds genuinely useful behavior beyond that: zero fund movement, an in-memory staging model, a 1-hour expiration window, and a cryptographic confirmation token required before authorization. It does not state that repeat calls create new batches (consistent with idempotentHint=false), so it stops short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, but the six-item computed-steps list is verbose and the Args/Returns sections duplicate content already covered by a 100%-covered schema and an existing output schema. Length is not justified by additive information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 needn't be explained, yet the description still sketches the StagedBatchResult. For a complex staging operation it covers the important lifecycle (staging → risk/validation → token → authorization) and the ephemeral nature of the object. It omits any auth/permission requirements or note on repeat invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries the parameter contract in detail (ISO 20022 enums, aliases, defaults, IBAN/BIC validation). The Args section in the description largely restates this, adding little beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Stage a payment batch' with a clear scope (in-memory, zero fund movement, 1-hour expiration). It is clear what the tool does, but it never names or contrasts itself with the obvious siblings (simulate_payment_batch, commit_payment_batch), leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'For simulation and dual-control approval' and 'token for subsequent authorization' imply where this sits in a workflow, but the description never states when to choose this over simulate_payment_batch or commit_payment_batch, nor any preconditions or when-not-to-use guidance. Usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_record_fixSuggest review-only record fixesARead-onlyIdempotent
Suggest deterministic, review-only fixes to non-financial fields.
Returns patches or a cannot_autofix reason. Never changes IBANs, BICs,
accounts, amounts or currencies, even for whitespace. Review every
candidate and validate the full record before generating a payment.
Args:
record: A flat payment record, left unchanged.
validation_error: Finding with field (or path) and rule keys.
message_type: Supported schema supplying trusted field bounds.
| Name | Required | Description | Default |
|---|---|---|---|
| record | Yes | One flat payment record; never modified. | |
| message_type | No | 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'. | pain.001.001.03 |
| validation_error | Yes | Finding with field (or path) and rule keys. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds specific behavioral constraints beyond these: 'Never changes IBANs, BICs, accounts, amounts or currencies, even for whitespace' and 'deterministic'. It also clarifies the output behavior (patches or reason). No contradiction 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: a purpose sentence, an output sentence, and a constraint/usage sentence. It front-loads the purpose and constraints, with no wasted words or redundant content. The structure is clean and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and rich annotations, the description covers all essential aspects: what it does, its output, its constraints, and when to use it. It does not need to explain return values since the output schema handles that. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% per context signals, so the schema already documents each parameter. The description's Args section largely mirrors the schema (e.g., 'record: A flat payment record, left unchanged' vs. schema 'One flat payment record; never modified'). It adds minimal new meaning, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Suggest'), a specific resource ('record fixes'), and precise constraints ('review-only', 'non-financial fields', 'deterministic'). It clearly distinguishes this from siblings like validate_records (which validates) and generate_message (which generates), and explicitly notes it returns patches or a cannot_autofix reason, making the tool's function unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it is meant to be used before generating a payment, and is review-only. It also implicitly defines when not to use it (for financial fields, since it never changes them). However, it does not explicitly name alternative tools or exclusions, so it falls 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.
validate_identifierValidate IBAN or BICARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Which identifier to validate: 'iban' or 'bic' (case-insensitive). Any other value returns an error. | |
| value | Yes | The identifier string to check — an IBAN or BIC/SWIFT code matching the chosen kind. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | |
| error | No | |
| valid | No | |
| value | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark the tool as read-only and idempotent. The description adds the return contract (kind, value, valid, error) and clarifies that the error key appears only when valid is false, which is useful behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well structured: purpose, usage guidance, return format, and parameter details. Every section earns its place, and the key routing information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, read-only, idempotent tool with a complete input schema and an output schema, the description supplies everything needed to call it correctly. It covers purpose, alternatives, return shape, and parameter meaning without any meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters are already well documented in the schema. The Args section mostly restates the schema and adds no significant new meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise action and resource: validating a single financial identifier (IBAN or BIC). It also distinguishes this tool from batch validation siblings, so an agent can tell exactly what it is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this for one-off identifier checks with a clear pass/fail and reason. It also names validate_records and validate_payment_scheme as the preferred alternatives for batch validation, giving concrete when-to-use versus when-not-to-use guidance.
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 rulebookARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | The payment-scheme rulebook profile to enforce. One of 'sepa-sct', 'sepa-sdd', 'sepa-inst', or 'xborder-ct'. Defaults to 'sepa-sct'. | sepa-sct |
| records | Yes | Payment records as a list of flat dicts (field name → value) to check against the scheme rulebook. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| profile | No | |
| is_valid | No | |
| violations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds valuable context beyond that: it delegates to pain001.validate_scheme, supports four named profiles, returns structured violations with specific keys, and returns an error for unknown profiles. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the purpose and usage guidance. The Args and Returns sections are scannable and informative, though the profile list is repeated in both the prose and the Args section, adding minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully equips an agent to invoke the tool: it names the alternative to use before it, specifies supported profiles, documents both parameters, and describes the exact return shape including error behavior. With only two parameters and strong annotations, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. The description's Args section largely restates the schema, though it does add the clarifier that records are 'flat dicts' and that the tool validates 'for one profile' at a time. This is useful but not a major addition beyond an already rich schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: validating records against a payment-scheme rulebook, with concrete examples (SEPA) and named profiles. It also distinguishes itself from the sibling validate_records by explaining that structural shape versus rulebook compliance is the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this tool after validate_records and explains the division of labor: JSON-Schema validation checks structure, while this enforces scheme-specific business rules. This gives an agent clear guidance on when to choose this tool over its sibling.
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 schemaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| records | Yes | One or more flat payment records to validate, each a dict of field name → value (see get_input_schema for the fields and get_required_fields for the mandatory ones). | |
| message_type | Yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '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
| Name | Required | Description |
|---|---|---|
| error | No | |
| total | No | |
| valid | No | |
| errors | No | |
| valid_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds valuable behavior beyond that: it checks JSON-Schema shape only, reports row-by-row errors, and returns a specific report structure. No contradiction 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured and front-loaded: purpose, usage, return format, then args. The Args block is somewhat redundant with the input schema, but the usage and return-format sentences earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only validation tool with complete schema annotations and sibling references, the description covers purpose, usage, limitations, and return shape. Nothing needed 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the schema already documents message_type and records with details like the enum and references to get_input_schema/get_required_fields. The Args section in the description mostly repeats this rather than adding new semantic detail, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and object: 'Validate flat records against a message type's input JSON Schema.' It clearly separates this validation tool from sibling validate_payment_scheme by naming the alternative and the different check performed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says exactly when to use it ('Use this before generate_message to catch structural/type errors') and when to use an alternative ('for payment-scheme rulebook checks... also run validate_payment_scheme'). This is explicit routing between siblings with no inference required.
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 XSDARead-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``.
| Name | Required | Description | Default |
|---|---|---|---|
| xml_content | Yes | The full pain.001 / pain.008 XML document as a string, validated against the message type's official XSD. | |
| message_type | Yes | A supported ISO 20022 pain message type. Must be exactly one of: 'pain.001.001.03', 'pain.001.001.04', 'pain.001.001.05', 'pain.001.001.06', 'pain.001.001.07', 'pain.001.001.08', 'pain.001.001.09', '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
| Name | Required | Description |
|---|---|---|
| error | No | |
| valid | No | |
| message_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructiveness. The description adds useful behavioral context beyond annotations: it operates on an in-memory string without filesystem access, wraps a specific validation function, and specifies that the returned error field exists only when valid is false. No contradiction 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the primary use case and alternative tools. The Args/Returns block is useful, though it partially duplicates the fully specified input schema, and the internal module path adds little for an agent. Still, every section serves a purpose and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter validation tool, the description covers when to use it, what it does, what its output shape is, and how it differs from the most relevant siblings. The schema covers the remaining enum details and aliases, and the annotations cover safety and idempotency, so nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema itself fully documents xml_content and message_type, including the enum values and alias behavior. The description adds only a terse restatement of the two parameters, so it does not meaningfully exceed what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validate), a precise resource (raw pain.001/pain.008 XML string), and the referenced XSD. It also distinguishes itself from related 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use this tool: when the XML is already a string and you need to check it without touching the filesystem. It also gives clear alternatives and conditions: use validate_records before XML exists, and use parse_camt053/parse_pain002 for parsing statement or status-report files.
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.
4 tool updates
v0.0.72- Added
commit_payment_batch - Added
simulate_clearing - Added
simulate_payment_batch - Added
stage_payment_batch
15 tool updates
v0.0.71- Changed
get_corpus_coverage1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "CoverageCount": { + "description": "Declared schema elements, how many the corpus hits, as a percentage.", + "properties": { + "declared": { + "title": "Declared", + "type": "integer" + }, + "hit": { + "title": "Hit", + "type": "integer" + }, + "percent": { + "title": "Percent", + "type": "number" + } + }, + "required": [ + "declared", + "hit", + "percent" + ], + "title": "CoverageCount", + "type": "object" + } + }, + "description": "Schema-path coverage of the corpus for one message edition.", + "properties": { + "branches": { + "$ref": "#/$defs/CoverageCount" + }, + "complete": { + "title": "Complete", + "type": "boolean" + }, + "error": { + "title": "Error", + "type": "string" + }, + "exempt": { + "items": { + "type": "string" + }, + "title": "Exempt", + "type": "array" + }, + "files": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "title": "Files", + "type": "array" + }, + "message_type": { + "title": "Message Type", + "type": "string" + }, + "missing_branches": { + "items": { + "type": "string" + }, + "title": "Missing Branches", + "type": "array" + }, + "missing_paths": { + "items": { + "type": "string" + }, + "title": "Missing Paths", + "type": "array" + }, + "paths": { + "$ref": "#/$defs/CoverageCount" + }, + "sources": { + "items": {}, + "title": "Sources", + "type": "array" + }, + "unknown": { + "items": { + "type": "string" + }, + "title": "Unknown", + "type": "array" + } + }, + "title": "CorpusCoverageResult", + "type": "object" +}
- Changed
get_corpus_file1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "One corpus XML file with the request echoed beside it.", + "properties": { + "error": { + "title": "Error", + "type": "string" + }, + "scenario_id": { + "title": "Scenario Id", + "type": "string" + }, + "variant": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Variant" + }, + "version": { + "title": "Version", + "type": "string" + }, + "xml": { + "title": "Xml", + "type": "string" + } + }, + "title": "CorpusFileResult", + "type": "object" +}
- Changed
get_corpus_provenance1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "A scenario's provenance record, as the corpus ships it.", + "properties": { + "build": { + "additionalProperties": true, + "title": "Build", + "type": "object" + }, + "constraints": { + "items": {}, + "title": "Constraints", + "type": "array" + }, + "country": { + "title": "Country", + "type": "string" + }, + "description": { + "title": "Description", + "type": "string" + }, + "error": { + "title": "Error", + "type": "string" + }, + "family": { + "title": "Family", + "type": "string" + }, + "message_type": { + "title": "Message Type", + "type": "string" + }, + "provenance": { + "additionalProperties": true, + "title": "Provenance", + "type": "object" + }, + "scenario": { + "title": "Scenario", + "type": "string" + }, + "sha256": { + "title": "Sha256", + "type": "string" + }, + "twins": { + "additionalProperties": true, + "title": "Twins", + "type": "object" + }, + "validation": { + "additionalProperties": true, + "title": "Validation", + "type": "object" + }, + "variant": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Variant" + } + }, + "title": "CorpusProvenanceResult", + "type": "object" +}
- Changed
get_input_schema1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "A JSON Schema (draft 7) for one message type's flat records.", + "properties": { + "additionalProperties": { + "title": "Additionalproperties", + "type": "boolean" + }, + "description": { + "title": "Description", + "type": "string" + }, + "error": { + "title": "Error", + "type": "string" + }, + "properties": { + "additionalProperties": true, + "title": "Properties", + "type": "object" + }, + "required": { + "items": { + "type": "string" + }, + "title": "Required", + "type": "array" + }, + "title": { + "title": "Title", + "type": "string" + }, + "type": { + "title": "Type", + "type": "string" + }, + "version": { + "title": "Version", + "type": "string" + } + }, + "title": "SchemaResult", + "type": "object" +}
- Changed
inspect_template1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The bundled CSV template's column names for one message type.", + "properties": { + "columns": { + "items": { + "type": "string" + }, + "title": "Columns", + "type": "array" + }, + "error": { + "title": "Error", + "type": "string" + }, + "message_type": { + "title": "Message Type", + "type": "string" + } + }, + "title": "TemplateResult", + "type": "object" +}
- Changed
list_corpus_files1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "CorpusFileEntry": { + "description": "One file of the example corpus, as the index lists it.\n\nMarket files name a scenario, a country and a rail family; coverage\nfiles carry the edition only, so those three are null for them.", + "properties": { + "country": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Country" + }, + "family": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Family" + }, + "file": { + "title": "File", + "type": "string" + }, + "kind": { + "title": "Kind", + "type": "string" + }, + "scenario_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Scenario Id" + }, + "variant": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Variant" + }, + "version": { + "title": "Version", + "type": "string" + } + }, + "title": "CorpusFileEntry", + "type": "object" + } + }, + "description": "The example corpus index.", + "properties": { + "count": { + "title": "Count", + "type": "integer" + }, + "error": { + "title": "Error", + "type": "string" + }, + "files": { + "items": { + "$ref": "#/$defs/CorpusFileEntry" + }, + "title": "Files", + "type": "array" + } + }, + "title": "CorpusListResult", + "type": "object" +}
- Changed
migrate_records1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Records rewritten from one message edition to another.", + "properties": { + "error": { + "title": "Error", + "type": "string" + }, + "from": { + "title": "From", + "type": "string" + }, + "migrated": { + "title": "Migrated", + "type": "integer" + }, + "records": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "title": "Records", + "type": "array" + }, + "to": { + "title": "To", + "type": "string" + } + }, + "title": "MigrateResult", + "type": "object" +}
- Changed
parse_camt0531 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "A parsed camt.053 statement, as the core library reports it.", + "properties": { + "currency": { + "title": "Currency", + "type": "string" + }, + "electronic_sequence_number": { + "title": "Electronic Sequence Number", + "type": "string" + }, + "entries": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "title": "Entries", + "type": "array" + }, + "error": { + "title": "Error", + "type": "string" + }, + "iban": { + "title": "Iban", + "type": "string" + }, + "statement_id": { + "title": "Statement Id", + "type": "string" + } + }, + "title": "Camt053Result", + "type": "object" +}
- Changed
parse_pain0021 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "A parsed pain.002 status report, as the core library reports it.", + "properties": { + "creation_datetime": { + "title": "Creation Datetime", + "type": "string" + }, + "error": { + "title": "Error", + "type": "string" + }, + "group_status": { + "title": "Group Status", + "type": "string" + }, + "message_id": { + "title": "Message Id", + "type": "string" + }, + "original_message_id": { + "title": "Original Message Id", + "type": "string" + }, + "original_message_name_id": { + "title": "Original Message Name Id", + "type": "string" + }, + "payment_statuses": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "title": "Payment Statuses", + "type": "array" + } + }, + "title": "Pain002Result", + "type": "object" +}
- Changed
sanitize_to_iso20022_charset1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "A value and its ISO 20022 charset-clean rendering.", + "properties": { + "changed": { + "title": "Changed", + "type": "boolean" + }, + "sanitised": { + "title": "Sanitised", + "type": "string" + }, + "value": { + "title": "Value", + "type": "string" + }, + "was_valid": { + "title": "Was Valid", + "type": "boolean" + } + }, + "title": "SanitiseResult", + "type": "object" +}
- Added
suggest_record_fix - Changed
validate_identifier1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "An IBAN or BIC verdict, with the library's message when invalid.", + "properties": { + "error": { + "title": "Error", + "type": "string" + }, + "kind": { + "title": "Kind", + "type": "string" + }, + "valid": { + "title": "Valid", + "type": "boolean" + }, + "value": { + "title": "Value", + "type": "string" + } + }, + "title": "ValidateIdentifierResult", + "type": "object" +}
- Changed
validate_payment_scheme1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "SchemeViolation": { + "description": "One rulebook violation, with the remediation the library suggests.", + "properties": { + "field": { + "title": "Field", + "type": "string" + }, + "index": { + "title": "Index", + "type": "integer" + }, + "message": { + "title": "Message", + "type": "string" + }, + "remediation": { + "title": "Remediation", + "type": "string" + }, + "rule": { + "title": "Rule", + "type": "string" + }, + "severity": { + "title": "Severity", + "type": "string" + } + }, + "required": [ + "rule", + "field", + "index", + "message", + "remediation", + "severity" + ], + "title": "SchemeViolation", + "type": "object" + } + }, + "description": "Verdict against a scheme rulebook profile.", + "properties": { + "error": { + "title": "Error", + "type": "string" + }, + "is_valid": { + "title": "Is Valid", + "type": "boolean" + }, + "profile": { + "title": "Profile", + "type": "string" + }, + "violations": { + "items": { + "$ref": "#/$defs/SchemeViolation" + }, + "title": "Violations", + "type": "array" + } + }, + "title": "SchemeResult", + "type": "object" +}
- Changed
validate_records1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "RecordError": { + "description": "One schema violation: the record's row, the field path, the message.", + "properties": { + "message": { + "title": "Message", + "type": "string" + }, + "path": { + "title": "Path", + "type": "string" + }, + "row": { + "title": "Row", + "type": "integer" + } + }, + "required": [ + "row", + "path", + "message" + ], + "title": "RecordError", + "type": "object" + } + }, + "description": "Verdict over a batch: one entry per violation, plus the counts.", + "properties": { + "error": { + "title": "Error", + "type": "string" + }, + "errors": { + "items": { + "$ref": "#/$defs/RecordError" + }, + "title": "Errors", + "type": "array" + }, + "total": { + "title": "Total", + "type": "integer" + }, + "valid": { + "title": "Valid", + "type": "boolean" + }, + "valid_count": { + "title": "Valid Count", + "type": "integer" + } + }, + "title": "ValidateRecordsResult", + "type": "object" +}
- Changed
validate_xml_against_schema1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Verdict of an XML document against the official XSD.", + "properties": { + "error": { + "title": "Error", + "type": "string" + }, + "message_type": { + "title": "Message Type", + "type": "string" + }, + "valid": { + "title": "Valid", + "type": "boolean" + } + }, + "title": "XsdResult", + "type": "object" +}
12 tool updates
v0.0.67- Changed
generate_message2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
generate_message_async2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
generate_message_from_file2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Added
get_corpus_coverage - Added
get_corpus_file - Added
get_corpus_provenance - Changed
get_input_schema2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
get_required_fields2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
inspect_template2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Added
list_corpus_files - Changed
validate_records2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
validate_xml_against_schema2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
1 tool update
v0.0.62- Changed
sanitize_to_iso20022_charset1 field changed- added
Input schema / properties / charsetAdded 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" +}
8 tool updates
- Changed
generate_message2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Added
generate_message_async - Changed
generate_message_from_file2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
get_input_schema2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
get_required_fields2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
inspect_template2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
validate_records2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
validate_xml_against_schema2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
14 tool updates
v0.0.60- Added
convert_mt101 - Added
generate_message - Added
generate_message_from_file - Added
get_input_schema - Added
get_required_fields - Added
inspect_template - Added
list_message_types - Added
list_supported_formats - Added
parse_camt053 - Added
sanitize_to_iso20022_charset - Added
validate_identifier - Added
validate_payment_scheme - Added
validate_records - Added
validate_xml_against_schema
15 tool updates
- Removed
convert_mt101 - Removed
generate_message - Removed
generate_message_async - Removed
generate_message_from_file - Removed
get_input_schema - Removed
get_required_fields - Removed
inspect_template - Removed
list_message_types - Removed
list_supported_formats - Removed
parse_camt053 - Removed
sanitize_to_iso20022_charset - Removed
validate_identifier - Removed
validate_payment_scheme - Removed
validate_records - Removed
validate_xml_against_schema
8 tool updates
- Changed
generate_message3 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +] - changed
Input schema / properties / records / descriptionPrevious 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."
- Changed
generate_message_async3 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +] - changed
Input schema / properties / records / descriptionPrevious 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."
- Changed
generate_message_from_file2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
get_input_schema2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
get_required_fields2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
inspect_template2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
validate_records2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
- Changed
validate_xml_against_schema2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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'." - changed
Input schema / properties / message_type / enumPrevious 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" +]
1 tool update
- Added
convert_mt101
8 tool updates
v0.0.57- Changed
generate_message2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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)." - added
Input schema / properties / message_type / enumAdded 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" +]
- Changed
generate_message_async2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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)." - added
Input schema / properties / message_type / enumAdded 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" +]
- Changed
generate_message_from_file2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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)." - added
Input schema / properties / message_type / enumAdded 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" +]
- Changed
get_input_schema2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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)." - added
Input schema / properties / message_type / enumAdded 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" +]
- Changed
get_required_fields2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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)." - added
Input schema / properties / message_type / enumAdded 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" +]
- Changed
inspect_template2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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)." - added
Input schema / properties / message_type / enumAdded 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" +]
- Changed
validate_records2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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)." - added
Input schema / properties / message_type / enumAdded 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" +]
- Changed
validate_xml_against_schema2 fields changed- changed
Input schema / properties / message_type / descriptionPrevious 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)." - added
Input schema / properties / message_type / enumAdded 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" +]
14 tool updates
v0.0.56- Changed
generate_message2 fields changed- added
Input schema / properties / message_type / descriptionAdded value: +"The target ISO 20022 pain message type to render, e.g. 'pain.001.001.09' — see list_message_types." - added
Input schema / properties / records / descriptionAdded 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."
- Changed
generate_message_async2 fields changed- added
Input schema / properties / message_type / descriptionAdded value: +"The target ISO 20022 pain message type to render, e.g. 'pain.001.001.09' — see list_message_types." - added
Input schema / properties / records / descriptionAdded 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."
- Changed
generate_message_from_file2 fields changed- added
Input schema / properties / data_file_path / descriptionAdded 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." - added
Input schema / properties / message_type / descriptionAdded value: +"The target ISO 20022 pain message type to render, e.g. 'pain.001.001.09' — see list_message_types."
- Changed
get_input_schema1 field changed- added
Input schema / properties / message_type / descriptionAdded value: +"A supported ISO 20022 pain message type, e.g. 'pain.001.001.09' — see list_message_types for the exact accepted strings."
- Changed
get_required_fields1 field changed- added
Input schema / properties / message_type / descriptionAdded value: +"A supported ISO 20022 pain message type, e.g. 'pain.001.001.09' — see list_message_types for the exact accepted strings."
- Changed
inspect_template1 field changed- added
Input schema / properties / message_type / descriptionAdded 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."
- Changed
migrate_records3 fields changed- added
Input schema / properties / from_version / descriptionAdded value: +"Source pain.001 schema version the records currently use, e.g. 'pain.001.001.03' — see list_message_types." - added
Input schema / properties / records / descriptionAdded value: +"Flat payment records in the from_version shape, each a dict of field name → value, to transform to to_version." - added
Input schema / properties / to_version / descriptionAdded value: +"Target pain.001 schema version to migrate the records to, e.g. 'pain.001.001.09' — see list_message_types."
- Changed
parse_camt0532 fields changed- added
Input schema / properties / xml_file_path / descriptionAdded value: +"Local filesystem path to the camt.053 bank-statement XML file to parse." - added
Input schema / properties / xsd_file_path / descriptionAdded value: +"Optional local path to a camt.053 XSD; when given, the document is validated against it before parsing. Omit to skip schema validation."
- Changed
parse_pain0022 fields changed- added
Input schema / properties / xml_file_path / descriptionAdded value: +"Local filesystem path to the pain.002 payment-status report XML file to parse." - added
Input schema / properties / xsd_file_path / descriptionAdded value: +"Optional local path to a pain.002 XSD; when given, the document is validated against it before parsing. Omit to skip schema validation."
- Changed
sanitize_to_iso20022_charset1 field changed- added
Input schema / properties / value / descriptionAdded value: +"A single free-text field value (e.g. a name or remittance line) to transliterate to the ISO 20022 Latin character set."
- Changed
validate_identifier2 fields changed- added
Input schema / properties / kind / descriptionAdded value: +"Which identifier to validate: 'iban' or 'bic' (case-insensitive). Any other value returns an error." - added
Input schema / properties / value / descriptionAdded value: +"The identifier string to check — an IBAN or BIC/SWIFT code matching the chosen kind."
- Changed
validate_payment_scheme2 fields changed- added
Input schema / properties / profile / descriptionAdded value: +"The payment-scheme rulebook profile to enforce. One of 'sepa-sct', 'sepa-sdd', 'sepa-inst', or 'xborder-ct'. Defaults to 'sepa-sct'." - added
Input schema / properties / records / descriptionAdded value: +"Payment records as a list of flat dicts (field name → value) to check against the scheme rulebook."
- Changed
validate_records2 fields changed- added
Input schema / properties / message_type / descriptionAdded 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." - added
Input schema / properties / records / descriptionAdded 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)."
- Changed
validate_xml_against_schema2 fields changed- added
Input schema / properties / message_type / descriptionAdded value: +"The ISO 20022 pain message type whose XSD to validate against, e.g. 'pain.001.001.09' — see list_message_types." - added
Input schema / properties / xml_content / descriptionAdded value: +"The full pain.001 / pain.008 XML document as a string, validated against the message type's official XSD."
16 tool updates
- First observed
generate_message - First observed
generate_message_async - First observed
generate_message_from_file - First observed
get_input_schema - First observed
get_required_fields - First observed
inspect_template - First observed
list_message_types - First observed
list_supported_formats - First observed
migrate_records - First observed
parse_camt053 - First observed
parse_pain002 - First observed
sanitize_to_iso20022_charset - First observed
validate_identifier - First observed
validate_payment_scheme - First observed
validate_records - First observed
validate_xml_against_schema
TDQS
Scored across 26 tools
The descriptions are exceptionally explicit, with each tool naming its siblings and stating when to use which (e.g. validate_records vs validate_payment_scheme vs validate_xml_against_schema; generate_message vs its _async and _from_file variants). The only real overlap is between simulate_payment_batch and stage_payment_batch, which both run schema/scheme validation, control sums, and duplicate detection, differing mainly in the staging/token layer, so a few calls could be confused.
Every tool follows a consistent snake_case verb_noun (or verb_object) convention: list_message_types, get_input_schema, validate_records, generate_message, parse_camt053, convert_mt101, etc. Suffix modifiers (_async, _from_file) are applied predictably to the base verb, with no camelCase or mixed-style deviations.
At 26 tools the surface is heavy and sits at the top of the acceptable range, driven partly by the four-tool corpus group and the four-tool staging/clearing lifecycle. Each tool is individually justifiable given the broad ISO 20022 domain, but the set is dense enough that some consolidation (e.g. simulate vs stage) would help.
The surface covers the full payment lifecycle: discovery of message types/schemas/formats, record validation and repair, generation (memory, file, async), XSD validation, scheme rulebook checks, version migration, MT101 conversion, charset sanitisation, and parsing of pain.002/camt.053 responses, plus a market corpus with provenance and coverage metadata. No obvious dead ends remain for the stated pain/camt domain.
Maintenance
Related MCP Connectors
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
Related MCP Servers
- AlicenseAqualityCmaintenancePactus 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.92MIT
- FlicenseNot gradedqualityCmaintenanceA Model Context Protocol server that advertises tools with JSON schemas and executes tool calls safely, enabling AI agents to perform actions on real systems.-
- FlicenseAqualityAmaintenanceMCP server that enables AI agents to parse, validate, and reverse ISO 20022 bank statements, with tools for discovering message types and return reasons.242-
- FlicenseAqualityAmaintenanceAn 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.1631 PyPI1-