/mcp-guide / tools

Finlynq MCP tool catalog

Every tool the Finlynq MCP server exposes: what it does, whether it reads or writes, which OAuth scope it needs, and which transports (HTTP, stdio) carry it. Source-of-truth is the registration code in mcp-server/register-tools-pg.ts; this page regenerates from that file at build time, so the count below is always live with what the server actually serves.

HTTP tools
75
Stdio tools
93
Read-only
41
Write/destructive
34

OAuth scopes filter the tool list per token

A token granted only mcp:read sees the 41 read tools below; out-of-scope tools never appear in tools/listand can't be invoked. The 34 write/destructive tools require mcp:write. API-key and session-cookie auth methods default to both scopes granted (no behavior change for non-OAuth clients). 30 tools are HTTP-only because they requirean encrypted-name (DEK) the stdio transport doesn't hold.

Read

35 tools

Pure queries: balances, net worth, budgets, transactions, portfolios, goals, loans, FX rates, spending trends, recurring bills, weekly recaps. Read-only. Allowed under both mcp:read and mcp:write OAuth scopes.

  • convert_amountReadHTTP + stdioscope: mcp:read

    Convert an amount from one currency to another using triangulated FX rates.

  • detect_subscriptionsReadHTTP + stdioscope: mcp:read

    Scan recent transactions and return candidate subscriptions.

  • find_duplicate_bank_rowsReadHTTP onlyscope: mcp:read

    Surface duplicate bank-ledger rows for one account.

  • finlynq_helpReadHTTP + stdioscope: mcp:read

    Discover available Finlynq tools, schema, and usage examples.

  • get_account_balancesReadHTTP + stdioscope: mcp:read

    Get current balances for all accounts.

  • get_balance_anchorsReadHTTP onlyscope: mcp:read

    List the bank balance anchors for one account.

  • get_budget_summaryReadHTTP + stdioscope: mcp:read

    Get budget vs actual spending for a specific month.

  • get_cash_flow_forecastReadHTTP + stdioscope: mcp:read

    Project cash flow for the next 30, 60, or 90 days based on recurring transactions.

  • get_categoriesReadHTTP + stdioscope: mcp:read

    List all available transaction categories

  • get_debt_payoff_planReadHTTP + stdioscope: mcp:read

    Compare debt payoff strategies (avalanche vs snowball) across all user loans with an optional extra monthly payment.

  • get_dividend_incomeReadHTTP onlyscope: mcp:read

    Dividend income from the transactions table, classified by the user's Dividends category (issue #84).

  • get_financial_health_scoreReadHTTP + stdioscope: mcp:read

    Calculate a financial health score 0-100 with a per-component breakdown.

  • get_fx_rateReadHTTP + stdioscope: mcp:read

    Get the FX rate to convert 1 unit of `from` into `to` on `date`.

  • get_income_statementReadHTTP + stdioscope: mcp:read

    Generate income statement for a period.

  • get_investment_insightsReadHTTP + stdioscope: mcp:read

    Portfolio-level investment analytics. `mode: 'patterns'` (default) returns contribution frequency, largest positions, diversification score. `mode: 'rebalancing'` suggests BUY/SELL amounts vs `targets`; each target's `holding` string is matched against a holding's NAME or SYMBOL (case-insensitive substring, same as get_portfolio_analysis), and positions sharing a symbol across accounts are aggregated into one current position.

  • get_loan_amortizationReadHTTP + stdioscope: mcp:read

    Full amortization schedule for a loan.

  • get_net_worthReadHTTP + stdioscope: mcp:read

    Net worth across all accounts.

  • get_portfolio_analysisReadHTTP + stdioscope: mcp:read

    List portfolio holdings with all investment metrics.

  • get_portfolio_performanceReadHTTP + stdioscope: mcp:read

    Per-holding average-cost performance aggregates: realized P&L, dividends, total return, and days held.

  • get_portfolio_returnsReadHTTP onlyscope: mcp:read

    Compute a portfolio time-series return series.

  • get_realized_gainsReadHTTP onlyscope: mcp:read

    Lot-level realized gains for the user, sourced from the FIFO lot engine.

  • get_reconcile_suggestionsReadHTTP onlyscope: mcp:read

    Reconcile snapshot for one account's bank ledger vs. its transactions (the /import page's three-layer match engine).

  • get_reconciliation_summaryReadHTTP onlyscope: mcp:read

    Summarize reconcile health across all accounts in one call (instead of one get_reconcile_suggestions per account).

  • get_recurring_transactionsReadHTTP + stdioscope: mcp:read

    Get detected recurring transactions (subscriptions, bills, salary) from transaction history.

  • get_spending_anomaliesReadHTTP + stdioscope: mcp:read

    Find spending categories with >30% deviation from their 3-month average.

  • get_spotlight_itemsReadHTTP + stdioscope: mcp:read

    Get current attention items — overspent budgets, upcoming bills, uncategorized transactions

  • get_staged_importReadHTTP + stdioscope: mcp:read

    Fetch full detail for one staged import — top-level metadata + every row with decrypted display fields.

  • get_weekly_recapReadHTTP + stdioscope: mcp:read

    Get a weekly financial recap: spending summary, income, net cash flow, notable transactions.

  • list_pending_uploadsReadHTTP + stdioscope: mcp:read

    List MCP uploads that are still pending or previewed (not yet executed, cancelled, or expired).

  • list_staged_importsReadHTTP + stdioscope: mcp:read

    List the user's staged imports (pending statements awaiting review).

  • list_staged_transactionsReadHTTP + stdioscope: mcp:read

    Flat list of staged transaction rows across one or many imports.

  • search_transactionsReadHTTP + stdioscope: mcp:read

    Flexible transaction search with partial payee match, amount range, date range, category, and tags.

  • suggest_transaction_detailsReadHTTP + stdioscope: mcp:read

    Suggest category + tags for a transaction based on rule matches and historical frequency.

  • test_ruleReadHTTP + stdioscope: mcp:read

    Dry-run a rule pattern against the user's existing transactions.

