Your muse's wallet, as tools.
Eight MCP tools that let any agent buy stock tokens, pay in USDG and run a vault on Robinhood Chain. The key is created on the muse's machine and never leaves it. The ceiling lives on chain.
npx -y metamuse-mcp
Eight tools, one ceiling
Reads are free. Anything that moves money is signed on the muse's machine, relayed by us, and checked by the policy hook on chain before a single token moves.
metamuse_statusWhere you standAccount, balances, the policy, budget left today, and what to do next.
metamuse_bindGet a join linkRegisters the muse and returns the link its human opens to create the account. No gas.
metamuse_assetsTradable stocksRobinhood Stock Tokens with a live Chainlink price, bid and ask.
metamuse_quoteQuoteWhat a buy or sell returns right now, priced on Uniswap, checked against Chainlink.
metamuse_tradeBuy or sellFrom the account or the vault. Dry run with confirm=false. Refusals come back in plain words.
metamuse_payPay a URL in USDGFetches a paid API; on 402 it signs the exact price from the account, retries, returns the receipt.
metamuse_vaultVaultOpen one, read its NAV and holdings. Others deposit, the muse trades, they redeem in kind.
metamuse_receiptsReceiptsEverything the account paid or received through rh777, with transactions to show anyone.
Set it up in a minute
Pick your client. The first run creates the muse's keys in ~/.metamuse/muse.json (mode 600). Then ask it for metamuse_status.
# muse.json (or the MCP section of your muse's config)
{
"mcpServers": {
"metamuse": {
"command": "npx",
"args": ["-y", "metamuse-mcp"],
"env": { "METAMUSE_MAX_USD_PER_CALL": "25" }
}
}
}
claude mcp add metamuse -- npx -y metamuse-mcp # then, inside Claude Code: > use metamuse_status, then bind me and show the join link
# ~/.codex/config.toml
[mcp_servers.metamuse]
command = "npx"
args = ["-y", "metamuse-mcp"]
[mcp_servers.metamuse.env]
METAMUSE_MAX_USD_PER_CALL = "25"
# .cursor/mcp.json (also the shape most clients accept) { "mcpServers": { "metamuse": { "command": "npx", "args": ["-y", "metamuse-mcp"] } } } # read-only, no keys, for anything that speaks Streamable HTTP: { "mcpServers": { "metamuse-remote": { "url": "https://api.metamuse.lol/mcp" } } }
What stays where
- 1The key stays on the muse's machine. It is generated there on first run and only signatures leave. We never see it, so there is nothing of yours for us to lose.
- 2The ceiling lives on chain. Per-trade and daily limits, expiry and the pause switch are in a contract. The tool cannot talk its way past them, and neither can we.
- 3A second guard on the machine. METAMUSE_MAX_USD_PER_CALL refuses anything bigger before it is even signed. Default 50 USD.
- 4Gas is ours. Trades and payments are relayed. The muse never needs ETH, and no automation of ours can move what your human funded.
- 5Every action leaves a receipt. Transactions on Blockscout, payments on the rh777 explorer, refusals by name: OverPerTx, OverDaily, Paused.
Give your muse tools it can actually use.
On npm as metamuse-mcp. The same build is mirrored at metamuse.lol/mcp/metamuse-mcp.tgz.