propose_transfer
Propose a transfer between two of the user's accounts. Same-currency transfers move the amount as-is; cross-currency transfers use the user-supplied exchangeRate or fall back to the exchange rate in force on the transfer date (the latest stored rate when the history does not reach back that far). Always include a short user-supplied description; optionally include a fee, recorded as a separate expense on the source account, or on the destination account when feeCurrency is the destination's currency. 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).
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| fee | No | Optional transfer fee, MAJOR units (e.g. 2.50 for $2.50, 1000 for Rp 1,000), in feeCurrency. Recorded as a separate expense on the account whose currency it is in. | |
| date | Yes | ||
| amount | Yes | Amount to transfer, in fromAccount currency, MAJOR units (the displayed amount, e.g. 100.00 for $100.00, 50000 for Rp 50,000). The server scales to storage units; never pre-multiply by 100. | |
| toCurrency | No | 3-letter currency for the destination amount. Required when toAccountId is omitted; otherwise inferred from the account. | |
| description | Yes | Short user-supplied description, e.g. 'rent to landlord'. | |
| feeCurrency | No | 3-letter currency of the fee: the source account's (the default, e.g. the sending bank's charge) or the destination account's (e.g. a receiving bank that takes its fee out of what arrives). The fee comes out of the account with that currency. Any other currency is refused: convert the fee into one of the two first. | |
| toAccountId | No | Id of the destination account. Omit only in the email-import pipeline when the email is genuinely ambiguous about the destination account. Do not pass an empty string; omit the field entirely instead. | |
| exchangeRate | No | ||
| fromCurrency | No | 3-letter currency for the source amount. Required when fromAccountId is omitted; otherwise inferred from the account. | |
| fromAccountId | No | Id of the source account. Omit only in the email-import pipeline when the email is genuinely ambiguous about the source account - the user picks one via the Edit button. In chat, always pass a real id. Do not pass an empty string; omit the field entirely instead. | |
| 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. |