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 47 read tools below; out-of-scope tools never appear in tools/listand can't be invoked. The 62 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). 19 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 (via the decrypted tx cache) and return candidate subscriptions — payees with 3+ regular-cadence occurrences and stable amounts.
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, 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 breakdown by 6 weighted components (Savings Rate 0.25 / Debt-to-Income 0.20 / Emergency Fund 0.15 / Net Worth Trend 0.15 / Budget Adherence 0.15 / Age of Money 0.10).
get_fx_rateReadHTTP + stdioscope: mcp:readGet the FX rate to convert 1 unit of `from` into `to` on `date`.
get_goalsReadHTTP + stdioscope: mcp:readGet all financial goals with progress.
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`. `mode: 'benchmark'` compares book-value growth vs a reference index.
get_loan_amortizationReadHTTP + stdioscope: mcp:readFull amortization schedule for a loan.
get_loansReadHTTP + stdioscope: mcp:readDeprecatedGet all loans with amortization summary.
get_net_worthReadHTTP + stdioscope: mcp:readNet worth across all accounts.
get_portfolio_analysisReadHTTP + stdioscope: mcp:readPortfolio holdings with all investment metrics: quantity, cost basis, avg cost, unrealized/realized gain, dividends, total return, % of portfolio.
get_portfolio_performanceReadHTTP + stdioscope: mcp:readPortfolio performance with avg-cost method: realized P&L, dividends, total return, days held per holding.
get_portfolio_performance_v2ReadHTTP onlyscope: mcp:read(Distinct capability, not a newer version of get_portfolio_performance: that tool is per-holding average-cost realized P&L; this one is the portfolio time-series return series.) Time-series performance for the portfolio: daily market_value + cost_basis series, period TWRR (Modified Dietz chained daily), annualized TWRR, and MWRR / XIRR.
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_recurring_transactionsReadHTTP + stdioscope: mcp:readGet detected recurring transactions (subscriptions, bills, salary).
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_subscription_summaryReadHTTP + stdioscope: mcp:readGet all tracked subscriptions with total monthly cost and upcoming renewals.
get_weekly_recapReadHTTP + stdioscope: mcp:readGet a weekly financial recap: spending summary, income, net cash flow, notable transactions.
list_fx_overridesReadHTTP + stdioscope: mcp:readList the user's manual FX rate overrides.
list_loansReadHTTP + stdioscope: mcp:readList all loans with balance, rate, payment, payoff date, and linked account
list_pending_uploadsReadHTTP + stdioscope: mcp:readList MCP uploads that are still pending or previewed (not yet executed, cancelled, or expired).
list_rulesReadHTTP + stdioscope: mcp:readList all auto-categorization rules.
list_splitsReadHTTP + stdioscope: mcp:readList all splits for a transaction.
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.
list_subscriptionsReadHTTP + stdioscope: mcp:readList all subscriptions with full detail (status, next billing, category, account, notes).
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.
add_accountWriteHTTP + stdioscope: mcp:writeCreate a new financial account (bank, investment, credit card, etc.)
add_goalWriteHTTP + stdioscope: mcp:writeCreate a new financial goal. `account_ids` (issue #130) accepts 0..N account ids — the goal's progress sums across all linked accounts.
add_loanWriteHTTP + stdioscope: mcp:writeCreate a new loan or lease.
add_portfolio_holdingWriteHTTP + stdioscope: mcp:writeCreate a portfolio holding (a single position like 'VEQT.TO' inside a brokerage account).
add_snapshotWriteHTTP + stdioscope: mcp:writeRecord a net-worth snapshot for tracking wealth over time
add_splitWriteHTTP + stdioscope: mcp:writeAdd a single split to an existing transaction
add_subscriptionWriteHTTP + stdioscope: mcp:writeCreate a new subscription.
apply_rules_to_bank_rowsWriteHTTP onlyscope: mcp:writeAuto-pilot bulk: fire active rules over a batch of bank-ledger rows and (on confirm) auto-materialize matched rows into transactions.
apply_rules_to_staged_importWriteHTTP onlyscope: mcp:writeRe-apply active transaction rules to a PENDING staged import in place (renames payees, flips tx_type to transfer, sets category/account, etc.) so the review surface reflects rule effects before approval.
apply_rules_to_uncategorizedWriteHTTP + stdioscope: mcp:writeRun all active categorization rules against uncategorized transactions.
approve_staged_rowsWriteHTTP + stdioscope: mcp:writeMaterialize staged rows into the live transactions table.
bulk_add_subscriptionsWriteHTTP + stdioscope: mcp:writeCommit a set of detected subscriptions.
bulk_record_transactionsWriteHTTP + stdioscope: mcp:writeRecord multiple transactions at once.
create_categoryWriteHTTP + stdioscope: mcp:writeCreate a new transaction category
create_ruleWriteHTTP + stdioscope: mcp:writeCreate an auto-categorization rule for future imports.
link_staged_transfer_pairWriteHTTP + stdioscope: mcp:writeSugar over update_staged_transaction: pair two staged rows as a transfer.
materialize_bank_rowWriteHTTP onlyscope: mcp:writeCreate a real transaction from a bank-only ledger row.
portfolio_buyWriteHTTP onlyscope: mcp:writeBookkeeping only: records a BUY entry in the user's own Finlynq tracking ledger.
portfolio_depositWriteHTTP onlyscope: mcp:writeBookkeeping only: records a deposit entry between two of the user's own tracked accounts; no real bank or brokerage transfer occurs.
portfolio_fx_conversionWriteHTTP onlyscope: mcp:writeBookkeeping only: records a currency-conversion entry between two of the user's own tracked cash sleeves; no real FX trade occurs.
portfolio_income_expenseWriteHTTP onlyscope: mcp:writeBookkeeping only: records an income/expense entry in the user's own Finlynq ledger; no real money moves.
portfolio_sellWriteHTTP onlyscope: mcp:writeBookkeeping only: records a SELL entry in the user's own Finlynq tracking ledger.
portfolio_swapWriteHTTP onlyscope: mcp:writeBookkeeping only: records a swap entry in the user's own Finlynq ledger; no real trade occurs.
portfolio_transferWriteHTTP onlyscope: mcp:writeBookkeeping only: records an in-kind move between two of the user's own tracked accounts; no real shares or money move.
portfolio_withdrawalWriteHTTP onlyscope: mcp:writeBookkeeping only: records a withdrawal entry between two of the user's own tracked accounts; no real bank or brokerage transfer occurs.
record_transactionWriteHTTP + stdioscope: mcp:writeBookkeeping only: writes an entry to the user's own Finlynq ledger (Finlynq never connects to a bank or moves real money).
record_transferWriteHTTP + stdioscope: mcp:writeBookkeeping only: records a transfer entry between two of the user's own tracked accounts in Finlynq; it never initiates a real bank or wire transfer or moves any actual money.
reorder_rulesWriteHTTP + stdioscope: mcp:writeReorder rules by assigning new priorities.
replace_splitsWriteHTTP + stdioscope: mcp:writeAtomically replace all splits on a transaction.
set_account_modeWriteHTTP onlyscope: mcp:writeSet an account's import pipeline mode: 'auto' (rules fire at upload), 'approve' (review each), or 'manual' (rules fire at materialize).
set_budgetWriteHTTP + stdioscope: mcp:writeSet or update a budget for a category in a specific month
set_fx_overrideWriteHTTP + stdioscope: mcp:writePin a manual FX rate.
unlink_reconcileWriteHTTP onlyscope: mcp:writeRemove a transaction ↔ bank-ledger link.
update_accountWriteHTTP + stdioscope: mcp:writeUpdate name, group, currency, note, or alias of an account.
update_goalWriteHTTP + stdioscope: mcp:writeUpdate a financial goal's target, deadline, status, or linked accounts. `account_ids` (issue #130) replaces the existing account-link set atomically — pass `[]` to unlink all, or omit to leave links unchanged.
update_loanWriteHTTP + stdioscope: mcp:writeUpdate any field of an existing loan by id
update_portfolio_holdingWriteHTTP + stdioscope: mcp:writeUpdate a portfolio holding's name, symbol, currency, isCrypto, or note.
update_ruleWriteHTTP + stdioscope: mcp:writeUpdate an existing transaction rule.
update_splitWriteHTTP + stdioscope: mcp:writeUpdate fields of an existing split
update_staged_transactionWriteHTTP + stdioscope: mcp:writeEdit a single staged transaction row in place.
update_subscriptionWriteHTTP + stdioscope: mcp:writeUpdate any field of an existing subscription
update_transactionWriteHTTP + stdioscope: mcp:writeUpdate fields of an existing transaction by ID.
update_transferWriteHTTP + stdioscope: mcp:writeUpdate both legs of an existing transfer pair atomically.
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_accountDestructiveHTTP + stdioscope: mcp:writeDelete an account (only if it has no transactions).
delete_budgetDestructiveHTTP + stdioscope: mcp:writeDelete a budget entry for a category/month
delete_categoryDestructiveHTTP + stdioscope: mcp:writeDelete a category.
delete_fx_overrideDestructiveHTTP + stdioscope: mcp:writeDelete a manual FX rate override by id
delete_goalDestructiveHTTP + stdioscope: mcp:writeDelete a financial goal by name
delete_loanDestructiveHTTP + stdioscope: mcp:writeDelete a loan by id
delete_portfolio_holdingDestructiveHTTP + stdioscope: mcp:writeDelete a portfolio holding.
delete_ruleDestructiveHTTP + stdioscope: mcp:writeDelete a transaction rule by id
delete_splitDestructiveHTTP + stdioscope: mcp:writeDelete a split by id
delete_subscriptionDestructiveHTTP + stdioscope: mcp:writePermanently delete a subscription by id
delete_transactionDestructiveHTTP + stdioscope: mcp:writePermanently delete a transaction by ID
delete_transferDestructiveHTTP + stdioscope: mcp:writePermanently delete BOTH legs of a transfer pair in a single statement.
execute_bulk_deleteDestructiveHTTP + stdioscope: mcp:writeCommit a bulk delete.
preview_bulk_deleteDestructiveHTTP + stdioscope: mcp:readPreview a bulk delete.
preview_delete_categoryDestructiveHTTP onlyscope: mcp:readPreview deletion of a category.
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.