propose_transaction
Propose a new income or expense transaction. Returns a proposal id; to record it, call the confirm_proposal tool with the returned proposalId after the user approves (there is no UI button or proposal card to click in this context). Validate account exists and is owned by the user before calling.
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD. | |
| type | Yes | ||
| amount | Yes | Amount in MAJOR units (the displayed amount, e.g. 12.34 for $12.34, 50000 for Rp 50,000). The server scales to storage units; never pre-multiply by 100. | |
| currency | Yes | 3-letter currency code. May differ from the account's currency; the server records an exchange rate to convert into the account currency. | |
| accountId | No | Id of the financial account. Omit only in the email-import pipeline when the source email is genuinely ambiguous about which account paid - the user will pick one via the proposal card's Edit button. In chat, always pass a real id (ask the user instead of guessing). Do not pass an empty string; omit the field entirely instead. | |
| categoryId | No | Id of one of the user's categories, from their category list: the one that best matches what was bought or paid. Set it on every income and expense; omit it only when no category reasonably fits. Never a category name, and never an id that is not in the list. | |
| envelopeId | No | ||
| description | Yes | ||
| exchangeRate | No | Rate to convert the amount into the account's currency, used only when currency differs from the account. Usually omit - the server auto-fetches the rate as of the date. | |
| editsProposalId | No | Id of an existing pending proposal to update in place. Pass this when the user asks to modify a proposal you previously made (e.g. 'make it $50 instead'). Look up current ids with listPendingProposals if you're unsure. Omit when proposing something new. | |
| alreadyInBalance | No | Set true only for a payment the account's balance already holds, which you know in one of two ways: you compared a list from the user's bank with the ledger (ACCOUNT VIEWS) and the line is dated on or before the account's addedOn (from getAccounts), or the user says the payment is already in the account's balance. Hundo then records it without moving the balance. Needs accountId, and an account that has an addedOn. Omit it for anything else, such as a payment the user tells you about to log: every other entry moves the balance. |