Bankstatementparser Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Bankstatementparser Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<!-- SPDX-License-Identifier: Apache-2.0 OR MIT -->
<p align="center"> <img src="https://cloudcdn.pro/bankstatementparser/v1/logos/bankstatementparser.svg" alt="bankstatementparser-mcp logo" width="120" height="120" /> </p>
<h1 align="center">bankstatementparser-mcp</h1>
<p align="center"> <b>Model Context Protocol server exposing the bankstatementparser library as first-class agent tools for reading bank statements.</b> </p>
<p align="center"> <a href="https://github.com/sebastienrousseau/bankstatementparser-mcp/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/sebastienrousseau/bankstatementparser-mcp/ci.yml?branch=main&label=Tests&style=for-the-badge&logo=github" alt="Tests" height="28" /></a> <a href="https://github.com/sebastienrousseau/bankstatementparser-mcp/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/sebastienrousseau/bankstatementparser-mcp/ci.yml?branch=main&label=Coverage&style=for-the-badge" alt="Coverage" height="28" /></a> <a href="https://pypi.org/project/bankstatementparser-mcp/"><img src="https://img.shields.io/pypi/v/bankstatementparser-mcp?style=for-the-badge&color=fc8d62&logo=python" alt="PyPI version" height="28" /></a> <a href="https://pypi.org/project/bankstatementparser-mcp/"><img src="https://img.shields.io/pypi/pyversions/bankstatementparser-mcp.svg?style=for-the-badge" alt="Python versions" height="28" /></a> <a href="https://pypi.org/project/bankstatementparser-mcp/"><img src="https://img.shields.io/pypi/dm/bankstatementparser-mcp.svg?style=for-the-badge" alt="PyPI downloads" height="28" /></a> <a href="https://scorecard.dev/viewer/?uri=github.com/sebastienrousseau/bankstatementparser-mcp"><img src="https://img.shields.io/ossf-scorecard/github.com/sebastienrousseau/bankstatementparser-mcp?style=for-the-badge&label=OpenSSF%20Scorecard&logo=openssf" alt="OpenSSF Scorecard" height="28" /></a> <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0%20OR%20MIT-blue.svg?style=for-the-badge" alt="License: Apache-2.0 OR MIT" height="28" /></a> <a href="https://glama.ai/mcp/servers/sebastienrousseau/bankstatementparser-mcp"><img src="https://glama.ai/mcp/servers/sebastienrousseau/bankstatementparser-mcp/badges/score.svg" alt="Glama MCP server score" height="28" /></a> </p>
<p align="center"> <img src=".github/demo.gif" alt="bankstatementparser-mcp Demo" width="100%" /> </p>
Getting started
Library reference
Operational
The Model Context Protocol (MCP) is an open standard that lets AI agents discover and call external tools in a uniform way. bankstatementparser-mcp is the MCP server that turns the bankstatementparser library into first-class agent tools — so an assistant can read, validate, and summarise bank statements in formats such as ISO 20022 CAMT.053, SWIFT MT940, OFX/QFX, and CSV directly from a conversation.
Every tool is a thin wrapper over the bankstatementparser parser core (create_parser, detect_statement_format), so the results behave identically to the CLI. Because an MCP client does not share the server's filesystem, the tools take inline statement content (plus a filename hint) and materialise it in a private temporary file for the duration of a single call. Tools return JSON-serialisable data.
| Concern | How bankstatementparser-mcp handles it |
|---|---|
| Transport | stdio by default; --transport streamable-http (2026-07-28 and 2025-11-25 on one endpoint) or --transport sse for HTTP |
| Input model | Inline content + filename hint; no shared filesystem required |
| Format fidelity | Tools delegate to bankstatementparser's create_parser pipeline |
| Format detection | detect_format mirrors the library's detect_statement_format |
| Validation | validate_statement is a dry run that returns structured results |
| Isolation | Each call writes to a private temp file that is deleted on exit |
bankstatementparser-mcp is the ingestion layer 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.
| Server | Scope | Surface | Install | Use it when |
|---|---|---|---|---|
camt053-mcp | ISO 20022 camt.053/camt.052 bank statements: parse, validate, filter, reverse; MT940/MT942 migration; CBPR+ readiness; journal export | 24 MCP tools · 4 prompts · 3 resources | pip install camt053-mcp | You work with bank-to-customer statements end to end — the suite's flagship |
iso20022-mcp | Unified gateway: search / describe / validate / generate / parse meta-tools routed across the pain · pacs · camt · acmt families | 7 meta-tools | pip install "iso20022-mcp[all]" | You want one entry point to every message family |
reconcile-mcp | Matches expected pain.001 payments against observed camt.053 entries — exact, partial, one-to-many, many-to-one, every match scored and explained | 7 MCP tools | pip install reconcile-mcp | You need explainable statement/payment reconciliation |
bankstatementparser-mcp | Multi-format statement ingestion: ISO 20022 CAMT.053 and pain.001, SWIFT MT940, OFX/QFX, CSV | 5 MCP tools · 1 prompt · 1 resource | pip install bankstatementparser-mcp | Your statements arrive in mixed or legacy formats — this package |
structured-address-fix-mcp | ISO 20022 postal-address classification, assessment & remediation for the November 2026 structured-address cutover, plus a high-level orchestration layer — readiness scoring, clearing-profile linting, and audit evidence (pacs.008 / pain.001 debtor & creditor addresses) | 9 MCP tools | pip install structured-address-fix-mcp | You need debtor/creditor addresses cliff-ready ahead of 14 Nov 2026 |
iso20022-readiness-suite-mcp | Orchestration gateway: detect → structurally validate → clearing-profile lint → readiness score, plus automated remediation and pacs.002 bank-response simulation — a meta-client over the foundational servers | 4 MCP tools | pip install iso20022-readiness-suite-mcp | You want one high-level readiness / orchestration entry point over the suite |
iso20022-bank-profile-mcp | Manages, validates and serves bank-specific clearing profiles / rule packs (CBPR+, SEPA_Instant, FedNow, Generic); premium rule-pack entitlement gating | 4 MCP tools | pip install iso20022-bank-profile-mcp | You lint payments against your own institution's market practice |
iso20022-evidence-pack-mcp | Compiles readiness findings, remediation diffs and simulated responses into a sealed, Ed25519-signable audit evidence pack | 6 MCP tools | pip install iso20022-evidence-pack-mcp | You need tamper-evident audit / certification artifacts |
In one line each: `camt053-mcp` is the bank-statement flagship (deepest camt.05x surface, stdio + 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).
| Channel | Command | Notes |
|---|---|---|
| PyPI | pip install bankstatementparser-mcp | Pulls in bankstatementparser >= 0.0.28 + MCP SDK |
| Source | git clone https://github.com/sebastienrousseau/bankstatementparser-mcp && cd bankstatementparser-mcp && poetry install | For development |
| Docker (GHCR) | docker pull ghcr.io/sebastienrousseau/bankstatementparser-mcp:latest | Multi-arch (linux/amd64, linux/arm64); runs bankstatementparser-mcp over stdio; pass --transport streamable-http --host 0.0.0.0 and publish port 8000 for HTTP |
Requires Python 3.10 or later. Works on macOS, Linux, and Windows.
<details> <summary>Using an isolated virtual environment (recommended)</summary>
python -m venv venv
source venv/bin/activate # macOS/Linux
venv\Scripts\activate # Windows
python -m pip install -U bankstatementparser-mcp</details>
Register the server with any MCP client (Claude Desktop shown):
{
"mcpServers": {
"bankstatementparser": { "command": "bankstatementparser-mcp" }
}
}That's it. Restart the client and the tools are available to the agent.
By default the server speaks JSON-RPC over stdin/stdout — it is meant to be launched by an MCP client, not used interactively. For a shared deployment, see Transports.
One command line, three transports:
| Command | Transport | Endpoint | Protocol revisions |
|---|---|---|---|
bankstatementparser-mcp | stdio | the client spawns the process | 2026-07-28, 2025-11-25 |
bankstatementparser-mcp --transport streamable-http | Streamable HTTP | http://127.0.0.1:8000/mcp | 2026-07-28 (stateless, server/discover) and 2025-11-25 (initialize, Mcp-Session-Id) on the same endpoint; responses stream as server-sent events, GET opens the server-to-client stream |
bankstatementparser-mcp --transport sse | HTTP+SSE (2024-11-05) | http://127.0.0.1:8000/sse and /messages/ | 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 passmcp in both protocol eras and over SSE with the MCP SDK client; see ADR 0001.
{
"mcpServers": {
"bankstatementparser": { "url": "http://127.0.0.1:8000/mcp" }
}
}All tools delegate to the bankstatementparser parser core, so they behave identically to the library.
list_supported_formats — List every bank statement format the parser can readdetect_format — Detect which statement format an inline payload isparse_statement — Parse a statement into structured transactions plus a summaryvalidate_statement — Dry-run check whether a statement parses cleanlysummarize_statement — Return only the statement summary (no per-transaction rows)Plus one resource and one prompt:
bankstatementparser://formats — Read-only catalogue of supported formats and their file extensionsanalyze_statement — Guided multi-step prompt that walks an agent through reading and reconciling a statementSupported formats: camt (ISO 20022 CAMT.053, .xml), pain001 (ISO 20022 pain.001, .xml), csv (.csv), ofx (.ofx), qfx (.qfx), and mt940 (SWIFT MT940, .mt940 / .sta).
The tools are plain functions on the bankstatementparser_mcp.server module, so you can call them in-process:
from bankstatementparser_mcp.server import (
detect_format,
parse_statement,
summarize_statement,
)
csv = (
"date,description,amount,currency,balance\n"
"2023-01-02,Salary,500.00,EUR,1500.00\n"
"2023-01-03,Groceries,-40.50,EUR,1459.50\n"
)
# 1. Detect the format from the filename hint + content.
print(detect_format(csv, "statement.csv"))
# -> csv
# 2. Parse the statement into structured rows + a summary.
parsed = parse_statement(csv, "statement.csv")
print(parsed["transaction_count"], parsed["columns"])
# 3. Read just the opening/closing balances.
print(summarize_statement(csv, "statement.csv"))The resource and prompt are plain functions too: formats_resource backs bankstatementparser://formats, and analyze_statement returns the guided multi-step prompt.
from bankstatementparser_mcp.server import (
analyze_statement,
formats_resource,
)
print(formats_resource()) # the supported-formats catalogue
print(analyze_statement("statement.csv")) # the guided analysis promptSee the examples/ folder for runnable walkthroughs, including 04_resource_and_prompt.py.
bankstatementparser CLI or library directly — it exposes the same surface with less indirection.
CLI reads paths directly and avoids the inline-content round-trip the MCP tools use.
bankstatementparser-mcp uses Poetry and mise.
git clone https://github.com/sebastienrousseau/bankstatementparser-mcp.git
cd bankstatementparser-mcp
mise install
poetry installA Makefile orchestrates the quality gates (kept in lockstep with CI):
| Target | What it runs |
|---|---|
make check | All gates (REQUIRED before commit) |
make test | pytest --cov=bankstatementparser_mcp --cov-branch --cov-fail-under=100 |
make lint | ruff check + black --check |
make type-check | mypy --strict |
make docs | interrogate --fail-under=100 (docstring coverage) |
Current state (v0.0.28): 100% line + branch coverage against a 100% enforced floor, mypy --strict clean, interrogate 100%.
inline content to a private temporary file that is deleted as soon as the call returns.
validate_statement are returned asstructured {"is_valid": false, "error": ...} payloads — never as stack traces.
poetry.lock and audited bypip-audit and Bandit in CI.
To report a vulnerability, please use GitHub private vulnerability reporting rather than a public issue.
examples/Contributions are welcome — see the contributing instructions. Thanks to all the contributors who have helped build bankstatementparser-mcp.
The four core servers of the ISO 20022 MCP Suite are compared in The ISO 20022 MCP Suite above. The wider family — open-source, Apache-2.0 licensed MCP servers for banking and financial-services AI agents — also includes:
| Server | Purpose |
|---|---|
pain001-mcp | Generate & validate ISO 20022 pain.001 payment files (v03–v12, pain.008, SEPA) with rulebook checks |
pacs008-mcp | Generate, validate, parse & scheme-check ISO 20022 pacs.008 FI-to-FI credit transfers + Nov-2026 address linting |
acmt001-mcp | Generate & validate ISO 20022 acmt account-management messages |
noyalib-mcp | Lossless YAML 1.2 parsing, formatting & validation (Rust, 100% spec compliance) |
mcp-name: io.github.sebastienrousseau/bankstatementparser-mcp
bankstatementparser is part of a modular financial ecosystem. Optional companion packages provide specialized loaders, writers, AI agents, language servers, and transport protocol adapters:
| Package | GitHub Repository | PyPI | Role | Description |
|---|---|---|---|---|
| `bankstatementparser` | sebastienrousseau/bankstatementparser | Core Engine | Unified parser for CAMT (052/053), PAIN.001, CSV, OFX, QFX, MT940, and PDF statements | |
| `bankstatementparser-mcp` | sebastienrousseau/bankstatementparser-mcp | AI Protocol | Model Context Protocol (MCP) server exposing statement tools to LLMs & AI agents | |
| `bankstatementparser-lsp` | sebastienrousseau/bankstatementparser-lsp | Developer Tooling | Language Server Protocol (LSP) with live SWIFT MT940 statement validation & diagnostics | |
| `bankstatementparser-transport-ebics` | sebastienrousseau/bankstatementparser-transport-ebics | Transport | Automated bank statement retrieval over EBICS 3.0 (H005) and 2.5 (H004) protocols | |
| `bankstatementparser-writer-xlsx` | sebastienrousseau/bankstatementparser-writer-xlsx | Output Writer | Formats and exports parsed banking transactions into styled Microsoft Excel (.xlsx) workbooks | |
| `bankstatementparser-writer-qif` | sebastienrousseau/bankstatementparser-writer-qif | Output Writer | Serializes transactions into standard Quicken Interchange Format (.qif) exchange files | |
| `bankstatementparser-writer-ofx` | sebastienrousseau/bankstatementparser-writer-ofx | Output Writer | Serializes transactions into standard Open Financial Exchange (.ofx) XML/SGML files | |
| `bankstatementparser-writer-swift` | sebastienrousseau/bankstatementparser-writer-swift | Output Writer | Exports transactions to SWIFT MT940 customer statements and MT942 interim reports | |
| `bankstatementparser-loader-bai2` | sebastienrousseau/bankstatementparser-loader-bai2 | Input Loader | Parses BAI2 cash-management and account balance statements | |
| `bankstatementparser-loader-mt942` | sebastienrousseau/bankstatementparser-loader-mt942 | Input Loader | Parses SWIFT MT942 interim transaction reports with credit/debit summary reconciliation | |
| `bankstatementparser-loader-cfonb` | sebastienrousseau/bankstatementparser-loader-cfonb | Input Loader | Parses French CFONB 120 / AFB120 120-byte fixed-width banking statement files | |
| `bankstatementparser-loader-camt054` | sebastienrousseau/bankstatementparser-loader-camt054 | Input Loader | Ingests ISO 20022 CAMT.054 real-time debit/credit notification stream XML | |
| `bankstatementparser-loader-sepa` | sebastienrousseau/bankstatementparser-loader-sepa | Input Loader | Ingests ISO 20022 SEPA PAIN.002 payment status reports and PAIN.008 direct debit mandates | |
| `bankstatementparser-loader-bacs` | sebastienrousseau/bankstatementparser-loader-bacs | Input Loader | Parses UK BACS Standard 18 / Faster Payments 106-byte fixed-width transmission files |
Licensed under the Apache License, Version 2.0. Any contribution submitted for inclusion shall be licensed as above, without additional terms.
<p align="center"> <a href="https://bankstatementparser.com">bankstatementparser.com</a> · <a href="https://pypi.org/project/bankstatementparser-mcp/">PyPI</a> · <a href="https://github.com/sebastienrousseau/bankstatementparser-mcp">GitHub</a> </p>
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.