Analyze

2 tools

Read-only deep-dives that walk individual holdings through their cost-basis history. Surface per-position attribution rather than aggregate views.

  • analyze_holdingAnalyzeHTTP + stdioscope: mcp:read

    Deep-dive on a single holding: avg cost, realized gain, dividends, days held, full transaction history.

  • trace_holding_quantityAnalyzeHTTP + stdioscope: mcp:read

    Per-transaction quantity contributions for a single holding, with running sum.

Preview

3 tools

Dry-run pair for every destructive bulk op. Returns a sample of the affected rows plus a signed confirmation token scoped to the exact payload. Read-only, so nothing is written.

  • preview_bulk_categorizePreviewHTTP + stdioscope: mcp:read

    Preview a bulk-categorize (shortcut for preview_bulk_update with only category_id set).

  • preview_bulk_updatePreviewHTTP + stdioscope: mcp:read

    Preview a bulk update over transactions matching `filter`.

  • preview_importPreviewHTTP + stdioscope: mcp:read

    Preview an uploaded CSV/OFX/QFX file.

Execute

3 tools

Commits a previously-previewed bulk operation. Refuses to run unless the caller passes the matching signed token from preview, so the AI can't skip the confirmation step or mutate the payload between steps.

  • execute_bulk_categorizeExecuteHTTP + stdioscope: mcp:write

    Commit a bulk-categorize.

  • execute_bulk_updateExecuteHTTP + stdioscope: mcp:write

    Commit a bulk update.

  • execute_importExecuteHTTP + stdioscope: mcp:write

    Commit an upload as transactions.

Write

27 tools

