Skip to main content
Glama
sebastienrousseau

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 (FastMCP default); zero config beyond the client manifest

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

22 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.18 + 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

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.

The server speaks JSON-RPC over stdin/stdout — it is meant to be launched by an MCP client, not used interactively.


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.19): 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:
    ValueError: If the format cannot be detected.
ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesThe raw statement text to inspect, inline (not a file path). Supported formats include ISO 20022 CAMT.053 and pain.001 XML, SWIFT MT940, CSV exports, and OFX/QFX.
filenameNoOriginal filename of the payload; its extension is the primary detection hint. Recognised extensions: .xml, .csv, .ofx, .qfx, .mt940, .sta. Defaults to 'statement.xml'.statement.xml

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the bar is lower. The description adds that it resolves format from content and filename, and raises ValueError if undetected, which is useful context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise with clear sections (Args, Returns, Raises). Every sentence earns its place; no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool complexity and 100% schema coverage with output schema, the description fully covers what the tool does, its inputs, output, and error conditions. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline 3. The description adds meaning by noting content is inline (not file path) and filename's extension is primary hint, along with defaults and recognized extensions. This goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it detects which bank statement format an inline payload is, using specific verb 'detect' and resource 'format'. It distinguishes from siblings by referencing parse_statement for subsequent actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (when you hold statement text but do not yet know its format) and what to do next (call parse_statement instead of calling again). Provides clear context and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds value by specifying the return value (format identifiers) and directing to a resource for human-readable details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise three-sentence description. Front-loaded with the main action, each sentence serves a purpose: states function, gives usage guidance, and describes return value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and an output schema exists, the description is complete. It explains what the tool returns, how it fits with sibling tools, and where to find additional info.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters in schema, so description doesn't need to explain them. It adds context about what the tool returns, meeting the baseline for zero parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'List every bank statement format identifier this server can parse.' Uses specific verb and resource, and distinguishes from siblings by mentioning it's a precursor to detect_format and parse_statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs 'Use this first to discover the valid format strings before calling detect_format or parse_statement.' Also references an alternative resource for more detailed information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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:
    ValueError: If the format is unsupported or cannot be detected.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoOptional maximum number of transaction rows to return. The full 'transaction_count' is always reported even when the returned rows are truncated. When omitted, all rows are returned.
