Skip to main content
Glama
finance-mcp-server

finance-mcp-server

by Marcusdt-UX

finance-mcp-server

Your personal finance tracker as an MCP server. Sync your bank via SimpleFIN — or backfill from a CSV — into a local SQLite database and ask Claude about it: spending, subscriptions, cash flow, merchant history, debt payoff. Everything stays on your machine; the only thing that leaves is the answer to a question you asked.

Finance HUD dashboard (synthetic demo data)

The bundled HUD (npm run hud) rendering a synthetic demo dataset — net worth, per-account balances, category spending, subscription price-hike flags, and a 30-day cash-flow projection with the low point marked.

The analytics engine in src/core/ is pure, dependency-free TypeScript, kept separate from the MCP and storage layers so a future app can share the same core.

Setup

npm install
npm run build

Related MCP server: goetta-finance

Get your data in

The primary data source. Live account balances and ongoing transaction sync via SimpleFIN Bridge (read-only bank aggregation, ~$15/yr) — no CSV and no specific budgeting app required. Get a one-time setup token from bridge.simplefin.org (My Account), then:

npm run link -- "<paste-setup-token>"

This claims the token into a durable access URL stored locally in data/finance.db (it never leaves your machine) and runs an initial 365-day sync. After that, balances are live — finance_sync (or just ask Claude to sync) pulls new transactions. You can also link from within Claude via the finance_link_bank tool, but the CLI keeps the token out of the chat transcript. The database lives at data/finance.db (override with the FINANCE_DB_PATH env var).

Optional: Rocket Money CSV backfill

Purely optional — SimpleFIN alone runs the whole tracker. If you're coming from Rocket Money, you can backfill history from before your bank's sync window. Export from Rocket Money (Settings → Export Data → CSV), then:

npm run import -- "C:/path/to/rocket-money-export.csv"

Re-running with an updated export is safe — rows dedupe by a stable hash, so only genuinely new transactions are added.

Local HUD (dashboard)

A glanceable dashboard that reads finance.db fresh on every load — net worth + account balances, this month's spending by category, subscriptions with price-hike flags, and a 30-day cash-flow sparkline with the low point marked. Fully offline (no CDN, no external calls); localhost only.

npm run hud       # → http://localhost:4321  (Ctrl+C to stop)

Leave it running and bookmark it; it self-refreshes every 2 minutes and re-reads the DB, so once your bank is linked the balances stay current. Override the port with HUD_PORT.

Use it with Claude

Claude Desktop, one-click (.mcpb) — the easiest path. Grab finance-mcp.mcpb from the latest release (or build it yourself, below), then drag it onto Settings → Extensions in Claude Desktop. It'll ask for a Database file path — leave the default for a fresh store, or point it at an existing finance.db to reuse that data. The bundle is self-contained (bundled Node deps incl. the native SQLite binary) and, being compiled, is win32-x64 only for now; on other platforms use the manual config below after npm install && npm run build.

Build the .mcpb yourself:

npm install && npm run build
npm i -g @anthropic-ai/mcpb   # the official packer
npm prune --omit=dev          # ship prod deps only (do this in a copy, or re-`npm install` after)
mcpb pack . finance-mcp.mcpb

manifest.json at the repo root defines the bundle. It ships no data — the SQLite file (and the SimpleFIN credential inside it) always lives at the external path you configure, never in the bundle.

Claude Desktop, manual — add to claude_desktop_config.json:

{
  "mcpServers": {
    "finance": {
      "command": "node",
      "args": ["/absolute/path/to/finance-mcp-server/dist/index.js"],
      "env": { "FINANCE_DB_PATH": "/absolute/path/to/finance-mcp-server/data/finance.db" }
    }
  }
}

Claude Code — claude mcp add finance -- node /absolute/path/to/finance-mcp-server/dist/index.js

Then ask things like:

  • "What did I spend on gas last quarter?"

  • "List my subscriptions and flag any price hikes."

  • "How much have I paid Amazon over the last year?"

  • "Forecast my cash flow for the next 30 days starting from $1,200."

  • "Given these balances and APRs, avalanche vs snowball — which saves more?"

Tools

Tool

What it does

finance_import_csv

Import a Rocket Money CSV (idempotent)

finance_data_overview

Count, date span, per-category totals

finance_search_transactions