Mutations: record / update transactions, transfers, trades; create or edit accounts, categories, rules, subscriptions, loans, goals, splits, holdings, snapshots, FX overrides. Requires mcp:write OAuth scope.

  • accept_reconcile_suggestionWriteHTTP onlyscope: mcp:write

    Link an existing transaction to a bank-ledger row (accept a reconcile suggestion). linkType 'primary' also sets transactions.bank_transaction_id when it's currently NULL; 'extra' just adds the join row.

  • accept_reconcile_suggestionsWriteHTTP onlyscope: mcp:write

    Bulk-accept reconcile suggestions: link MANY existing transactions to bank-ledger rows in ONE call. `pairs` is an array of {bankTransactionId, transactionId, linkType?} (linkType defaults to 'primary').

  • add_snapshotWriteHTTP + stdioscope: mcp:write

    Record a net-worth snapshot for tracking wealth over time

  • apply_rules_to_bank_rowsWriteHTTP onlyscope: mcp:write

    Fire active rules over a batch of bank-ledger rows (Auto-pilot bulk).

  • apply_rules_to_staged_importWriteHTTP onlyscope: mcp:write

    Re-apply active transaction rules to a PENDING staged import in place.

  • apply_rules_to_uncategorizedWriteHTTP + stdioscope: mcp:write

    Run all active categorization rules against uncategorized transactions.

  • approve_staged_rowsWriteHTTP + stdioscope: mcp:write

    Create REAL ledger transactions from staged rows (writes into the live `transactions` table).

  • manage_accountsWriteHTTP onlyscope: mcp:write

    Manage financial accounts: `op` selects add / update / delete / set_mode. add: create an account (name/type A|L, optional currency/group/alias). update: change name/group/currency/note/alias (exact `accountId` or fuzzy `account`). delete: TWO-STEP for a non-empty/force delete (preview cascade counts + token, then commit); a clean empty account deletes directly. set_mode: set the import pipeline mode (auto|approve|manual).

  • manage_budgetsWriteHTTP onlyscope: mcp:write

    Manage per-category monthly budgets: `op` selects set / delete. set: create or update a budget (`category`, `month` YYYY-MM, `amount` > 0). delete: remove a budget for a category/month.

  • manage_categoriesWriteHTTP onlyscope: mcp:write

    Manage transaction categories: `op` selects create / rename / merge / delete. create: a new category (name + type E/I/R). rename: change a category's name (`id`/`name` + `new_name`); a duplicate name is refused. merge: TWO-STEP — call with `source`+`target` and NO `confirmation_token` to preview per-type dependent counts + get a token, then call again with the same source/target + that `confirmation_token` to atomically repoint EVERY dependent (transactions/splits/rules/subscriptions/budgets/…) into the target and delete the source. delete: TWO-STEP — preview FK counts + token, then commit; delete refuses while any dependent still references the category (use merge to fold it into another).

  • manage_fx_overridesWriteHTTP onlyscope: mcp:write

    Manage manual FX rate overrides: `op` selects set / delete / list. set: pin a rate (1 `from` = `rate` `to` on `date`; one side MUST be USD). delete: remove an override by `id`. list: all overrides (rate_to_usd per currency + date range).

  • manage_goalsWriteHTTP onlyscope: mcp:write

    Manage financial goals: `op` selects add / update / delete / list. add: create a goal (name/type/target_amount, optional deadline + account_ids). update: change a goal's target, deadline, status, name, or linked accounts (fuzzy `goal`). delete: remove a goal by name. list: all goals with progress (accountIds, currentAmount, progress, remaining, monthlyNeeded).

  • manage_holdingsWriteHTTP onlyscope: mcp:write

    Manage portfolio holdings (positions inside a brokerage account): `op` selects add / update / delete. add: create a position (name + account; optional symbol/currency/isCrypto). update: change name/symbol/currency/isCrypto/note (fuzzy `holding`; moving accounts is REFUSED — use portfolio_transfer). delete: TWO-STEP when the holding has transactions/lots (preview counts + token, then commit); a clean holding deletes directly. qty/cost come from transactions, NOT this tool.

  • manage_loansWriteHTTP onlyscope: mcp:write

    Manage loans & debt: `op` selects add / update / delete / list. add: create a loan or lease (principal/rate + term_months OR payment_amount; residual_value for leases). update: change any loan field by id. delete: remove a loan by id. list: all loans with balance/rate/payment/payoff date/linked account.

  • manage_rulesWriteHTTP onlyscope: mcp:write

    Manage auto-categorize rules: `op` selects create / update / delete / list / reorder. create: a rule from legacy shorthand (match_payee + assign_category). update: legacy shorthand OR the v2 conditions+actions shape by id. delete: remove a rule by id. list: all rules (v2 JSONB + decrypted FK names). reorder: assign priorities from an ordered id list.

  • manage_splitsWriteHTTP onlyscope: mcp:write

    Manage transaction splits: `op` selects list / add / update / delete / replace. list: all splits for a transaction. add: one split. update: change a split's fields by id. delete: remove a split by id (optional `expected.amount` echo guards a mis-copied id). replace: atomically replace ALL splits on a transaction (must sum to the parent amount ±$0.01).

  • manage_subscriptionsWriteHTTP onlyscope: mcp:write

    Manage subscriptions: `op` selects add / update / delete / list. add: one (name/amount/cadence/next_billing_date) or many (pass `items[]` + the `confirmation_token` from detect_subscriptions). update: change any field by id. delete: remove by id. list: raw editable rows (filter by `status`); `include_summary:true` also adds cost/renewal totals under a `summary` key.

  • manage_transactionsWriteHTTP onlyscope: mcp:write

    Manage cash-account transactions: `op` selects record / update / delete. record: one row (amount/payee/account…) OR many (pass `transactions[]` + optional idempotencyKey). update: change a transaction's fields by id. delete: remove by id (optional `expected` payee/amount echo guards a mis-copied id).

  • manage_transfersWriteHTTP onlyscope: mcp:write

    Manage transfers between two of the user's accounts: `op` selects record / update / delete. record: create BOTH legs atomically (shared link_id; cash, cross-currency via `receivedAmount`, or in-kind via `holding`+`quantity`). update: change both legs of a pair (by linkId OR either leg's transactionId). delete: TWO-STEP — remove BOTH legs (preview + token, then commit).

  • materialize_bank_rowWriteHTTP onlyscope: mcp:write

    Create a real transaction from a bank-only ledger row.

  • portfolio_record_entryWriteHTTP onlyscope: mcp:write

    Record a lot-aware portfolio ledger entry; `entry_type` selects the operation.

  • send_to_bank_ledgerWriteHTTP onlyscope: mcp:write

    Promote staged import rows into the bank ledger only (bank_transactions) for reconciliation.

  • update_staged_transactionWriteHTTP + stdioscope: mcp:write

    Edit a single staged transaction row in place.

  • upload_statementWriteHTTP onlyscope: mcp:write

    Stage a bank/brokerage statement file (CSV, OFX, or QFX) over this MCP connection (no browser session needed).

  • upsert_balance_anchorWriteHTTP onlyscope: mcp:write

    Create or correct a single bank balance anchor.

