bankstatementparser-mcp
Parse, detect, validate, and summarize bank statements in multiple formats directly through an AI agent using the Model Context Protocol (MCP). All tools process statement content provided inline as a string, avoiding shared filesystem dependencies.
Tools:
list_supported_formats: Discover all supported format identifiers (e.g.,camt,pain001,csv,ofx,qfx,mt940).detect_format: Automatically identify the format of a statement payload using its content and an optional filename hint.parse_statement: Extract full transaction rows plus balances/totals. Supports optional format override and a row limit for large statements.validate_statement: Dry-run check whether a statement is well-formed and parseable — returns a structured pass/fail with transaction count or error details, without returning transaction rows.summarize_statement: Retrieve only the opening/closing balances, currency, and summary fields, without per-transaction rows.
Resource:
bankstatementparser://formats: Read-only catalogue of supported formats and their file extensions.
Prompt:
analyze_statement: Guided multi-step prompt that walks an AI agent through reading and reconciling a bank statement end-to-end.
Supported formats:
ISO 20022 CAMT.053 (
.xml)ISO 20022 pain.001 (
.xml)SWIFT MT940 (
.mt940,.sta)OFX (
.ofx), QFX (.qfx)CSV (
.csv)
Allows parsing of SWIFT MT940 bank statements to extract transactions and balances.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@bankstatementparser-mcpRead and summarize this bank statement"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Contents
Getting started
What is bankstatementparser-mcp? — the problem it solves
The ISO 20022 MCP Suite — the four coordinated servers and when to use each
Install — PyPI, virtualenv, Docker
Quick start — register with Claude Desktop in 30 seconds
Library reference
Tools — the five tools, one resource, one prompt
Using the tools — call them in-process from Python
Operational
When not to use bankstatementparser-mcp — honest boundaries
Development — gates, make targets
Security — sandboxing posture
Documentation — examples, guides
Contributing — how to get changes in
License — Apache-2.0
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 |
Format detection |
|
Validation |
|
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 |
ISO 20022 | 22 MCP tools · 4 prompts · 3 resources |
| You work with bank-to-customer statements end to end — the suite's flagship | |
Unified gateway: | 7 meta-tools |
| You want one entry point to every message family | |
Matches expected | 7 MCP tools |
| You need explainable statement/payment reconciliation | |
Multi-format statement ingestion: ISO 20022 CAMT.053 and pain.001, SWIFT MT940, OFX/QFX, CSV | 5 MCP tools · 1 prompt · 1 resource |
| Your statements arrive in mixed or legacy formats — this package | |
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 ( | 9 MCP tools |
| You need debtor/creditor addresses cliff-ready ahead of 14 Nov 2026 | |
Orchestration gateway: detect → structurally validate → clearing-profile lint → readiness score, plus automated remediation and | 4 MCP tools |
| You want one high-level readiness / orchestration entry point over the suite | |
Manages, validates and serves bank-specific clearing profiles / rule packs (CBPR+, SEPA_Instant, FedNow, Generic); premium rule-pack entitlement gating | 4 MCP tools |
| You lint payments against your own institution's market practice | |
Compiles readiness findings, remediation diffs and simulated responses into a sealed, Ed25519-signable audit evidence pack | 6 MCP tools |
| 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 |
| Pulls in |
Source |
| For development |
Docker (GHCR) |
| Multi-arch (linux/amd64, linux/arm64); runs |
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-mcpQuick 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 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:
Resource
bankstatementparser://formats— Read-only catalogue of supported formats and their file extensionsPrompt
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 promptSee 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
bankstatementparserCLI 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 installA Makefile orchestrates the quality gates (kept in lockstep with CI):
Target | What it runs |
| All gates (REQUIRED before commit) |
|
|
|
|
|
|
|
|
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_statementare returned as structured{"is_valid": false, "error": ...}payloads — never as stack traces.Dependencies are pinned via
poetry.lockand audited bypip-auditand Bandit in CI.
To report a vulnerability, please use GitHub private vulnerability reporting rather than a public issue.
Documentation
Runnable examples:
examples/Release history: CHANGELOG.md
MCP specification: modelcontextprotocol.io
Contributing
Contributions are welcome — see the
contributing instructions.
Thanks to all the
contributors
who have helped build bankstatementparser-mcp.
Related MCP Servers
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 |
Generate & validate ISO 20022 pain.001 payment files (v03–v12, pain.008, SEPA) with rulebook checks | |
Generate, validate, parse & scheme-check ISO 20022 pacs.008 FI-to-FI credit transfers + Nov-2026 address linting | |
Generate & validate ISO 20022 acmt account-management messages | |
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 |
| Core Engine | Unified parser for CAMT (052/053), PAIN.001, CSV, OFX, QFX, MT940, and PDF statements | ||
| AI Protocol | Model Context Protocol (MCP) server exposing statement tools to LLMs & AI agents | ||
| Developer Tooling | Language Server Protocol (LSP) with live SWIFT MT940 statement validation & diagnostics | ||
| Transport | Automated bank statement retrieval over EBICS 3.0 ( | ||
| Output Writer | Formats and exports parsed banking transactions into styled Microsoft Excel ( | ||
| Output Writer | Serializes transactions into standard Quicken Interchange Format ( | ||
| Output Writer | Serializes transactions into standard Open Financial Exchange ( | ||
| Output Writer | Exports transactions to SWIFT MT940 customer statements and MT942 interim reports | ||
| Input Loader | Parses BAI2 cash-management and account balance statements | ||
| Input Loader | Parses SWIFT MT942 interim transaction reports with credit/debit summary reconciliation | ||
| Input Loader | Parses French CFONB 120 / AFB120 120-byte fixed-width banking statement files | ||
| Input Loader | Ingests ISO 20022 CAMT.054 real-time debit/credit notification stream XML | ||
| Input Loader | Ingests ISO 20022 SEPA PAIN.002 payment status reports and PAIN.008 direct debit mandates | ||
| 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 toolsdetect_formatDetect statement formatARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | 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. | |
| filename | No | Original 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
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 formatsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 summaryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 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. | |
| format | No | 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. | |
| content | Yes | 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. | |
| filename | No | Original 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 balancesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | 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. | |
| content | Yes | 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. | |
| filename | No | Original 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | 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. | |
| content | Yes | 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. | |
| filename | No | Original 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
v0.0.19- Changed
parse_statement2 fields changed- changed
Input schema / properties / format / descriptionPrevious 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." - changed
Input schema / properties / format / enumPrevious value: -[ - "camt", - "csv", - "mt940", - "ofx", - "pain001", - "qfx" -]New value: +[ + "camt", + "pain001", + "csv", + "ofx", + "qfx", + "mt940" +]
- Changed
summarize_statement2 fields changed- changed
Input schema / properties / format / descriptionPrevious 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." - changed
Input schema / properties / format / enumPrevious value: -[ - "camt", - "csv", - "mt940", - "ofx", - "pain001", - "qfx" -]New value: +[ + "camt", + "pain001", + "csv", + "ofx", + "qfx", + "mt940" +]
- Changed
validate_statement2 fields changed- changed
Input schema / properties / format / descriptionPrevious 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." - changed
Input schema / properties / format / enumPrevious value: -[ - "camt", - "csv", - "mt940", - "ofx", - "pain001", - "qfx" -]New value: +[ + "camt", + "pain001", + "csv", + "ofx", + "qfx", + "mt940" +]
3 tool updates
- Changed
parse_statement2 fields changed- changed
Input schema / properties / format / descriptionPrevious 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." - added
Input schema / properties / format / enumAdded value: +[ + "camt", + "csv", + "mt940", + "ofx", + "pain001", + "qfx" +]
- Changed
summarize_statement2 fields changed- changed
Input schema / properties / format / descriptionPrevious 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." - added
Input schema / properties / format / enumAdded value: +[ + "camt", + "csv", + "mt940", + "ofx", + "pain001", + "qfx" +]
- Changed
validate_statement2 fields changed- changed
Input schema / properties / format / descriptionPrevious 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." - added
Input schema / properties / format / enumAdded value: +[ + "camt", + "csv", + "mt940", + "ofx", + "pain001", + "qfx" +]
4 tool updates
v0.0.16- Changed
detect_format2 fields changed- added
Input schema / properties / content / descriptionAdded 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." - added
Input schema / properties / filename / descriptionAdded 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'."
- Changed
parse_statement4 fields changed- added
Input schema / properties / content / descriptionAdded 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." - added
Input schema / properties / filename / descriptionAdded 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'." - added
Input schema / properties / format / descriptionAdded 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." - added
Input schema / properties / limit / descriptionAdded 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."
- Changed
summarize_statement3 fields changed- added
Input schema / properties / content / descriptionAdded 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." - added
Input schema / properties / filename / descriptionAdded 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'." - added
Input schema / properties / format / descriptionAdded 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."
- Changed
validate_statement3 fields changed- added
Input schema / properties / content / descriptionAdded 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." - added
Input schema / properties / filename / descriptionAdded 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'." - added
Input schema / properties / format / descriptionAdded 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."
5 tool updates
v0.0.14- First observed
detect_format - First observed
list_supported_formats - First observed
parse_statement - First observed
summarize_statement - First observed
validate_statement
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
A Model Context Protocol server for Wix AI tools
Model Context Protocol server for Studex tools, notifications, and profile integrations
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Related MCP Servers
- FlicenseNot gradedqualityFmaintenanceThis server implements the Model Context Protocol to facilitate meaningful interaction and understanding development between humans and AI through structured tools and progressive interaction patterns.57-
- AlicenseAqualityDmaintenanceA Model Context Protocol server providing tools for DB queries, API calls, file I/O, and text transformations, enabling AI agents like Claude to perform real-world actions.10MIT
- AlicenseNot gradedqualityDmaintenanceModel Context Protocol server that standardizes tool discovery, execution, and context management for AI applications.MIT

Cerevox MCP Serverofficial
AlicenseNot gradedqualityDmaintenanceModel Context Protocol server for Cerevox AI that exposes document parsing (Lexa), RAG and semantic search (Hippo), and account management APIs, enabling AI agents to parse documents, search and query document collections with RAG, and manage accounts.MIT