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
Works with Muse Code · Claude Code · Codex · Cursor · any MCP client · listed in the MCP Registry as lol.metamuse/wallet
metamuse-mcp · stdio · Robinhood Chain

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.

readmetamuse_statusWhere you stand

Account, balances, the policy, budget left today, and what to do next.

oncemetamuse_bindGet a join link

Registers the muse and returns the link its human opens to create the account. No gas.

readmetamuse_assetsTradable stocks

Robinhood Stock Tokens with a live Chainlink price, bid and ask.

readmetamuse_quoteQuote

What a buy or sell returns right now, priced on Uniswap, checked against Chainlink.

signsmetamuse_tradeBuy or sell

From the account or the vault. Dry run with confirm=false. Refusals come back in plain words.

signsmetamuse_payPay a URL in USDG

Fetches a paid API; on 402 it signs the exact price from the account, retries, returns the receipt.

signsmetamuse_vaultVault

Open one, read its NAV and holdings. Others deposit, the muse trades, they redeem in kind.

readmetamuse_receiptsReceipts

Everything 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

  • 1
    The 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.
  • 2
    The 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.
  • 3
    A second guard on the machine. METAMUSE_MAX_USD_PER_CALL refuses anything bigger before it is even signed. Default 50 USD.
  • 4
    Gas is ours. Trades and payments are relayed. The muse never needs ETH, and no automation of ours can move what your human funded.
  • 5
    Every action leaves a receipt. Transactions on Blockscout, payments on the rh777 explorer, refusals by name: OverPerTx, OverDaily, Paused.
key never leaves
Muse's machinemetamuse-mcp · ~/.metamuse/muse.json · signs batches and payments
↓ signatures only
MetaMuse engineapi.metamuse.lol · builds typed data, relays, pays gas, keeps receipts
↓ one transaction
Robinhood ChainCalibur account + policy hook · router priced by Chainlink · Permit2 for rh777

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.