Destructive

5 tools

Delete a row, reject a staged import, or cancel an in-flight import. Marked with the MCP destructiveHint so clients can surface a confirmation prompt. Requires mcp:write OAuth scope.

  • cancel_importDestructiveHTTP + stdioscope: mcp:write

    Cancel a pending MCP upload — marks the row as cancelled and deletes the file from disk.

  • delete_bank_transactionDestructiveHTTP onlyscope: mcp:write

    Delete a single bank-ledger row (bank_transactions) by id.

  • execute_bulk_deleteDestructiveHTTP + stdioscope: mcp:write

    Commit a bulk delete.

  • preview_bulk_deleteDestructiveHTTP + stdioscope: mcp:read

    Preview a bulk delete.

  • reject_staged_importDestructiveHTTP + stdioscope: mcp:write

    Reject (hard-delete) a staged import.

How destructive operations stay safe

Every bulk write follows a preview → confirm → execute pattern. The preview tool returns a sample of affected rows plus a signed confirmation token scoped to the exact payload. The execute tool refuses to run unless the caller passes that exact token, so the AI can't skip the preview step or silently mutate the operation between calls. The same pattern protects bulk categorize, bulk update, bulk delete, category deletion (with FK refusal), and the staged-import approve flow.

Per-write idempotency keys carry through bulk_record_transactions and approve_staged_rows with a 72-hour replay window, so Claude retrying a flaky import won't double-book the rows.