Sebastien Rousseau
OPEN SOURCE · APACHE-2.0 · ON PYPI + THE MCP REGISTRY

Let your AI agent make real bank payments.

Nine open MCP servers that turn plain language into validated ISO 20022 bank messages: initiate, settle, reconcile and resolve. Vendor-neutral, runs anywhere, installed in one line.

Terminal · claude
claude mcp add iso20022 -- uvx --from "iso20022-mcp[all]" iso20022-mcpclaude mcp listiso20022 · connectedclaudeGenerate a pain.001 credit transfer paying Acme GmbH EUR 4,200, executing Friday.generate · records validated against the official XSD✓ schema-valid pain.001.001.03 returned

9 servers, live on PyPI · 100% branch-tested · vendor-neutral, Apache-2.0

FOR THE BOARD

Three questions, answered up front.

What agentic payments cost, what they risk and what they replace, before anyone books a meeting about it.

WHAT IT COSTS

Free. Apache-2.0.

No licence, no account, no procurement. The whole suite is open source on public PyPI, so adopting it is an engineering decision, not a contract negotiation.

WHAT IT RISKS

Money never moves without a human.

The servers generate and check messages; sending them stays behind your own approval wall, in your own systems. Every gateway tool is read-only and idempotent.

WHAT IT REPLACES

Bespoke ISO 20022 integration work.

The message generation, validation and reconciliation plumbing a team would otherwise build by hand against the schemas, maintained in the open instead.

WHAT YOU CAN DO

Payment operations, from a sentence.

Give an agent the jobs a treasury team does by hand. Every result is schema-valid before it is returned.

INITIATE

Pay from plain language.

“Pay this supplier €4,200” becomes a validated pain.001 or pacs.008, IBAN- and XSD-checked, ready for the rail.

RECONCILE

Match a statement in seconds.

Reconcile a camt.053 statement against what you expected, with an explainable reason for every match, partial and split payment.

MIGRATE

Get off SWIFT MT in time.

Convert MT103/MT101/MT94x to ISO 20022 and fix structured addresses before the 2026–2028 deadlines, one message at a time.

BRIDGE

Turn a mandate into a wire.

Take a signed AP2 or x402 agent mandate and produce a wire-valid pain.001, with spending-cap and expiry guardrails.

SEE IT WORK

From a sentence to a validated message.

Pick a real payment sentence and watch it become an exact MCP tool call and schema-valid ISO 20022 XML. Every transcript shown was captured from a live server, not mocked.

This interactive demo lets you pick a payment sentence and see the exact MCP tool call an assistant makes, plus the validated ISO 20022 XML the gateway returned, captured live over stdio. Enable JavaScript to explore the transcripts.

A grid of blue and white cubes with one cube glowing, evoking a validated message among structured blocks.
CAPABILITY, NOT BROCHURE

An MCP server that does the work, not just the docs.

Ask for a payment and get the validated message itself. These servers generate, validate, parse, convert and reconcile ISO 20022 on your machine; they do not stop at telling you how.

9

servers on PyPI

87

tools, captured live

0

outbound network calls

100%

branch coverage

Tool count computed at build time from the committed tools/list captures in this site's repository, recorded over stdio JSON-RPC from the running servers.

NEW TO MCP?

What is the Model Context Protocol?

MCP is an open standard that lets AI assistants use real tools safely, a universal port between an assistant and your systems.

THE PROBLEM

Agents talk, but can't act.

A model can describe a payment, but not produce the exact bank message that moves it. Every integration was bespoke glue code.

THE STANDARD

One protocol, any tool.

MCP gives assistants a common way to discover and call tools, from Claude, Cursor or your own agent. Build a capability once; every client can use it.

THIS SUITE

Payments as MCP tools.

These servers expose ISO 20022 as MCP tools. Ask in plain terms, get back XSD-validated messages. No translator between your systems and the rails.

THE OUTCOME

Build the next era of your enterprise.

Agents that act across your whole payment stack: initiate, reconcile, migrate and resolve, on an open, vendor-neutral standard you can run anywhere.

THE SUITE

Nine servers, one payment lifecycle.

Install the gateway and let it route, or install just the server for the job. Each is one pip install, on the MCP registry.

DISCOVER + GENERATE

The gateway.

One surface across pain, pacs, camt and acmt: search, generate XSD-valid XML, validate and parse, through seven meta-tools.

  • iso20022-mcp
  • pain001-mcp
  • pacs008-mcp
