Skip to main content
Your agent can trade through Otto without handing Otto your money. Point any MCP client at https://mcp.ottoai.services, supply an address you control, and ask for a swap. What comes back is an unsigned execution plan: the ordered steps, the decoded calldata, the address the plan is bound to, an expiry, a digest, and the checks the constructor already ran on its own output. You sign it and broadcast it yourself. Otto has no path in that response by which it signs or submits. The four otto_prepare_* constructors are free to call.

Try it in one call

That is 1 USDC into WETH on Base, prepared for whatever address you put in accountProfile.address. Put in an address you control and the plan is one only you can execute.

What comes back

Each constructor’s own description states it verbatim: “never signs or submits.”

The plan states its own limits

replay_disclosure comes back on every envelope:
The constructor cannot enforce single execution. Your signer’s account nonce is the on-chain replay boundary, and on the Polymarket and Hyperliquid rails the venue’s own order hash or signer nonce is.

The twelve checks

An otto_prepare_swap envelope carries twelve assertions, each reported with its result in the response. A check that does not hold refuses the call by name rather than returning a plan.

The four constructors

Connection details for Claude Code, Claude Desktop, Cursor, Codex CLI, and ChatGPT, plus the full tool list, are on Otto Intel MCP.

Optional: a bounded permission to submit

Signing it yourself is the default and needs nothing from Otto. If you would rather Otto submitted for you, you can grant a bounded, revocable permission for Base swaps, and take it back whenever you want. The permission itself is fenced by a single project-scope policy, and that fence is publicly readable — call otto_delegation_fence_status with no arguments and no header:
It returns the fence’s public promise only: whether the policy is installed and current, its versioned name, the digest over its rules, the per-swap cap, and the public project id an agent binds its grant to. It never returns a user, a grant, or an address. Before any delegated send, Otto’s server confirms in order that the fence reads back by name and rules digest, that your grant is still active past the envelope’s valid_until, that the account is one of your own, that the envelope passes the verifier for exactly the request that produced it, and that the plan sits inside the fence. Where the output lands is Otto’s own server-side check. The three steps then go out in order, each waited to a sealed block; a halt clears the allowance and reports the read-back. Granting a permission today runs through otto-execute delegate, a command-line tool that is built but not yet published. Until it is, the constructors above are the reachable path, and the fence status is readable by anyone.

Which rail you are on

This page describes the agent rail. Otto’s /app deposit surface runs on a different arrangement — a Safe your own wallet solely owns, carrying an Otto-operated trading permission. The two are mapped side by side on Your Safe Account & Custody. Read the rail you are on.