Filter by date/category/merchant/amount/flow

finance_spending_by_category

Inflow/outflow by category over a range

finance_list_subscriptions

Recurring charges + price-hike flags

finance_cash_flow_forecast

N-day projection with low-point warning

finance_merchant_history

Every charge from a merchant + summary

finance_debt_payoff_plan

Avalanche/snowball simulation

finance_link_bank

Connect a bank via a SimpleFIN setup token

finance_balances

Live per-account balances + net worth

finance_sync

Pull new transactions + refresh balances

finance_disconnect_bank

Forget the SimpleFIN connection

finance_add_category_rule

Map a merchant substring → category (recategorizes matches)

finance_list_category_rules

List rules + re-apply them across the store

finance_remove_category_rule

Delete a rule

Fixing miscategorized transactions

CSV history carries Rocket Money's own categories, but transactions synced live from SimpleFIN only have raw bank descriptors, so many land in other. Fix them with rules — just tell Claude, e.g. "categorize anything from Menards as shopping." Each rule matches a case-insensitive substring against the merchant name / descriptor, recategorizes all matches immediately (past and future), and sticks for every later import/sync.

Privacy

data/ and all *.csv files are gitignored. Real transaction history is never committed and never sent anywhere except when you ask Claude a question that requires reading it. The screenshot above is generated from synthetic data.

License

MIT

Available Tools

15 tools
finance_add_category_ruleAdd Category RuleA
Idempotent

Create a rule that assigns a category to any transaction whose merchant name or bank descriptor contains a given substring — and immediately recategorize all matching transactions (past and future imports/syncs honor it too). Use this to clean up transactions stuck in 'other'. Match is case-insensitive. Args: match (substring, e.g. 'menards'), category. Returns how many transactions were recategorized. Example: {match:'robinhood', category:'transfers'}.

Inputs: match (required), category (required).

finance_balancesReal-Time BalancesA
Idempotent

Live per-account balances and net worth via SimpleFIN (fetched fresh on each call, then cached). Credit-card and loan balances are shown as positive amounts OWED and subtracted from net worth. If the live fetch fails, returns the last cached balances with a note. Requires finance_link_bank first. No args. Returns { accounts: [{name, institution, type, balance, currency, as_of}], assets, liabilities, net_worth, live }.

Inputs: no named parameters.

finance_cash_flow_forecastCash Flow ForecastA
Read-onlyIdempotent

Project cash flow over the next N days from detected recurring bills (outflows) and recurring income (inflows, cadence-aware). Args: starting_balance (current available cash; default 0), window_days (7-90, default 30). Returns a day-by-day projection with the running balance and a flag for the lowest point. Note: starting_balance isn't in the CSV — pass your real current balance for an accurate low-point.

Inputs: window_days, starting_balance.

finance_data_overviewData OverviewA
Read-onlyIdempotent

Summarize what's in the store: total transaction count, date span, last import time, and per-category inflow/outflow totals across all history. Call this first to know what data is available. No args.

Inputs: no named parameters.

finance_debt_payoff_planDebt Payoff PlanA
Read-onlyIdempotent

Simulate a debt-payoff plan given a list of debts and a monthly budget. Strategy 'avalanche' (highest APR first) or 'snowball' (smallest balance first), or 'compare' to run both and show interest/time saved. Debts are provided by you (not read from the CSV). Args: debts: [{id, name, balance, apr, minPayment}], monthly_budget, strategy. Returns the plan(s): months to debt-free, total interest, debt-free date, per-debt payoff month.

Inputs: debts (required), monthly_budget (required), strategy.

finance_disconnect_bankDisconnect BankA
DestructiveIdempotent

Forget the SimpleFIN connection (clears the stored access URL). Imported transactions and cached balances are kept. No args.

Inputs: no named parameters.

finance_import_csvImport Rocket Money CSVA
Idempotent

Import a Rocket Money transaction CSV export into the local store. Idempotent: re-importing the same or an updated export dedupes by a stable row hash, so only genuinely new transactions are added. Args: path (absolute path to the .csv). Returns counts (parsed/inserted/skipped), the date span, and any parsing warnings.

Inputs: path (required).

finance_list_category_rulesList Category RulesA
Idempotent

List all merchant→category rules (most specific first) and re-apply them across the whole store, returning how many transactions changed. Call after editing rules to resync. No args.

