{
  "markdown": "# acmt001-mcp: An MCP Server for ISO 20022 Account Management\n\n![acmt001-mcp banner][banner]\n\n[![PyPI Version][pypi-badge]][07]\n[![Python Versions][python-versions-badge]][07]\n[![PyPI Downloads][pypi-downloads-badge]][07]\n[![Licence][licence-badge]][01]\n[![Tests][tests-badge]][tests-url]\n[![Quality][quality-badge]][quality-url]\n[![Documentation][docs-badge]][docs-url]\n\n**A [Model Context Protocol][mcp] server that exposes the [`acmt001`][core]\nISO 20022 Account Management library as tools for AI agents and assistants** —\ndiscover message types, inspect input schemas, validate records and financial\nidentifiers, and generate validated XML, all from your favourite MCP client.\n\n> **Latest release: v0.0.5** — six MCP tools over stdio, all backed by the\n> shared `acmt001.services` layer, for Python 3.10+.\n> [See what's new →][release-005]\n\n## Contents\n\n- [Overview](#overview)\n- [Install](#install)\n- [Quick Start](#quick-start)\n- [Tools](#tools)\n- [Using the tools](#using-the-tools)\n- [Benchmarks](#benchmarks)\n- [Development](#development)\n- [Licence](#licence)\n- [Contribution](#contribution)\n- [Acknowledgements](#acknowledgements)\n\n## Overview\n\nThe [Model Context Protocol][mcp] (MCP) is an open standard that lets AI agents\nand assistants discover and call external tools in a uniform way. **acmt001-mcp**\nis an MCP server that turns the [`acmt001`][core] library into a set of\nfirst-class agent tools, so an assistant can generate and validate **ISO 20022\n`acmt` Account Management XML messages** — the standardised instructions,\nconfirmations, and reports that govern the lifecycle of a bank account (opening,\nmaintenance, closing, identification, and switching) — directly from a\nconversation.\n\nEvery tool is a thin, typed wrapper over `acmt001.services` — the single shared\nfacade also used by the CLI and REST API — so all interfaces behave identically.\nTools return JSON-serialisable data; on a validation error they return an\n`{\"error\": ...}` payload rather than raising.\n\n- **Website:** <https://acmt001.com>\n- **Source code:** <https://github.com/sebastienrousseau/acmt001-mcp>\n- **Bug reports:** <https://github.com/sebastienrousseau/acmt001-mcp/issues>\n\nThis package is part of the **acmt001 suite** — a set of independently\ninstallable packages that share the `acmt001.services` layer:\n\n- [`acmt001`][core] — the core library (CLI + REST API)\n- `acmt001-mcp` — this package, the **Model Context Protocol** server\n- [`acmt001-lsp`][lsp] — the **Language Server Protocol** server for editors\n\n```mermaid\nflowchart LR\n    A[\"MCP client<br/>(Claude Desktop, IDE, agent)\"] -->|stdio| B[\"acmt001-mcp\"]\n    B -->|delegates to| C[\"acmt001.services\"]\n    C -->|render + validate| D[\"ISO 20022 acmt XML\"]\n```\n\n## Install\n\n**acmt001-mcp** runs on macOS, Linux, and Windows and requires **Python 3.10+**\nand **pip**. It pulls in the core `acmt001` library and the MCP SDK\nautomatically.\n\n```sh\npython -m pip install acmt001-mcp\n```\n\n> **Note:** while the core `acmt001` library is not yet on PyPI, install it from\n> source first:\n>\n> ```sh\n> python -m pip install \"git+https://github.com/sebastienrousseau/acmt001.git\"\n> python -m pip install acmt001-mcp\n> ```\n\n<details>\n<summary>Using an isolated virtual environment (recommended)</summary>\n\n```sh\npython -m venv venv\nsource venv/bin/activate        # macOS/Linux\nvenv\\Scripts\\activate           # Windows\npython -m pip install -U acmt001-mcp\n```\n</details>\n\n## Quick Start\n\nLaunch the server over stdio (the FastMCP default transport):\n\n```sh\nacmt001-mcp\n```\n\nRegister it with any MCP client (e.g. Claude Desktop) by adding it to the\nclient's configuration:\n\n```json\n{\n  \"mcpServers\": {\n    \"acmt001\": { \"command\": \"acmt001-mcp\" }\n  }\n}\n```\n\nThe agent can then call the tools below to validate account data and generate\nISO 20022 messages on demand.\n\n## Tools\n\nAll tools delegate to the shared `acmt001.services` layer, so they behave\nidentically to the CLI and REST API.\n\n- `list_message_types` — List the 34 supported acmt message types\n- `get_required_fields` — Required input fields for a message type\n- `get_input_schema` — Full input JSON Schema for a message type\n- `validate_records` — Validate flat records against a message type\n- `validate_identifier` — Validate an IBAN, BIC, or LEI\n- `generate_message` — Generate a validated acmt XML message\n\n## Using the tools\n\nYou can invoke the tools in-process — without a transport — straight through the\nFastMCP instance. This mirrors what an agent receives over stdio. The runnable\nversion of this snippet lives in [`examples/mcp_tools.py`](examples/mcp_tools.py).\n\n```python\nimport asyncio\n\nfrom acmt001_mcp.server import server\n\n# A single flat account-opening record.\nrecord = [\n    {\n        \"msg_id\": \"ACMT-MSG-0001\",\n        \"creation_date_time\": \"2026-01-15T10:30:00\",\n        \"process_id\": \"ACMT-PRC-0001\",\n        \"account_id\": \"GB29NWBK60161331926819\",\n        \"account_currency\": \"EUR\",\n        \"account_name\": \"Treasury Operating Account\",\n        \"account_type_cd\": \"CACC\",\n        \"account_servicer_bic\": \"NWBKGB2LXXX\",\n        \"account_owner_name\": \"Acme Embedded Finance Ltd\",\n        \"account_owner_country\": \"GB\",\n        \"org_full_legal_name\": \"Acme Embedded Finance Limited\",\n        \"org_country_of_operation\": \"GB\",\n        \"org_id_lei\": \"5493001KJTIIGC8Y1R12\",\n    }\n]\n\n\nasync def main() -> None:\n    async def call(name, args):\n        result = await server.call_tool(name, args)\n        content = result[0] if isinstance(result, tuple) else result\n        return content[0].text if content else \"\"\n\n    # Validate an identifier.\n    print(await call(\"validate_identifier\",\n                     {\"kind\": \"lei\", \"value\": \"5493001KJTIIGC8Y1R12\"}))\n    # -> {\"kind\": \"lei\", \"value\": \"5493001KJTIIGC8Y1R12\", \"valid\": true}\n\n    # Generate a validated ISO 20022 Account Opening Request.\n    xml = await call(\"generate_message\",\n                     {\"message_type\": \"acmt.007.001.05\", \"records\": record})\n    print(xml[:46])  # -> <?xml version=\"1.0\" encoding=\"UTF-8\"?> ...\n\n\nasyncio.run(main())\n```\n\nRun it directly:\n\n```sh\npython examples/mcp_tools.py\n```\n\n## Benchmarks\n\n```sh\npython benches/bench_tool_dispatch.py           # full run\npython benches/bench_tool_dispatch.py --quick   # what CI runs\n```\n\nThe benchmark measures what an *agent* waits for: the dispatch floor\n(`list_message_types`, around a microsecond), the metadata lookups used\nto build a request, and the two batch tools side by side.\n\nThe result worth knowing is the asymmetry between those two.\n`validate_records` checks every record, so it is linear in batch size.\n`generate_message`, for a single-account message type like the default\n`acmt.007.001.05`, renders **only the first record** — twenty-seven of\nthe thirty-four templates work this way. So validating a hundred records\nand generating from them costs roughly 260 ms of validation against 6 ms\nof generation, and returns one message rather than a hundred.\n\nThat is correct ISO 20022 behaviour and a real trap when batching, which\nis why the benchmark prints output size beside the timings: flat bytes\nacross growing input is what tells you the rest of the batch was not\nrendered. See [docs/benchmarks.md](docs/benchmarks.md).\n\n## Development\n\n**acmt001-mcp** uses [Poetry](https://python-poetry.org/) and\n[mise](https://mise.jdx.dev/).\n\n```bash\ngit clone https://github.com/sebastienrousseau/acmt001-mcp.git && cd acmt001-mcp\nmise install\npoetry install\npoetry shell\n```\n\n> This package depends on the core `acmt001` library. Until it is on PyPI,\n> install it from source first:\n> `pip install \"git+https://github.com/sebastienrousseau/acmt001.git\"`.\n\nA `Makefile` orchestrates the quality gates (kept in lockstep with CI):\n\n```bash\nmake check        # all gates (REQUIRED before commit)\nmake test         # pytest\nmake lint         # ruff + black\nmake type-check   # mypy --strict\n```\n\n## Related MCP Servers\n\nPart of the **ISO 20022 MCP Suite** — open-source, Apache-2.0 licensed MCP servers for banking and financial-services AI agents:\n\n| Server | Purpose |\n|---|---|\n| [`pain001-mcp`](https://github.com/sebastienrousseau/pain001-mcp) | Generate & validate ISO 20022 pain.001 payment files (v03–v12, pain.008, SEPA) with rulebook checks |\n| [`pacs008-mcp`](https://github.com/sebastienrousseau/pacs008-mcp) | Generate, validate, parse & scheme-check ISO 20022 pacs.008 FI-to-FI credit transfers + Nov-2026 address linting |\n| [`camt053-mcp`](https://github.com/sebastienrousseau/camt053-mcp) | Parse & reconcile ISO 20022 camt.053 bank-to-customer statements — CBPR+/HVPS+ ready |\n| [`bankstatementparser-mcp`](https://github.com/sebastienrousseau/bankstatementparser-mcp) | Parse bank statements (BAI2, MT940/MT942, CAMT.053, OFX, CSV) into structured transactions |\n| [`noyalib-mcp`](https://github.com/sebastienrousseau/noyalib) | Lossless YAML 1.2 parsing, formatting & validation (Rust, 100% spec compliance) |\n\n---\n\n## MCP Registry\n\n`mcp-name: io.github.sebastienrousseau/acmt001-mcp`\n\n---\n\n## Licence\n\nLicensed under the [Apache Licence, Version 2.0][01]. Any contribution submitted\nfor inclusion shall be licensed as above, without additional terms.\n\n## Contribution\n\nContributions are welcome — see the [contributing instructions][04]. Thanks to\nall [contributors][05].\n\n## Acknowledgements\n\nBuilt on the [`acmt001`][core] ISO 20022 Account Management library and the\n[Model Context Protocol][mcp] Python SDK.\n\n[01]: https://opensource.org/license/apache-2-0/\n[04]: https://github.com/sebastienrousseau/acmt001-mcp/blob/main/CONTRIBUTING.md\n[05]: https://github.com/sebastienrousseau/acmt001-mcp/graphs/contributors\n[07]: https://pypi.org/project/acmt001-mcp/\n[core]: https://github.com/sebastienrousseau/acmt001\n[lsp]: https://github.com/sebastienrousseau/acmt001-lsp\n[mcp]: https://modelcontextprotocol.io\n[release-005]: https://github.com/sebastienrousseau/acmt001-mcp/releases/tag/v0.0.5\n[release-002]: https://github.com/sebastienrousseau/acmt001-mcp/releases/tag/v0.0.2\n[release-001]: https://github.com/sebastienrousseau/acmt001-mcp/releases/tag/v0.0.1\n[banner]: https://kura.pro/acmt001-mcp/images/banners/banner-acmt001-mcp.svg 'acmt001-mcp'\n[docs-badge]: https://img.shields.io/badge/Docs-acmt001.com-blue?style=for-the-badge\n[docs-url]: https://acmt001.com/\n[licence-badge]: https://img.shields.io/pypi/l/acmt001-mcp?style=for-the-badge\n[pypi-badge]: https://img.shields.io/pypi/v/acmt001-mcp?style=for-the-badge\n[pypi-downloads-badge]: https://img.shields.io/pypi/dm/acmt001-mcp.svg?style=for-the-badge\n[python-versions-badge]: https://img.shields.io/pypi/pyversions/acmt001-mcp.svg?style=for-the-badge\n[quality-badge]: https://img.shields.io/github/actions/workflow/status/sebastienrousseau/acmt001-mcp/ci.yml?branch=main&label=Quality&style=for-the-badge\n[quality-url]: https://github.com/sebastienrousseau/acmt001-mcp/actions/workflows/ci.yml\n[tests-badge]: https://img.shields.io/github/actions/workflow/status/sebastienrousseau/acmt001-mcp/ci.yml?branch=main&label=Tests&style=for-the-badge\n[tests-url]: https://github.com/sebastienrousseau/acmt001-mcp/actions/workflows/ci.yml\n",
  "bytes": 11082,
  "sha": "ea22fa3065899db6a62bdc161489bf08d71c45a884ac5a2cff2ead1cf90e3de4",
  "repo_slug": "sebastienrousseau/acmt001-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_sebastienrousseau_acmt001_mcp_240bc28b/readme"
}