Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Bankstatemently

REMOTE · API.BANKSTATEMENTLY.COM · SCANNED SEP 20

Convert PDF bank statements into structured transactions, accounts, and balances.

+2 this week 95 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security97
Transport & Reachability100
Schema Quality & AI Usability77
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 4018 tokens (~236/item across 17 items; 16 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 16 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 18 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the Bankstatemently MCP server?

Bankstatemently is a hosted endpoint at https://api.bankstatemently.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · api.bankstatemently.com

# add to Claude Code
claude mcp add --transport http bankstatemently-bankstatemently-mcp 'https://api.bankstatemently.com/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "bankstatemently-bankstatemently-mcp": {
      "url": "https://api.bankstatemently.com/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "bankstatemently-bankstatemently-mcp": {
      "type": "http",
      "url": "https://api.bankstatemently.com/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.bankstatemently-bankstatemently-mcp]
url = "https://api.bankstatemently.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "bankstatemently-bankstatemently-mcp": {
      "type": "remote",
      "url": "https://api.bankstatemently.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add bankstatemently-bankstatemently-mcp --url 'https://api.bankstatemently.com/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  bankstatemently-bankstatemently-mcp:
    url: "https://api.bankstatemently.com/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "bankstatemently-bankstatemently-mcp": {
      "Transport": "http",
      "Url": "https://api.bankstatemently.com/mcp"
    }
  }
}
# add to Vellum
assistant mcp add bankstatemently-bankstatemently-mcp -t streamable-http -u 'https://api.bankstatemently.com/mcp'
// mcp.json
{
  "mcpServers": {
    "bankstatemently-bankstatemently-mcp": {
      "type": "http",
      "url": "https://api.bankstatemently.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +2
    • Authorization: partial → pass security
  • 17 Sept 26 0
    • The server now declares the “prompts” capability functional
    • New prompt “analyze_spending” functional
    • New prompt “benchmark_accuracy” functional
    • New prompt “convert_statement_workflow” functional
    • New prompt “reconcile_statements” functional
    • Server version: 1.3.0 → 1.4.0 functional
  • 15 Sept 26 0
    • Server version: 1.2.0 → 1.3.0 functional
  • 11 Sept 26 0
    • Stability: 0.97 → pass security
    • Tool “rate_statement” rewrote its description, which is the text the model reads security
    • Tool “dismiss_statement” is now declared destructive security
    • Tool “get_credits” changed its title: Get Credit Balance (processing quota) → Get Credit Balance cosmetic
  • 10 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 7 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 5 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.

  • 4 Sept 26 +3
    • Schema quality: 168 → 236 functional
    • Tool coverage: 0% → 100% functional
    • Schema quality: good → excellent functional
    • MCP protocol: Implements a current MCP spec version (2026-07-28). functional
    • MCP protocol version: 2025-11-25 → 2026-07-28 functional
    • “aggregate” reworded the description of “filter” cosmetic
    • “aggregate” reworded the description of “metric” cosmetic
    • “aggregate” reworded the description of “scope” cosmetic
    • “categorize_statement” reworded the description of “document_id” cosmetic
    • “compare” reworded the description of “filterA” cosmetic
    • “compare” reworded the description of “filterB” cosmetic
    • “compare” reworded the description of “metric” cosmetic
    • “compare” reworded the description of “scope” cosmetic
    • “convert_statement” reworded the description of “output_format” cosmetic
    • “convert_statement” reworded the description of “password” cosmetic
    • “convert_statement” reworded the description of “pdf” cosmetic
    • “convert_statement” reworded the description of “pdf_file” cosmetic
    • “convert_statement” reworded the description of “pdf_url” cosmetic
    • “convert_statement” reworded the description of “upload_id” cosmetic
    • “convert_statement” reworded the description of “upload_ids” cosmetic
    • “dismiss_statement” reworded the description of “document_id” cosmetic
    • “evaluate_benchmark” reworded the description of “accounts” cosmetic
    • “evaluate_benchmark” reworded the description of “content_hash” cosmetic
    • “evaluate_benchmark” reworded the description of “statement_id” cosmetic
    • “evaluate_benchmark” reworded the description of “transactions” cosmetic
    • “get_statement” reworded the description of “data_mode” cosmetic
    • “get_statement” reworded the description of “document_id” cosmetic
    • “get_statement” reworded the description of “limit” cosmetic
    • “get_statement” reworded the description of “offset” cosmetic
    • “get_statement” reworded the description of “output_format” cosmetic
    • “group_by” reworded the description of “dimension” cosmetic
    • “group_by” reworded the description of “filter” cosmetic
    • “group_by” reworded the description of “metric” cosmetic
    • “group_by” reworded the description of “scope” cosmetic
    • “list_statements” reworded the description of “limit” cosmetic
    • “list_statements” reworded the description of “offset” cosmetic
    • “list_statements” reworded the description of “status” cosmetic
    • “list_transactions” reworded the description of “filter” cosmetic
    • “list_transactions” reworded the description of “limit” cosmetic
    • “list_transactions” reworded the description of “order” cosmetic
    • “list_transactions” reworded the description of “scope” cosmetic
    • “list_transactions” reworded the description of “sort_by” cosmetic
    • “list_transfers” reworded the description of “amountMin” cosmetic
    • “list_transfers” reworded the description of “scope” cosmetic
    • “rate_statement” reworded the description of “document_id” cosmetic
    • “rate_statement” reworded the description of “export_format” cosmetic
    • “rate_statement” reworded the description of “feedback” cosmetic
    • “rate_statement” reworded the description of “feedback_categories” cosmetic
    • “rate_statement” reworded the description of “rating” cosmetic
    • “rate_statement” reworded the description of “use_case” cosmetic
    • “rate_statement” reworded the description of “use_case_other” cosmetic
    • “request_upload” reworded the description of “count” cosmetic
    • “time_series” reworded the description of “bucket” cosmetic
    • “time_series” reworded the description of “filter” cosmetic
    • “time_series” reworded the description of “metric” cosmetic
    • “time_series” reworded the description of “scope” cosmetic
    • “top_n” reworded the description of “dimension” cosmetic
    • “top_n” reworded the description of “filter” cosmetic
    • “top_n” reworded the description of “metric” cosmetic
    • “top_n” reworded the description of “n” cosmetic
    • “top_n” reworded the description of “scope” cosmetic
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Probed https://api.bankstatemently.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=api.bankstatemently.com CN=YE2,O=Let's Encrypt,C=US 6 Aug 2026 4 Nov 2026 ECDSA 256 ECDSA-SHA384 6f56be3dc1b570f025732b079c0a51e3a5e
SANs: api.bankstatemently.com
CN=YE2,O=Let's Encrypt,C=US (CA) CN=Root YE,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 ECDSA 384 ECDSA-SHA384 4df3b15dd6c0784c507cd37b58e6f115
CN=Root YE,O=ISRG,C=US (CA) CN=ISRG Root X2,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 ECDSA-SHA384 872165fc34b6e5fba8add5b3705fb53a
CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 SHA256-RSA 6c8f1dc727c7117f7baf853ac980f9cd

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of api.bankstatemently.com. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
bankstatemently.com. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer resource_metadata="https://api.bankstatemently.com/.well-known/oauth-protected-resource/mcp"

Bearer resource_metadata="https://api.bankstatemently.com/.well-known/oauth-protected-resource/mcp"
Header Value
strict-transport-security max-age=31536000; includeSubDomains
content-security-policy default-src 'self';script-src 'self' 'unsafe-inline' https://js.stripe.com https://clerk.bankstatemently.com;style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://client.crisp.chat;font-src 'self' https://fonts.gstatic.com https://client.crisp.chat;img-src 'self' data: https: https://img.clerk.com;connect-src 'self' https://api.bankstatemently.com https://api.stripe.com https://clerk.bankstatemently.com https://*.ingest.sentry.io https://*.ingest.de.sentry.io https://ipapi.co;worker-src 'self' blob:;frame-src https://js.stripe.com https://hooks.stripe.com;object-src 'none';base-uri 'self';form-action 'self';upgrade-insecure-requests;frame-ancestors 'self';script-src-attr 'none'
x-content-type-options nosniff
x-frame-options SAMEORIGIN
referrer-policy no-referrer

Protected resource metadata

Document https://api.bankstatemently.com/.well-known/oauth-protected-resource/mcp
Retrieved Yes
Resource https://api.bankstatemently.com/mcp
Authorisation server https://clerk.bankstatemently.com

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://api.bankstatemently.com/mcp Verified 200
http (plaintext) http://api.bankstatemently.com/mcp HTTPS enforced 301 https://api.bankstatemently.com/mcp
MCP tools · 16 exposed · ~3,855 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
aggregate ~181

Compute a single metric (sum/average/count/max/min) over a filtered set of transactions across your converted statements. Results are per-currency — never sum across currencies yourself. Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range. For "how many credits do I have" / processing quota / remaining pages, use get_credits instead — that is not a transaction.

NameTypeReqDescription
filterobjectSubset of transactions to operate on. All fields are optional and combined with AND logic.
metricstringyesAggregation metric.
scopeobjectOptional structural scope (WHO × WHEN). Omit to search across all your completed statements. "accounts" is a list of account/product chips (kind + identityKey); "dateRange" bounds by transaction date…
NameTypeReqDescription
resultyes
scopeobjectyes

No examples provided.

categorize_statement ~107

Run AI transaction categorization on a previously processed document, then return its category mappings. Returns cached categories with no charge if this document was already categorized. Consumes credits (pooled per page, same rate as the categorize toggle on the website) the first time — free on every re-fetch after. Every response includes a "summary" field: use it as the single source of truth for what happened.

NameTypeReqDescription
document_idstringyesDocument ID (from convert_statement or list_statements)
NameTypeReqDescription
categoryMappingsobject
documentIdstring
errorstring
hintstring
messagestring
statusstringyes
summarystring

No examples provided.

compare ~170

Side-by-side metric comparison for two filtered groups of transactions (e.g. one category vs another, one month vs another). Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range.

NameTypeReqDescription
filterAobjectyesSubset of transactions to operate on. All fields are optional and combined with AND logic.
filterBobjectyesSubset of transactions to operate on. All fields are optional and combined with AND logic.
metricstringyesMetric for both groups.
scopeobjectOptional structural scope (WHO × WHEN). Omit to search across all your completed statements. "accounts" is a list of account/product chips (kind + identityKey); "dateRange" bounds by transaction date…
NameTypeReqDescription
resultyes
scopeobjectyes

No examples provided.

convert_statement ~552

Convert a bank statement PDF into structured data or a spreadsheet. When the user attaches a PDF in the conversation, it arrives automatically as pdf_file — never encode it yourself. Otherwise, pass pdf_url for a public HTTPS link. If your host has no way to reference the attached file at all (no pdf_file/pdf_url equivalent), call request_upload first and pass its upload_id here instead. The base64 pdf parameter is a last resort only, for a caller with no other way to reference the file. To convert several statements in one call, pass upload_ids (the array from a single request_upload call made with count set) instead of pdf/pdf_url/pdf_file/upload_id — mutually exclusive with those four. This batch form only ADMITS each file (queues it, or reports an already-completed duplicate) and returns immediately with a compact per-file status list plus a summary — it never waits for conversion, so call get_statement per document_id once ready rather than expecting inline results here. Returns accounts, transactions, and metadata. output_format "json" (default) returns the data inline, renderable in chat. The other formats (csv, xlsx, qbo, xero) return a time-limited download link instead: present it as a normal link. Every response includes a "summary" field: use it as the single source of truth for what happened. If the conversation is not in English, translate it faithfully into the conversation language; never add details it doesn't contain. Never echo raw status values (e.g. "completed") or field names. Consumes credits (1 per page). Page limit depends on your plan.

NameTypeReqDescription
output_formatstringOutput format
passwordstringPassword for encrypted PDFs
pdfstringBase64-encoded PDF content — last resort only; prefer pdf_file for an attachment or pdf_url for a link
pdf_fileobjectAn attached PDF (populated automatically by ChatGPT — do not construct this yourself).
pdf_urlstringHTTPS URL to fetch the PDF from
upload_idstringAn upload_id from request_upload, after PUTting the file to its upload_url. Use this only when your host has no other way to reference the attached file (no pdf_file/pdf_url equivalent).
upload_idsarrayBatch of upload_ids from a single request_upload(count) call, each already PUT to its own upload_url — converts many statements in one call. Mutually exclusive with pdf, pdf_url, pdf_file, and upload…
NameTypeReqDescription
columnsarray
confidenceScorenumber
dataModestring
documentobject
documentId
elapsedMs
errorstring
estimateSeconds
exportUrl
gating
hintstring
messagestring
paginationobject
processingProgress
processingStage
resultsarray
statusstringyes
summarystring
transactionCountnumber
transactionsarray
warningsarray

No examples provided.

dismiss_statement ~86

Hide a failed, rejected, or cancelled document from future list_statements results. Use this only when the user asks to clear a terminal failed/rejected/cancelled conversion from their history. This is not a delete: it marks the document dismissed and leaves stored data/artifacts untouched.

NameTypeReqDescription
document_idstringyesDocument ID from list_statements, convert_statement, or get_statement
NameTypeReqDescription
documentIdstringyes
statusstringyes
summarystringyes

No examples provided.

evaluate_benchmark ~241

Score parsed bank statement transactions against the Bankstatemently benchmark ground truth. Accepts a statement_id (e.g. "bsb-001") or content_hash, plus your parsed transactions. Returns extraction accuracy, integrity score, and an overall score. Only statements marked published: true in the catalog can be evaluated — held-out statements return an error. transactions[].originalData is optional but strongly recommended: fetch it via get_statement with data_mode: "original" and pass it through verbatim — an absent originalData scores that transaction's raw-fidelity (parsed) dimension 0; never fabricate a value. Free to use — no credits consumed. Read the benchmark://catalog resource first to see available statements and their published status.

NameTypeReqDescription
accountsarrayOptional account roster for multi-account statements. Each transaction references one via accountId.
content_hashstringSHA-256 hex digest of the PDF. Use statement_id instead if you know it.
statement_idstringBenchmark statement ID (e.g. "bsb-001"). Preferred over content_hash.
transactionsarrayyesParsed transactions (1-2000)
NameTypeReqDescription
challengesarrayyes
contentHashstring
datasetVersionstring
difficultystringyes
idstringyes
normalizedScoreobjectyes
parsedScoreobjectyes

No examples provided.

get_credits ~97

Your remaining Bankstatemently credits — the processing quota, NOT credit/debit transactions. Use for: how many credits do I have, remaining pages, plan limits, quota, how many pages can I upload. 1 credit = 1 page of bank statement processing. Also reports your plan's operational limits (max pages per upload, max upload size, daily spend cap) so you can size a multi-file batch correctly before starting it.

Input schema present but exposes no named parameters.

NameTypeReqDescription
balancenumberyes
creditsExpireAtyes
limityes
planobjectyes
planIdyes
summarystringyes

No examples provided.

get_statement ~475

Fetch the full converted data for a previously processed document. Use this after convert_statement returns a "processing" status, or to re-fetch results. output_format "json" (default) returns the data inline, renderable in chat. The other formats (csv, xlsx, qbo, xero) return a time-limited download link instead: present it as a normal link. data_mode selects which projection of the data you get: omit it for each output_format's existing default behavior. "normalized" is the cleaned, interpreted view; "original" includes each transaction's raw column values exactly as printed on the source PDF (originalData); "enhanced" is a reformatted view of the original columns (csv/xlsx only for now). Fetch data_mode: "original" when you plan to submit results to evaluate_benchmark — pass its originalData through verbatim; an absent originalData scores that benchmark's raw-fidelity dimension 0 for this document. Every response includes a "summary" field: use it as the single source of truth for what happened. If the conversation is not in English, translate it faithfully into the conversation language; never add details it doesn't contain. Never echo raw status values (e.g. "completed") or field names.

NameTypeReqDescription
data_modestringOmit for each output_format's existing default behavior (json: normalized; csv/xlsx: the export route's own default). "normalized": the cleaned, interpreted data. "original": includes each transactio…
document_idstringyesDocument ID (from convert_statement or list_statements)
limitintegeroutput_format "json" only. Max transactions to return (default 500, capped at 2000, or 500 with data_mode "original").
offsetintegeroutput_format "json" only. Number of transactions to skip. Omit to start from the beginning.
output_formatstringOutput format
NameTypeReqDescription
columnsarray
confidenceScorenumber
dataModestring
documentobject
documentId
elapsedMs
errorstring
estimateSeconds
exportUrl
gating
hintstring
messagestring
paginationobject
processingProgress
processingStage
resultsarray
statusstringyes
summarystring
transactionCountnumber
transactionsarray
warningsarray

No examples provided.

group_by ~157

Group transactions by a dimension (month/category/merchant/account/currency) and apply a metric to each group. Results are per-currency. Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range.

NameTypeReqDescription
dimensionstringyesGrouping dimension.
filterobjectSubset of transactions to operate on. All fields are optional and combined with AND logic.
metricstringyesMetric per group.
scopeobjectOptional structural scope (WHO × WHEN). Omit to search across all your completed statements. "accounts" is a list of account/product chips (kind + identityKey); "dateRange" bounds by transaction date…
NameTypeReqDescription
resultyes
scopeobjectyes

No examples provided.

list_statements ~54

Browse your previously converted bank statements with pagination and optional status filter.

NameTypeReqDescription
limitintegerMax results (1-100)
offsetintegerPagination offset
statusstringFilter by status
NameTypeReqDescription
documentsarrayyes
paginationobjectyes

No examples provided.

list_transactions ~293

A transaction is a single line as printed on one account's statement — one side of any movement. Return a filtered list of transactions across your converted statements, capped at 50 rows. Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range. Every response names the scope it actually evaluated (document count + covered date range) and each returned row carries its source document's content_hash so you can cite it. For "how many credits do I have" / processing quota / remaining pages, use get_credits instead — that is not a transaction.

NameTypeReqDescription
filterobjectSubset of transactions to operate on. All fields are optional and combined with AND logic.
limitnumberMaximum rows to return. Default 20, max 50.
orderstringSort direction. Default "desc" (largest amount / most recent date first). Only meaningful with sort_by.
scopeobjectOptional structural scope (WHO × WHEN). Omit to search across all your completed statements. "accounts" is a list of account/product chips (kind + identityKey); "dateRange" bounds by transaction date…
sort_bystringSort the filtered set before applying limit. "amount" ranks by absolute magnitude (signed amounts are still returned). Omit for today's default (encounter order).
NameTypeReqDescription
scopeobjectyes
transactionsarrayyes

No examples provided.

list_transfers ~398

Match transfers between your own accounts. A transfer is TWO transactions — a debit leaving one of your accounts and a credit arriving in another — matched as two sides of the same movement (amount and date aligned); account-level successions (an account closing into a successor) are matched too. A payment to an outside party is not a transfer here: only movements with both sides visible in your statements are matched. THE way to answer any "was money moved between my accounts" / "did I transfer X" question — never try to answer a money-moved-between-accounts question with list_transactions + arithmetic; always call this tool instead. Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range. Every response reports the match window (in days) it used, even when no transfers are found — a lack of matches is never silent about how hard it looked. To find large movements with NO matching counterpart in your other accounts — e.g. "trace transfers over $10,000; which ones leave without a known destination?" — pass "amountMin": reconciled pairs and successions are filtered to that floor, and the response gains an "unmatched" bucket of large movements (debits leaving, or unexplained credits arriving) with no matching pair, candidate, or succession. Omit amountMin for the ordinary reconciled-pairs answer.

NameTypeReqDescription
amountMinnumberInclusive minimum absolute amount. When present, transfers/accountSuccessions are floored to this amount and the response gains an "unmatched" bucket of large movements with no matching counterpart.…
scopeobjectOptional structural scope (WHO × WHEN). Omit to search across all your completed statements. "accounts" is a list of account/product chips (kind + identityKey); "dateRange" bounds by transaction date…
NameTypeReqDescription
accountSuccessionsarrayyes
ambiguousarrayyes
ambiguousCountnumberyes
matchWindowDaysnumberyes
scopeobjectyes
transfersarrayyes
unmatchedobject

No examples provided.

rate_statement ~254

Report how well a previously converted bank statement was parsed: submit a 1-5 rating, optionally with structured feedback (only accepted when the rating is 3 or below) and use-case tags. Calling this again for the same document updates your existing rating without clearing feedback already submitted for it. Returns the stored rating state in the response — there is no separate tool to read your own rating back. Every response includes a "summary" field: use it as the single source of truth for what happened.

NameTypeReqDescription
document_idstringyesDocument ID (from convert_statement or list_statements)
export_formatstringWhich output format you exported this conversion to (csv, xlsx, qbo, or xero).
feedbackstringFree-text feedback. Only accepted when rating is 3 or below.
feedback_categoriesarrayStructured feedback categories. Only accepted when rating is 3 or below.
ratingintegeryes1-5 star rating for this conversion
use_casearrayTags describing what you use the converted data for.
use_case_otherstringFree-text use case, for when "other" is among the use_case tags.
NameTypeReqDescription
documentIdstring
errorstring
hasFeedbackboolean
hintstring
messagestring
ratingnumber
statusstringyes
summarystring
useCasearray
useCaseOther

No examples provided.

request_upload ~480

Mint a single-use upload URL for pushing a conversation-attached PDF to Bankstatemently before converting it. Use this ONLY when you have no other way to reference the attached file (no pdf_file/pdf_url equivalent for this host) — e.g. a code-execution sandbox that can see the file on disk but has no URL for it. Playbook: (1) check your sandbox's uploads/attachments directory first — if the file isn't there yet, the mount can lag behind the conversation; ask the user to re-attach or wait a moment and check again before calling this tool. (2) Call request_upload to get upload_url and upload_id. (3) PUT the raw PDF bytes to upload_url with header Content-Type: application/pdf, e.g.: `curl -X PUT "<upload_url>" -H "Content-Type: application/pdf" --data-binary @<path-to-file>`. (4) Once the PUT succeeds, call convert_statement with upload_id set to the same value — never pdf/pdf_url/pdf_file for this flow. The URL and token are single-use and expire quickly; call request_upload again for a fresh one if the PUT fails partway through — never retry a failed PUT against the same URL. If the PUT fails with a network error or a "host not allowed"-style denial, the sandbox is likely blocking outbound requests to api.bankstatemently.com — tell the user to add api.bankstatemently.com to their host's code-execution allowed-domains setting (on claude.ai: Settings → Capabilities → Code execution) and retry. To convert several statements at once, pass count (1-100) instead of calling this tool once per file: the response returns "uploads", an array of that many { upload_id, upload_url } pairs — PUT each file to its own upload_url, then make ONE convert_statement call with upload_ids set to every upload_id. Free to use — no credits consumed (conversion itself still costs credits, same as any other convert_statement call).

NameTypeReqDescription
countintegerBatch size — mint this many independent single-use upload URLs in one call instead of calling request_upload once per file. When set, the response returns "uploads": an array of that many { upload_id…
NameTypeReqDescription
expires_atstring
max_bytesnumber
upload_idstring
upload_urlstring
uploadsarray

No examples provided.

time_series ~149

Compute a time series by grouping transactions into week or month buckets and applying a metric — useful for trends. Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range.

NameTypeReqDescription
bucketstringyesBucket size.
filterobjectSubset of transactions to operate on. All fields are optional and combined with AND logic.
metricstringyesMetric per bucket.
scopeobjectOptional structural scope (WHO × WHEN). Omit to search across all your completed statements. "accounts" is a list of account/product chips (kind + identityKey); "dateRange" bounds by transaction date…
NameTypeReqDescription
resultyes
scopeobjectyes

No examples provided.

top_n ~161

Return the top N groups ranked by metric (descending), per-currency for monetary metrics. Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range.

NameTypeReqDescription
dimensionstringyesGrouping dimension.
filterobjectSubset of transactions to operate on. All fields are optional and combined with AND logic.
metricstringyesMetric to rank by.
nnumberyesNumber of top groups to return.
scopeobjectOptional structural scope (WHO × WHEN). Omit to search across all your completed statements. "accounts" is a list of account/product chips (kind + identityKey); "dateRange" bounds by transaction date…
NameTypeReqDescription
resultyes
scopeobjectyes

No examples provided.

Common questions

What is the Bankstatemently MCP server?

Bankstatemently is an MCP server listed in the public MCP registry as io.github.bankstatemently/bankstatemently-mcp. Convert PDF bank statements into structured transactions, accounts, and balances. This page covers its hosted endpoint (https://api.bankstatemently.com/mcp).

Is the Bankstatemently MCP server safe to use?

Bankstatemently scores 95 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Bankstatemently MCP server expose?

Bankstatemently exposes 16 tools: request_upload, convert_statement, get_statement, categorize_statement, list_statements, and 11 more. Their descriptions and schemas cost roughly 3,855 tokens of context every time the server is loaded.

Does the Bankstatemently MCP server require authentication?

Yes. Bankstatemently asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the Bankstatemently MCP server still maintained?

Bankstatemently is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.