Local self-custody MCP server: an AI agent trades the Cessio RFQ desk as maker and taker.
14 tools with clear verb-noun naming and consistent descriptions (avg 95 chars). All tools have input schemas with typed parameters and descriptions. Risk annotations (READ_ONLY, WRITE, IRREVERSIBLE) are present but not formalized as tool annotations in the MCP schema. Output schemas are not documented, LLMs cannot predict response structure. Error handling is minimal; no recovery guidance or actionable error messages visible in tool definitions. Composition is strong: tools chain well (e.g., create_rfq → get_quotes → accept_quote), and parameter naming is consistent across related tools (rfqId, quoteId). However, lack of documented output schemas and error patterns prevents higher scores.
Accept a maker's quote on your RFQ. Signs the settlement and blocks until it settles (or reports it is still settling).
Cancel one of your open RFQs.
Request quotes for a base/quote swap. direction is from the taker's side: SELL = you sell the base for quote; BUY = you buy the base with quote. `makers` defaults to every desk maker except yourself.
The agent's on-ledger holdings per instrument.
The quotes received on one of your RFQs.
The desk oracle mid for a base/quote pair (price per 1 base, in quote), or null if unavailable.
Output schemas not documented. LLMs cannot predict response structure (e.g., what fields does get_status return? what is the structure of list_instruments?). This forces agents to guess and wastes tokens on trial-and-error.
No error handling guidance in tool descriptions. Tools like accept_quote (IRREVERSIBLE) and submit_quote (WRITE) lack recovery hints. If a quote acceptance fails, what should the agent do next? No guidance provided.
Risk annotations (READ_ONLY, WRITE, IRREVERSIBLE, REVERSIBLE) are metadata but not formalized as MCP tool annotations (readOnlyHint, destructiveHint, idempotentHint). This prevents clients from enforcing safety policies.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
This agent's party hint, whether takers can invite it, and its pending sign actions.
The tradeable catalog (base/quote symbols) on the desk.
Trades this agent won as a maker.
The agent's own RFQs with the quotes received on each.
The agent's recent settled trades (either role).
On DevNet, top up the agent's demo balances (no-op where the faucet is disabled).
Quote a price on an incoming RFQ (price = quote units per 1 base). Checked against the operator rails, then signed and published. Use the rfqId from wait_for_rfq.
Blocks up to timeoutSeconds for the next RFQ addressed to this maker, then returns it (with its deadline) so you can decide a price and call submit_quote. Returns a no-RFQ note on timeout. Call it in a loop to make markets.
Pagination not documented for list_* tools. list_instruments, list_trades, list_maker_trades, list_my_rfqs lack limit/offset/cursor parameters and total count in response. Large result sets will blow context windows.
wait_for_rfq timeout parameter lacks guidance on retry behavior. If timeout expires, should the agent call it again immediately? After a delay? No recovery hint provided.