camt053-mcp: An MCP Server for ISO 20022 Bank Statements
[camt053-mcp logo]
[Build]
[Registry]
[Docs]
[OpenSSF Scorecard]
[License: Apache-2.0 OR MIT]
[Python 3.11 or newer]
[OpenSSF Best Practices]
[Glama MCP server score]
[camt053-mcp Demo]
A Model Context Protocol server that exposes the camt053
ISO 20022 Bank Statement library as tools for AI agents and assistants —
discover message types and return reasons, inspect input schemas, validate
records and financial identifiers, parse incoming statements, and generate
validated reversing-entry XML, all from your favourite MCP client.
Latest release: v0.0.25: released with the camt053 suite 0.0.25
(core, loaders, writer, language server and this server on one
version). Takes pytest-asyncio 1.4.1 and the newer complexipy in the
development tools; 24 MCP tools over stdio, streamable HTTP, SSE or
authenticated streamable HTTP.
Contents
Overview
The Model Context Protocol (MCP) is an open standard that lets AI agents
and assistants discover and call external tools in a uniform way. camt053-mcp
is an MCP server that turns the camt053 library into a set of
first-class agent tools, so an assistant can read and reverse ISO 20022
camt.05x cash-management messages — the standardised bank-to-customer
account reports, statements, and debit/credit notifications — directly from a
conversation.
The headline capability is the one-shot reversing-entry workflow: read an
incoming camt.053 statement, find the entries carrying a return reason code
(e.g. AC04 Closed Account), and emit a validated reversing entry.
Every tool is a thin, typed wrapper over camt053.services — the single shared
facade also used by the CLI and REST API — so all interfaces behave identically.
Tools return JSON-serialisable data; on an error they return an
{"error": ...} payload rather than raising.
This package is part of the camt053 suite — a set of independently
installable packages that share the camt053.services layer:
camt053 — the core library (CLI + REST API)
camt053-mcp — this package, the Model Context Protocol server
camt053-lsp — the Language Server Protocol server for editors
The ISO 20022 MCP Suite
camt053-mcp is the bank-statement flagship of eight coordinated,
vendor-neutral MCP servers that together cover the ISO 20022
bank-statement workflow and the November 2026 structured-address
cutover — statement depth, whole-catalogue routing, reconciliation,
multi-format ingestion, and address remediation. Dependency ranges are kept
aligned across the suite, so the servers co-install cleanly in a single
Python environment: start with one, add the rest as your workflow grows.
In one line each: camt053-mcp is the bank-statement flagship
(deepest camt.05x surface, stdio, streamable HTTP, SSE and authenticated
streamable HTTP);
iso20022-mcp is the generic message toolkit (a handful of verbs
over the whole catalogue); reconcile-mcp is the reconciliation
workflow (did the money we expected actually arrive?);
bankstatementparser-mcp is the ingestion layer (many formats in,
one transaction shape out); and structured-address-fix-mcp is the
postal-address specialist (debtor/creditor addresses cliff-ready for the
Nov 2026 cutover).
The suite also includes per-family servers —
pain001-mcp
(credit transfer initiation),
pacs008-mcp
(FI-to-FI credit transfers), and
acmt001-mcp
(account management) — reachable through the iso20022-mcp gateway.
Install
camt053-mcp runs on macOS, Linux, and Windows and requires Python 3.11+
and pip. It pulls in the core camt053 library and the MCP SDK
automatically.
Using an isolated virtual environment (recommended)
Quick Start
For the 10-minute install → MCP client config → first conversation
tutorial, see docs/quickstart.md.
Launch the server over stdio (the FastMCP default transport):
Register it with any MCP client (e.g. Claude Desktop) by adding it to the
client's configuration:
The agent can then call the tools below to parse incoming statements and
generate validated reversing entries on demand.
For a shared, multi-tenant deployment, the server can also serve
streamable HTTP with mandatory bearer-token auth and optional
per-request Camt053-Account tenant scoping:
See Multi-tenant HTTP deployment
and the deployment cookbook.
Transports
One command line, four transports:
--host and --port change the bind address of streamable-http and
sse (defaults 127.0.0.1 and 8000). Those two carry no
authentication of their own: bind loopback, or put the server behind a
gateway you trust before binding a routable address; --transport http
is the authenticated option. Every release is verified over streamable
HTTP with scout in both
protocol eras and over SSE with the MCP SDK client; see
ADR 0001.
Tools
All tools delegate to the shared camt053.services layer, so they behave
identically to the CLI and REST API.
list_message_types — List the 3 supported camt.05x message types
list_return_reasons — List the ISO external return reason codes
get_required_fields — Required input fields for a message type
get_input_schema — Full input JSON Schema for a message type
validate_records — Validate flat records against a message type
validate_identifier — Validate an IBAN, BIC, or LEI
validate_statement — Validate a statement against its XSD and detect its type
convert_mt940_to_camt053 — MT940 → camt.053 migration: convert legacy SWIFT MT940 statement text into a camt.053 structure
convert_mt942 — MT942 → camt.052 migration: convert legacy SWIFT MT942 interim transaction report text into a camt.052 structure
check_cbpr_readiness — Flag CBPR+ Nov 2026 cliff issues in a statement
get_cbpr_cutover_date — Return the official CBPR+ cutover date (2026-11-16)
cite_rulebook — Quote a curated SEPA / CBPR+ / HVPS+ rulebook clause
list_rulebook_clauses — List the available rulebook citations (optionally filtered)
search_rulebook_vector — Find rulebook clauses by natural-language similarity when you do not know the clause id (needs the [vector] extra)
export_journal — Export statement entries as Xero BankTransactions or QBO JournalEntry payloads
list_export_journal_targets — List the accounting-platform targets export_journal supports
classify_entry — Classify a statement entry via MCP Sampling (uses the client's LLM)
list_classify_entry_categories — List the default categories classify_entry uses
get_tenant_context — Report the multi-tenant scope of the call (the Camt053-Account header on the HTTP transport; None over stdio)
parse_statement — Parse an incoming camt.05x statement into data
detect_statement_anomalies — Screen a statement for duplicate references, unusual fee deductions, and velocity spikes (deterministic rules, no model or network)
list_entries — List every entry across all statements (paginated)
filter_entries — Return entries carrying a return reason code (paginated)
generate_reversal — Generate a validated reversing-entry XML document
Pagination
list_entries and filter_entries accept optional offset (default 0) and
limit (default None) parameters. When limit is omitted they return the
full list, exactly as before. When limit is given they return a paginated
envelope instead:
A negative offset or limit returns an {"error": ...} payload, consistent
with the rest of the server's error convention.
Prompts
reversal_preview takes an optional reason_code (default "AC04") and
returns a four-step message template: parse the statement, preview the matching
entries with filter_entries, confirm with the operator, then call
generate_reversal. The other three prompts take no parameters and return a
two-message user-prompt + assistant-walkthrough template the agent can replay
verbatim.
Resources
Resources give an agent read-only reference context it can load without
calling a tool. Each resource returns a JSON payload.
Both back onto the shared camt053.services layer, so they stay in sync with
the equivalent list_return_reasons / list_message_types tools. On an error
they return a serialised {"error": ...} payload.
Rulebook search
cite_rulebook needs a scheme, version and clause id. When you know
what a rule is about but not what it is called,
search_rulebook_vector closes that gap:
Take the winning scheme/version/clause and pass it to
cite_rulebook for the full citation.
It is not a neural embedding model. Retrieval is a deterministic
lexical-vector cosine search: each clause and the query are hashed into a
fixed 256-dimension term-frequency vector — whole words plus character
3- and 4-grams, so address matches addresses without a stemmer —
bucketed with BLAKE2b rather than Python's salted hash, and ranked with
sqlite-vec. That has three consequences worth knowing:
- The same query always returns the same ranking, in every process and
every CI run.
- Nothing is downloaded and no network call happens at query time.
- It matches wording, not meaning. A query sharing no vocabulary with a
clause will not find it, however related the concepts are.
Only the curated summaries are indexed — the same ones behind
cite_rulebook. No external, copyrighted, or auth-gated rulebook text is
stored or searched.
Installing it
sqlite-vec ships in an optional extra and is imported lazily, so the
base install pulls in nothing:
Without it the tool returns a plain error payload naming the extra
rather than raising, so a client that calls it on a base install gets a
usable message instead of a stack trace.
There is a second requirement that is easy to miss: your Python must be
built with loadable SQLite extension support. The python.org macOS
installers and several distribution packages ship it disabled, in which
case sqlite-vec installs perfectly and still cannot load. The tool
detects that and says so, naming the build flag
(--enable-loadable-sqlite-extensions) to look for. Homebrew, uv and
pyenv builds normally have it enabled.
See docs/vector-search.md for the retrieval
design and its limits.
Using the tools
You can invoke the tools in-process — without a transport — straight through the
FastMCP instance. This mirrors what an agent receives over stdio. The runnable
version of this snippet lives in examples/mcp_tools.py.
Run it directly:
The camt053 suite
camt053-mcp is part of a set of independently installable packages
built around the camt053 library — pick whichever ones
your stack needs:
Every tool here is a thin typed wrapper over camt053.services —
the same facade the CLI, REST API, and LSP use — so all four
interfaces behave identically.
When not to use camt053-mcp
- You have no MCP client. This server only makes sense paired
with an MCP-aware host (Claude Desktop, the IDE plugins, an agent
framework). For scripted / CI use, the camt053 CLI and REST API
cover the same ground without the stdio protocol overhead.
- You need to run as a long-lived daemon without an MCP client.
The server does run persistently over the streamable HTTP transport
(
--transport=http), but every consumer must still speak MCP
JSON-RPC. For plain REST semantics, use the camt053 FastAPI service.
- You need streaming responses. Tool calls return whole values,
not streams. Large statements are paginated through the existing
list_entries(xml, offset, limit) envelope, not chunked over
multiple responses.
- You need per-user OAuth flows brokered for you. The HTTP
transport authenticates callers (OAuth 2.1 resource server with
RFC 9728 metadata, or a static bearer token in dev mode) and scopes
requests via the
Camt053-Account tenant header, but it does not
run an authorization server: bring your own IdP.
- You need to generate pain.001 outbound payment files. Out of
scope; use
pain001-mcp.
Development
camt053-mcp uses Poetry and
mise.
A Makefile orchestrates the quality gates (kept in lockstep with CI):
Security
camt053-mcp is a thin wrapper — every tool delegates to
camt053.services, where the defence-in-depth (defusedxml +
xml_guard byte cap + DOCTYPE / ENTITY pre-flight) lives. Tools
catch (ValueError, Camt053Error) and return an {"error": ...}
envelope per the suite convention; they never propagate raw
exceptions to the MCP client. Reporting practice, supported
versions, and the full supply-chain posture are documented in
SECURITY.md. Vulnerabilities go via GitHub Private
Vulnerability Reporting, not public issues.
Documentation
Related MCP Servers
Part of the ISO 20022 MCP Suite — open-source, Apache-2.0 licensed MCP servers for banking and financial-services AI agents:
MCP Registry
mcp-name: io.github.sebastienrousseau/camt053-mcp
License
Dual-licensed under the Apache License, Version 2.0 or the MIT License. Any contribution submitted
for inclusion shall be licensed as above, without additional terms.
Contributing
Contributions are welcome — see the contributing instructions. Thanks to
all contributors.
Acknowledgements
Built on the camt053 ISO 20022 Bank Statement library and the
Model Context Protocol Python SDK.