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.
OAuth scopes filter the tool list per token
A token granted only mcp:read sees the 33 read tools below; out-of-scope tools never appear in tools/listand can't be invoked. The 21 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). 17 tools are HTTP-only because they requirean encrypted-name (DEK) the stdio transport doesn't hold.
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:readConvert an amount from one currency to another using triangulated FX rates.
detect_subscriptionsReadHTTP + stdioscope: mcp:readScan recent transactions and return candidate subscriptions.
finlynq_helpReadHTTP + stdioscope: mcp:readDiscover available Finlynq tools, schema, and usage examples.
get_account_balancesReadHTTP + stdioscope: mcp:readGet current balances for all accounts.
get_budget_summaryReadHTTP + stdioscope: mcp:readGet budget vs actual spending for a specific month.
get_cash_flow_forecastReadHTTP + stdioscope: mcp:readProject cash flow for the next 30/60/90 days from recurring transactions.
get_categoriesReadHTTP + stdioscope: mcp:readList all available transaction categories
get_debt_payoff_planReadHTTP + stdioscope: mcp:readCompare debt payoff strategies (avalanche vs snowball) across all user loans with an optional extra monthly payment.
get_dividend_incomeReadHTTP onlyscope: mcp:readDividend income from the transactions table, classified by the user's Dividends category (issue #84).
get_financial_health_scoreReadHTTP + stdioscope: mcp:readCalculate a financial health score 0-100 with a per-component breakdown.
get_fx_rateReadHTTP + stdioscope: mcp:readGet the FX rate to convert 1 unit of `from` into `to` on `date`.
get_income_statementReadHTTP + stdioscope: mcp:readGenerate income statement for a period.
get_investment_insightsReadHTTP + stdioscope: mcp:readPortfolio-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:readFull amortization schedule for a loan.
get_net_worthReadHTTP + stdioscope: mcp:readNet worth across all accounts.
get_portfolio_analysisReadHTTP + stdioscope: mcp:readList portfolio holdings with all investment metrics.
get_portfolio_performanceReadHTTP + stdioscope: mcp:readPer-holding average-cost performance aggregates: realized P&L, dividends, total return, and days held.
get_portfolio_returnsReadHTTP onlyscope: mcp:readCompute a portfolio time-series return series.
get_realized_gainsReadHTTP onlyscope: mcp:readLot-level realized gains for the user, sourced from the FIFO lot engine.
get_reconciliation_summaryReadHTTP onlyscope: mcp:readSummarize reconcile health across all accounts in one call (instead of one reconcile(op:suggest) per account).
get_recurring_transactionsReadHTTP + stdioscope: mcp:readGet detected recurring transactions (subscriptions, bills, salary) from transaction history.
get_spending_anomaliesReadHTTP + stdioscope: mcp:readFind spending categories with >30% deviation from their 3-month average.
get_spending_trendsReadHTTP + stdioscope: mcp:readGet spending trends over time grouped by category.
get_spotlight_itemsReadHTTP + stdioscope: mcp:readGet current attention items — overspent budgets, upcoming bills, uncategorized transactions
get_weekly_recapReadHTTP + stdioscope: mcp:readGet a weekly financial recap: spending summary, income, net cash flow, notable transactions.
search_transactionsReadHTTP + stdioscope: mcp:readFlexible transaction search with partial payee match, amount range, date range, category, and tags.
suggest_transaction_detailsReadHTTP + stdioscope: mcp:readSuggest category + tags for a transaction based on rule matches and historical frequency.
test_ruleReadHTTP + stdioscope: mcp:readDry-run a rule pattern against the user's existing transactions.
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:readDeep-dive on a single holding: avg cost, realized gain, dividends, days held, full transaction history.
trace_holding_quantityAnalyzeHTTP + stdioscope: mcp:readPer-transaction quantity contributions for a single holding, with running sum.
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:readPreview a bulk-categorize (shortcut for preview_bulk_update with only category_id set).
preview_bulk_updatePreviewHTTP + stdioscope: mcp:readPreview a bulk update over transactions matching `filter`.
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:writeCommit a bulk-categorize.
execute_bulk_updateExecuteHTTP + stdioscope: mcp:writeCommit a bulk update.
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.
add_snapshotWriteHTTP + stdioscope: mcp:writeRecord a net-worth snapshot for tracking wealth over time
apply_rules_to_uncategorizedWriteHTTP + stdioscope: mcp:writeRun all active categorization rules against uncategorized transactions.
manage_accountsWriteHTTP onlyscope: mcp:writeManage 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_bank_ledgerWriteHTTP + stdioscope: mcp:writeMaintain bank-ledger rows and balance anchors: `op` selects list_anchors / upsert_anchor / find_duplicates / delete_row. list_anchors: the bank's reported balances for an account (read). upsert_anchor: create/correct one anchor keyed by (accountId, date) — idempotent, immediately affects the reconcile balance check. find_duplicates: group DISTINCT bank rows describing the same economic event so you can keep a canonical (read; DEK required). delete_row: remove a single bank row by id (destructive; pass dryRun:true to preview the unlinkedTransactionIds first).
manage_budgetsWriteHTTP onlyscope: mcp:writeManage 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:writeManage 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:writeManage 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:writeManage 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:writeManage 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_record_entry (entry_type: 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:writeManage 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:writeManage 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:writeManage 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_statement_importWriteHTTP + stdioscope: mcp:writeManage the staged-import lifecycle in one union tool. `op` selects upload / list / get / list_rows / update_row / link_transfer_pair / approve / send_to_bank_ledger / apply_rules / reject. upload: stage a CSV/OFX/QFX file (base64 fileContent; content-hash idempotent). list/get/list_rows: review staged imports + rows (read). update_row / link_transfer_pair: fix or pair staged rows. send_to_bank_ledger: promote rows into the bank ledger ONLY (normal reconcile — no `transactions`). approve: TWO-STEP create of REAL ledger transactions (first-import ONLY; preview→token then commit). apply_rules: re-fire rules over a pending import. reject: TWO-STEP hard-delete (preview→token then commit).
manage_subscriptionsWriteHTTP onlyscope: mcp:writeManage 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:writeManage 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:writeManage 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).
portfolio_record_entryWriteHTTP onlyscope: mcp:writeRecord a lot-aware portfolio ledger entry; `entry_type` selects the operation.
reconcileWriteHTTP + stdioscope: mcp:writeReconcile a bank statement against the ledger for one account. `op` selects suggest / accept / unlink / materialize / apply_rules. suggest: rollups-first match (buckets exact/fuzzy/noMatch/alreadyLinked + legacy detail) — read. accept: link MANY bank↔tx pairs at once (`pairs[]`, linkType default 'primary'; positional response, partial commit). unlink: remove a tx↔bank link. materialize: turn an unmatched bank row into a real transaction (category mode) or a transfer (destAccountId). apply_rules: Auto-pilot bulk — preview (no confirmation_token) returns a token; commit with the token + autoMaterialize:true.
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.
execute_bulk_deleteDestructiveHTTP + stdioscope: mcp:writeCommit a bulk delete.
preview_bulk_deleteDestructiveHTTP + stdioscope: mcp:readPreview a bulk delete.
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.