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 | ||
| 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. |