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 46 read tools below; out-of-scope tools never appear in tools/listand can't be invoked. The 49 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). 4 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 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:readTime-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_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 — 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.
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.
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_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.
record_tradeWriteHTTP + stdioscope: mcp:writeRecord a stock/ETF/crypto buy or sell in a brokerage account.
record_transactionWriteHTTP + stdioscope: mcp:writeRecord a transaction.
record_transferWriteHTTP + stdioscope: mcp:writeRecord a transfer between two of the user's accounts.
reorder_rulesWriteHTTP + stdioscope: mcp:writeReorder rules by assigning new priorities.
replace_splitsWriteHTTP + stdioscope: mcp:writeAtomically replace all splits on a transaction.
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.
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 — Claude retrying a flaky import won't double-book the rows.