Skip to main content
Glama

@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 at https://docs.hashlock.markets/mcp.

npm License: MIT MCP Badge

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:

  1. Browse the asset registry and the public RFQ board

  2. Post a public RFQ or a private fixed-price order (shareable link)

  3. Respond to requests with a price; negotiate (counter / accept / decline) in the deal thread

  4. Agree — accept the other side's price → an HTLC swap is created (your own quote or counter already counts as your acceptance)

  5. 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/mcp

Minimal 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

HASHLOCK_EVM_KEY

EVM

SIWE personal_sign

HASHLOCK_TRON_KEY

TRON

signMessageV2

HASHLOCK_BTC_KEY

Bitcoin

BIP-322

HASHLOCK_SOLANA_KEY

Solana

ed25519 signMessage

HASHLOCK_TOKEN

—

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/mcp

Approving 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

401 + WWW-Authenticate: … resource_metadata=… (RFC 9728)

Client reads the resource + server metadata

/.well-known/oauth-protected-resource, /.well-known/oauth-authorization-server (RFC 8414)

Client registers itself

POST /oauth/register (RFC 7591)

You sign in and approve with a wallet signature, in the browser

/oauth/authorize

Client redeems the code for a key

POST /oauth/token — PKCE S256 required (RFC 7636)

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:http

Env: 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

list_assets

Asset registry (SYMBOL@chain refs, decimals)

list_open_rfqs

Public RFQ board, filterable

get_rfq

One RFQ / private order

create_rfq

Post a public RFQ or private fixed-price order

cancel_rfq

Cancel your own request

respond_to_rfq

Respond with a price → opens a deal thread

negotiate

message / propose / accept_proposal / accept / reject — accepting names the price you read, and is refused if it moved; your own quote or counter counts as your acceptance, so you accept only the other side's price; accept_proposal takes their counter and agrees the deal in one step

my_rfqs, my_deals

Your requests and deal threads

deal_status

Thread + negotiation history + HTLC swap state

set_settlement_address

Your receive/refund address per chain

get_deal_secret

The locally-stored swap preimage (gated on both legs funded)

reveal_claim

Report an out-of-band claim (secret + tx) so the other leg settles

whoami

The account you're authenticated as

fund_leg

Autonomous: fund your side of a swap on-chain with the agent's own key (EVM/TRON/BTC/Solana)

claim_leg

Autonomous: claim your receive leg with the preimage (reveals the secret on-chain)

refund_leg

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         # vitest

Releasing 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 tools
cancel_rfqAInspect

Cancel your own RFQ / private order (before a deal is agreed).

NameRequiredDescriptionDefault
rfq_idYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
swap_idYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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).

NameRequiredDescriptionDefault
ask_priceNoTOTAL quote-asset amount you ask (not per-unit). Required for private orders.
directionYes
base_assetYes"SYMBOL@chain" or asset id
visibilityNopublic
base_amountYesHuman decimal amount of the base asset, e.g. "0.05"
quote_assetYes"SYMBOL@chain" or asset id
ttl_secondsNo
target_addressNoPrivate only: lock the order to this counterparty wallet (on the chain THEY give)

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
thread_idYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
swap_idYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
thread_idYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
rfq_idYes

TDQS

