MENTAT
The OTC venue built for agents. Every fill proves what its chain can prove.
ERC-8004 agent #31596 on Base (registry 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432). Three settlement paths, one JSON contract on every quote and order, a public tape of every fill. Contact trade@mentat.market.
Plain-text version for models: /llms.txt
Install
The ClawHub skill teaches an OpenClaw agent every endpoint below and the response contract.
clawhub install mentat- ClawHub skill https://clawhub.ai/agora0x/skills/mentat
Use MENTAT from Hermes
Hermes Agent (Nous Research) uses MENTAT through its MCP server. No API key is needed.
1. Add the MCP server to ~/.hermes/config.yaml under the name mentat: the mcp_servers block below.
2. Optional: install the MENTAT skill from mentat.market with the hermes skills install line below. It is the same skill as on ClawHub, and it also works over REST without the MCP server.
3. Test it with this prompt: "Using MENTAT, show me the open order book on Base and explain what you see".
mcp_servers:
mentat:
url: "https://api.mentat.market/mcp"
hermes skills install well-known:https://mentat.market/.well-known/skills/mentatHermes troubleshooting
- Tool namesHermes names MCP tools mcp_{server}_{tool}, so MENTAT's are mcp_mentat_get_book, mcp_mentat_get_deal, mcp_mentat_create_deal, mcp_mentat_get_quote. If they are missing, check that the server is named mentat in config.yaml.
- HTTP 429The model provider is rate-limiting the agent, not MENTAT. Switch to another model or provider and try again.
- ApprovalsHermes does not ask before it calls an MCP tool. MENTAT only returns unsigned steps, so pair Hermes with a wallet that enforces its own approvals and spending limits, and confirm each step's intent before it is signed.
Endpoints on api.mentat.market
Every call is free, quotes included: MENTAT earns its 25 bps fee on settlement, never on a quote.
The official contract list is https://api.mentat.market/.well-known/contracts.json: the escrow with its function selectors, the verified tokens, and the addresses an agent wallet needs to allowlist. Match on those addresses, never on a ticker.
- MCPPOSThttps://api.mentat.market/mcp — Streamable HTTP; legacy SSE at /sse + /messages
- A2A (JSON-RPC)POSThttps://api.mentat.market/a2a — tasks/send with skill_id + arguments
- Agent cardGEThttps://api.mentat.market/.well-known/agent.json
- REST quoteGEThttps://api.mentat.market/api/quote?from=XMR&to=USDC&amount=0.1&to_address=0xYourBaseAddress — free
- TapeGEThttps://api.mentat.market/api/tape?limit=50 — every fill, newest first; /api/tape/{id} is one receipt; /api/stats the figures
- Open bookGEThttps://api.mentat.market/api/book — open V3 deals in the taker frame with reference, distance, maker_fills and fill steps; also the get_book skill and tool; synced: false while the indexer catches up. /api/book/reference is the price reference by token address; /api/makers/{address} one maker's settled fills
- Route statusGEThttps://api.mentat.market/api/routes — XMR routing live or paused
- HealthGEThttps://api.mentat.market/health
Quote the XMR route
Amounts are decimal strings, never floats. to_address lets the venue price the destination leg; 0xYourBaseAddress is a placeholder for the Base address that should receive the USDC.
curl -s "https://api.mentat.market/api/quote?from=XMR&to=USDC&amount=0.1&to_address=0xYourBaseAddress"Response contract
Every quote and order carries the same four fields. Refusals carry a machine code, never prose alone.
- settlement_pathescrow | cow_relay | wagyu_route (quote_only when the pair cannot be executed on chain).
- route_legs[]{ leg, name, chain, chain_id, proof_kind, proofs } — the legs this path settles through and the proof each can carry.
- proofs[]{ chain, kind, hash, explorer_url } — empty on a quote; on an order, one entry per exposed hash, appended as each chain confirms it (Hyperliquid fill hashes arrive after completion too).
- mentat_fee_bps25 on every path. On the XMR route it is applied inside to_amount and counted in effective_cost_bps (the all-in number).
- code (on refusal)routing_paused, below_minimum, above_maximum, no_route, amount_below_minimum, invalid_request, rate_limited, create_uncertain, execution_disabled.
{
"quote": {
"settlement_path": "wagyu_route",
"from_token": "XMR", "to_token": "USDC",
"from_amount": "0.1", "to_amount": "50.41",
"mentat_fee_bps": 25,
"effective_cost_bps": 202,
"route_legs": [
{ "leg": 1, "name": "source", "chain": "monero", "proof_kind": "deposit_tx" },
{ "leg": 2, "name": "hyperliquid_swap", "chain": "hyperliquid", "proof_kind": "fill_tx" },
{ "leg": 3, "name": "destination", "chain": "base", "proof_kind": "payout_tx" }
],
"proofs": [],
"reference": { "source": "hyperliquid", "perp_mark": 551.08, "spot_mid": 550.98 }
}
}Deals and token trust
FloorEscrow V3 deals, for agents: get_book lists the open book, get_deal reads one deal by id, create_deal prepares a new one. The same three tools over MCP and A2A, or REST on api.mentat.market. Free. MENTAT never signs: create_deal returns the maker's two transactions unsigned, and fill steps are given only while a deal is open and neither token is a fake.
Match on address, never ticker. Anyone can deploy a token called USDC; its symbol and its balance come from its own code. Every side of every deal carries the same verdict this site shows, decided by the token address against MENTAT's verified list.
MENTAT never DMs deal links, and they only live at https://mentat.market/deal/. An id the contract says does not exist answers found: false and status not_found: do not send funds to anyone claiming otherwise. A deal that cannot be checked right now answers status unknown with code chain_unavailable: don't deposit until it can be checked.
The example below gives 1,000 USDC for 1,001 DAI, slightly above market for the maker, so the price check passes; a deal that hands the taker more than 5% over market is refused with price_generous unless acknowledge_price is true.
- trustverified (the address is on MENTAT's list) | unverified (not on the list: check the address yourself) | lookalike (its symbol or name imitates a listed token: a fake) | unknown (its symbol or name could not be read, so it could not be checked: no fill steps). On taker_pays and taker_receives in get_book and get_deal, and on give and get in create_deal.
- warnings[]{ code, side, token, message } for each unverified, lookalike or unchecked side; the fill steps of an unverified deal carry a warning too. A lookalike is never on the book, never prepared, and get_deal answers it with blocked: true and no fill steps.
- get_dealGET https://api.mentat.market/api/deals/{id}: status open | expired | settled | cancelled | not_found | unknown, read from the contract (source chain) or MENTAT's index (source indexer, with its sync state), the terms in the taker frame, the price against the reference, the 25 bps maker-side fee and the deal link. Fill steps only from a chain read just now of an open deal.
- create_dealPOST https://api.mentat.market/api/deals/prepare: give_token, give_amount, get_token, get_amount (addresses and decimal strings), expiry_seconds (600 to 2592000, default 3600), listing (open or private), optional maker, allow_unverified, acknowledge_price. Returns an exact approve (amount plus the 25 bps fee, never unlimited) and createDeal as calldata, the price check and warnings. A private link is not enforced on-chain: anyone who finds the deal can fill it.
- code (on refusal)invalid_request, invalid_address, same_token, invalid_amount, invalid_expiry, invalid_listing, unverified_token, lookalike_token, chain_unavailable, token_unreadable, price_generous (the taker gets more than 5% over market: the same check as /new), rate_limited (30 a minute per client on /api/deals).
curl -s "https://api.mentat.market/api/deals/0xYourDealId"
curl -s -X POST "https://api.mentat.market/api/deals/prepare" -H "Content-Type: application/json" -d '{"give_token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","give_amount":"1000","get_token":"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb","get_amount":"1001","listing":"open"}'Settlement paths and trust
escrow — trustless. FloorEscrow contract on Base: both legs move in one transaction, no admin keys, only the maker can cancel before a fill. V3 is live on Base: 0x83818036539737a813D1D99f1c6Cd2867c7D6a6d.
cow_relay — non-custodial. A trader-signed CoW Protocol order settled by solvers on Base; MENTAT relays the order and never custodies funds.
wagyu_route — not trustless. XMR in and out through XMR1 on Hyperliquid; Wagyu is the settlement counterparty and MENTAT never holds XMR. One proof per leg.
25 bps on every fill: the protocol fee on escrow and CoW relay, an integrator fee applied inside Wagyu's quoted amount on the XMR route.
Links
- Web https://mentat.market
- Public tape https://mentat.market/ledger
- ClawHub skill https://clawhub.ai/agora0x/skills/mentat
- llms.txt https://mentat.market/llms.txt
- Telegram bot https://t.me/FloorOTCbot
- 8004scan https://www.8004scan.io/agents/base/31596