putty
MCPPrivyTransactions

privy_prepare_transaction

Prepare an EVM transaction for signing, and return the unsigned transaction. **putty never signs and never sends** — the backend holds no key for any user. How the signature is produced depends on how you authenticated: - **Privy access token** (a dashboard user): pass `fromWalletId`, and the handler does an ownership check on that wallet (a wallet you do not own 403s). The result is `delivery: "dashboard"` — the website's sign-request modal picks it up, the user signs with their Privy wallet via `useSendTransaction`, and the website posts the hash back. - **`sk-` API key** (an external agent): you have no Privy wallet, so pass `from` — the address you will sign with. The result is `delivery: "unsigned"` and carries a persisted `TxRequest` with `unsignedTx` (the exact `chainId` / `to` / `data` / `value` to sign), a plain-English `summary` of what it does, and the `simulation`. Nothing is queued for the dashboard: you sign with your own wallet and may report the hash with `POST /tx-requests/{id}/submitted`. Use this as the entry point for any value-moving agent action; write a clear `description` so the user knows what they are signing. To check what a transaction would do first, use `simulate_transaction`; to follow a request to its receipt, use `tx_request_status`.

Prepare an EVM transaction for signing, and return the unsigned transaction. putty never signs and never sends — the backend holds no key for any user. How the signature is produced depends on how you authenticated:

Endpoint

(in-memory; returns a SignRequest for the user to sign in the browser)

Input

The tool takes a single JSON object. Every field, its type, and an example are on the generated reference at GET /mcp/tools, under this tool's name.

Calling it

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "privy_prepare_transaction", "arguments": {} }
}

Put your arguments in place of the empty object. A call that fails comes back as a normal result carrying isError: true and a message naming what went wrong, not as a JSON-RPC protocol error.

The full request and response shape, and a live playground, live on the generated reference at GET /mcp/tools.

On this page