adjust_account_balance
ChatGPTRecord one or more account-rebalance entries in bulk (up to 1000). Each entry is a TransactionSyncDto with type=Adjustment (3) and a SIGNED amount (positive or negative). The only place a transaction may carry a negative amount. category_id and to_account_id must be null. Excluded from income/expense aggregates by default.
aggregate_transactions
ChatGPTGroup + sum transactions over a period with FX normalization. By default Transfer (type=2) and Adjustment (type=3) are excluded so income/expense numbers match the mobile UI. Set include_transfers / include_adjustments to true to include them, or set filter.type=[…] for explicit type filtering.
convert_currency
ChatGPTConvert an amount between two ISO-4217 currencies using the latest FX rates. For bulk conversion across many transactions, prefer the 'currency' parameter on aggregate_transactions.
delete_accounts
ChatGPTSoft-delete accounts in bulk (up to 1000). The sync layer cascades to dependent member rows automatically.
delete_budgets
ChatGPTSoft-delete budgets in bulk (up to 1000).
delete_categories
ChatGPTSoft-delete custom categories in bulk (up to 1000). Existing transactions referencing the category are unaffected (the reference becomes orphaned and falls back to 'uncategorized' on the client).
delete_category_groups
ChatGPTSoft-delete category groups in bulk (up to 1000). Categories within the group remain (their CategoryGroupId becomes orphaned).
delete_groups
ChatGPTSoft-delete groups in bulk (up to 1000). The sync layer cascades to dependent group-member and group-transaction rows.
delete_recurring_transactions
ChatGPTSoft-delete recurring transactions in bulk (up to 1000). Already-generated transaction instances are unaffected.
delete_tags
ChatGPTSoft-delete tags in bulk (up to 1000). Tag links on existing transactions are preserved as-is — only the tag definition is tombstoned.
delete_transactions
ChatGPTSoft-delete transactions in bulk (up to 1000). Works for any transaction type (expense, income, transfer, adjustment).
download_receipt
ChatGPTReturns a short-lived signed URL (60 min) to download the receipt attached to a transaction. The URL points directly at Google Cloud Storage — fetch via plain HTTPS GET. Returns null if the transaction has no receipt or the file metadata is missing.
get_account_balance
ChatGPTReturns the live computed balance for one or more accounts using the same formula as the mobile UI: initial_balance + income - expense - transfers_out + transfers_in + adjustments. Each account's balance is in its own currency; pass currency to also get a converted figure per account. Pass account_ids to filter, or omit to receive every account. Set include_unassigned to surface income/expense transactions that have no account assigned (rendered as a synthetic 'Unassigned' bucket).
get_transaction
ChatGPTReturns a single transaction by sync_id with full details.
get_transactions
ChatGPTList transactions with rich filters (date range, type, accounts, categories, group_ids, amount range). Returns a page sorted by date desc; pass the cursor from a previous response to fetch the next page. Combining a date range with an amount range is rejected (400) — use aggregate_transactions for that intent. Filtering by group_ids resolves through the user-group-transactions junction (an M2M link, since Transaction has no direct groupId field) and uses in-memory pagination.
get_user_profile
ChatGPTReturns the user's profile settings: primary currency, week-start day, app language, date format, decimal places, and timezone offset.
list_accounts
ChatGPTReturns the user's accounts (personal + shared) paginated. Personal accounts paginated server-side; shared accounts (where you're a non-owner member) paginated independently via shared_cursor. SharedItems and PersonalItems each carry their own NextCursor / HasMore — page each axis independently.
list_budgets
ChatGPTReturns the user's configured budgets paginated. Ordered by createdAt ASC + syncId tiebreaker (Name is optional and can't be used as a stable cursor field).
list_categories
ChatGPTReturns the user's categories paginated. Custom categories are paginated server-side (custom_cursor); custom category groups are paginated independently (groups_cursor). Well-known categories are returned only on the first response (when custom_cursor is null) — they're a static set, not paginated.
list_groups
ChatGPTReturns the user's groups paginated. Personal groups paginated server-side (cursor); shared groups paginated independently (shared_cursor). Members are joined per-page via a chunked WhereIn query — never a full-collection scan.
list_recurring_transactions
ChatGPTReturns the user's configured recurring transactions paginated. Ordered by nextOccurrence ASC + syncId tiebreaker (so upcoming items appear first). Type is 'income' | 'expense' | 'transfer'.
list_supported_icons
ChatGPTReturns the FontAwesome icon catalog and the brand color palette accepted by Icon/Color fields on accounts, categories, category groups, and groups. Validate icon/color values BEFORE setting them on entities.
list_tags
ChatGPTReturns the user's tags paginated. Set include_usage=true to also compute the usage count per tag for the current page (one Firestore aggregation query per tag in the page; off by default to keep the common path fast).
reconcile_account
ChatGPTBring an account's computed balance in line with an external figure (e.g. the bank app's screen) by creating a single signed adjustment entry. Computes delta = expected_balance - current_balance and posts it as a type=Adjustment transaction. Returns the previous and new balance plus the adjustment sync_id. NOT idempotent — calling twice creates two adjustments.
transfer_between_accounts
ChatGPTRecord one or more account-to-account transfers in bulk (up to 1000). Each transfer is ONE transaction with type=Transfer, AccountId=source, ToAccountId=destination, CategoryId=null. Cross-currency transfers MUST set both exchange_rate and converted_amount (positive, in destination currency); same-currency transfers MUST leave both null.
update_user_settings
ChatGPTUpdate one or more fields of the user's profile settings (primary currency, week-start day, language, etc.). Pass only the fields you want to change; nulls preserve current values. Settings are a per-user singleton — there is exactly one row.
upload_receipt
ChatGPTAttach a receipt (JPEG/PNG/HEIC/WebP image or PDF) to an existing transaction. Server fetches the file from the provided HTTPS URL. Max 10MB; identical files (SHA-256) are deduplicated against the user's existing files; replaces any prior receipt on the same transaction. If the file is not yet at a public URL (e.g. it's a chat-attached photo), upload it first to a public host (Dropbox, Imgur, signed cloud-storage URL, etc.) and pass that URL.
upsert_accounts
ChatGPTCreate or update accounts in bulk (up to 1000). Items without sync_id create new accounts; items with sync_id update existing ones. Live balance is derived from transactions; only InitialBalance is editable here.
upsert_budgets
ChatGPTCreate or update budgets in bulk (up to 1000). Period is an integer enum: 0=Weekly, 1=Monthly, 2=Quarterly, 3=Yearly.
upsert_categories
ChatGPTCreate or update custom categories in bulk (up to 1000). Type is 'income' or 'expense'. Well-known categories are read-only — use upsert_categories only for user-custom categories.
upsert_category_groups
ChatGPTCreate or update category groups in bulk (up to 1000).
upsert_groups
ChatGPTCreate or update groups in bulk (up to 1000). Plain group CRUD only — sharing-token generation and member invites stay excluded from MCP.
upsert_recurring_transactions
ChatGPTCreate or update recurring transactions in bulk (up to 1000). Type is 'income' | 'expense' | 'transfer'. Frequency enum: 0=Daily, 1=Weekly, 2=BiWeekly, 3=Monthly, 4=Quarterly, 5=Yearly, 6=Custom.
upsert_tags
ChatGPTCreate or update tags in bulk (up to 1000). Each item without a sync_id creates a new tag; with a sync_id it updates. Use list_tags to discover existing sync_ids.
upsert_transactions
ChatGPTCreate or update income/expense transactions in bulk (up to 1000). For transfers use transfer_between_accounts; for account rebalance use adjust_account_balance. Items without sync_id create; items with sync_id update. account_id is optional — null means 'unassigned' (no specific account).