hashlock-mcp
OfficialSummary: This MCP server lets agents discover OTC markets, run sealed-bid/ghost-auction RFQ and swap workflows, and manage non-custodial HTLC settlement for EVM, Bitcoin, and Sui trades.
Discover supported chain-qualified token pairs and open RFQs.
Create RFQs for cross-chain BUY/SELL swaps with sealed/Ghost Auction privacy and chain-aware defaults.
Act as a market maker by responding to open RFQs with private price quotes.
Run the one-call swap flow:
swap_quote,swap_status,swap_execute, andswap_cancelto collect bids, poll the best bid, accept/execute, or abort.Track trades and inspect per-leg HTLC settlement state with
list_my_tradesandget_htlc.Advance settlement non-custodially by recording HTLC lock, claim, and refund transactions with
create_htlc,withdraw_htlc, andrefund_htlc; signing/broadcasting remains outside the server.
Allows creation and settlement of atomic swaps on the Bitcoin network using Hashlock's intent-based trading protocol, supporting RFQs and HTLC operations.
Enables cross-chain atomic swaps on Ethereum through RFQ creation, market making, and HTLC funding/withdrawal/refund operations.
Facilitates atomic swaps on the Sui blockchain with tools for RFQ management and HTLC lifecycle operations via Move-based contracts.
@hashlock-tech/mcp
Hashlock Markets — the settlement layer for the agent economy, as MCP tools. Non-custodial cross-chain OTC: sealed RFQ + price negotiation + HTLC atomic settlement — both legs settle or both refund; no bridge, no custodian, no counterparty risk. BTC ↔ EVM / TRON / Solana.
Live on mainnet: Bitcoin, Ethereum, Base, Robinhood Chain, TRON, Solana. Use a dedicated key with only the funds you intend to trade.
📖 Documentation: docs.hashlock.markets — concepts, quickstart, guides and the API reference. For agents:
llms.txt(index),llms-full.txt(everything in one file), any page as Markdown by adding.md, and a docs-search MCP server athttps://docs.hashlock.markets/mcp.
What is this?
The canonical Model Context Protocol server for Hashlock Markets. It gives AI agents (Claude, Cursor, Windsurf, any MCP client) the full OTC trading loop:
Browse the asset registry and the public RFQ board
Post a public RFQ or a private fixed-price order (shareable link)
Respond to requests with a price; negotiate (counter / accept / decline) in the deal thread
Agree — accept the other side's price → an HTLC swap is created (your own quote or counter already counts as your acceptance)
Track settlement — who funded, timelocks, tx hashes — and manage receive/refund addresses
Settlement signing (funding and claiming the HTLCs) stays with your own wallet — the server never holds keys or funds. The swap secret is generated locally on your machine and only its sha256 hashlock is sent; retrieve it with get_deal_secret when it's time to claim.
Related MCP server: hashlock-mcp-server
Two ways to run
Local (stdio) — the npm package below. You run it on your machine with your own keys; it can settle autonomously (SIWE login + on-chain signing with
HASHLOCK_*_KEY). Full trust in yourself.Remote (hosted, Streamable HTTP) — a public URL (
https://hashlock.markets/mcp) anyone can add from Claude / ChatGPT / any MCP client; one-click OAuth, no install. Multi-tenant, so it is strictly non-custodial: settlement returns unsigned transactions you sign with your own wallet, and the server never holds keys or your swap preimage. See Remote (hosted) below.
Install
HASHLOCK_API_URL=https://hashlock.markets/api npx -y @hashlock-tech/mcpMinimal config (read-only — browse assets and the RFQ board, no key needed):
{
"mcpServers": {
"hashlock": {
"command": "npx",
"args": ["-y", "@hashlock-tech/mcp"],
"env": { "HASHLOCK_API_URL": "https://hashlock.markets/api" }
}
}
}To trade, add the agent's own key(s) — local stdio via npx (Claude Desktop / Cursor / Windsurf mcpServers config):
{
"mcpServers": {
"hashlock": {
"command": "npx",
"args": ["-y", "@hashlock-tech/mcp"],
"env": {
"HASHLOCK_API_URL": "https://hashlock.markets/api",
"HASHLOCK_EVM_KEY": "0x<agent EVM key>",
"HASHLOCK_TRON_KEY": "<agent TRON key, 64-hex (optional)>",
"HASHLOCK_BTC_KEY": "<agent BTC WIF (optional)>",
"HASHLOCK_SOLANA_KEY": "<agent Solana key, base58 (optional)>"
}
}
}
}Auth — autonomous, per chain
The agent owns its key(s); the server does the login itself (nonce → sign → JWT, refreshed on expiry). The first configured key (EVM → TRON → BTC → Solana) mints the session; each key also signs settlement on its chain.
Env var | Chain | Login |
| EVM | SIWE |
| TRON |
|
| Bitcoin | BIP-322 |
| Solana | ed25519 |
| — | a ready JWT (alternative to a key) |
HASHLOCK_SOLANA_KEY is base58 — the 64-byte export a wallet gives you, or a bare 32-byte seed. It mints
the session when it is the only key set, and otherwise sits behind the others in the order above. Either
way it proves ownership of the wallet
(a signed, nonce-bearing message to /me/link-solana) the first time the agent posts, quotes, accepts or
calls whoami, because an order whose give leg is Solana is refused without it — and because it is what
puts the agent in the feed for a private order aimed at that wallet. If the account is already linked to a
different Solana wallet, that link is left alone; nothing else is blocked, and whoami.solanaLink says so. Solana is also the one chain whose
transactions this package does not build: the escrow's ADDRESS is a hash of the agreed terms, so the
server composes each one and the agent signs the bytes it is handed. Set the agent's Solana address — whoami returns it as
localSigners.addresses.solana — as its settlement address with set_settlement_address before funding.
With none set, read-only tools (list_assets, list_open_rfqs, get_rfq) still work. Use a dedicated key with only the funds you intend to trade.
Required: HASHLOCK_API_URL — the API base, e.g. https://hashlock.markets/api; there is no default. Other env: HASHLOCK_APP_URL (share links; default derived), HASHLOCK_EVM_RPC (default a public Ethereum mainnet RPC; another EVM chain takes HASHLOCK_EVM_RPC_<CHAIN>, e.g. HASHLOCK_EVM_RPC_BASE), HASHLOCK_TRON_HOST (default TronGrid mainnet), HASHLOCK_TRON_API_KEY (a TronGrid API key — TronGrid throttles requests without one), HASHLOCK_SECRETS_PATH (default ~/.hashlock/mcp-secrets.json, mode 0600).
Remote (hosted)
The same server also runs as a remote MCP over Streamable HTTP so anyone can connect by URL — no
install. This is the multi-tenant, non-custodial surface: browse, RFQ, negotiate, and get unsigned
fund/claim/refund transactions you sign with your own wallet (there is no autonomous key-in-env signing
and no server-side secret storage here — you supply your own hashlock and keep your own preimage).
Connect from a client: add the server URL. Nothing else — the client discovers that it needs authorization, sends you to Hashlock to sign in and approve, and receives its own key:
URL: https://hashlock.markets/mcpApproving takes a signature from your wallet — a signed-in session alone grants nothing. The grant then
appears under Developers as an ordinary API key: it expires after
90 days, you are told in Telegram (when linked) whenever one is created, and it can be revoked there at any time. Clients
that do not speak OAuth can still send a key they created themselves as Authorization: Bearer hk_….
Agents, with no browser: an agent that holds a wallet key mints its own hk_ key — GET https://hashlock.markets/api/v1/keys/nonce, sign Hashlock Markets — create an API key. plus
Address: and Nonce: lines (optionally Key name: and Scopes:), and POST /api/v1/keys with { rail, address, message, signature }. The key belongs to the account that wallet signs in to, created on first
use. A wallet-only account holds one key — signing again replaces it, which is also how a lost key is
recovered; sign up at /developers with email, Google or Telegram to hold up to 10. See /api/v1/docs.
Standard OAuth 2.1, so any compliant MCP client drives it unattended:
Step | Endpoint |
Unauthorized call names its metadata |
|
Client reads the resource + server metadata |
|
Client registers itself |
|
You sign in and approve with a wallet signature, in the browser |
|
Client redeems the code for a key |
|
Codes are single-use and expire in 60 seconds; redirect URIs are allowlisted, with loopback permitted per RFC 8252. The issued token IS the API key, so a grant is revocable from the same list as every other key.
Which chains you can give on. An order that GIVES an asset needs a wallet you proved on that chain,
and a key starts with only the address its owner signed in with — whoami lists both. To add another,
call wallet_proof_message for the exact text, sign it with that wallet (EVM personal_sign · TRON
signMessageV2 · Solana signMessage · Bitcoin BIP-322) and pass it to prove_wallet. A proof widens
what you can trade and nothing else: it never becomes the account's payout address, which only a wallet
session can set, and remove_wallet_proof takes it back.
Run the hosted service yourself:
docker build -t hashlock-mcp-http .
docker run -p 8080:8080 -e HASHLOCK_V1_URL=https://api.hashlock.markets/v1 hashlock-mcp-http
# or, from source:
pnpm build && HASHLOCK_V1_URL=https://api.hashlock.markets/v1 PORT=8080 pnpm start:httpEnv: HASHLOCK_V1_URL (developer-API base, default https://api.hashlock.markets/v1) · PORT (default
8080). Put it behind your reverse proxy at /mcp; GET /health is a liveness probe.
Tools (17)
Tool | What it does |
| Asset registry ( |
| Public RFQ board, filterable |
| One RFQ / private order |
| Post a public RFQ or private fixed-price order |
| Cancel your own request |
| Respond with a price → opens a deal thread |
|
|
| Your requests and deal threads |
| Thread + negotiation history + HTLC swap state |
| Your receive/refund address per chain |
| The locally-stored swap preimage (gated on both legs funded) |
| Report an out-of-band claim (secret + tx) so the other leg settles |
| The account you're authenticated as |
| Autonomous: fund your side of a swap on-chain with the agent's own key (EVM/TRON/BTC/Solana) |
| Autonomous: claim your receive leg with the preimage (reveals the secret on-chain) |
| Autonomous: take your funded leg back once its timelock has passed and nobody claimed it |
Amounts are human decimal strings ("0.5"); prices are the total quote-asset amount, not per-unit. Errors return a structured envelope { error: { code, is_retryable, recovery_hint } } agents can branch on.
Fully autonomous loop
With a key set for each chain a swap touches, an agent can run end to end with no human:
create_rfq/respond_to_rfq → negotiate (accept) → set_settlement_address (both chains) →
fund_leg → claim_leg. Funding/claiming is signed locally with the agent's keys; the swap secret is
generated + stored locally and only its hashlock leaves the machine. Use a dedicated key with only the funds you intend to trade.
How atomic settlement works
Both parties lock funds in HTLCs bound to the same sha256(secret) hashlock — BTC as a P2WSH script, EVM/TRON as contracts. The initiator funds the long-timelock leg first (asymmetric timelocks, so nobody gets a free option). Claiming one leg reveals the secret on-chain, which unlocks the other leg. Either both legs settle, or both refund after their timelocks. The recipient of each leg is fixed at funding time — revealing the secret cannot redirect funds.
Development
pnpm install
pnpm run build # tsup → dist/
pnpm run lint # tsc --noEmit
pnpm test # vitestReleasing means bumping two version numbers, and they are not the same one: package.json (and
server.json's packages[0].version, which must match it) is the npm package, while server.json's
own top-level version numbers the entry in the MCP Registry. Leave the second behind and npm
publishes happily while the registry answers cannot publish duplicate version. Then tag: git tag v0.8.1 && git push origin v0.8.1 runs both workflows.
Node ≥ 20. MIT.
Available Tools
17 toolscancel_rfqAInspect
Cancel your own RFQ / private order (before a deal is agreed).
| Name | Required | Description | Default |
|---|---|---|---|
| rfq_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden. It discloses that this is an owner-scoped mutation with a precondition, which is genuinely useful, but says nothing about irreversibility, what happens to pending responses on the RFQ, or what error is returned if a deal already exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero filler; the action and its precondition are front-loaded so the agent can decide immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no annotations and no output schema, the agent still lacks post-call expectations: whether the RFQ is gone permanently, whether funds/responses are released, and what success looks like. Adequate but noticeably thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but there is only one parameter whose name (rfq_id) and uuid format are largely self-documenting. The description adds the meaningful ownership constraint implicit in 'your own,' yet never mentions rfq_id or how to obtain a valid one.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Cancel') plus specific resource ('your own RFQ / private order'), with a temporal qualifier that narrows scope. It separates itself from create_rfq/respond_to_rfq by verb alone, but never names a sibling or explicitly contrasts with adjacent tools like get_rfq or deal_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(before a deal is agreed)' gives an explicit precondition for use, and 'your own' implicitly excludes cancelling other parties' RFQs. It stops short of naming an alternative path (e.g. negotiate) for RFQs already past that stage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
claim_legAInspect
AUTONOMOUS SETTLEMENT: claim YOUR receive leg of a swap using the preimage, signing with the agent's own key. This reveals the secret on-chain (so the counterparty/keeper can settle the other leg) and reports the claim to the API. Requires both legs funded and the preimage available (you are the initiator, or the initiator already revealed it). Returns the on-chain tx id.
| Name | Required | Description | Default |
|---|---|---|---|
| swap_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and mostly meets it: it discloses the irreversible side effect ('reveals the secret on-chain') and the downstream consequence (counterparty/keeper can settle the other leg), plus an API reporting step. It does not cover failure behavior or what happens if the claim tx reverts, but the critical irreversibility is front and center.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with an ALL-CAPS label and ending with the return value. Every sentence adds information; the shouting is stylistic noise but costs nothing in length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter settlement action with no annotations and no output schema, the description supplies the return value ('on-chain tx id'), the prerequisites, and the side effect. Only error/revert handling is missing, which an agent would otherwise need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and there is one undocumented parameter. `swap_id` is self-describing and its uuid format is in the schema, but the description never mentions it or the fact that it is the sole required input. Adequate by implication, not by statement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('claim YOUR receive leg of a swap using the preimage') and adds distinguishing scope (signs with the agent's own key, reports to the API). It stops short of naming the obvious sibling `reveal_claim`, so an agent must still infer which of the two settles a leg, but the purpose itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Prerequisites are stated explicitly: both legs must be funded and the preimage must be available (you are the initiator or the initiator already revealed it). That is a real gating condition an agent can check. No exclusion is given against `reveal_claim`, which is the one alternative that matters here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_rfqAInspect
Post a trade request. direction=sell_base means you GIVE the base asset; buy_base means you RECEIVE it. visibility=public → an open RFQ on the board (price optional, negotiated later). visibility=private → a link-only order at YOUR fixed price (ask_price required); share the returned link with the counterparty; optionally lock it to their wallet via target_address. PREREQUISITE: your account must have a proven wallet for the asset you GIVE (the account you authenticate as owns it).
| Name | Required | Description | Default |
|---|---|---|---|
| ask_price | No | TOTAL quote-asset amount you ask (not per-unit). Required for private orders. | |
| direction | Yes | ||
| base_asset | Yes | "SYMBOL@chain" or asset id | |
| visibility | No | public | |
| base_amount | Yes | Human decimal amount of the base asset, e.g. "0.05" | |
| quote_asset | Yes | "SYMBOL@chain" or asset id | |
| ttl_seconds | No | ||
| target_address | No | Private only: lock the order to this counterparty wallet (on the chain THEY give) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the wallet prerequisite, the distinct outcomes of public vs private visibility, the returned shareable link, and optional target_address locking. It does not clarify whether funds are escrowed at creation, how ttl_seconds affects the order, or what cancellation/expiry behavior looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is front-loaded with the core action, then uses compact lines for direction semantics, visibility modes, and prerequisites. Every sentence contributes operational meaning, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-parameter creation tool with no annotations and no output schema, the description covers the essential calling context: direction meaning, visibility behavior, ask_price requirement, target_address locking, returned link, and the wallet prerequisite. Remaining gaps are ttl_seconds semantics and whether any funds are committed or escrowed at creation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds important meaning beyond the 63%-covered schema: it explains direction semantics ('GIVE' vs 'RECEIVE'), visibility consequences, the requirement that ask_price applies to private orders, and the counterparty-locking role of target_address. It omits explanation of ttl_seconds and adds little on base_amount or quote_asset beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Post a trade request.' It clearly establishes this as an RFQ creation tool and elaborates direction and visibility modes, though it does not explicitly differentiate itself from sibling tools such as respond_to_rfq or negotiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear mode-selection guidance: visibility=public creates an open board RFQ with optional price, while visibility=private creates a fixed-price link-only order requiring ask_price. It also states the prerequisite of a proven wallet for the asset given, but does not name alternative tools or when not to use this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deal_statusBInspect
Full state of one deal: thread, negotiation history and — once agreed — the HTLC swap (who funded, timelocks, addresses, tx hashes). Use this to track settlement.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the shape of returned data and notes that swap details exist only 'once agreed', implying a read-only lookup, but says nothing about access restrictions (e.g., must you be a party to the deal) or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and its contents, with the usage hint as a short trailing sentence. Nearly zero waste, though the parenthetical list is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates what is returned, which is its main value. However, it omits how to identify the deal (thread_id semantics) and any access constraints, leaving gaps for a single-parameter state tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the sole parameter is a UUID thread_id. The description uses 'thread' only as returned content, never clarifying that thread_id is the deal identifier, so it does not compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Full state of one deal') and enumerates the returned contents (thread, negotiation history, HTLC swap details). An agent can distinguish it from list-style siblings like my_deals or list_open_rfqs, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing phrase 'Use this to track settlement' implies a usage context, but there is no explicit when-not guidance or routing to alternatives such as get_rfq or my_deals. Usage must be inferred from the settlement framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fund_legAInspect
AUTONOMOUS SETTLEMENT: fund YOUR side of an agreed swap on-chain, signing with the agent's own key (HASHLOCK_EVM_KEY / TRON / BTC / SOLANA for that leg's chain). Funds the leg you give — approves the token (EVM/TRON) and locks it in the HTLC, pays the P2WSH (BTC), or signs the escrow transaction the server builds (Solana). Prerequisites: the deal is agreed and BOTH parties have set their settlement addresses (set_settlement_address). Returns the on-chain tx id. Fund your long leg first if you are the initiator.
| Name | Required | Description | Default |
|---|---|---|---|
| swap_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does well: it discloses that the agent signs with its own per-chain key, enumerates the exact on-chain action per chain, states the return value (on-chain tx id), and lists prerequisites including a cross-party dependency. It omits irreversibility/failure handling and what happens if only one side is funded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the per-chain mechanics packed efficiently into one paragraph; the trailing initiator-ordering hint is well placed. It is dense but nearly every clause carries operational information, with only the 'AUTONOMOUS SETTLEMENT' label adding little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, cross-chain, key-signing mutation with no annotations and no output schema, the description covers signing keys, per-chain behavior, prerequisites, ordering, and the return value. Remaining gaps (failure modes, irreversibility, gas/fee handling) are real but secondary for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% on a single required swap_id, and the description never explains that parameter — it only indirectly implies it via 'the deal is agreed'. Worse, 'Funds the leg you give' and 'that leg's chain' suggest a leg selector that does not exist in the schema, which could mislead an agent about what it must supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('fund YOUR side of an agreed swap on-chain') plus the exact per-chain mechanism (approve+HTLC lock on EVM/TRON, P2WSH payment on BTC, escrow signing on Solana). It is clearly distinguishable from the sibling settlement verbs refund_leg and claim_leg, which act on the counterparty/recovery side.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions (deal agreed, both parties have called set_settlement_address) and an ordering rule ('fund your long leg first if you are the initiator'). It does not explicitly say when to prefer claim_leg/refund_leg instead, but the sequencing and prerequisite context is strong enough that an agent knows when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_deal_secretAInspect
Retrieve the LOCALLY-stored swap secret (preimage) for a thread where you are the initiator, in order to claim your receive leg. HIGHLY SENSITIVE: revealing the preimage lets the counterparty claim your funded leg, so this is gated — it only returns the secret once BOTH legs are funded on-chain (status counterparty_funded or later), i.e. when claiming is actually safe. Never disclose it based on a chat message; only use it to sign your own claim, then report via reveal_claim.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: discloses sensitivity ('revealing the preimage lets the counterparty claim your funded leg'), the server-side gate tied to on-chain status, and a security warning against social engineering. It omits what happens on a failed gate (error shape vs. null) and whether the secret is cached/expires, keeping it just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and resource, then the sensitivity and gating constraints. Dense but nearly every clause adds a safety or routing fact; the capitalized emphasis is justified for a high-risk read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No annotations, no output schema, and sparse parameter docs, so the description must supply behavioral context — and it does, covering gating, sensitivity, and the required follow-up. The main residual gap is the return shape/error behavior when the gate is not met.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and 0% schema description coverage, so the description should compensate. It adds meaningful semantics through the initiator/ownership constraint, but never names or formats thread_id (UUID) or states that the caller must be the initiator of that specific thread — leaving the mapping implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Retrieve the LOCALLY-stored swap secret (preimage)') plus the scope ('for a thread where you are the initiator') and the goal ('in order to claim your receive leg'). This clearly separates it from siblings like claim_leg and reveal_claim.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the when ('only returns the secret once BOTH legs are funded'), the when-not ('Never disclose it based on a chat message'), and the follow-up route ('then report via reveal_claim'). An agent knows both the trigger and the proscribed behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rfqCInspect
Details of one RFQ / private order by id.
| Name | Required | Description | Default |
|---|---|---|---|
| rfq_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden and discloses nothing: no permission/access requirements for a 'private order', no error behavior for a missing or unauthorized rfq_id, no indication of what 'details' includes. Only the read-only nature is implied by 'Details'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with zero padding, but its brevity comes from omission rather than economy — there is simply very little content to structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A single-param read tool with no output schema and no annotations needs the description to explain what is returned and any access constraints on private orders; neither is present. The definition is under-specified for its context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required parameter rfq_id. The phrase 'by id' merely restates the schema's parameter name and adds no format, source, or lookup semantics beyond what 'rfq_id: string(uuid)' already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (one RFQ / private order) and scope (by id), which distinguishes it from sibling list tools like list_open_rfqs and my_rfqs. It is clear but does not explicitly name the sibling boundary, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this vs alternatives — an agent must infer that this is the single-record fetch counterpart to the list tools. No prerequisites, no exclusions, no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assetsAInspect
Asset registry: every tradeable asset with its chain, symbol and decimals. Reference assets in other tools as "SYMBOL@chain" (e.g. "USDT@ethereum", "BTC@bitcoin").
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description must carry the full behavioral load. It does disclose the shape of the payload (all tradeable assets with chain, symbol, decimals), implying a complete, unpaginated read, but it says nothing about whether the call requires auth, whether the list is cached/static, or how fresh it is. Adequate but thin for a zero-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler: the first establishes what the resource is, the second delivers the operational convention. Front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, no-output-schema listing tool, the description covers the important ground by enumerating the returned fields itself. What is missing is minor: no statement about ordering, size of the list, or whether the set is chain-scoped, but an agent could call this correctly as written.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline of 4 applies. The description earns its keep by instead documenting the 'SYMBOL@chain' identifier convention with two concrete examples ('USDT@ethereum', 'BTC@bitcoin'), which is value the schema cannot supply since the schema is an empty object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete noun-plus-scope ('Asset registry: every tradeable asset') and names the returned fields (chain, symbol, decimals), so the agent knows exactly what it gets. It is unmistakably distinct from the RFQ/deal siblings, which are all workflow actions. It stops short of an explicit verb phrase like 'list all supported assets', which is why it is a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives actionable context: assets are referenced elsewhere as 'SYMBOL@chain', so the agent knows this tool is how you learn valid identifiers before calling create_rfq, fund_leg, and friends. There is no need for exclusions because no sibling lists assets, but the description never states the trigger explicitly ('call this first to resolve an asset id').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_open_rfqsBInspect
Browse the public RFQ board (open requests you can respond to with a price). Optional filters.
| Name | Required | Description | Default |
|---|---|---|---|
| direction | No | ||
| base_asset | No | Filter by base asset ("SYMBOL@chain" or id) | |
| quote_asset | No | Filter by quote asset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does disclose useful behavior: the board is public, contains open requests, and is intended for price responses. It still omits pagination, ordering, authentication expectations, and result limits, which matter for a browsing endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core purpose. There is no redundant repetition and the optional-filter note is brief but useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool, the description covers the main purpose and scope. However, with no output schema and no annotations, it leaves return contents, pagination behavior, and the direction filter semantics underexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents base_asset and quote_asset, but the direction enum values sell_base and buy_base are unexplained. The description adds only 'Optional filters' and does not clarify what the filters mean or how they combine.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Browse the public RFQ board,' and clarifies that these are open requests the caller can price. This distinguishes it from single-RFQ, mutation, and private-listing siblings, though it does not name any sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Open requests you can respond to with a price' implies the use case: finding RFQs before calling respond_to_rfq. However, it does not explicitly say when to use this versus get_rfq, my_rfqs, or other board views, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_dealsBInspect
Your deal threads (negotiations + agreed deals) with current/pending prices.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does not say whether the tool is read-only, whether results are paginated or filtered, or whether authentication is required. Only the data content (current/pending prices) is described, leaving the operational profile largely blank.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the core content front-loaded and no wasted words. It is appropriately sized for a zero-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-argument read tool with no output schema, the description gives a reasonable content overview. However, because there are no annotations and no return-shape documentation, it should say more about what an agent receives (e.g., a list of threads with prices) and whether the operation is safe/read-only.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There are no parameter semantics to clarify, and the description correctly does not invent any.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ('deal threads') and its scope ('negotiations + agreed deals ... current/pending prices'), which lets an agent distinguish it from siblings like my_rfqs and list_open_rfqs. It stops short of an explicit verb, but the possessive 'Your deal threads' makes the retrieval intent clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives such as my_rfqs, deal_status, or get_deal_secret. The agent is left to infer from the name alone that this lists the caller's deals rather than, say, a single deal's status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_rfqsAInspect
Your own RFQs / private orders and their statuses.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that results are scoped to the caller's private orders and include statuses, but it does not state that this is read-only, whether authentication is required, pagination behavior, or return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with the scope ('Your own') front-loaded and no filler. The slash construction 'RFQs / private orders' is slightly loose but does not obscure meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless retrieval tool, the description says what is returned at a high level: the caller's own RFQs/private orders and their statuses. Without an output schema, it does not specify the result structure, fields, or pagination, leaving meaningful gaps for an agent that needs to interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter semantics to explain; the baseline for 0 params is 4. Nothing in the description contradicts the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource as the caller's own RFQs/private orders and indicates statuses are included. It implicitly distinguishes from list_open_rfqs by saying 'your own,' but lacks an explicit verb such as 'list' or 'retrieve,' leaving list-vs-detail slightly ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Your own' implies scope and contrasts with public/open RFQ tools like list_open_rfqs, but it does not explicitly state when to use this tool versus get_rfq, list_open_rfqs, or my_deals. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
negotiateAInspect
Act in a deal thread. Actions:
message: free-text chat (body required)
propose: counter with a new TOTAL price (price required). Proposing a price is agreeing to it: when the counterparty takes it, the deal is agreed.
accept_proposal: take the price the counterparty proposed (price required: the pendingPrice shown by deal_status or my_deals) — they agreed to it by proposing, so this agrees the deal. As with accept, the initiator's secret is generated locally and only its hashlock is sent.
accept: accept the price on the table (price required: the currentPrice shown by deal_status or my_deals) — needed only when youAccepted is false — your own quote or proposal normally already counts (except an initiator's on an older server). When both sides have accepted, the HTLC swap is created. If you are the initiator (fund the long leg), a swap secret is generated LOCALLY on this machine and only its sha256 hashlock is sent — retrieve it later with get_deal_secret.
reject: decline and close the deal Accepting names the price on purpose: if it changed since you read the deal, the accept is refused — read it again and decide.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | message text (action=message) | |
| price | No | total price: the new one (propose) or the one you are accepting (accept_proposal, accept) | |
| action | Yes | ||
| thread_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it explains that propose/accept_proposal constitute agreement, that accept triggers HTLC creation, and that the initiator's secret is generated locally with only its hashlock sent, retrievable via get_deal_secret. It also discloses that a stale price causes refusal and that reject closes the deal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The bullet-list structure is front-loaded and appropriate for a five-action tool, with no filler sentences. Some clauses are long and nested, especially around accept and hashlock handling, but every part conveys useful semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with no annotations or output schema, the description covers action semantics, side effects, and secret handling thoroughly. It could go further by explaining the response after each action or explicitly telling the agent where to obtain thread_id, so it is strong but not fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover only body and price minimally, and action/thread_id have no descriptions. The description compensates by mapping body to message and price to the exact price required for propose, accept_proposal, and accept, including the source (pendingPrice/currentPrice). That adds substantial meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Act in a deal thread' and enumerates five concrete actions, so the tool's scope is clear. It references deal_status and my_deals as sources of pricing state, indirectly separating negotiation writes from status reads, though it does not explicitly name every sibling it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives precise conditions for selecting accept vs accept_proposal vs propose, including that accept is only needed when youAccepted is false and that accept_proposal uses pendingPrice. It also tells the agent to re-read the deal if the named price has changed. It stops short of stating when to use negotiate versus RFQ tools like respond_to_rfq.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refund_legAInspect
AUTONOMOUS SETTLEMENT: take back YOUR funded leg after its timelock has passed and the counterparty never claimed it, signing with the agent's own key. Works on every rail — EVM and TRON call the escrow, Solana and Bitcoin sign a transaction the server builds. On Bitcoin a node also rejects it until the chain's MEDIAN TIME PAST has passed the timelock, which trails real time by roughly an hour. Each rail sends the money where it was agreed it would go: the leg's refund address on Bitcoin and Solana, and on EVM and TRON the wallet that funded the escrow — the agent's own key. Returns the on-chain tx id.
| Name | Required | Description | Default |
|---|---|---|---|
| swap_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it explains signing with the agent's own key, rail-specific mechanics for EVM, TRON, Solana, and Bitcoin, the Bitcoin MTP delay, payout destinations per rail, and that it returns the on-chain tx id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded, starting with the operation and conditions, then adding rail-specific behavior and return value. Every sentence adds useful operational detail without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex cross-rail settlement tool with no annotations and no output schema, the description is strong on behavior, timing, signing, destination, and return value. The main remaining gap is that it does not document the swap_id parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has only swap_id with 0% description coverage, and the description never explains what swap_id represents or how to obtain it. The parameter name is fairly self-evident, but the description does not compensate for the schema coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: take back a funded leg after its timelock has passed when the counterparty never claimed it. It clearly distinguishes refunding from claiming and gives enough detail to identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the triggering conditions: timelock passed and counterparty never claimed. It does not explicitly name sibling alternatives like claim_leg or state when not to use it, but the context is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
respond_to_rfqAInspect
Respond to an open RFQ with your price. Opens a private deal thread with the creator; returns the threadId for negotiate/deal_status. price = TOTAL quote-asset amount for the whole base amount (not per-unit). Your quote is your acceptance of that price (as the initiator, this tool accepts it for you with your hashlock): when the creator accepts it, the deal is agreed.
| Name | Required | Description | Default |
|---|---|---|---|
| price | Yes | Total quote-asset amount, human decimal | |
| rfq_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses the side effect (opens a private deal thread), the return value (threadId), and the commitment semantics ('your quote is your acceptance ... this tool accepts it for you with your hashlock'). It omits whether the response is retractable, how funds/hashlock are actually committed, and any auth requirements, leaving some behavioral risk undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and return value, then the high-risk price semantics, then the commitment consequence — a sensible ordering. The mid-sentence parenthetical about hashlocks is dense but earns its place by explaining why no separate acceptance step is needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no output schema and no annotations, the description covers the essentials: side effect, return handle, unit semantics, and post-acceptance state. It leaves open edge cases (multiple responses per RFQ, validity bounds on price, failure modes) that an agent would want to know.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, but the description fully compensates for the undocumented-critical parameter by clarifying price is the TOTAL quote-asset amount for the whole base amount, not per-unit — a unit ambiguity the schema alone would not resolve. rfq_id remains undocumented in both places, though its uuid type and provenance (get_rfq/list_open_rfqs) make it inferable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Respond to an open RFQ with your price') and immediately distinguishes itself from siblings by naming the downstream tools it feeds (negotiate/deal_status) and by contrast with create_rfq implicit in 'open RFQ'. An agent knows exactly what action this performs without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'open RFQ' scopes usage and the closing note tells the agent this is the initiator-side action, seeding the alternative path (creator accepts). It also routes follow-up work to negotiate and deal_status. It stops short of explicitly stating exclusions, e.g. what to do if the RFQ is already closed or if you are the creator (cancel_rfq/my_rfqs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reveal_claimAInspect
After you claimed your receive leg on-chain (with your own wallet), report the revealed secret + claim tx so the counterparty and watchers can settle the other leg.
| Name | Required | Description | Default |
|---|---|---|---|
| leg | No | ||
| secret | Yes | 64-char hex preimage (from get_deal_secret or the on-chain claim) | |
| swap_id | Yes | ||
| claim_tx | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the consequence that reporting publishes the secret so the counterparty and watchers can settle the other leg, which signals this is a consequential disclosure rather than a benign read. It doesn't state permissions, irreversibility of revealing the secret, or what happens on failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the precondition then the action and its purpose. Little waste, though it is slightly dense/run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation-style disclosure tool with no annotations, no output schema, and low parameter coverage, the description covers the why and when but omits return behavior and the irreversibility of publishing the secret, leaving meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25% (only 'secret' is documented), so some compensation is expected. The description maps to 'secret' and 'claim_tx' but adds nothing about swap_id or the 'leg' enum, leaving those to the schema's self-evident naming.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (report) and the resources it takes (revealed secret + claim tx), and frames the task as disclosing the preimage so the counterparty can settle. It implies a sequencing relative to the sibling claim_leg (after the on-chain claim) without naming that sibling directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"After you claimed your receive leg on-chain (with your own wallet)" gives a clear prerequisite/timing condition for using this tool, implicitly excluding use before the on-chain claim. It stops short of naming alternatives like claim_leg or fund_leg, or saying when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_settlement_addressAInspect
Set YOUR receive/refund address for an agreed swap, per leg (each party sets the address for the leg they receive on and the one they refund from). Required before the HTLC can be funded. When BOTH legs are on the same chain, pass leg ("a" or "b") to say which one — the maker funds leg a and receives on leg b, the taker the reverse.
| Name | Required | Description | Default |
|---|---|---|---|
| leg | No | Required when both legs are on this chain | |
| chain | Yes | Chain id from list_assets, e.g. "ethereum", "bitcoin", "tron" (see list_assets) | |
| address | Yes | ||
| swap_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full disclosure burden. It does add real context: per-leg semantics, the maker/taker leg-role mapping, and the ordering constraint before funding. It omits what happens on a second call (overwrite/idempotency), whether the caller must be a party to the swap, and any address validation or error behavior — gaps that matter for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by the funding prerequisite and then the leg-disambiguation rule — a sensible priority order. The maker/taker sentence is dense but each sentence carries distinct information; only minor overlap with the schema's own `leg` description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter mutation tool with no annotations and no output schema, the description covers when and how to call it but not the outcome: nothing about the response, whether the address can be re-set, or what errors arise from an invalid or wrong-chain address. Adequate to invoke, thin on what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: `leg` and `chain` are already described in the schema, but the description goes further on `leg` by explaining the maker funds leg a and receives on leg b while the taker is the reverse, and it clarifies that `address` is the caller's own receive/refund address rather than an arbitrary counterparty address. `swap_id` receives no added meaning, but it is a self-evident UUID identifier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — set the caller's receive/refund address for an agreed swap, per leg — and scopes it to a prerequisite of HTLC funding, which cleanly separates it from fund_leg, claim_leg and refund_leg in the sibling list. An agent can tell what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger ('Required before the HTLC can be funded') and an explicit conditional rule for when to supply `leg` (only when both legs are on the same chain). It does not name an alternative tool or state exclusions, but the sequencing relative to fund_leg is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiAInspect
The account you are authenticated as (linked wallet addresses), plus localSigners.addresses — what THIS process holds keys for (any key that could not be read is reported separately under localSigners.unusable, and solanaLink says whether the Solana wallet held here is proven to the account — an order whose give leg is Solana needs that). Use localSigners.addresses.solana as your settlement address on a Solana leg: the server builds that transaction for whoever the leg names, so naming a key you do not hold makes the leg unsignable.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose non-obvious behavior: unreadable keys surface under `localSigners.unusable`, `solanaLink` reports whether the Solana wallet is proven to the account, and naming a key you don't hold makes a leg unsignable. It never states the operation is read-only, but the read semantics are evident from the content returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core answer is front-loaded, but the middle is a single run-on sentence with parentheticals nested three levels deep (`localSigners.unusable`, `solanaLink`), which hurts scanability. The settlement-address warning is valuable and earns its place, but the packaging could be broken into clearer clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description must explain the return shape, and it does: account, linked wallets, local signer addresses, unusable keys, and the Solana linkage proof. For an identity-inspection tool this is nearly complete, missing only a note on whether the listing is exhaustive or paginated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate at the input level; this sits at the baseline for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first clause states precisely what is returned: the authenticated account with linked wallet addresses, plus `localSigners.addresses`. The resource is unambiguous and clearly distinct from the RFQ/deal siblings, though the verb ('returns') is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The final sentence gives one concrete usage rule: use `localSigners.addresses.solana` as your settlement address on a Solana leg. However, nothing says when to call this tool versus siblings like `set_settlement_address` or before `create_rfq`, so tool-selection guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
28 tool updates
v0.10.0- Added
cancel_rfq - Added
claim_leg - Removed
create_htlc - Changed
create_rfq18 fields changed- removed
Input schema / properties / amountRemoved value: -{ - "description": "Amount of base token as a raw decimal string (\"0.1\", \"1.5\", \"10\"). Do NOT convert to wei/satoshis. Reject USD-denominated values — ask user for base-token amount instead.", - "type": "string" -} - added
Input schema / properties / ask_priceAdded value: +{ + "description": "TOTAL quote-asset amount you ask (not per-unit). Required for private orders.", + "type": "string" +} - removed
Input schema / properties / baseChainRemoved value: -{ - "description": "Chain the base token settles on. Inference defaults: ETH/USDC/USDT/WBTC/WETH→\"ethereum\", BTC→\"bitcoin\", SUI→\"sui\". Override to testnet ONLY on explicit user mention (\"sepolia\", \"signet\", \"testnet\", \"test\", \"sınama\"). Required for SUI legs (no legacy fallback).", - "enum": [ - "ethereum", - "sepolia", - "bitcoin", - "bitcoin-signet", - "sui", - "sui-testnet" - ], - "type": "string" -} - removed
Input schema / properties / baseTokenRemoved value: -{ - "description": "Base asset symbol from the supported list (ETH, BTC, SUI, USDC, USDT, WBTC, WETH). Case-insensitive but uppercase preferred.", - "type": "string" -} - added
Input schema / properties / base_amountAdded value: +{ + "description": "Human decimal amount of the base asset, e.g. \"0.05\"", + "type": "string" +} - added
Input schema / properties / base_assetAdded value: +{ + "description": "\"SYMBOL@chain\" or asset id", + "type": "string" +} - removed
Input schema / properties / client_request_idRemoved value: -{ - "description": "Idempotency key. Retrying the SAME write with the SAME id within this MCP session returns the first result instead of triggering a second on-chain/backend side effect. Best-effort: not durable across MCP restarts.", - "type": "string" -} - added
Input schema / properties / directionAdded value: +{ + "enum": [ + "sell_base", + "buy_base" + ], + "type": "string" +} - removed
Input schema / properties / expiresInRemoved value: -{ - "description": "RFQ expiration in seconds. Default 300 (5 min). \"Urgent\" → 60-120. \"Take your time\" → 600-1800. Hard cap 86400 (24 h).", - "type": "number" -} - removed
Input schema / properties / isBlindRemoved value: -{ - "description": "Ghost Auction mode — hides requester identity from bidders and losing counterparties. Default false. Set true on intent words: \"ghost\", \"blind\", \"anonymous\", \"hide identity\", \"gizli\". External brand: \"Ghost Auction\"; internal name retained for API/DB schema stability.", - "type": "boolean" -} - removed
Input schema / properties / quoteChainRemoved value: -{ - "description": "Chain the quote token settles on. Same inference rules as baseChain. Cross-environment pairs are allowed (e.g. baseChain=\"sui\" + quoteChain=\"sepolia\").", - "enum": [ - "ethereum", - "sepolia", - "bitcoin", - "bitcoin-signet", - "sui", - "sui-testnet" - ], - "type": "string" -} - removed
Input schema / properties / quoteTokenRemoved value: -{ - "description": "Quote asset symbol from the supported list. Same rules as baseToken.", - "type": "string" -} - added
Input schema / properties / quote_assetAdded value: +{ + "description": "\"SYMBOL@chain\" or asset id", + "type": "string" +} - removed
Input schema / properties / sideRemoved value: -{ - "description": "BUY = user wants to acquire baseToken; SELL = user wants to dispose of baseToken. Map \"sell/swap/exchange/liquidate/convert/sat\" → SELL, \"buy/acquire/al\" → BUY.", - "enum": [ - "BUY", - "SELL" - ], - "type": "string" -} - added
Input schema / properties / target_addressAdded value: +{ + "description": "Private only: lock the order to this counterparty wallet (on the chain THEY give)", + "type": "string" +} - added
Input schema / properties / ttl_secondsAdded value: +{ + "default": 86400, + "exclusiveMinimum": 0, + "maximum": 604800, + "type": "integer" +} - added
Input schema / properties / visibilityAdded value: +{ + "default": "public", + "enum": [ + "public", + "private" + ], + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "baseToken", - "quoteToken", - "side", - "amount" -]New value: +[ + "direction", + "base_asset", + "base_amount", + "quote_asset" +]
- Added
deal_status - Added
fund_leg - Added
get_deal_secret - Removed
get_htlc - Added
get_rfq - Added
list_assets - Removed
list_my_trades - Changed
list_open_rfqs5 fields changed- added
Input schema / properties / base_assetAdded value: +{ + "description": "Filter by base asset (\"SYMBOL@chain\" or id)", + "type": "string" +} - added
Input schema / properties / directionAdded value: +{ + "enum": [ + "sell_base", + "buy_base" + ], + "type": "string" +} - removed
Input schema / properties / pageRemoved value: -{ - "description": "1-based page number. Default 1.", - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / pageSizeRemoved value: -{ - "description": "Page size, 1-100. Default 20.", - "maximum": 100, - "minimum": 1, - "type": "integer" -} - added
Input schema / properties / quote_assetAdded value: +{ + "description": "Filter by quote asset", + "type": "string" +}
- Removed
list_supported_pairs - Added
my_deals - Added
my_rfqs - Added
negotiate - Removed
refund_htlc - Added
refund_leg - Removed
respond_rfq - Added
respond_to_rfq - Added
reveal_claim - Added
set_settlement_address - Removed
swap_cancel - Removed
swap_execute - Removed
swap_quote - Removed
swap_status - Added
whoami - Removed
withdraw_htlc
13 tool updates
v0.4.0- First observed
create_htlc - First observed
create_rfq - First observed
get_htlc - First observed
list_my_trades - First observed
list_open_rfqs - First observed
list_supported_pairs - First observed
refund_htlc - First observed
respond_rfq - First observed
swap_cancel - First observed
swap_execute - First observed
swap_quote - First observed
swap_status - First observed
withdraw_htlc
TDQS
Scored across 17 tools
Tools mostly have distinct purposes across the RFQ→negotiation→settlement lifecycle, and descriptions clarify boundaries (e.g. get_rfq vs my_rfqs vs list_open_rfqs). A few pairs could be confused—my_deals vs deal_status, and get_deal_secret vs claim_leg vs reveal_claim—but the descriptions make the distinction clear enough.
Most tools follow a verb_noun pattern (get_rfq, create_rfq, cancel_rfq, fund_leg, claim_leg), but there are notable deviations: bare verbs (negotiate), noun forms (deal_status, whoami), and my_-prefixed listers (my_rfqs, my_deals). Still readable, but the convention is mixed.
17 tools for a full OTC RFQ + HTLC settlement lifecycle is slightly heavy but each tool maps to a real step (browse, create, respond, negotiate, fund, claim, refund, report). Nothing feels gratuitous, though the surface is on the larger side.
Coverage is strong: RFQ creation/browsing/cancellation, negotiation, deal state, settlement addressing, key/secret handling, funding, claiming, refunding, and claim reporting. Minor gaps exist (e.g. no RFQ editing or explicit deal abandonment beyond reject), but core workflows are end-to-end.
Maintenance
Related MCP Connectors
Atomadic MCP: 68 deterministic tools for agent identity, escrow, SLA, EU AI Act compliance.
Agent-native MCP for governed commerce, x402 payments, paid capabilities, and verifiable receipts.
Multi-agent coordination protocol on Solana. Swarm formation, on-chain settlement, 14 MCP tools.
Agent MCP for DeFi: cross-chain LINQ fan-out, AMM quotes/swaps, bridge, AI. Solana+EVM. Free+x402.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables cross-chain token swapping between different blockchains using 1inch Fusion+ API, along with portfolio management tools for tracking assets across chains.1-

hashlock-mcp-serverofficial
AlicenseAqualityDmaintenanceHashlock Markets (hashlock.markets) — sealed-bid intent-based crypto trading protocol with HTLC atomic settlement. AI agents can create, commit, and validate trading intents on Ethereum, Bitcoin, and Sui. Canonical npm package: @hashlock-tech/mcp. Not the cryptographic hashlock primitive, not Hashlock Pty Ltd (hashlock.com).521 npmMIT
Haiku DeFi MCPofficial
AlicenseAqualityFmaintenanceMCP server for DeFi execution — lets AI agents swap, provide liquidity, lend, bridge, and run yield strategies across 22 chains in a single transaction. 7 tools for token discovery, portfolio analysis, quoting, and execution via the Haiku API.7162 npm2MIT- AlicenseNot gradedqualityBmaintenanceOpen intent exchange that gives any AI agent a portable, verifiable track record: one-command Ed25519 identity, reputation-ranked discovery, signed sponsorship disclosures, and dual-signed outcomes on a publicly auditable ledger. Zero-config — npx -y erabi-mcp joins the live public network.1Apache 2.0