Read the docs
RECONCILE + RESOLVE

Close the loop.

Match statements to expected payments, explainably. When one goes wrong, cancel and resolve it with camt.056 and camt.029.

  • reconcile-mcp
  • camt053-mcp
  • camt-exceptions
See the recipes
BRIDGE + ACCOUNTS

The frontier.

Bridge AP2 / x402 agent mandates to a wire-valid message, guardrailed, and open or verify accounts with acmt.001.

  • ap2-iso20022
  • acmt001-mcp
  • bankstatementparser-mcp
Tool reference
TRUST, BY ARCHITECTURE

Money never moves without a human.

The servers produce and check messages. Sending them stays behind your approval, in your own systems.

  1. Generate locally.

    Your records become a pain.001 or pacs.008 on your own machine, over stdio. Nothing is uploaded anywhere.

  2. Validate locally.

    Output is checked against the bundled official XSD before it returns. Deterministic, offline, the same answer every run.

  3. Approval wall

    A human approves.

    Every meta-tool is annotated read-only and idempotent. The message is a file; a person decides whether it becomes a payment.

  4. Your rails dispatch.

    Submission to SWIFT, SEPA or FedNow happens in your own banking channel. The servers hold no credentials and never move money.

SECURITY POSTURE

Your payment data stays yours.

LOCAL-FIRST

Zero data retention.

The stdio servers run inside your environment and make no outbound network calls. Nothing is sent, nothing is stored, nothing phones home.

DETERMINISTIC

Validated on your machine.

Every generated message is checked against the bundled official ISO 20022 XSD locally, before you ever see it.

OPEN

Apache-2.0, in the open.

Every server is open source on PyPI and the official MCP registry. Read the code before you trust it.

TESTED

100% branch-tested.

Full branch coverage across the suite, so the paths an agent exercises are the paths the tests exercise.

FOR REGULATORS AND COMPLIANCE

Evidence a supervisor can check.

Tools that cite their sources, dates they enforce, and validation an auditor can rerun and get the same answer.

CITED, NOT ASSERTED

Rulebook clauses with sources.

cite_rulebook and list_rulebook_clauses return curated SEPA, CBPR+ and HVPS+ clauses, versioned, each with its canonical source URL, so a compliance claim can be traced to the official document.

THE 2026 CUTOVER

November 2026, encoded.

get_cbpr_cutover_date returns 2026-11-16, and check_cbpr_readiness audits a camt.053 statement against the CBPR+ acceptance rules that take effect at the 14-16 November 2026 cutover, structured postal addresses included.

STRUCTURED ADDRESSES

The address cliff, tool by tool.

classify_address, validate_address, repair_address and validate_addresses classify, police and repair party addresses against the 14 November 2026 rule that rejects unstructured-only addresses.

AUDIT EVIDENCE

Deterministic, offline validation.

Every generated message is checked against the bundled official XSD on your machine: same input, same answer, no network. A validation run can be reproduced by an auditor, line for line.

A note on DORA. This suite is not certified against DORA, and no such product certification exists. What the architecture offers is raw material for your own control mapping: local execution reduces reliance on external ICT providers for message validation, deterministic offline validation produces repeatable testing evidence, and open source means your auditors can read every line they depend on. Whether these properties satisfy your DORA obligations is your assessment to make.

A minimalist wall clock, evoking payment operations measured in seconds.
TIMED, NOT ESTIMATED

Under a minute, with a stopwatch on it.

From a completely empty package cache to a schema-valid pain.001 in 17.5 seconds, downloads included. We measured it, on 16 July 2026, instead of promising it.

17.5s

cold cache to validated pain.001

1.5s

warm cache, same session

1

call, first try

0

accounts, keys or sign-ups

Method: stdio JSON-RPC client timestamps from process spawn: uvx --from "iso20022-mcp[all]" iso20022-mcp, initialize handshake, then one generate call returning a schema-valid pain.001.001.03 (gateway 0.0.4). Cold run used --cache-dir pointing at an empty directory, so the 17.5s includes resolving and downloading every package; the warm run reused the populated cache. Machine: Apple-silicon Mac (arm64 macOS), uv 0.11.21.

FREE, THREE WAYS

Free means free.

BOARDS

Free to adopt.

Nothing to procure: no licence, no contract, no vendor negotiation. Apache-2.0, tied to no balance sheet.

ENGINEERS

Free to run.

No account, no API key, no metering. One uvx command and the suite is running on your own machine.

REGULATORS

