account_balances
ClaudeThe balances on the dashboard: each account's current realized balance (what the bank shows: realized, not voided, card payments without a bill excluded), the total, and each account's reconciliation against the statement balance set with set_account_statement_balance (difference = computed minus statement; reconciled when it is zero). For a balance on a past date use balance_at instead.
aggregate
ClaudeSum transactions across a date range, grouped by category, counterparty, account, center, or month. Use this for "how much did I spend on X?", "what was my income last month?", "show me my spending by category this year", or any question that maps to a numeric total or breakdown. Voided and transfer-leg transactions are always excluded. If the user names a category or counterparty in natural language, call match_entity_name first to resolve it to a UUID.
balance_at
ClaudeCompute the running balance of an account (or the consolidated balance across all accounts) on a given date. Use for "how much was in my checking on April 30?", "what is my current balance?", or "did I close last year in the black?".
biggest_transactions
ClaudeReturn the largest individual transactions in a date range, by absolute amount. Use for "what was my biggest expense in March?", "show me my top 5 income transactions this year", or "where did most of my money go this quarter?". Names are decrypted client-side before reaching the model.
breakdown
ClaudeThe Reports screen: income or expenses of a year (or one month of it) ranked by category, counterparty or cost center, top 50, with each one's share and the rest summed as othersTotal. Transfers, voided rows and card payments without a bill are left out, as in the app. name null is the "uncategorized" or "without center" bucket. Use aggregate instead for any other date range or filter.
cashflow
ClaudeThe Cashflow screen for a year: income and expense per category for each of the 12 months (expenses negative), monthly totals, transfers in and out, and the balance at the end of each month from the opening balance. planned or all add scheduled and recurring projections. name null is uncategorized. Use monthly_summary for the totals alone.
create_account
ClaudeCreate an account as the app's account form does. type is checking, investment, creditcard or cash; a credit card takes a brand and the bill due day (used to date its imported purchases), cash has no bank. An opening balance (not for credit cards) is recorded as the account's "Initial Balance" transaction on its date, so balances reconcile with the bank. For a checking account the app can also create the same bank's investment account and credit card in one go (alsoCreateInvestment, alsoCreateCreditcard). Only the tenant owner can create accounts. Check list_accounts first so you do not create a second account for the same bank and type.
create_category
ClaudeCreate a category. Refuses, as the app does, a name reserved for transfers ("Transferência", "Transfer") and a synonym of a default category (e.g. "Restaurante" for "Alimentação"): the error names the default to use instead. Refuses a name another category already has. Only the tenant owner can create one. Call list_categories first to reuse an existing category instead.
create_center
ClaudeCreate a center. Refuses a name another center already has. Only the tenant owner can create one. Call list_centers first to reuse an existing center instead.
create_counterparty
ClaudeCreate a counterparty. Refuses a name another counterparty already has. Only the tenant owner can create one. Call list_counterparties first to reuse an existing counterparty instead.
create_recurring_transaction
ClaudeCreate a recurring planned transaction (a recurrence template), as the app's form does when a recurrence is chosen: it repeats weekly, biweekly, monthly or yearly from date, until end (or forever). It is always planned; each occurrence shows as projected until it is materialized (materialize_occurrence) or the recurrence is removed (remove_recurrence). list_recurrences shows the projected occurrences.
create_transaction
ClaudeCreate one manual transaction (planned or realized), as the app's transaction form does. Status defaults as in the app: planned when the date is in the future or the account is not a cash account (bank and card rows normally come from statement imports), realized otherwise. A realized row on a non-cash account breaks Maru's import rule and is refused unless the person agreed (acceptManualRule). For a credit card, effectiveDate is the bill date. For a transfer between accounts use the transfer operations; for a repeating one use create_recurring_transaction. Fails with transaction_limit_reached when the tenant's credits are used up.
create_transfer
ClaudeCreate a new transfer between two of the person's accounts, as the app's transaction form does with type Transfer: two linked transactions, an outgoing one on from and an incoming one on to, no category. Status defaults to planned, as in the app, because bank and card movements arrive by importing statements; a realized transfer touching a non-cash account breaks that rule, so it is refused unless the person confirmed it and you pass acceptManualRule. Uses two transaction credits. To pair existing transactions use transfers_link instead.
delete_accounts
ClaudeDelete accounts by id (up to 200). An account's own "Initial Balance" opening row is deleted with it, as the account form owns it; any other transaction blocks the delete, so this refuses up front and names those accounts: delete or move their transactions first with the transaction operations. Destructive: the first call returns the plan and changes nothing; call again with the confirm token once the person agrees. Only the tenant owner can delete accounts.
delete_categories
ClaudeDelete categories by id (up to 200). Destructive: the first call returns the plan (each category with how many transactions use it, and what happens to them) and changes nothing; call again with the confirm token once the person agrees. Its transactions stay and become uncategorized (the uncategorized filter finds them). Move them to another category first if that matters. Only the tenant owner can delete. Get ids from list_categories.
delete_centers
ClaudeDelete centers by id (up to 200). Destructive: the first call returns the plan (each center with how many transactions use it, and what happens to them) and changes nothing; call again with the confirm token once the person agrees. Its transactions stay and lose their cost center. Move them to another center first if that matters. Only the tenant owner can delete. Get ids from list_centers.
delete_counterparties
ClaudeDelete counterparties by id (up to 200). Destructive: the first call returns the plan (each counterparty with how many transactions use it, and what happens to them) and changes nothing; call again with the confirm token once the person agrees. Its transactions stay and lose their counterparty. Move them to another counterparty first if that matters. Only the tenant owner can delete. Get ids from list_counterparties.
delete_transactions
ClaudeDelete explicit manual transactions, as the app's Delete does. Destructive: the first call returns the plan (each row with its date, amount, description and every side effect) and deletes nothing. Deleting one leg of a transfer deletes the other leg too; deleting a recurrence template stops its projections and keeps its materialized occurrences, detached; an account whose opening balance it was loses that link. Imported rows, and transfer legs whose other leg is imported, are refused and listed with the reason (undo an import with the import operations). To only stop a recurrence and keep the row, use remove_recurrence.
get_transaction
ClaudeOne transaction in full, decrypted: date, effective date, amount, description, notes, account, category, counterparty, center, status, voided, whether it was imported, its transfer counterpart, its recurrence (template or occurrence) and whether it is an account's opening balance. Use it before changing a transaction, to show the person what is there.
import
ClaudeImport statements: the same judgment as import_preview, then commit every row that is not open, and post the statement's opening balance as the account's initial balance when the account has none (as the app does). Destructive: the first call returns the preview's judgment (counts per file, balance effect, opening balance, rows left out) as the plan; call again with its confirm token to commit exactly that. Run import_preview first and resolve open rows with decisions. When several files are imported together each is re-judged after the previous one is committed, so a later file can pair with rows the earlier one created. Undo a whole import with undo_import. Rows the web app commits without asking (new rows, certain duplicates skipped, auto-matches, investment yields) are judged the same way. Rows the web would put in front of the person are returned under open with their reasons (match, probable_duplicate, unmatched_payment = a card payment with no bill behind it, "Pag. sem fatura"), candidates and allowed actions, and are LEFT OUT of a commit until decisions cover them. Decisions are an object: {"applyOpeningBalance"?: boolean, "files"?: {"<file name>": {"account"?: "<id|name>", "dueDay"?: 1-31}}, "rows"?: {"<rowId>": {"action"?: "accept"|"link"|"transfer"|"skip", "transactionId"?, "account"?, "category"?, "counterparty"?, "center"?}}}. Row ids are stable for the same file and account. Non-open rows are counted per file; pass all, or offset and limit, to list them.
import_preview
ClaudeDry run of a statement import: parse each file, detect its account, and judge every row against the ledger without writing anything. Run it before import, show the person the summary and the open rows, and build the decisions from their answers. Rows the web app commits without asking (new rows, certain duplicates skipped, auto-matches, investment yields) are judged the same way. Rows the web would put in front of the person are returned under open with their reasons (match, probable_duplicate, unmatched_payment = a card payment with no bill behind it, "Pag. sem fatura"), candidates and allowed actions, and are LEFT OUT of a commit until decisions cover them. Decisions are an object: {"applyOpeningBalance"?: boolean, "files"?: {"<file name>": {"account"?: "<id|name>", "dueDay"?: 1-31}}, "rows"?: {"<rowId>": {"action"?: "accept"|"link"|"transfer"|"skip", "transactionId"?, "account"?, "category"?, "counterparty"?, "center"?}}}. Row ids are stable for the same file and account. Non-open rows are counted per file; pass all, or offset and limit, to list them.
list_accounts
ClaudeList the bank, investment, credit card and cash accounts with everything the accounts screen shows: decrypted name, type, bank (code and name), card brand and due day, opening balance (the "Initial Balance" transaction), the statement balance set for reconciliation, current realized balance, how many transactions each holds, and how far statements have been imported. Use it to find account ids for the other operations.
list_categories
ClaudeList every category of the tenant with its decrypted name, color, icon and how many transactions use it (transactionCount, with their income and expense totals over all time). Use it to find ids before create_category, update_category, rename_category or delete_categories.
list_centers
ClaudeList every center of the tenant with its decrypted name and how many transactions use it (transactionCount, with their income and expense totals over all time). Use it to find ids before create_center, rename_center or delete_centers.
list_counterparties
ClaudeList every counterparty of the tenant with its decrypted name, color and how many transactions use it (transactionCount, with their income and expense totals over all time). Use it to find ids before create_counterparty, update_counterparty, rename_counterparty or delete_counterparties.
list_ids
ClaudeFetch transaction IDs matching a filter. Use this when you need a count or want to follow up with search_descriptions over a specific subset. Capped at limit; check truncated before drawing conclusions about totals.
list_imports
ClaudeList past statement imports, newest first, as the app's Import History shows them: file name, account, statement period, rows imported, and the rows and sum as they stand now (edited when the import's transactions were changed or removed since). Use an id with undo_import, or list its transactions with the transaction tools by importId.
list_recurrences
ClaudeRecurring transactions (templates) and their projected occurrences between from and to, as the app's transaction list projects them: occurrences already materialized are not projected again. Use it to find the templateId and date for materialize_occurrence, or a templateId for remove_recurrence.
list_statement_uploads
ClaudeLists the statement files uploaded to Maru in this conversation that have not expired (uploads last an hour), newest first, with their uploadId. Use it after the person picks a file in the upload panel.
list_transactions
ClaudeList individual transactions in a date range, ordered by date or amount. Use this whenever the user wants to SEE specific transactions rather than a sum: "list my transactions for the first week of March", "what was my first/last transaction this month?", "show me March transactions with their descriptions". Names are enriched client-side. Descriptions are included only when the description-consent toggle is on (otherwise descriptionsOmitted is true) — date, amount, category, counterparty and account are always available regardless of consent. Prefer this over biggest_transactions when the user is not asking specifically about the LARGEST transactions.
match_entity_name
ClaudeFuzzy-match free-form text against the user's categories, counterparties, accounts, or centers. Always call this first when the user mentions a name in natural language ("restaurantes", "Nubank", "filial SP"), then pass the matched UUID to other tools as a filter. Returns up to limit candidates sorted by score; pick the highest unless the user clearly meant another match.
materialize_occurrence
ClaudeTurn one projected occurrence of a recurring transaction into a real transaction, as opening a projected row in the app and saving it does: it copies the template, takes the occurrence date, stays linked to its template, and applies any overrides given (e.g. the actual amount). Status defaults as in the app: planned for a future date or a non-cash account, realized otherwise; realized on a non-cash account needs acceptManualRule. Find templateId and date with list_recurrences. Fails if that date is not an occurrence or is already materialized, and with transaction_limit_reached when credits are used up.
monthly_summary
ClaudeThe dashboard's income, expense and transfer totals for a year by month, or for one month by day, with the opening balance and the closing balance after each period. Excludes voided rows, recurrence templates and card payments without a bill, as the dashboard does; planned includes projected recurrences. expense is a positive number. For totals over any other date range or by category use aggregate.
reconcile_balance
ClaudeCheck an account against the balance its bank statement prints on a date. Stores that balance and date on the account (the account form's statement reconcile fields), so the app's off-by indicator agrees, then reports the ledger balance the app computes for that day (realized, not voided, card payments without a bill excluded), the difference, and the account's transactions within 3 days of the date. The result carries the statement balance and date the account held before, so it can be set back. For a read-only balance use balance_at.
reconcile_statement
ClaudeCompare a statement file with the ledger for the statement's period: rows missing from Maru, near misses (same date and amount, different description), and rows in Maru the statement lacks, through the same reconcile_statement logic the in-app assistant uses. Also compares the statement's closing balance, when it prints one, with the ledger balance on its last day. Read-only: to bring missing rows in, use import_preview and import.
remove_recurrence
ClaudeStop a recurring transaction, as the app's Remove Recurrence does: no more occurrences are projected, the transactions already materialized are kept (detached from it), and the template itself stays as one planned transaction on its first date (delete it with delete_transactions if unwanted). Takes the template id or the id of one of its materialized occurrences. Destructive: the first call returns the plan.
rename_category
ClaudeRename a category. Destructive: the old name is overwritten everywhere it shows. The first call returns the plan (old and new name, how many transactions use it) and changes nothing; call again with the confirm token once the person agrees. Same name rules as create_category. Only the tenant owner can rename. Get the id from list_categories.
rename_center
ClaudeRename a center. Destructive: the old name is overwritten everywhere it shows. The first call returns the plan (old and new name, how many transactions use it) and changes nothing; call again with the confirm token once the person agrees. Same name rules as create_center. Only the tenant owner can rename. Get the id from list_centers.
rename_counterparty
ClaudeRename a counterparty. Destructive: the old name is overwritten everywhere it shows. The first call returns the plan (old and new name, how many transactions use it) and changes nothing; call again with the confirm token once the person agrees. Same name rules as create_counterparty. Only the tenant owner can rename. Get the id from list_counterparties.
search_descriptions
ClaudeSubstring-search transaction descriptions and notes for a phrase. Privacy-sensitive: requires the user to have enabled the description-consent toggle. If consentDenied is true on the response, do NOT guess answers — tell the user how to enable the toggle and offer to continue with the structured tools instead.
set_account_statement_balance
ClaudeRecord the balance a bank statement shows on a date, so the app flags whether the account reconciles (the computed realized balance on that date against this one; account_balances reports the difference). Pass balance null to clear it. Not for cash accounts, as in the app. The result carries the previous statement balance and date, so the change can be set back.
set_transaction_labels
ClaudeSet (or clear with null) the category, counterparty and/or center of explicit transactions, as the app's inline edit and bulk bar do. Setting or clearing a category un-voids a voided row, as in the app. On a transfer leg the category is refused (transfers have none) and counterparty/center apply to both legs, as the app's transfer form does. Values are ids or names; createMissing creates a missing name (owner role). Refuses the transfer and voided pseudo-categories: use the transfer operations or void_transactions. The result carries each row's previous labels (and voided flag), so the change can be set back.
set_transaction_notes
ClaudeReplace the notes of one transaction (null or empty clears them), as the app's form does; allowed on imported rows too. On a transfer leg the notes apply to both legs, as in the app. The result carries the previous notes so they can be put back.
set_transaction_status
ClaudeMark explicit transactions planned or realized, as the status field of the app's form does. Realizing a manual row on a non-cash account, or changing the status of an imported row, breaks Maru's import rule and needs acceptManualRule after the person agreed. Going back to planned resets a manual row's effective date to its date (the app's form does the same); effectiveDate sets it when realizing. Refuses transfer legs (use the transfer operations) and recurrence templates (use materialize_occurrence). The result carries each row's previous status and effective date, so the change can be set back.
store_statement_upload
ClaudeCalled by the upload panel, not by the model: stores the bytes of the file the person picked and returns its uploadId.
transaction_years
ClaudeThe years that have transactions, newest first: the year choices of the dashboard, reports and cashflow. Use it to pick a year for monthly_summary, breakdown or cashflow.
transfers_candidates
ClaudeList the transactions that could be the other leg of a transfer for one transaction: on another account, opposite amount, within 3 days, not voided and not already a transfer (the app's "Create Transfer" dialog). Link one with transfers_link, or create the other leg on an account with transfers_link and account.
transfers_convert
ClaudeTurn transactions (all expenses or all incomes, none already a transfer) into transfers from one account to another, as the transactions list's bulk "Convert to transfer" does: each transaction becomes the leg on from (with a negative amount, category cleared) and a new opposite leg is created on to. When all of them are on one account, that account must stay their side: from for expenses, to for incomes. A transaction moved to another account loses its link to its import. Each conversion uses one transaction credit. Up to 200 ids. Destructive: the first call returns the plan; call again with its confirm token. Undo one with transfers_unlink.
transfers_link
ClaudeMake a transaction one leg of a transfer, as the app's "Create Transfer" dialog does. With linkedTransactionId, links two existing transactions on different accounts with opposite amounts (both lose their category and are no longer voided). With account, creates the other leg on that account instead (one transaction credit): for an expense the transaction stays on its account and the new income leg goes to account; for an income the transaction moves to account as the outgoing leg and a new income leg is created on its original account. Destructive (categories are cleared): the first call returns the plan; call again with its confirm token. Find candidates with transfers_candidates first; undo with transfers_unlink.
transfers_unlink
ClaudeUndo a transfer ("Unlink" in the app's transfer details): both legs become ordinary transactions again, without a category. Nothing is deleted. Destructive: the first call returns both legs as the plan; call again with its confirm token.
undo_import
ClaudeDelete a statement import and every transaction it owns, as "Delete" in the app's Import History does. That includes rows the import created and planned transactions it matched (they now belong to it). Transfer legs on other accounts that were paired with its rows are kept and become ordinary transactions. The opening balance it posted is kept. Destructive and permanent: the first call returns every transaction it would delete as the plan; call again with its confirm token. Find the id with list_imports.
unmatched_card_payments
ClaudeCredit card bill payments the app labels "Pag. sem fatura": a payment whose card bill (fatura) for the period was never imported, so nothing on the card offsets it. Both legs are listed: the card-side leg is left out of the card balance and of every report, the checking-side leg is real money out and still counts. Importing the missing card statement fixes them. billDifferences lists the matched payments ("Pag. Fatura") whose amount differs from the bill, with the bill minus payment difference.
unmatched_payments
ClaudeList credit card payments that no imported card bill covers ("Pag. sem fatura" in the app), both the card-side and the checking-side rows. The card-side row is left out of the card's balance until the bill behind it is imported; the checking-side row is real money out and counts. Resolve one by importing the card statement that covers it (import_preview then import), or pair it with transfers_candidates and transfers_link. Read-only.
unvoid_transactions
ClaudeReactivate voided transactions so they count in balances and reports again, as the app's Reactivate action does. Refuses transfer legs.
update_account
ClaudeChange an account's label, type, bank, card brand, due day or opening balance. Destructive: these change how statements are imported and matched and what the balances add up to, so the first call returns the plan (every field before and after, and the side effects) and changes nothing; call again with the confirm token once the person agrees. As in the app, a type other than creditcard clears brand and due day, cash clears the bank, and a credit card has no opening balance. A new due day dates future imports only; existing transactions keep their dates. Only the tenant owner can change accounts. For the reconciliation statement balance use set_account_statement_balance.
update_category
ClaudeChange how a category looks: its color and icon. To change its name use rename_category. Only the tenant owner can change it. The result carries the previous values, so the change can be set back.
update_counterparty
ClaudeChange how a counterparty looks: its color. To change its name use rename_counterparty. Only the tenant owner can change it. The result carries the previous values, so the change can be set back.
update_transaction
ClaudeChange the description, amount, date, effective date or account of one manual transaction, or the schedule (rule, end) of a recurrence template, as the app's edit form does. Destructive: the old values are overwritten, so the first call returns a before/after plan. Refuses imported rows (they mirror the bank statement; only labels, notes, status and voided can change), transfer legs (use the transfer operations), a date change on a reconciled row, an effective date on a planned row, and a schedule on an occurrence (change its template). Status: set_transaction_status; labels: set_transaction_labels; notes: set_transaction_notes.
update_transfer
ClaudeChange an existing transfer, both legs at once, as the app's transaction form does when editing a transfer: amount, date, description, notes, accounts, counterparty or center. When either leg came from a bank statement, only counterparty, center and notes can change, as in the app. A category cannot be set on a transfer. Destructive (the old values are overwritten): the first call returns the plan with every change; call again with its confirm token.
upload_attached_statement
ClaudeGets a statement file the person attached to this chat (OFX, CSV, PDF, XLSX or XLS, up to 10 MB) into Maru and returns its uploadId for the import and reconciliation tools. Pass the attached file as file.
upload_statement
ClaudeGets a bank or card statement file (OFX, CSV, PDF, XLSX or XLS, up to 10 MB) into Maru for this conversation and returns its uploadId, which import and reconciliation tools take as the statement ({ "uploadId": "..." }). Uploads last an hour. It shows the person a panel to pick the file; once they say they picked it, get its uploadId from list_statement_uploads. If the file is already attached to the chat and upload_attached_statement is available, use that instead. Without a panel, ask the person to attach the file, or pass an OFX or CSV as text to the import tool.
void_transactions
ClaudeVoid ("ignore") explicit transactions: they stay in the list but are excluded from balances and reports, as the app's Ignore action does. Their category is kept, so unvoid_transactions restores them exactly. Refuses transfer legs (unlink the transfer first, as the app requires). Allowed on imported rows.