Moneo gives an AI agent its own account, its own spending limits, and its own access to markets. Three SDKs: a wallet whose keys the model never sees, a guard that evaluates every payment before it is signed, and an execution layer for markets that never close.
Adopt them one at a time. The wallet works alone, the guard wraps anything that spends, and trading is just another caller the guard has to approve.
The guard sits between the agent's intent and the signer. A blocked payment is never broadcast, never costs a fee, and comes back as a structured reason the agent can reason about, not a stack trace it can retry into oblivion.
Nothing here is a migration. Each step is a call you add next to the code you already have.
Declare what this agent may do with money: caps per transaction, a rolling budget, who it can pay, what it can trade, and the threshold where a human has to say yes.
One call creates a funded account for a named agent, with the policy already attached. Custody is a TEE signer, an MPC quorum, or your own KMS. Nothing about the key material crosses into the model's context.
Expose the SDKs to your agent over MCP or plain function calling. It sees pay, swap, quote, balance, and gets a structured refusal when policy says no.
Every attempt is recorded with its verdict and reason, attributable to one agent, one run, one policy version. Reconciliation stops being archaeology.
Policy evaluation is free and unmetered. You should never be billed for the decision to say no. Sandbox is free outright.
TypeScript and Python, same surface. Start on the sandbox ledger with test funds, flip one flag when you want it real.
Read the docsimport { createGuard } from "@moneolabs/guard"; // Policy is data, versioned like code. Pass it to createWallet// and it runs before anything is signed.const guard = createGuard({ perTransaction: { max: "$250" }, rolling24h: { max: "$2,000" }, counterparties: "allowlist-only", allow: ["x402:*", "0x9f3c…a71b", "stripe:acct_1Nz"], escalate: { above: "$500" },}); // Denials arrive as values, not exceptions the agent can swallow.const decision = await guard.check({ action: "pay", amount: "$8,200" });// → { verdict: "block", reason: "exceeds the rolling 24h budget" }Sandbox access is open. Production ledgers are onboarding now.