Free to audit.

Every line public on GitHub and PyPI. Read the exact code that validates the message before you rely on it.

WORKS WITH YOUR STACK

Works with every MCP client.

One standard stdio server, so the setup is one small block in your client's own config. Remote-first platforms connect to hosted MCP servers instead.

Claude Code

One command, from any directory.

claude mcp add iso20022 -- uvx --from "iso20022-mcp[all]" iso20022-mcp

Claude Desktop

Settings, Developer, Edit Config: claude_desktop_config.json.

{
  "mcpServers": {
    "iso20022": {
      "command": "uvx",
      "args": ["--from", "iso20022-mcp[all]", "iso20022-mcp"]
    }
  }
}

Cursor

.cursor/mcp.json in the project, or ~/.cursor/mcp.json.

{
  "mcpServers": {
    "iso20022": {
      "command": "uvx",
      "args": ["--from", "iso20022-mcp[all]", "iso20022-mcp"]
    }
  }
}

Windsurf

~/.codeium/windsurf/mcp_config.json.

{
  "mcpServers": {
    "iso20022": {
      "command": "uvx",
      "args": ["--from", "iso20022-mcp[all]", "iso20022-mcp"]
    }
  }
}

VS Code + GitHub Copilot

.vscode/mcp.json. The top-level key is "servers".

{
  "servers": {
    "iso20022": {
      "type": "stdio",
      "command": "uvx",
      "args": ["--from", "iso20022-mcp[all]", "iso20022-mcp"]
    }
  }
}

Google Gemini CLI

"mcpServers" inside ~/.gemini/settings.json.

{
  "mcpServers": {
    "iso20022": {
      "command": "uvx",
      "args": ["--from", "iso20022-mcp[all]", "iso20022-mcp"]
    }
  }
}

OpenAI Codex CLI

~/.codex/config.toml, or one command: codex mcp add iso20022 -- uvx ...

[mcp_servers.iso20022]
command = "uvx"
args = ["--from", "iso20022-mcp[all]", "iso20022-mcp"]

Remote-first platforms

OpenAI

The Agents SDK spawns the suite locally over stdio through its MCPServerStdio class, with the same command and args. ChatGPT connectors and the Responses API connect to remote MCP servers over Streamable HTTP or HTTP/SSE only, so they pair with a hosted deployment, not a local process.

async with MCPServerStdio(
    name="iso20022",
    params={
        "command": "uvx",
        "args": ["--from", "iso20022-mcp[all]", "iso20022-mcp"],
    },
) as server:
    ...

Microsoft Copilot Studio

Adds MCP servers to agents as tools through Power Platform connectors, over the Streamable HTTP transport only; it does not run local stdio servers.

Zapier MCP

A Zapier-hosted remote MCP endpoint: you create a dedicated server at mcp.zapier.com and point your client at the generated URL. It connects clients to Zapier actions, not to local servers like this suite.

Config shapes checked against each client's official documentation, July 2026. Full per-client setup

INSTALL

Install it your way.

Run it with uvx and nothing to install, pin it with pip, or drop one block of JSON into Claude Desktop.

uvx --from "iso20022-mcp[all]" iso20022-mcp

No install, no account, no key. The [all] extra covers every family, bank statements included.

pip install "iso20022-mcp[all]"
iso20022-mcp

Installed with pip, the client config is just the iso20022-mcp command, no args.

{
  "mcpServers": {
    "iso20022": {
      "command": "uvx",
      "args": ["--from", "iso20022-mcp[all]", "iso20022-mcp"]
    }
  }
}

Settings, Developer, Edit Config, then restart. The tools appear under the tools icon in the chat box.

{
  "mcpServers": {
    "iso20022": {
      "command": "uvx",
      "args": ["--from", "iso20022-mcp[all]", "iso20022-mcp"]
    }
  }
}

.cursor/mcp.json in the project, or ~/.cursor/mcp.json to make the suite available everywhere.

{
  "servers": {
    "iso20022": {
      "type": "stdio",
      "command": "uvx",
      "args": ["--from", "iso20022-mcp[all]", "iso20022-mcp"]
    }
  }
}

.vscode/mcp.json, for GitHub Copilot. The top-level key is "servers", not "mcpServers".

async with MCPServerStdio(
    name="iso20022",
    params={
        "command": "uvx",
        "args": ["--from", "iso20022-mcp[all]", "iso20022-mcp"],
    },
) as server:
    ...

