Skip to main content
Glama
dfrysinger

finance-mcp

by dfrysinger

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
FINANCE_MCP_HOMENoOverride directory for access URL and transaction cache (default: ~/.finance-mcp).
SIMPLEFIN_ACCESS_URLNoThe SimpleFIN access URL (overrides saved file if set). It embeds Basic-Auth credentials to read transactions.

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_accountsA

List cached accounts with balances and the institution each belongs to.

account_balancesA

Return just the balance and as-of date for each cached account.

get_transactionsA

Query cached transactions.

Dates are YYYY-MM-DD. Amounts are signed (negative = money out), so use max_amount=0 for spending only or min_amount=0 for income only. Each transaction carries a derived category and is_transfer flag; pass category to filter to one, or include_transfers=False to drop internal transfers and card payments. Returns the matching transactions plus the count.

spending_summaryA

Aggregate net spending over a date range, grouped for budgeting.

group_by is category (default), account, org, month, or envelope. Categories come from a local rules engine plus manual overrides. Internal transfers and income (payroll, benefits, investment income) are excluded by default so the totals reflect real spending; set exclude_transfers=False or exclude_income=False to include them.

Per group, outflow is spend, inflow is refunds/returns that net against it, and unclassified_inflow is positive amounts with no spending category (surfaced but not netted). net is outflow plus refunds.

envelope rolls spend up by the configured budget envelope that owns each account (so spend on a non-envelope account such as a loan or brokerage falls into an (unmapped) bucket). It needs at least one envelope in the budget config; with none configured it returns an error rather than an empty view.

net_worth_historyA

Total balance across all accounts per as-of date, from the archive.

Each sync records a balance snapshot, so this builds a net-worth trend over time (oldest first). Loan/credit balances are negative, so the total is true net worth.

archive_statsA

Report archive size and date coverage (transaction count, earliest/latest).

categorization_statusB

Report category coverage and the breakdown of transactions per category.

list_category_rulesB

List the category rules (pattern -> category) currently in effect.

add_category_ruleA

Add a category rule: a merchant match (+ optional predicates) -> category.

field is description, payee, or any. priority is lowest-wins. Set is_transfer=True for internal transfers / card payments so they are excluded from spending totals. Set account_id to scope the rule to a single account (so a generic descriptor like "FUNDS TRAN" can be reclassified on one account without affecting the same text elsewhere); leave it None to apply to every account.

The merchant match defaults to a case-insensitive substring; set match_mode='regex' to match pattern as a case-insensitive regular expression instead (useful when a store number splits a merchant name). Optional predicates further narrow a rule and must all hold to match: amount_min/amount_max bound the amount magnitude (abs(amount), so 200-350 matches a $304 charge), and day_min/day_max bound the posted day-of-month (1-31) — together they isolate a recurring charge like a mid-month insurance premium from other charges at the same merchant.

remove_category_ruleC

Delete a category rule by its id.

set_transaction_categoryA

Pin a category to a single transaction.

Manual overrides win over every rule and survive re-syncs, so use this to fix a one-off that the rules get wrong.

sync_nowA

Pull fresh data from SimpleFIN into the cache (network call).

Respect SimpleFIN's ~24 requests/day budget: a sync of >89 days makes one request per ~89-day window. Returns a summary including any SimpleFIN errors.

budget_burndownA

Per-envelope planned target vs. actual spend for one YYYY-MM month.

Reads the budget config and the categorized archive. Returns each envelope's target, actual spend, and remaining (negative = over budget), plus unmapped spend on accounts in no envelope so nothing is silently dropped.

budget_forecastA

Per-envelope sufficiency over a window: will each cover its upcoming bills.

Dates are YYYY-MM-DD. as_of defaults to today and through to 60 days later. Each envelope gets a verdict (ok / at_risk / balance_unknown) with the projected minimum balance and, when at risk, the date and shortfall.

allocation_audit_reportA

Audit each scheduled transfer: did it fire on time, late, early, or not at all.

