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 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.
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.
find_duplicate_bank_rowsReadHTTP onlyscope: mcp:readSurface duplicate bank-ledger rows for one account.
finlynq_helpReadHTTP + stdioscope: mcp:readDiscover available Finlynq tools, schema, and usage examples.
get_account_balancesReadHTTP + stdioscope: mcp:readGet current balances for all accounts.
get_balance_anchorsReadHTTP onlyscope: mcp:readList the bank balance anchors for one account.
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, or 90 days based on 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_reconcile_suggestionsReadHTTP onlyscope: mcp:readReconcile snapshot for one account's bank ledger vs. its transactions (the /import page's three-layer match engine).
get_reconciliation_summaryReadHTTP onlyscope: mcp:readSummarize reconcile health across all accounts in one call (instead of one get_reconcile_suggestions 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_staged_importReadHTTP + stdioscope: mcp:readFetch full detail for one staged import — top-level metadata + every row with decrypted display fields.
get_weekly_recapReadHTTP + stdioscope: mcp:readGet a weekly financial recap: spending summary, income, net cash flow, notable transactions.
list_pending_uploadsReadHTTP + stdioscope: mcp:readList MCP uploads that are still pending or previewed (not yet executed, cancelled, or expired).
list_staged_importsReadHTTP + stdioscope: mcp:readList the user's staged imports (pending statements awaiting review).
list_staged_transactionsReadHTTP + stdioscope: mcp:readFlat list of staged transaction rows across one or many imports.
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`.
preview_importPreviewHTTP + stdioscope: mcp:readPreview an uploaded CSV/OFX/QFX file.
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.
execute_importExecuteHTTP + stdioscope: mcp:writeCommit an upload as transactions.
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:writeLink 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:writeBulk-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:writeRecord a net-worth snapshot for tracking wealth over time
apply_rules_to_bank_rowsWriteHTTP onlyscope: mcp:writeFire active rules over a batch of bank-ledger rows (Auto-pilot bulk).
apply_rules_to_staged_importWriteHTTP onlyscope: mcp:writeRe-apply active transaction rules to a PENDING staged import in place.
apply_rules_to_uncategorizedWriteHTTP + stdioscope: mcp:writeRun all active categorization rules against uncategorized transactions.
approve_staged_rowsWriteHTTP + stdioscope: mcp:writeCreate REAL ledger transactions from staged rows (writes into the live `transactions` table).
link_staged_transfer_pairWriteHTTP + stdioscope: mcp:writeSugar over update_staged_transaction: pair two staged rows as a transfer.
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_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_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_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).
materialize_bank_rowWriteHTTP onlyscope: mcp:writeCreate a real transaction from a bank-only ledger row.
portfolio_record_entryWriteHTTP onlyscope: mcp:writeRecord a lot-aware portfolio ledger entry; `entry_type` selects the operation.
send_to_bank_ledgerWriteHTTP onlyscope: mcp:writePromote staged import rows into the bank ledger only (bank_transactions) for reconciliation.
unlink_reconcileWriteHTTP onlyscope: mcp:writeRemove a transaction ↔ bank-ledger link.
update_staged_transactionWriteHTTP + stdioscope: mcp:writeEdit a single staged transaction row in place.
upload_statementWriteHTTP onlyscope: mcp:writeStage a bank/brokerage statement file (CSV, OFX, or QFX) over this MCP connection (no browser session needed).
upsert_balance_anchorWriteHTTP onlyscope: mcp:writeCreate or correct a single bank balance anchor.
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:writeCancel a pending MCP upload — marks the row as cancelled and deletes the file from disk.
delete_bank_transactionDestructiveHTTP onlyscope: mcp:writeDelete a single bank-ledger row (bank_transactions) by id.
execute_bulk_deleteDestructiveHTTP + stdioscope: mcp:writeCommit a bulk delete.
preview_bulk_deleteDestructiveHTTP + stdioscope: mcp:readPreview a bulk delete.
reject_staged_importDestructiveHTTP + stdioscope: mcp:writeReject (hard-delete) a staged import.
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.