Inputs: no named parameters.

finance_list_subscriptionsList Subscriptions & Recurring ChargesA
Read-onlyIdempotent

Detect recurring charges (subscriptions, memberships, bills) from transaction history using merchant-key normalization and cadence analysis. Flags price hikes vs the prior baseline. Args: none (analyzes all history). Returns { totals: {monthly, annual, count, hikes}, subscriptions: [{label, category, cadence, lastAmount, monthlyCost, occurrences, lastDate, nextDate, daysUntilNext, priceHike?}] }.

Inputs: no named parameters.

finance_merchant_historyMerchant HistoryA
Read-onlyIdempotent

Every charge from a given merchant (substring match on name/descriptor), with a spend summary. Useful for 'how much have I paid X' and spotting creep. Args: merchant (required), from/to (optional). Returns { merchant, count, total_spent, total_received, first_date, last_date, average, transactions: [...] }.

Inputs: merchant (required), to, from.

finance_remove_category_ruleRemove Category RuleA
DestructiveIdempotent

Delete a category rule by its exact match string. Transactions it already recategorized keep their current category (rules don't store the original). Args: match. Returns whether a rule was removed.

Inputs: match (required).

finance_search_transactionsSearch TransactionsA
Read-onlyIdempotent

Search transactions with filters. All optional; combine freely. Returns newest-first, paginated. Amounts are signed (positive = money in, negative = money out). Args: from/to (YYYY-MM-DD), category, merchant (substring on name/descriptor), min_amount/max_amount (by absolute value), flow ('in'|'out'|'all'), limit (1-500, default 100), offset. Returns { total, count, offset, has_more, transactions: [{id, txn_date, amount, description, category, account, institution}] }.

Inputs: to, flow, from, limit, +5 more.

finance_spending_by_categorySpending by CategoryA
Read-onlyIdempotent

Total inflow and outflow grouped by category over an optional date range (defaults to all history). Sorted by outflow descending. Args: from/to (YYYY-MM-DD). Returns { range, categories: [{category, inflow, outflow, count}], total_outflow, total_inflow, net }.

Inputs: to, from.

finance_syncSync Bank (SimpleFIN)A

Pull new transactions and refresh balances from SimpleFIN. By default fetches from the day after the latest transaction already in the store (so it won't re-pull or double-count history from your CSV) — pass days_back to force a wider window (e.g. 365 for a full refresh). Transactions dedupe by provider id. Requires finance_link_bank first. Args: days_back (optional, 1-730). Returns { accounts, newTransactions, store_span }.

Inputs: days_back.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A4.4/5.0

    Scored across 15 tools

    Disambiguation5/5

    Each tool targets a distinct operation in the personal finance domain: import, search, analysis (categories, subscriptions, cash flow, merchant history), debt planning, bank connectivity, and rule management. No two tools have overlapping purposes; an agent can easily differentiate them.

    Naming Consistency5/5

    All tool names follow the consistent snake_case pattern 'finance_verb_noun' (e.g., finance_import_csv, finance_search_transactions, finance_link_bank). This uniformity makes the tool set predictable and easy to navigate.

    Tool Count5/5

    With 15 tools, the server is well-scoped for a personal finance assistant. It covers data import, querying, analysis, planning, and bank integration without being overwhelming. Each tool serves a clear purpose.

    Completeness4/5

    The tool set covers core workflows: importing, searching, categorizing (via rules), analyzing spending, detecting subscriptions, forecasting cash flow, planning debt payoff, and syncing bank transactions. Minor gaps exist, such as the lack of direct transaction editing or deletion, but these can be worked around.

    Maintenance

    ActivityStale
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      B
      quality
      D
      maintenance
      A personal MCP server that gives Claude native access to YNAB budget data.
      46
      -
    • A
      license
      Not graded
      quality
      B
      maintenance
      A local-first MCP server that connects SimpleFIN bank accounts to Claude, storing data in a local DuckDB file and providing a web dashboard.
      2
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server that lets you log and query your own spending through natural conversation with Claude, instead of a spreadsheet or app.
      33 npm
      6
      ISC
    • F
      license
      A
      quality
      D
      maintenance
      Personal finance MCP server that integrates Plaid bank data with local SQLite memory for conversational budgeting, goal tracking, and transaction management.
      15
      -