acmt001-mcp
acmt001-mcp is a Model Context Protocol server that turns the acmt001 ISO 20022 Account Management library into agent-callable tools over stdio, streamable HTTP, or SSE.
List supported message types —
list_message_typesreturns all 34 acmt message types (e.g.acmt.001.001.08Account Opening Instruction) with human-readable names.Discover required fields —
get_required_fieldsgives a quick checklist of mandatory input columns for a chosen message type.Inspect full input schemas —
get_input_schemareturns the complete JSON Schema (fields, types, constraints) for a message type's flat record.Validate records —
validate_recordschecks batches of flat account records against the message type's schema and returns a row-by-row error report (valid,total,valid_count,errors).Validate financial identifiers —
validate_identifierperforms offline format/check-digit validation of an IBAN, BIC, or LEI.Generate ISO 20022 XML —
generate_messagerenders XSD-validated acmt XML from in-memory records (no files written), returning the XML string or a serialized{"error": ...}payload.Verify LEIs live —
verify_lei_onlinequeries the public GLEIF register (needs theonlineextra) to confirm an LEI is registered and return entity details (legal name, status, country, registration/renewal dates).Multiple transports — run over stdio (default), streamable HTTP at
/mcp, or legacy HTTP+SSE at/sse+/messages/, with configurable--host/--port.
acmt001-mcp: An MCP Server for ISO 20022 Account Management
A Model Context Protocol server that exposes the acmt001
ISO 20022 Account Management library as tools for AI agents and assistants —
discover message types, inspect input schemas, validate records and financial
identifiers, and generate validated XML, all from your favourite MCP client.
Latest release: v0.0.15: 7 MCP tools over stdio, streamable HTTP or SSE, all backed by the shared
acmt001.serviceslayer, for Python 3.11+. Ships in lockstep withacmt0010.0.15; every CI and image install is hash-pinned, and the tools are fuzzed. See what's new →
Contents
Related MCP server: pacs008-mcp
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. acmt001-mcp
is an MCP server that turns the acmt001 library into a set of
first-class agent tools, so an assistant can generate and validate ISO 20022
acmt Account Management XML messages — the standardised instructions,
confirmations, and reports that govern the lifecycle of a bank account (opening,
maintenance, closing, identification, and switching) — directly from a
conversation.
Every tool is a thin, typed wrapper over acmt001.services — the single shared
facade also used by the CLI and REST API — so all interfaces behave identically.
Tools return JSON-serialisable data; on a validation error they return an
{"error": ...} payload rather than raising.
Website: https://acmt001.com
Source code: https://github.com/sebastienrousseau/acmt001-mcp
Bug reports: https://github.com/sebastienrousseau/acmt001-mcp/issues
This package is part of the acmt001 suite — a set of independently
installable packages that share the acmt001.services layer:
acmt001— the core library (CLI + REST API)acmt001-mcp— this package, the Model Context Protocol serveracmt001-lsp— the Language Server Protocol server for editors
flowchart LR
A["MCP client<br/>(Claude Desktop, IDE, agent)"] -->|stdio| B["acmt001-mcp"]
B -->|delegates to| C["acmt001.services"]
C -->|render + validate| D["ISO 20022 acmt XML"]Install
acmt001-mcp runs on macOS, Linux, and Windows and requires Python 3.11+
and pip. It pulls in the core acmt001 library and the MCP SDK
automatically.
python -m pip install acmt001-mcpNote: while the core
acmt001library is not yet on PyPI, install it from source first:python -m pip install "git+https://github.com/sebastienrousseau/acmt001.git" python -m pip install acmt001-mcp
python -m venv venv
source venv/bin/activate # macOS/Linux
venv\Scripts\activate # Windows
python -m pip install -U acmt001-mcpQuick Start
Launch the server over stdio (the default transport):
acmt001-mcpRegister it with any MCP client (e.g. Claude Desktop) by adding it to the client's configuration:
{
"mcpServers": {
"acmt001": { "command": "acmt001-mcp" }
}
}The agent can then call the tools below to validate account data and generate ISO 20022 messages on demand.
Transports
One command line, three transports:
Command | Transport | Endpoint | Protocol revisions |
| stdio | the client spawns the process | 2026-07-28, 2025-11-25 |
| Streamable HTTP |
| 2026-07-28 (stateless, |
| HTTP+SSE (2024-11-05) |
| for clients that still expect the older transport |
--host and --port change the bind address (defaults 127.0.0.1 and
8000). The HTTP transports carry no authentication of their own: bind
loopback, or put the server behind a gateway you trust before binding a
routable address. Every release is verified over streamable HTTP with
scout in both protocol
eras and over SSE with the MCP SDK client; see
ADR 0001.
{
"mcpServers": {
"acmt001": { "url": "http://127.0.0.1:8000/mcp" }
}
}Tools
All tools delegate to the shared acmt001.services layer, so they behave
identically to the CLI and REST API.
list_message_types— List the 34 supported acmt message typesget_required_fields— Required input fields for a message typeget_input_schema— Full input JSON Schema for a message typevalidate_records— Validate flat records against a message typevalidate_identifier— Validate an IBAN, BIC, or LEIgenerate_message— Generate a validated acmt XML messageverify_lei_online— Look an LEI up in the live GLEIF register (needs theonlineextra)
Using the tools
You can invoke the tools in-process — without a transport — straight through the
server instance. This mirrors what an agent receives over stdio. The runnable
version of this snippet lives in examples/mcp_tools.py.
import asyncio
from acmt001_mcp.server import server
# A single flat account-opening record.
record = [
{
"msg_id": "ACMT-MSG-0001",
"creation_date_time": "2026-01-15T10:30:00",
"process_id": "ACMT-PRC-0001",
"account_id": "GB29NWBK60161331926819",
"account_currency": "EUR",
"account_name": "Treasury Operating Account",
"account_type_cd": "CACC",
"account_servicer_bic": "NWBKGB2LXXX",
"account_owner_name": "Acme Embedded Finance Ltd",
"account_owner_country": "GB",
"org_full_legal_name": "Acme Embedded Finance Limited",
"org_country_of_operation": "GB",
"org_id_lei": "5493001KJTIIGC8Y1R12",
}
]
async def main() -> None:
async def call(name, args):
result = await server.call_tool(name, args)
content = result[0] if isinstance(result, tuple) else result
return content[0].text if content else ""
# Validate an identifier.
print(await call("validate_identifier",
{"kind": "lei", "value": "5493001KJTIIGC8Y1R12"}))
# -> {"kind": "lei", "value": "5493001KJTIIGC8Y1R12", "valid": true}
# Generate a validated ISO 20022 Account Opening Request.
xml = await call("generate_message",
{"message_type": "acmt.007.001.05", "records": record})
print(xml[:46]) # -> <?xml version="1.0" encoding="UTF-8"?> ...
asyncio.run(main())Run it directly:
python examples/mcp_tools.pyBenchmarks
python benches/bench_tool_dispatch.py # full run
python benches/bench_tool_dispatch.py --quick # what CI runsThe benchmark measures what an agent waits for: the dispatch floor
(list_message_types, around a microsecond), the metadata lookups used
to build a request, and the two batch tools side by side.
The result worth knowing is the asymmetry between those two.
validate_records checks every record, so it is linear in batch size.
generate_message, for a single-account message type like the default
acmt.007.001.05, renders only the first record — twenty-seven of
the thirty-four templates work this way. So validating a hundred records
and generating from them costs roughly 260 ms of validation against 6 ms
of generation, and returns one message rather than a hundred.
That is correct ISO 20022 behaviour and a real trap when batching, which is why the benchmark prints output size beside the timings: flat bytes across growing input is what tells you the rest of the batch was not rendered. See docs/benchmarks.md.
Documentation
Rendered docs (API reference, ADRs, benchmarks, changelog): sebastienrousseau.github.io/acmt001-mcp
Runnable example:
examples/mcp_tools.pyArchitecture decisions: docs/adr/
Release history: CHANGELOG.md
Core library docs: acmt001.com
MCP specification: modelcontextprotocol.io
Development
acmt001-mcp uses Poetry and mise.
git clone https://github.com/sebastienrousseau/acmt001-mcp.git && cd acmt001-mcp
mise install
poetry install
poetry shellThis package depends on the core
acmt001library. Until it is on PyPI, install it from source first:pip install "git+https://github.com/sebastienrousseau/acmt001.git".
A Makefile orchestrates the quality gates (kept in lockstep with CI):
make check # all gates (REQUIRED before commit)
make test # pytest, 100% line and branch coverage
make lint # ruff + black
make type-check # mypy --strict
make doc-coverage # interrogate, 100% docstrings
make mutate # mutmut over the tool handlers, gated on the score
make docs # Sphinx site, warnings are errorsThe property-based tests (Hypothesis) run as part of make test; set
HYPOTHESIS_PROFILE=mutation for the slimmer profile the mutation run
uses.
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:
Server | Purpose |
Generate & validate ISO 20022 pain.001 payment files (v03–v12, pain.008, SEPA) with rulebook checks | |
Generate, validate, parse & scheme-check ISO 20022 pacs.008 FI-to-FI credit transfers + Nov-2026 address linting | |
Parse & reconcile ISO 20022 camt.053 bank-to-customer statements — CBPR+/HVPS+ ready | |
Parse bank statements (BAI2, MT940/MT942, CAMT.053, OFX, CSV) into structured transactions | |
Lossless YAML 1.2 parsing, formatting & validation (Rust, 100% spec compliance) |
MCP Registry
mcp-name: io.github.sebastienrousseau/acmt001-mcp
License
Licensed under the Apache License, Version 2.0. Any contribution submitted for inclusion shall be licensed as above, without additional terms.
Contribution
Contributions are welcome — see the contributing instructions. Thanks to all contributors.
Acknowledgements
Built on the acmt001 ISO 20022 Account Management library and the
Model Context Protocol Python SDK.
Available Tools
7 toolsgenerate_messageGenerate acmt XML from recordsARead-onlyIdempotent
Generate a validated ISO 20022 acmt XML message from in-memory records.
This is the primary generation tool: pass account records you already
hold in memory and receive an XSD-validated XML document; no file is
written. Run ``validate_records`` first to surface record-level errors,
and ``list_message_types`` to confirm the ``message_type`` string.
Returns the validated XML document as a string, or an ``{"error": ...}``
payload (serialized) if generation fails.
Args:
message_type: A supported ISO 20022 acmt message type.
records: One or more flat account records.
Inputs: records (required), message_type (required). Returns: result
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 acmt message type.
Inputs: message_type (required).
get_required_fieldsGet required fieldsARead-onlyIdempotent
List only the required input field names for an acmt message type.
Use this for a quick checklist of the mandatory columns before building
account 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 acmt message type.
Inputs: message_type (required). Returns: result
list_message_typesList acmt message typesARead-onlyIdempotent
List every supported ISO 20022 acmt 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 (e.g.
``acmt.001.001.08`` Account Opening Instruction). 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. ``acmt.001.001.08``).
Inputs: no named parameters. Returns: result
validate_identifierValidate IBAN, BIC or LEIARead-onlyIdempotent
Validate a single financial identifier (IBAN, BIC, or LEI).
Use this for a one-off identifier check with a clear pass/fail. To
validate identifiers embedded across a whole batch of account records,
prefer ``validate_records`` rather than calling this per field.
Returns ``{"kind": str, "value": str, "valid": bool}``.
Args:
kind: One of ``"iban"``, ``"bic"``, or ``"lei"`` (case-insensitive).
value: The identifier value to check.
Inputs: kind (required), value (required).
validate_recordsValidate records against schemaARead-onlyIdempotent
Validate flat account 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; to validate a single financial identifier in isolation use
``validate_identifier``.
Returns a report ``{"valid": bool, "total": int, "valid_count": int,
"errors": [...]}``.
Args:
message_type: A supported ISO 20022 acmt message type.
records: One or more flat account records to validate.
Inputs: records (required), message_type (required).
verify_lei_onlineVerify a LEI against the live GLEIF registerARead-onlyIdempotent
Verify a LEI against the live GLEIF register (reaches the network).
Unlike ``validate_identifier``, which checks an LEI's format and check
digits entirely offline, this tool performs a live HTTP GET against the
public GLEIF REST API (``api.gleif.org``) to confirm the LEI is actually
registered and to return the registered entity's details. It therefore
requires network access and is marked open-world.
Requires the optional ``online`` extra (``pip install acmt001-mcp[online]``)
for the ``httpx`` HTTP client; without it a graceful ``{"error": ...}`` is
returned rather than raising.
Returns a dict with the ``lei``, registered ``legal_name``, entity
``status``, ``country``, and registration ``registration_status``,
``initial_registration_date``, ``last_update_date`` and
``next_renewal_date``. On failure returns ``{"error": ...}``: an
``LEI not found`` error for an unregistered LEI (HTTP 404), or a
``GLEIF API unavailable`` error for any other non-200 response or a
transport/connection error.
Args:
lei_code: A 20-character ISO 17442 Legal Entity Identifier.
Inputs: lei_code (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 7 tools
Each tool targets a distinct step in the acmt workflow: discovery, schema lookup, record validation, message generation, and identifier/LEI checks. The only potential overlap—validate_identifier vs verify_lei_online—is explicitly clarified as offline format check vs live GLEIF registry lookup.
All names use consistent snake_case verb_noun phrasing (list_, get_, validate_, generate_, verify_). The only minor variation is the 'online' qualifier in verify_lei_online, but it remains predictable and readable.
Seven tools is well within the ideal 3–15 range and each maps to a specific workflow need: discovery, schema inspection, validation, generation, and identifier verification. No redundant or unnecessary tools.
The surface covers the full acmt generation lifecycle: list message types, inspect schema/required fields, validate records, generate XSD-validated XML, and validate identifiers including live LEI lookup. No obvious missing operation for the stated purpose.
Maintenance
Related MCP Connectors
MCP server for Modern Treasury — payment orders, transactions, counterparties and ledgers.
Demo banking MCP server: accounts, transactions and payments. OAuth 2.1 with DPoP.
Check ISO 20022 messages (pacs.008, pain.001, camt.053, seev.031) against schema and rules.
MCP server for Codat — companies, connections, invoices, bills and financial statements.
Related MCP Servers
- AlicenseAqualityBmaintenanceModel Context Protocol (MCP) server for French Electronic Invoicing (NF XP Z12-013). Provide tools to validate, generate, and explore API specifications for PDP/OD interoperability.34Apache 2.0
- AlicenseAqualityBmaintenanceAn 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.1649 PyPI1Apache 2.0
- AlicenseAqualityBmaintenanceUnified gateway for ISO 20022 message families, providing meta-tools to search, describe, validate, generate, and parse financial messages.771 PyPI1Apache 2.0
- AlicenseAqualityDmaintenanceMCP server for parsing, validating, building and explaining FIX protocol trading messages — offline, no API keys.4MIT