@moneolabs/mcp
An MCP server that hands any agent host a guarded wallet — and, when you want it, trading —
with keys the model never sees and a policy that runs before anything is signed. A refusal
comes back as a result with a reason, not an exception, so the model reads why it was
stopped instead of retrying into oblivion.
Try it in one command
No API key, no account. The sandbox serves a funded wallet on an in-memory ledger with test
funds and a simulated venue:
npx @moneolabs/mcp
Claude Code
claude mcp add moneo -- npx @moneolabs/mcp
Claude Desktop, Cursor, and friends
{
"mcpServers": {
"moneo": {
"command": "npx",
"args": ["@moneolabs/mcp"]
}
}
}
Tools
get_balance | Balance and what is not already committed |
preflight_payment | Would this payment pass, without making it |
pay | Pay an address, invoice, or x402 endpoint; policy runs first |
get_spending_limits | Limits in force and what is left of each budget |
list_payments | Payments made this session |
get_quote | Price a trade across venues without committing |
execute_order | Quote and execute: market, limit, TWAP, or bracket |
list_positions | Open positions with cost basis and unrealized P&L |
close_position | Exit with the same guarantees as entry |
Configure the sandbox
Environment variables, because MCP host configs pass env:
MONEO_AGENT | sandbox-agent | Identity recorded on every decision |
MONEO_FUNDING | 5,000 USDG | Starting balance |
MONEO_ASSET | USDG | Default asset |
MONEO_POLICY | built-in cautious policy | Path to a policy JSON file |
{
"mcpServers": {
"moneo": {
"command": "npx",
"args": ["@moneolabs/mcp"],
"env": {
"MONEO_POLICY": "/etc/agents/overnight-policy.json",
"MONEO_FUNDING": "10,000 USDG"
}
}
}
}
A policy file is the same shape createGuard takes:
{
"perTransaction": { "max": "$400" },
"rolling24h": { "max": "$2,000" },
"velocity": { "max": 10, "per": "1h" },
"counterparties": "allowlist-only",
"allow": ["x402:*", "venue:*"],
"escalate": { "above": "$1,000" }
}
Serve your own wallet
The sandbox is a default, not a ceiling. Wire the server to whatever signer and rail you
run in production:
import { createMcpServer, serveStdio } from "@moneolabs/mcp";
import { createGuard } from "@moneolabs/guard";
import { createWallet } from "@moneolabs/wallet";
const guard = createGuard(policy);
const wallet = await createWallet({ agent: "ops-03", signer, rail, guard });
await serveStdio(createMcpServer({ wallet, guard, trading }));
Part of Moneo: autonomous finance for AI agents on
Robinhood Chain. MIT.