The Python Agents SDK spawns the server itself over stdio through MCPServerStdio.

GET STARTED

Live in under a minute.

STEP 1

Run it, no install.

Start the gateway with one command, no account, no key: uvx --from "iso20022-mcp[all]" iso20022-mcp

STEP 2

Ask in plain terms.

Try search "cancel a payment" and it points you at the right message, then generate returns XSD-valid XML.

STEP 3

Connect your agent.

Add iso20022-mcp as a command in your MCP client (Claude Desktop, Cursor) and your assistant can pay, reconcile and migrate.

STEP 4

Keep humans in the loop.

The agent can search, generate and validate complex ISO 20022 XML, but by design it never moves money directly. Have it output the XSD-valid payload, or route it to your bank's SFTP, API gateway or treasury queue for final human approval and settlement. Generation stays separate from execution, so the AI can draft, reconcile and migrate with no risk of unauthorised funds leaving accounts.

PASTE-AND-SEE

Three prompts, three receipts.

Each prompt is limited to what the suite actually does, and each result excerpt is from a real tool session driven over stdio JSON-RPC. Paste the prompt into any connected client; the same ask becomes the same tool call.

INITIATE

Ask for a payment.

iso20022-mcp 0.0.4 (gateway) · tool: generate · stdio JSON-RPC · captured 2026-07-16

The prompt

Generate a SEPA pain.001.001.03 customer credit transfer paying Fournier Conseil SARL EUR 4,200.00 from Acme Treasury GmbH, IBAN DE89370400440532013000, executing 2026-07-17, invoice INV-2026-183. Validate the records first, then return the XML.

What came back

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 pain.001.001.03.xsd">
    <CstmrCdtTrfInitn>
        <GrpHdr>
            <MsgId>MSG-2026-07-16-001</MsgId>
            <CreDtTm>2026-07-16T09:30:00</CreDtTm>
            <NbOfTxs>1</NbOfTxs>
...
                <Amt>
                    <InstdAmt Ccy="EUR">4200.00</InstdAmt>
                </Amt>

The gateway validated the record set, generated the document and checked it against the official XSD before returning. First call, no retry; isError false.

CITE

Ask for the rule, with its source.

camt053-mcp 0.0.14 · tool: cite_rulebook · stdio JSON-RPC · captured 2026-07-16

The prompt

Which CBPR+ 2026 rule makes structured postal addresses mandatory? Cite it with the official source URL.

What came back

{
  "scheme": "CBPR+",
  "version": "2026",
  "clause": "structured-address-mandate-nov-2026",
  "title": "Structured postal addresses mandatory from 14-16 Nov 2026",
  "summary": "From the Nov 14-16 2026 cutover, CBPR+ messages (pacs.008, pacs.009, camt.053, camt.054 and related) must carry structured postal addresses (TownName, Country, optionally PostCode) on debtor, creditor, and ultimate parties. Unstructured-only addresses (AdrLine without structured siblings) will be rejected at FINplus.",
  "source_url": "https://www.swift.com/standards/iso-20022-programme/cbpr-plus",
  "as_of": "2026-06-22"
}

The registry is a curated convenience layer; the tool's own disclaimer says to consult the official scheme document at the source URL before relying on it, and so do we.

RECONCILE

Ask for a reconciliation, with zero real data.

reconcile-mcp 0.0.1 · tool: run_sandbox_scenario · stdio JSON-RPC · captured 2026-07-16

The prompt

Run the month_end sandbox scenario and explain every match.

What came back

