MCP server
BetaConnect an AI agent to NoFomo over the Model Context Protocol: read markets and clusters, and build transactions it signs itself.
Remote or local
Your agent
Claude, or any MCP client
NoFomo MCP (stateless)
reads + transaction builders
Your wallet signs
the server never sees a key
Your agent
spawns the package on your machine
nofomo-mcp
calls the same API, checks your spend limits
Robinhood Chain
the key never leaves your machine
| Remote | Local | |
|---|---|---|
| Endpoint | POST /api/mcp, Streamable HTTP, stateless | nofomo-mcp over stdio |
| Writes return | A PreparedTx for a wallet to sign | A sent transaction hash, signed locally |
| Keys | None | NOFOMO_AGENT_KEY, only on your machine |
| Best for | Research, monitoring, agents that hand transactions to a human or a wallet | Agents that act on their own, inside a spend limit |
Connect
claude mcp add --transport http nofomo https://nofomoagent.com/api/mcpclaude mcp add nofomo \
-e NOFOMO_AGENT_KEY=0xYOUR_AGENT_PRIVATE_KEY \
-e NOFOMO_MAX_ETH_PER_TX=0.05 \
-e NOFOMO_MAX_ETH_PER_DAY=0.2 \
-- npx -y nofomo-mcp{
"mcpServers": {
"nofomo": {
"command": "npx",
"args": ["-y", "nofomo-mcp"],
"env": {
"NOFOMO_AGENT_KEY": "0xYOUR_AGENT_PRIVATE_KEY",
"NOFOMO_MAX_ETH_PER_TX": "0.05",
"NOFOMO_MAX_ETH_PER_DAY": "0.2"
}
}
}
}For the remote server instead, add a custom connector in Claude Desktop settings with the URL https://nofomoagent.com/api/mcp.
curl -X POST https://nofomoagent.com/api/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Use a fresh wallet as the agent key, funded with only what the agent should be able to spend. Never paste a main wallet's key into a config file.
Tools
Amounts are decimal ETH strings like "0.01", ids look like current-3, and results use the same shapes as the API.
Read
find_marketsSearch stock and Pons markets by symbol, name or address; filter by kind.
kind?, query?, sort?, limit?
get_marketOne market: price, reserve, capacity per ceiling, open cluster.
market
list_clustersClusters, newest first, filtered by status, market or wallet.
status?, market?, wallet?, limit?
get_clusterOne cluster with its participants and, once cleared, its result.
id
get_executionOne mandate execution with its per-allocator fills.
id
get_statsNetwork totals: clusters cleared and forming, capital, wallets, mandates.
no arguments
Transaction builders
On the remote server these return a PreparedTx: { chainId: 4663, to, data, value, description }. The description is written for the signer and always notes that the contracts are unaudited. Builders validate against live chain state, so a transaction that comes back is one the contract would accept at that moment.
submit_intentJoin the open cluster for a market, or open one if none is forming.
market, amountEth, windowSec?, ceilingBps?
join_clusterJoin a specific forming cluster.
clusterId, amountEth
cancel_intentLeave a cluster before it closes, for a full refund.
clusterId
clear_clusterCrank a closed cluster. Permissionless; costs only gas (send the suggested gas).
clusterId
claimClaim tokens and any refund; retrieves parked stock tokens; forWallet pushes another's claim.
clusterId, wallet?, forWallet?
arm_mandateArm a mandate behind an originator with caps, ceiling, expiry and V2 scope.
originator, amountEth, perExecEth, dailyCapEth, ceilingBps, expiry?, market?, maxSpotEth?
revoke_mandateRevoke a mandate and return its balance.
mandateId
Local signer and spend limits
The local package calls the same public API, then signs and sends with NOFOMO_AGENT_KEY. Before signing, it checks two limits you set:
| Variable | Meaning |
|---|---|
NOFOMO_AGENT_KEY | Private key of the agent wallet. Never sent anywhere. |
NOFOMO_MAX_ETH_PER_TX | Largest ETH value the agent may send in one transaction. |
NOFOMO_MAX_ETH_PER_DAY | Total ETH the agent may send per day. |
These are local safety rails on top of the onchain ones (a cluster's ceiling, a mandate's caps). For an agent that spends someone else's capital, prefer a mandate: its limits are enforced by the contract, not by software on one machine.
A typical session
find_marketswithtradable: trueto see what can be cleared, andget_marketfor capacity at the ceiling you want.submit_intentwith a market and an amount. It joins the forming cluster, or opens one.get_clusterto follow it. Change your mind before close withcancel_intent.- After close,
clear_clusterif nobody has yet, thenclaim.