formatNoExplicit format identifier that overrides detection from the filename. Must be exactly one of: 'camt', 'pain001', 'csv', 'ofx', 'qfx', 'mt940' (see list_supported_formats). When omitted, the format is inferred from the filename extension.
contentYesThe raw statement text to parse, inline (not a file path). Accepts ISO 20022 CAMT.053 and pain.001 XML, SWIFT MT940, CSV exports, and OFX/QFX payloads.
filenameNoOriginal filename of the payload; its extension (.xml, .csv, .ofx, .qfx, .mt940, .sta) selects the format when 'format' is omitted. Defaults to 'statement.xml'.statement.xml

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior, and the description adds genuinely useful context beyond them: format resolution precedence (filename extension vs explicit format override), truncation semantics (transactions possibly truncated while transaction_count stays full), and the ValueError raised for unsupported or undetectable formats. The Returns section also documents the exact response shape. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-line purpose, followed by compact usage guidance and terse Args/Returns/Raises sections. Every section earns its place; the Returns and Raises blocks carry real behavioral information rather than padding or repeating the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 4 parameters, a 6-value format enum, and 4 sibling tools, nothing an agent needs to invoke this correctly is missing: required content semantics, format inference and override, limit behavior, return structure, error behavior, and alternative tools are all covered. The output schema covers return values, and the description reinforces them regardless.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema descriptions are already rich (format enum values, accepted payload types, extension list), so the baseline is 3. The description nudges above baseline by adding the behavioral consequence of `limit` in the Returns section (transactions may be truncated but transaction_count is the full count) and by tying format failures to the Raises clause.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line 'Parse an inline statement payload into transaction rows and a summary' names a specific verb, resource, and delivered artifacts. It also differentiates from siblings by clarifying that this tool provides full transaction detail plus balances, while summarize_statement and validate_statement cover the reduced-scope cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool ('Use this to read the full transaction detail plus the statement balances') and gives concrete switch criteria: use summarize_statement when only balances/totals are needed, and validate_statement to merely confirm a payload parses. Alternatives are named, so an agent needs no inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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:
    ValueError: If the format is unsupported or cannot be detected.
ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoExplicit format identifier that overrides detection from the filename. Must be exactly one of: 'camt', 'pain001', 'csv', 'ofx', 'qfx', 'mt940' (see list_supported_formats). When omitted, the format is inferred from the filename extension.
contentYesThe raw statement text to summarize, inline (not a file path). Accepts ISO 20022 CAMT.053 and pain.001 XML, SWIFT MT940, CSV exports, and OFX/QFX payloads.
filenameNoOriginal filename of the payload; its extension (.xml, .csv, .ofx, .qfx, .mt940, .sta) selects the format when 'format' is omitted. Defaults to 'statement.xml'.statement.xml

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idemponentHint, and destructiveHint=false; the description adds meaningful behavioral details beyond annotations, including that Decimal values are stringified in the result, that ValueError is raised for unsupported/undetectable formats, and that the input must be inline text rather than a file path. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the primary purpose and usage guidance, and the Args/Returns/Raises sections are compact. It earns a igh score, though the Args section slightly duplicates richer schema descriptions, keeping it from a perfect 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a full input schema, output schema, strong annotations, and explicit sibling routing, the description covers what the tool does, when to use it, what it returns, and what can go wrong. Nothing essential is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter already has a thorough description, including the format enum and filename extension behavior. The Args section in the description is a concise restatement but does not add significant meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb plus resource: 'summarize an inline statement's balances and totals only.' It clearly distinguishes this tool from parse_statement by noting that it omits per-transaction rows, so an agent can select correctly even before reading schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance ('when you need just the opening/closing balances, currency, and other summary fields') and explicitly names the alternative ('use parse_statement instead') for full transaction detail. It also clarifies format detection behavior and the role of filename vs format.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoExplicit format identifier that overrides detection from the filename. Must be exactly one of: 'camt', 'pain001', 'csv', 'ofx', 'qfx', 'mt940' (see list_supported_formats). When omitted, the format is inferred from the filename extension.
contentYesThe raw statement text to validate, inline (not a file path). Accepts ISO 20022 CAMT.053 and pain.001 XML, SWIFT MT940, CSV exports, and OFX/QFX payloads.
filenameNoOriginal filename of the payload; its extension (.xml, .csv, .ofx, .qfx, .mt940, .sta) selects the format when 'format' is omitted. Defaults to 'statement.xml'.statement.xml

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive, and closed-world behavior. The description adds valuable behavioral context beyond those flags: it never raises on parse error, returns a structured pass/fail, includes transaction count on success, and never returns row data. This meaningfully informs agent expectations around failure handling and output scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose statement, usage guidance, Args, and Returns sections. Every sentence earns its place, and the most important behavioral constraints (no rows, no raise) are front-loaded before the alternative tool mention.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a validation tool with rich annotations, a fully described schema, an output schema, and explicit sibling guidance, the description is complete. An agent knows what it validates, when to call it, what it returns, how it behaves on failure, and which sibling to use when actual data is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents content, filename, and format. The description's Args section largely restates this existing information without adding new semantic depth beyond what the schema already provides. This is the appropriate baseline for a fully self-documenting schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair ('Dry-run parse an inline statement') and immediately clarifies what it does and does not return (pass/fail with transaction count, never rows). It also distinguishes itself from parse_statement by naming it explicitly, so an agent can separate the two tools without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states exactly when to use this tool: to confirm a payload is well-formed before committing to a full read. It also names the alternative action ('To actually read the transactions use parse_statement'), which provides an explicit selection rule between siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 3 tool updatesv0.0.19
    • Changedparse_statement2 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"Explicit format identifier that overrides detection from the filename. Must be exactly one of: 'camt', 'csv', 'mt940', 'ofx', 'pain001', 'qfx' (see list_supported_formats). When omitted, the format is inferred from the filename extension."New value: +"Explicit format identifier that overrides detection from the filename. Must be exactly one of: 'camt', 'pain001', 'csv', 'ofx', 'qfx', 'mt940' (see list_supported_formats). When omitted, the format is inferred from the filename extension."
      • changedInput schema / properties / format / enum
        Previous value: -[
        -  "camt",
        -  "csv",
        -  "mt940",
        -  "ofx",
        -  "pain001",
        -  "qfx"
        -]New value: +[
        +  "camt",
        +  "pain001",
        +  "csv",
        +  "ofx",
        +  "qfx",
        +  "mt940"
        +]
    • Changedsummarize_statement2 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"Explicit format identifier that overrides detection from the filename. Must be exactly one of: 'camt', 'csv', 'mt940', 'ofx', 'pain001', 'qfx' (see list_supported_formats). When omitted, the format is inferred from the filename extension."New value: +"Explicit format identifier that overrides detection from the filename. Must be exactly one of: 'camt', 'pain001', 'csv', 'ofx', 'qfx', 'mt940' (see list_supported_formats). When omitted, the format is inferred from the filename extension."
      • changedInput schema / properties / format / enum
        Previous value: -[
        -  "camt",
        -  "csv",
        -  "mt940",
        -  "ofx",
        -  "pain001",
        -  "qfx"
        -]New value: +[
        +  "camt",
        +  "pain001",
        +  "csv",
        +  "ofx",
        +  "qfx",
        +  "mt940"
        +]
    • Changedvalidate_statement2 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"Explicit format identifier that overrides detection from the filename. Must be exactly one of: 'camt', 'csv', 'mt940', 'ofx', 'pain001', 'qfx' (see list_supported_formats). When omitted, the format is inferred from the filename extension."New value: +"Explicit format identifier that overrides detection from the filename. Must be exactly one of: 'camt', 'pain001', 'csv', 'ofx', 'qfx', 'mt940' (see list_supported_formats). When omitted, the format is inferred from the filename extension."
      • changedInput schema / properties / format / enum
        Previous value: -[
        -  "camt",
        -  "csv",
        -  "mt940",
        -  "ofx",
        -  "pain001",
        -  "qfx"
        -]New value: +[
        +  "camt",
        +  "pain001",
        +  "csv",
        +  "ofx",
        +  "qfx",
        +  "mt940"
        +]
  2. 3 tool updates
    • Changedparse_statement2 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"Explicit format identifier that overrides detection from the filename. One of: 'camt' (CAMT.053), 'pain001', 'csv', 'ofx', 'qfx', 'mt940'. When omitted, the format is inferred from the filename extension."New value: +"Explicit format identifier that overrides detection from the filename. Must be exactly one of: 'camt', 'csv', 'mt940', 'ofx', 'pain001', 'qfx' (see list_supported_formats). When omitted, the format is inferred from the filename extension."
      • addedInput schema / properties / format / enum
        Added value: +[
        +  "camt",
        +  "csv",
        +  "mt940",
        +  "ofx",
        +  "pain001",
        +  "qfx"
        +]
    • Changedsummarize_statement2 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"Explicit format identifier that overrides detection from the filename. One of: 'camt' (CAMT.053), 'pain001', 'csv', 'ofx', 'qfx', 'mt940'. When omitted, the format is inferred from the filename extension."New value: +"Explicit format identifier that overrides detection from the filename. Must be exactly one of: 'camt', 'csv', 'mt940', 'ofx', 'pain001', 'qfx' (see list_supported_formats). When omitted, the format is inferred from the filename extension."
      • addedInput schema / properties / format / enum
        Added value: +[
        +  "camt",
        +  "csv",
        +  "mt940",
        +  "ofx",
        +  "pain001",
        +  "qfx"
        +]
    • Changedvalidate_statement2 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"Explicit format identifier that overrides detection from the filename. One of: 'camt' (CAMT.053), 'pain001', 'csv', 'ofx', 'qfx', 'mt940'. When omitted, the format is inferred from the filename extension."New value: +"Explicit format identifier that overrides detection from the filename. Must be exactly one of: 'camt', 'csv', 'mt940', 'ofx', 'pain001', 'qfx' (see list_supported_formats). When omitted, the format is inferred from the filename extension."
      • addedInput schema / properties / format / enum
        Added value: +[
        +  "camt",
        +  "csv",
        +  "mt940",
        +  "ofx",
        +  "pain001",
        +  "qfx"
        +]
  3. 4 tool updatesv0.0.16
    • Changeddetect_format2 fields changed
      • addedInput schema / properties / content / description
        Added value: +"The raw statement text to inspect, inline (not a file path). Supported formats include ISO 20022 CAMT.053 and pain.001 XML, SWIFT MT940, CSV exports, and OFX/QFX."
      • addedInput schema / properties / filename / description
        Added value: +"Original filename of the payload; its extension is the primary detection hint. Recognised extensions: .xml, .csv, .ofx, .qfx, .mt940, .sta. Defaults to 'statement.xml'."
    • Changedparse_statement4 fields changed
      • addedInput schema / properties / content / description
        Added value: +"The raw statement text to parse, inline (not a file path). Accepts ISO 20022 CAMT.053 and pain.001 XML, SWIFT MT940, CSV exports, and OFX/QFX payloads."
      • addedInput schema / properties / filename / description
        Added value: +"Original filename of the payload; its extension (.xml, .csv, .ofx, .qfx, .mt940, .sta) selects the format when 'format' is omitted. Defaults to 'statement.xml'."
      • addedInput schema / properties / format / description
        Added value: +"Explicit format identifier that overrides detection from the filename. One of: 'camt' (CAMT.053), 'pain001', 'csv', 'ofx', 'qfx', 'mt940'. When omitted, the format is inferred from the filename extension."
      • addedInput schema / properties / limit / description
        Added value: +"Optional maximum number of transaction rows to return. The full 'transaction_count' is always reported even when the returned rows are truncated. When omitted, all rows are returned."
    • Changedsummarize_statement3 fields changed
      • addedInput schema / properties / content / description
        Added value: +"The raw statement text to summarize, inline (not a file path). Accepts ISO 20022 CAMT.053 and pain.001 XML, SWIFT MT940, CSV exports, and OFX/QFX payloads."
      • addedInput schema / properties / filename / description
        Added value: +"Original filename of the payload; its extension (.xml, .csv, .ofx, .qfx, .mt940, .sta) selects the format when 'format' is omitted. Defaults to 'statement.xml'."
      • addedInput schema / properties / format / description
        Added value: +"Explicit format identifier that overrides detection from the filename. One of: 'camt' (CAMT.053), 'pain001', 'csv', 'ofx', 'qfx', 'mt940'. When omitted, the format is inferred from the filename extension."
    • Changedvalidate_statement3 fields changed
      • addedInput schema / properties / content / description
        Added value: +"The raw statement text to validate, inline (not a file path). Accepts ISO 20022 CAMT.053 and pain.001 XML, SWIFT MT940, CSV exports, and OFX/QFX payloads."
      • addedInput schema / properties / filename / description
        Added value: +"Original filename of the payload; its extension (.xml, .csv, .ofx, .qfx, .mt940, .sta) selects the format when 'format' is omitted. Defaults to 'statement.xml'."
      • addedInput schema / properties / format / description
        Added value: +"Explicit format identifier that overrides detection from the filename. One of: 'camt' (CAMT.053), 'pain001', 'csv', 'ofx', 'qfx', 'mt940'. When omitted, the format is inferred from the filename extension."
  4. 5 tool updatesv0.0.14
    • First observeddetect_format
    • First observedlist_supported_formats
    • First observedparse_statement
    • First observedsummarize_statement
    • First observedvalidate_statement

TDQS

A4.8/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a distinct purpose: discovering formats, detecting format, parsing full statements, validating without returning rows, and summarizing balances. The overlap between parse_statement and the other parse-derived tools is explicitly disambiguated in their descriptions.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case: list_supported_formats, detect_format, parse_statement, validate_statement, summarize_statement. No mixed conventions or vague verbs.

Tool Count5/5

Five tools is well-scoped for a bank statement parser server. Each tool covers a distinct stage or mode of use with no redundant extras.

Completeness5/5

The surface covers format discovery, format detection, validation, full parsing, and summary extraction—everything needed to work with bank statements. There are no obvious dead ends or missing lifecycle operations.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers