Skip to main content
Glama
bankstatementparser-mcp

bankstatementparser-mcp


Contents

Getting started

Library reference

  • Tools — the five tools, one resource, one prompt

  • Using the tools — call them in-process from Python

Operational


Related MCP server: MCP Toolkit Server

What is bankstatementparser-mcp?

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


The ISO 20022 MCP Suite

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).


Install

Channel

Command

Notes

PyPI

pip install bankstatementparser-mcp

Pulls in bankstatementparser >= 0.0.29 + 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.

python -m venv venv
source venv/bin/activate        # macOS/Linux
venv\Scripts\activate           # Windows
python -m pip install -U bankstatementparser-mcp

Quick start

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.


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" }
  }
}

Tools

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 read

  • detect_format — Detect which statement format an inline payload is

  • parse_statement — Parse a statement into structured transactions plus a summary

  • validate_statement — Dry-run check whether a statement parses cleanly

  • summarize_statement — Return only the statement summary (no per-transaction rows)

Plus one resource and one prompt:

  • Resource bankstatementparser://formats — Read-only catalogue of supported formats and their file extensions

  • Prompt analyze_statement — Guided multi-step prompt that walks an agent through reading and reconciling a statement

Supported 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).


Using the tools

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 prompt

See the examples/ folder for runnable walkthroughs, including 04_resource_and_prompt.py.


When not to use bankstatementparser-mcp

  • You're not driving an MCP-aware agent. Use the bankstatementparser CLI or library directly — it exposes the same surface with less indirection.

  • You need to parse files already on disk in bulk. The library's CLI reads paths directly and avoids the inline-content round-trip the MCP tools use.


Development

bankstatementparser-mcp uses Poetry and mise.

git clone https://github.com/sebastienrousseau/bankstatementparser-mcp.git
cd bankstatementparser-mcp
mise install
poetry install

A 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.29): 100% line + branch coverage against a 100% enforced floor, mypy --strict clean, interrogate 100%.


Security

  • No persistent filesystem writes from tools. Each call writes the inline content to a private temporary file that is deleted as soon as the call returns.

  • Validation failures from validate_statement are returned as structured {"is_valid": false, "error": ...} payloads — never as stack traces.

  • Dependencies are pinned via poetry.lock and audited by pip-audit and Bandit in CI.

To report a vulnerability, please use GitHub private vulnerability reporting rather than a public issue.


Documentation


Contributing

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 Registry

mcp-name: io.github.sebastienrousseau/bankstatementparser-mcp


Ecosystem

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

PyPI

Core Engine

Unified parser for CAMT (052/053), PAIN.001, CSV, OFX, QFX, MT940, and PDF statements

bankstatementparser-mcp

sebastienrousseau/bankstatementparser-mcp

PyPI

AI Protocol

Model Context Protocol (MCP) server exposing statement tools to LLMs & AI agents

bankstatementparser-lsp

sebastienrousseau/bankstatementparser-lsp

PyPI

Developer Tooling

Language Server Protocol (LSP) with live SWIFT MT940 statement validation & diagnostics

bankstatementparser-transport-ebics

sebastienrousseau/bankstatementparser-transport-ebics

PyPI

Transport

Automated bank statement retrieval over EBICS 3.0 (H005) and 2.5 (H004) protocols

bankstatementparser-writer-xlsx

sebastienrousseau/bankstatementparser-writer-xlsx

PyPI

Output Writer

Formats and exports parsed banking transactions into styled Microsoft Excel (.xlsx) workbooks

bankstatementparser-writer-qif

sebastienrousseau/bankstatementparser-writer-qif

PyPI

Output Writer

Serializes transactions into standard Quicken Interchange Format (.qif) exchange files

bankstatementparser-writer-ofx

sebastienrousseau/bankstatementparser-writer-ofx

PyPI

Output Writer

Serializes transactions into standard Open Financial Exchange (.ofx) XML/SGML files

bankstatementparser-writer-swift

sebastienrousseau/bankstatementparser-writer-swift

PyPI

Output Writer

Exports transactions to SWIFT MT940 customer statements and MT942 interim reports

bankstatementparser-loader-bai2

sebastienrousseau/bankstatementparser-loader-bai2

PyPI

Input Loader

Parses BAI2 cash-management and account balance statements

bankstatementparser-loader-mt942

sebastienrousseau/bankstatementparser-loader-mt942

PyPI

Input Loader

Parses SWIFT MT942 interim transaction reports with credit/debit summary reconciliation

bankstatementparser-loader-cfonb

sebastienrousseau/bankstatementparser-loader-cfonb

PyPI

Input Loader

Parses French CFONB 120 / AFB120 120-byte fixed-width banking statement files

bankstatementparser-loader-camt054

sebastienrousseau/bankstatementparser-loader-camt054

PyPI

Input Loader

Ingests ISO 20022 CAMT.054 real-time debit/credit notification stream XML

bankstatementparser-loader-sepa

sebastienrousseau/bankstatementparser-loader-sepa

PyPI

Input Loader

Ingests ISO 20022 SEPA PAIN.002 payment status reports and PAIN.008 direct debit mandates

bankstatementparser-loader-bacs

sebastienrousseau/bankstatementparser-loader-bacs

PyPI

Input Loader

Parses UK BACS Standard 18 / Faster Payments 106-byte fixed-width transmission files


License

Licensed under the Apache License, Version 2.0. Any contribution submitted for inclusion shall be licensed as above, without additional terms.


Available Tools

5 tools
detect_formatDetect statement formatA
Read-onlyIdempotent

Detect which bank statement format an inline payload is.

Use this when you hold statement text but do not yet know its format,
to resolve the ``format`` identifier from the content plus filename
hint. Once the format is known, call ``parse_statement`` to read the
transactions instead of calling this again.

Args:
    content: The raw statement text.
    filename: Original filename; its extension is the primary hint.

Returns:
    The detected format identifier.

Raises:
    ToolError: If the format cannot be detected.

Inputs: content (required), filename. Returns: result

list_supported_formatsList supported statement formatsA
Read-onlyIdempotent

List every bank statement format identifier this server can parse.

Use this first to discover the valid ``format`` strings before calling
``detect_format`` or ``parse_statement``. For the file extensions and a
human-readable description of each format, read the
``bankstatementparser://formats`` resource instead.

Returns:
    The supported format identifiers.

Inputs: no named parameters. Returns: result

parse_statementParse statement transactions and summaryA
Read-onlyIdempotent

Parse an inline statement payload into transaction rows and a summary.

Use this to read the full transaction detail plus the statement
balances from a payload. When you only need the balances/totals use
``summarize_statement`` instead, and to merely confirm a payload parses
without returning any rows use ``validate_statement``.

Args:
    content: The raw statement text.
    filename: Original filename; its extension selects the format
        when ``format`` is omitted.
    format: Explicit format override.
    limit: Optional cap on returned transaction rows.

Returns:
    A dict with the resolved ``format``, ``columns``, full
    ``transaction_count``, the (possibly truncated) ``transactions``
    as row dicts, and the statement ``summary``.

Raises:
    ToolError: If the format is unsupported, cannot be detected, or
        the payload does not parse.

Inputs: content (required), limit, format, filename. Returns: object

summarize_statementSummarize statement balancesA
Read-onlyIdempotent

Summarize an inline statement's balances and totals only.

Use this when you need just the opening/closing balances, currency, and
other summary fields without the per-transaction rows. For the full
transaction detail alongside the summary, use ``parse_statement``
instead.

Args:
    content: The raw statement text.
    filename: Original filename; its extension selects the format.
    format: Explicit format override.

Returns:
    The summary record with Decimal values stringified.

Raises:
    ToolError: If the format is unsupported, cannot be detected, or
        the payload does not parse.

Inputs: content (required), format, filename. Returns: object

validate_statementValidate statement (dry run)A
Read-onlyIdempotent

Dry-run parse an inline statement to check it parses cleanly.

Use this to confirm a payload is well-formed and parseable before
committing to a full read; it returns a structured pass/fail with the
transaction count but never the rows themselves, and never raises on a
parse error. To actually read the transactions use ``parse_statement``.

Args:
    content: The raw statement text.
    filename: Original filename; its extension selects the format.
    format: Explicit format override.

Returns:
    A dict with ``is_valid``, the resolved ``format``, the
    ``transaction_count`` on success, and an ``error`` on failure.

Inputs: content (required), format, filename. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.4/5.0

    Scored across 5 tools

    Disambiguation4/5

    Each tool targets a distinct action (detect, parse, summarize, list, validate), and descriptions explicitly cross-reference each other to steer selection. Minor overlap exists because parse_statement also resolves formats and validate_statement is effectively a dry-run parse, but the boundaries are clearly articulated.

    Naming Consistency5/5

    All five tools follow a clean verb_noun snake_case pattern (detect_format, parse_statement, summarize_statement, list_supported_formats, validate_statement) with no stylistic deviations.

    Tool Count5/5

    Five tools is a tight, well-scoped set for an inline statement parser, with each tool earning its place across detection, discovery, full parsing, summarizing, and validation.

    Completeness4/5

    The surface covers the full inline workflow: discovering formats, detecting, validating, parsing rows, and summarizing balances. Gaps are minor, such as no file/URL ingestion path, but that appears outside the stated inline-payload scope.

    Maintenance

    ActivityActive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers