Monarch Money

Monarch Money

Integration

Personal finance tools powered by Monarch Money

Connects to your Monarch Money account for spending analysis, net worth tracking, budget monitoring, and transaction management.

Tools (20)

get_account_balances

Fetch all financial accounts on the user's Monarch (active AND closed/inactive — Monarch keeps closed accounts visible for history). Each row includes balance, type, institution, includeInNetWorth, and the inactive-state flags: `closed` (deactivated in Monarch), `sync_disabled` (manually paused), `hidden` (user-hidden from UI), `disconnected` (credential lost with the data provider — needs reconnection), and `is_manual` (user-tracked, no auto-sync). When the user asks 'how many closed/inactive accounts', count by `closed` or `disconnected` — do NOT infer from $0 balance, that's noisy.

get_net_worth_snapshot

Fetch net worth snapshots over time. Returns aggregate totals (assets, liabilities, net worth) at periodic intervals. Use this to track net worth trends.

get_recent_transactions

Fetch transactions filtered by date range, category, search text, review status, or limit. Returns date, merchant, amount, category, account, and needs_review for each transaction. For category-level spending questions, call list_categories first to get the real category IDs, then pass them as category_ids here (include all child categories of a group — e.g. for 'driving' pass every category in the 'Auto & Transport' group). Sum the amounts in the response to answer 'how much did I spend on X' questions. Date window: pass `start_date` and `end_date` (YYYY-MM-DD) for an arbitrary period — use this for questions like 'last February' (start_date=2025-02-01, end_date=2025-02-28), 'in 2024', or 'last year' (start_date=today minus 365 days). If both are omitted, falls back to the trailing `days` window (default 30). When computing averages over long periods (e.g. average monthly groceries over a year), set `limit` high enough to cover all matching rows — the default 50 will silently truncate. Set needs_review=true to fetch only transactions awaiting review (the reconcile workflow); when filtering by review status, widen the window if you expect more results than limit.

get_spending_summary

Fetch a high-level spending summary. Returns aggregate spending totals and category breakdowns for the current period.

get_cashflow_report

Fetch cashflow summary — income vs expenses over a date range. Returns totals for income, expenses, and savings rate.

list_categories

List the user's transaction categories and category groups — the real taxonomy names used by their Monarch account. Always call this before answering category-level spending questions so you use the user's actual category names instead of guessing from merchant strings. Works even when the user has no budget set up.

get_budget_status

Fetch current budget status — planned vs actual spending by category. Shows which budgets are on track, over, or under.

get_recurring_transactions

Fetch recurring transactions — subscriptions, bills, and regular charges. Use this to find recurring expenses, subscription costs, and upcoming bills.

get_investment_holdings

Fetch investment holdings for a specific account. Returns securities positions with name, ticker, quantity, value, and cost basis.

get_account_history

Fetch historical balance data for a specific account. Use this to see balance trends over time for a single account.

refresh_accounts

Kick off a sync with the user's bank(s) for one or more accounts. Returns IMMEDIATELY (does not wait for the refresh to complete) so the chat doesn't hang for minutes. Use the optional `filter` to scope the refresh — it matches case-insensitively against account name, type, subtype, and institution, so the user's phrasing works directly: 'td accounts' matches all TD-institution accounts, 'chequing' matches checking accounts, 'visa' matches visa-subtype accounts, 'wealthsimple cash' matches by name. Omit `filter` to refresh every connected account. Tell the user the refresh is running and offer to call check_refresh_status in a minute or two; do not poll yourself.

check_refresh_status

Check whether previously-kicked-off account refreshes have completed. Same `filter` semantics as refresh_accounts (matches name/type/subtype/institution). Returns per-account in-progress booleans — useful when one bank is slow and others are already done. Omit filter to check all accounts.

split_transaction

Split a single Monarch transaction into multiple child transactions, each with its own merchant, amount, and category. Replaces any existing splits on the parent transaction. The sum of split amounts must equal the parent transaction's amount (use signed amounts — negative for expenses). Pass an empty splits list to remove all splits and restore the parent. Get transaction_id from get_recent_transactions and category_id values from list_categories.

update_transaction

Update fields on a single Monarch transaction — category, merchant name, amount, date, notes, hide-from-reports, or needs-review. Only the fields you pass are changed; omit anything you want to leave alone. Get transaction_id from get_recent_transactions and category_id from list_categories. Pass an empty string to clear notes.

update_account_balance

Set the current balance on a **manual** Monarch account (e.g. car values, real estate, cash, or any other user-tracked asset/liability that isn't auto-synced from a bank). Use this when the user asks to update / adjust / correct / sync a manual account balance. Get account_id from get_account_balances — the same call also surfaces an `is_manual` flag, which must be true for this tool to succeed. Synced accounts (bank-linked via Plaid/MX) cannot have their balance edited; for those, use refresh_accounts to pull fresh data from the institution. The new `balance` is the absolute current value (not a delta); for liabilities, pass a positive number representing the amount owed (Monarch's display convention). Returns the previous balance, the new balance, and the account name so you can echo the change back to the user.

resolve_category

Find the most likely Monarch category for a free-text query, ranked by how the user actually categorizes similar transactions. Always call this before update_transaction or split_transaction so you write back the user's preferred category, not a guess. The popularity prior is built from the last 6 months of *reviewed* transactions on the *same account*, with the *same sign* as the target, excluding structural categories (transfers, paychecks, etc). History from the target's own merchant counts 10x more than other merchants. Returns up to 3 candidates with id, name, group, match quality (exact/word/substring), and the merchant + global usage counts that informed the ranking. Decision rule: if rank 1 is `exact` OR its score is at least 3x rank 2, write it. Otherwise show the top candidates and ask the user which they meant.

resolve_merchant

Find the most likely canonical merchant name for a free-text query, ranked by how often the user has used each variant. Useful when renaming a messy bank string ('STARBUCKS #1234 SEATTLE WA') to the user's clean canonical ('Starbucks'). Pulls candidates from the last 6 months of reviewed transactions on the same account, same sign as the target, excluding structural categories. Returns up to 3 candidates with: canonical name, total uses, last-seen date, the category most often paired (top_category), how dominant that category is (top_category_uses, top_category_confidence as a 0-1 ratio), and a coarse confidence label (high/medium/low) for the top_category suggestion. Decision rule for renames: if rank 1 is `exact` OR has at least 3x the usage of rank 2, use it. Decision rule for AUTO-applying top_category during review: only when confidence is `high`. For `medium`, propose and confirm. For `low`, leave the existing category unless the user said otherwise.

list_tags

Fetch all transaction tags configured on the user's Monarch account. Returns id, name, and color for each. Tags are distinct from categories: a transaction has exactly one category but any number of tags. Call this when the user asks to tag/label/mark a transaction and you need to know what tag names exist, or when add_transaction_tag reports an ambiguous or missing tag.

add_transaction_tag

Add a tag to a single Monarch transaction by name. Resolves the name case-insensitively with plural-stripping (so 'reimburse' matches 'Reimbursement'). Preserves existing tags on the transaction. Tags are distinct from categories — use this when the user says 'tag', 'label', or 'mark', not when they say 'categorize'. If the tag name doesn't exist or matches more than one tag, returns an error with the candidates so you can ask the user; do not silently substitute a category change. Tags must already exist on the account; this tool does not create new tags.

remove_transaction_tag

Remove a tag from a single Monarch transaction by name. Same name matching as add_transaction_tag. Other tags on the transaction are preserved. Returns status='not_present' if the tag wasn't on the transaction, or status='ambiguous'/'no_match' with candidates if the name is unclear.

Chat with Monarch Money

Open chat