The bank statement is the only complete record you have. Everything else is a record of what you remembered to write down, which is why reconciliation is the step that finds the missing paperwork rather than the step that confirms it is all there.
Import ~/Downloads/revolut-main.csv as my main account.
Paste this into Claude with the server connected.
statement_import. It sniffs the delimiter and the header row, which is what makes an
export from any bank work rather than one specific format. A run recorded in
docs/USER_VALUE_R27.md on 2026-09-05 imported a 4,422-byte Revolut export and read
41 transactions, of which 33 were August debits.
One thing that trips people: hand it a local path. A bare http:// argument where a
file is expected resolves as a relative filesystem path rather than being downloaded. That is recorded
as defect D-R83 in the same document. Download first, then say the path.
Anything from Adobe is software, anything from PKP is travel, and anything from Zabka is subsistence.
Paste this into Claude with the server connected.
category_rules. Rules are matched on the merchant text and applied to new imports, so
the second month is mostly automatic. Free tier holds 5 rules across 2 accounts with 12 months of
transactions.
Reconcile August against my logged expenses and tell me what has no receipt.
Paste this into Claude with the server connected.
reconcile_expenses. In that recorded run it returned EUR 1,283.73
unreceipted across the August debits. That number is the point of the exercise: it is the
list of things you spent money on and never logged, sorted so you can work down it.
On the free tier reconciliation runs 31 days at a time. A year is twelve calls, which is tedious and works. Pro removes the window.
What is recurring on this account?
Paste this into Claude with the server connected.
recurring_detect looks for repeated charges. Free covers the last 3 months and reports
5 charges, which in practice is enough to find the two you were not thinking about.
The bank server categorises and reconciles spending. For money coming in, the pairing is manual and
deliberate: transactions_search finds the credit, and invoice_mark_paid on
the invoice server records it in full or in part and reports the balance due. There is no automatic
matcher, because a payment that is 3 EUR short of an invoice is either a bank fee or a dispute, and
guessing which one costs more than asking.
Ten tools on this server, counted from data/tools.json. Free and Pro splits from
data/facts.json.
It is format-agnostic rather than bank-specific: it sniffs the delimiter and guesses the header row, then maps date, description and amount. Exports that split debit and credit into two columns, and exports that use a single signed column, both work. A format it cannot read fails loudly with the row it choked on rather than importing half a file.
No. The server makes no network call at all. Transactions live under ~/.local/share/mcp-servers/bank-statement/ as plain JSON, and you can delete the folder to delete the data.
Importing overlapping ranges is the normal case, since bank exports usually overlap at the edges. Check the imported count against the file's own row count on the first import so you know what a clean number looks like for your bank, then compare on later ones.
Bank debits against expenses logged on the expense tracker over the same window, by amount and date proximity. What it returns is the unmatched side: debits with nothing logged against them. It does not create expenses for you, because a bank line has no VAT rate, no project and no billable flag, and inventing those is how a ledger stops being true.
All MCP servers and prices · All guides · Buy the bundle $39