Any agent with a key: an MCP server in Claude or Cursor, a script, a bot. Your passkey sets what it may spend each day and who it may pay. Monad checks it inside every payment, so a hijacked or confused agent can't spend past it.
Run this once. It prints an agent address and its key. Or use any Monad address your agent already controls.
npx leash-monad-mcp --new-key
Your passkey is the owner. No seed phrase, no wallet extension.
Fund this account, not the agent. The agent spends from here, inside its leash.
No key yet? A Privy server wallet becomes the agent. Its Privy policy only lets it call pay() on this account, on Monad, so nobody holds a key that could do anything else.
Your account holds —. Withdrawing needs your passkey; nobody else can. Real USDC goes first; demo dollars only if that's all there is.
Privy signs for the agent, but only what its policy allows: pay() on your Leash account, on Monad. Your leash then decides, inside the payment, whether that payment goes through. Try all three.
Add this to your MCP client (Claude Desktop, Cursor, or anything that speaks MCP). The agent gets four tools: check_agent, my_budget, pay and fetch_paid, which pays a 402 API once and retries. We topped it up with a little MON for gas.