propose_asset_trade
Propose a buy or sell trade for an asset. 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). To buy an asset the user does not hold yet, pass newAsset instead of assetId: confirming creates the asset and records the buy together. For sells, validates the user holds enough quantity. The cash account currency must match priceCurrency. Always include a short user-supplied description; optionally include a categoryId.
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. | |
| fees | No | Transaction fees in MAJOR units (e.g. 1.99 for $1.99, 5000 for Rp 5,000). Pass 0 if none. | |
| action | Yes | ||
| assetId | No | Id of the asset being traded, from getAssets. Omit it only for a buy of an asset the user does not hold yet, and pass newAsset instead. | |
| newAsset | No | Pass this INSTEAD of an asset id, only when getAssets shows the user does not hold the asset yet. Confirming the proposal creates the asset and records the trade together. | |
| quantity | Yes | Number of units to buy or sell. | |
| categoryId | No | Optional category id to attach to the cash transaction. | |
| description | Yes | Short user-supplied description, e.g. 'DCA into AAPL'. | |
| pricePerUnit | Yes | Per-unit price in MAJOR units (the displayed amount, e.g. 180.25 for $180.25, 3123.98 for Rp 3,123.98). Fractional values are allowed (e.g. 0.000001 for high-supply crypto). The server scales to storage units; never pre-multiply by 100. | |
| cashAccountId | No | Id of the cash account funding or receiving this trade. Omit only in the email-import pipeline when the source email doesn't make it clear which cash account is involved - 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. | |
| priceCurrency | Yes | 3-letter currency code for the trade price. | |
| 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. |