{
  "summary": {
    "expected_count": 3,
    "observed_count": 5,
    "matches_by_type": { "amount_mismatch": 1, "exact": 1, "one_to_many": 1 },
    "fully_reconciled": false
  },
  "matches": [
    {
      "type": "amount_mismatch",
      "expected": ["INV-6002"], "observed": ["ENT-52"],
      "amount_delta": "-99.99",
      "reasons": ["reference exact", "amount close (delta -99.99)",
                  "date +/-0d", "counterparty exact"]
    },
...
  "unmatched_observed": ["ENT-55"]
}

A mixed month-end close on built-in fixtures: one exact match, one short payment with the delta reported, one invoice settled by two instalments, and one unexpected credit left unmatched, each with its reasons.

Excerpts are drawn from the committed capture file; elisions are marked with an ellipsis and nothing is reworded.

ZERO REAL DATA

Try it with zero real data.

reconcile-mcp ships deterministic sandbox fixtures: list_sandbox_scenarios shows the scenarios, load_sandbox_scenario opens one for inspection and run_sandbox_scenario reconciles it in one call. Watch a full, explainable reconciliation, exact matches, short payments, splits and unmatched residuals, before any real statement touches the tools.

ADOPTION, MEASURED

Real numbers, dated.

3,999

downloads, last 30 days

13

servers on the official registry

9

of them are this suite

Downloads: pypistats.org last-30-day counts for the nine suite packages, summed, fetched 16-17 July 2026. Registry: live listing count for this account on registry.modelcontextprotocol.io, checked 17 July 2026. No projections, no all-time totals.

THE GATEWAY, VERBATIM

Seven meta-tools, captured live.

Recorded from a running gateway over stdio JSON-RPC (tools/list), not written by hand. Expand a tool to see its real description and input schema.

searchSearch the ISO 20022 catalogue by use-case, message type or keyword (e.g. 'reconciliation', 'make a payment', 'pacs.008') and get the matching message types, their family, and which package provides them.

Search the ISO 20022 catalogue by use-case, message type or keyword (e.g. 'reconciliation', 'make a payment', 'pacs.008') and get the matching message types, their family, and which package provides them.

  • querystring, optionalUse-case, message type or keyword. Empty = all.
list_familiesList every ISO 20022 family the gateway routes to (pain, pacs, camt, acmt): its capabilities, backing package, and whether that package is installed in this environment.

List every ISO 20022 family the gateway routes to (pain, pacs, camt, acmt): its capabilities, backing package, and whether that package is installed in this environment.

Takes no arguments.

list_serversList the whole ISO 20022 suite the gateway knows: the message families (pain/pacs/camt/acmt), the Exceptions & Investigations messages (camt.056/camt.029), and the specialized servers (reconciliation, agent-payment bridge) with what each does.

List the whole ISO 20022 suite the gateway knows: the message families (pain/pacs/camt/acmt), the Exceptions & Investigations messages (camt.056/camt.029), and the specialized servers (reconciliation, agent-payment bridge) with what each does.

Takes no arguments.

describeDescribe a message type: its required fields and input JSON Schema, resolved from the family's backing server.

Describe a message type: its required fields and input JSON Schema, resolved from the family's backing server.

  • message_typestring, requiredISO 20022 message type or family prefix, e.g. 'pacs.008' or 'camt.053'.
validateValidate records for a message type against its JSON Schema, via the family's backing server.

Validate records for a message type against its JSON Schema, via the family's backing server.

  • message_typestring, requiredISO 20022 message type or family prefix, e.g. 'pacs.008' or 'camt.053'.
  • recordsarray, requiredList of record objects to validate or generate a message from.
generateGenerate a validated ISO 20022 XML message from records; the XML document is returned in the 'xml' key. Supported for initiation and interbank families (pain, pacs, acmt); statement families (camt) are inbound-only and return an explanatory error.

Generate a validated ISO 20022 XML message from records; the XML document is returned in the 'xml' key. Supported for initiation and interbank families (pain, pacs, acmt); statement families (camt) are inbound-only and return an explanatory error.

  • message_typestring, requiredISO 20022 message type or family prefix, e.g. 'pacs.008' or 'camt.053'.
  • recordsarray, requiredList of record objects to validate or generate a message from.
parseParse an inbound ISO 20022 XML message into structured data. Supported for interbank (pacs) and statement (camt) families; initiation families return an explanatory error.

Parse an inbound ISO 20022 XML message into structured data. Supported for interbank (pacs) and statement (camt) families; initiation families return an explanatory error.

  • message_typestring, requiredISO 20022 message type or family prefix, e.g. 'pacs.008' or 'camt.053'.
  • xmlstring, requiredRaw ISO 20022 XML to parse.

Captured from iso20022-mcp 0.0.2 on 15 July 2026. Every tool is annotated read-only, idempotent and closed-world.

SAFE BY DESIGN

Built to hand to an agent.

VALIDATED

Checked before it returns.

Every generator validates output against the official bundled XSD before handing it back. Malformed messages never leave the tool.

GUARDED

Never moves money.

The bridge only transforms and validates. Producing a message stays separate from sending it, so payment is a human-guarded step.

READ-ONLY

Read-only where it counts.

Reconciliation is pure matching, and every tool is marked read-only, idempotent and closed-world, so clients can reason about safety.

OPEN

Owned by no bank.

Apache-2.0, 100% branch-tested, on your own infrastructure, tied to no balance sheet.