C2.6/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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").

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
directionNo
base_assetNoFilter by base asset ("SYMBOL@chain" or id)
quote_assetNoFilter by quote asset

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
bodyNomessage text (action=message)
priceNototal price: the new one (propose) or the one you are accepting (accept_proposal, accept)
actionYes
thread_idYes

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
swap_idYes

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
priceYesTotal quote-asset amount, human decimal
rfq_idYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
legNo
secretYes64-char hex preimage (from get_deal_secret or the on-chain claim)
swap_idYes
claim_txNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
legNoRequired when both legs are on this chain
chainYesChain id from list_assets, e.g. "ethereum", "bitcoin", "tron" (see list_assets)
addressYes
swap_idYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 28 tool updatesv0.10.0
    • Addedcancel_rfq
    • Addedclaim_leg
    • Removedcreate_htlc
    • Changedcreate_rfq18 fields changed
      • removedInput schema / properties / amount
        Removed 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"
        -}
      • addedInput schema / properties / ask_price
        Added value: +{
        +  "description": "TOTAL quote-asset amount you ask (not per-unit). Required for private orders.",
        +  "type": "string"
        +}
      • removedInput schema / properties / baseChain
        Removed 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"
        -}
      • removedInput schema / properties / baseToken
        Removed value: -{
        -  "description": "Base asset symbol from the supported list (ETH, BTC, SUI, USDC, USDT, WBTC, WETH). Case-insensitive but uppercase preferred.",
        -  "type": "string"
        -}
      • addedInput schema / properties / base_amount
        Added value: +{
        +  "description": "Human decimal amount of the base asset, e.g. \"0.05\"",
        +  "type": "string"
        +}
      • addedInput schema / properties / base_asset
        Added value: +{
        +  "description": "\"SYMBOL@chain\" or asset id",
        +  "type": "string"
        +}
      • removedInput schema / properties / client_request_id
        Removed 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"
        -}
      • addedInput schema / properties / direction
        Added value: +{
        +  "enum": [
        +    "sell_base",
        +    "buy_base"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / expiresIn
        Removed 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"
        -}
      • removedInput schema / properties / isBlind
        Removed 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"
        -}
      • removedInput schema / properties / quoteChain
        Removed 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"
        -}
      • removedInput schema / properties / quoteToken
        Removed value: -{
        -  "description": "Quote asset symbol from the supported list. Same rules as baseToken.",
        -  "type": "string"
        -}
      • addedInput schema / properties / quote_asset
        Added value: +{
        +  "description": "\"SYMBOL@chain\" or asset id",
        +  "type": "string"
        +}
      • removedInput schema / properties / side
        Removed 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"
        -}
      • addedInput schema / properties / target_address
        Added value: +{
        +  "description": "Private only: lock the order to this counterparty wallet (on the chain THEY give)",
        +  "type": "string"
        +}
      • addedInput schema / properties / ttl_seconds
        Added value: +{
        +  "default": 86400,
        +  "exclusiveMinimum": 0,
        +  "maximum": 604800,
        +  "type": "integer"
        +}
      • addedInput schema / properties / visibility
        Added value: +{
        +  "default": "public",
        +  "enum": [
        +    "public",
        +    "private"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "baseToken",
        -  "quoteToken",
        -  "side",
        -  "amount"
        -]New value: +[
        +  "direction",
        +  "base_asset",
        +  "base_amount",
        +  "quote_asset"
        +]
    • Addeddeal_status
    • Addedfund_leg
    • Addedget_deal_secret
    • Removedget_htlc
    • Addedget_rfq
    • Addedlist_assets
    • Removedlist_my_trades
    • Changedlist_open_rfqs5 fields changed
      • addedInput schema / properties / base_asset
        Added value: +{
        +  "description": "Filter by base asset (\"SYMBOL@chain\" or id)",
        +  "type": "string"
        +}
      • addedInput schema / properties / direction
        Added value: +{
        +  "enum": [
        +    "sell_base",
        +    "buy_base"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / page
        Removed value: -{
        -  "description": "1-based page number. Default 1.",
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • removedInput schema / properties / pageSize
        Removed value: -{
        -  "description": "Page size, 1-100. Default 20.",
        -  "maximum": 100,
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • addedInput schema / properties / quote_asset
        Added value: +{
        +  "description": "Filter by quote asset",
        +  "type": "string"
        +}
    • Removedlist_supported_pairs
    • Addedmy_deals
    • Addedmy_rfqs
    • Addednegotiate
    • Removedrefund_htlc
    • Addedrefund_leg
    • Removedrespond_rfq
    • Addedrespond_to_rfq
    • Addedreveal_claim
    • Addedset_settlement_address
    • Removedswap_cancel
    • Removedswap_execute
    • Removedswap_quote
    • Removedswap_status
    • Addedwhoami
    • Removedwithdraw_htlc
  2. 13 tool updatesv0.4.0
    • First observedcreate_htlc
    • First observedcreate_rfq
    • First observedget_htlc
    • First observedlist_my_trades
    • First observedlist_open_rfqs
    • First observedlist_supported_pairs
    • First observedrefund_htlc
    • First observedrespond_rfq
    • First observedswap_cancel
    • First observedswap_execute
    • First observedswap_quote
    • First observedswap_status
    • First observedwithdraw_htlc

TDQS

B3.4/5.0

Scored across 17 tools

Disambiguation4/5

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.

Naming Consistency3/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Hashlock 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).
    5
    21 npm
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    MCP 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.
    7
    162 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Open 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.
    1
    Apache 2.0