Dates are YYYY-MM-DD; end defaults to today and start to a year back. day_tolerance is how far a transfer may drift and still count as fired. A genuinely-ambiguous allocation surfaces as missing until its transfer link is confirmed via confirm_transfer.

red_flags_reportA

Loud alerts for debt payments that were returned or missed.

as_of is YYYY-MM-DD, defaulting to today. Audits each configured debt account (loans, mortgages, financed purchases) directly from its own transactions, so a payment is caught no matter which account funded it. A returned payment (posted then reversed) and a month whose payments net to zero or less (none posted, or fully reversed) each surface as a red flag; the payment amount is never compared, so any positive net counts as paid. A returned or missed payment that is later re-made or covered by an extra payment is downgraded to made_good and drops out of the red count. A debt that syncs only a balance surfaces as an explicit unauditable note rather than a silent gap. With no debt_accounts configured the report is simply empty.

subscription_audit_reportA

Flag tracked bills that did not post (billing problem / cancellation) and surface untracked recurring merchants as candidates for the assistant to judge.

Dates are YYYY-MM-DD; end defaults to today and start to a year back so a monthly charge clears min_occurrences. tracked is the full roster of configured recurring bills with each one's amount, due day, last-seen date, and next due date. expected_missing is the deterministic high-stakes alert; candidate_new is advisory — the assistant decides which candidates are real subscriptions.

subscriptions_detectA

Detect recurring charges from history and save them as tracked bills.

Scans the archive for merchants with repeated, same-amount, monthly-spaced debits and writes each as a recurring bill in the budget config (creating the config if absent), so your subscriptions become a saved list rather than something re-inferred on every audit. Idempotent: a merchant already tracked is skipped. Dates are YYYY-MM-DD; end defaults to today and start to a year back. day_tolerance (default 7) is the day-of-month drift allowed when deciding whether a charge is already covered by an existing bill. Weekly/yearly merchants are reported under unsupported_cadence (only monthly bills are tracked). Monthly merchants that could not be auto-tracked — text too generic/variable to pin, or a recurring charge at a different price from an already-tracked subscription — are reported under needs_review (each with a reason) rather than written.

subscriptions_markA

Mark a tracked recurring bill as canceling, canceled, or active again.

The cancellation watch: after you cancel (or try to cancel) a subscription, record it here so the audit stops reporting its expected charges as missing and instead warns you if it charges again. lifecycle is canceling (a cancellation was attempted but not confirmed), canceled (confirmed), or active (reactivate a bill you'd marked). cancel_effective is the YYYY-MM-DD date the cancellation takes effect and is required for canceling and canceled — any matching charge on or after it is surfaced as the bill "coming back". Omit it when reactivating. variable optionally flags the bill as one whose amount changes every cycle (a usage-based or escrow bill): true matches it by merchant and date regardless of amount and reports the actual charged amount, false restores exact-amount matching, null leaves the setting unchanged. The bill is found by name (case-insensitive); the name must match exactly one bill.

reconcile_transfersA

Rebuild internal-transfer links from the archive (idempotent).

Re-runs the matcher over the categorized archive and persists the links, preserving every confirmed link and recomputing the rest. Returns counts of inferred / needs-confirm / unmatched links plus promotions and downgrades. Run this after a sync so list_transfers reflects the latest data.

list_transfersA

List reconstructed transfer links as from_account -> to_account $amount [why].

The raw feed names only the product type a transfer went to, never the named account; each link here recovers the hidden counterparty and records why it was drawn. status optionally restricts to one lifecycle state (confirmed / inferred / unconfirmed / unmatched); unconfirmed links are the ones awaiting the user's review and sort first.

confirm_transferA

Confirm one transfer link by id, locking the pairing as authoritative.

A confirmed link is excluded from every future reconcile, so the user's decision is never silently recomputed. Only a two-leg link can be confirmed; confirming an unmatched single leg is rejected. Returns the updated link or an error.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/dfrysinger/finance-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server