Skip to main content
Glama

Post an RFQ

create_rfq

Post a public or private RFQ to trade cross-chain assets, defining direction, amount, and price. Private orders return a link to share with a counterparty.

Instructions

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

Input Schema

NameRequiredDescriptionDefault
ask_priceNoTOTAL quote-asset amount you ask (not per-unit), at most 8 decimals of its asset (fewer if the asset has fewer); the API refuses more. Required for private orders.
directionYessell_base: you give the base asset; buy_base: you receive it
base_assetYes"SYMBOL@chain" or asset id
visibilityNopublic: on the board; private: link-only at your fixed ask_pricepublic
base_amountYesHuman decimal amount of the base asset, e.g. "0.05"
quote_assetYes"SYMBOL@chain" or asset id
ttl_secondsNoHow long the request stays open, in seconds (default 1 day, at most 7 days)
target_addressNoPrivate only: lock the order to this counterparty wallet (on the chain THEY give)

Output Schema

NameRequiredDescriptionDefault
errorNoSet instead when the call failed
rfqIdNoRequest id
statusNo
askPriceNoTotal ask; null if none
baseAmountNo
share_linkNoPrivate order link to share

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changedv1.11.1
    • removedInput schema / additionalProperties
      Removed value: -false
    • changedInput schema / properties / ask_price / description
      Previous value: -"TOTAL quote-asset amount you ask (not per-unit). Required for private orders."New value: +"TOTAL quote-asset amount you ask (not per-unit), at most 8 decimals of its asset (fewer if the asset has fewer); the API refuses more. Required for private orders."
    • addedInput schema / properties / direction / description
      Added value: +"sell_base: you give the base asset; buy_base: you receive it"
    • addedInput schema / properties / ttl_seconds / description
      Added value: +"How long the request stays open, in seconds (default 1 day, at most 7 days)"
    • addedInput schema / properties / visibility / description
      Added value: +"public: on the board; private: link-only at your fixed ask_price"
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": {},
      +  "properties": {
      +    "askPrice": {
      +      "description": "Total ask; null if none",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "baseAmount": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "error": {
      +      "additionalProperties": {},
      +      "description": "Set instead when the call failed",
      +      "properties": {
      +        "code": {
      +          "type": "string"
      +        },
      +        "is_retryable": {
      +          "type": "boolean"
      +        },
      +        "message": {
      +          "type": "string"
      +        },
      +        "recovery_hint": {
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "rfqId": {
      +      "description": "Request id",
      +      "type": "string"
      +    },
      +    "share_link": {
      +      "description": "Private order link to share",
      +      "type": "string"
      +    },
      +    "status": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  2. Changed18 schema fields changedv0.10.0
    • 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"
      +]
  3. First observedv0.4.0

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly=false, openWorld=true, destructive=false), it discloses the key operational prerequisite — the authenticated account must hold a proven wallet for the asset being given — and explains the private-order lifecycle (link returned, shared out-of-band, optionally wallet-locked). That is exactly the kind of pre-call constraint an agent cannot infer from the hint flags.

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, then mode semantics, then a clearly labelled PREREQUISITE. A few clauses duplicate the schema's own enum descriptions, but each sentence still supports a real decision (mode choice or eligibility).

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 an output schema present, return values need no explanation, and the description covers eligibility, mode trade-offs, and the private-link flow. It is silent on non-idempotency (accidental duplicate postings) and on any funding/escrow implications involving fund_leg, which are the only material gaps for an 8-parameter creation tool.

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 100% and the description largely restates what the schema already documents for direction, visibility, ask_price and target_address. The only genuinely additive detail is that the private order's link is a returned artifact to hand to the counterparty, so the baseline 3 applies.

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 opens with a specific verb+resource ("Post a trade request") and immediately disambiguates the two modes it can create (public board RFQ vs. link-only private order). Against siblings like list_open_rfqs, respond_to_rfq and cancel_rfq, an agent can tell this is the creation entry point 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 gives concrete selection logic between visibility=public and visibility=private, including that private requires ask_price and that the resulting link must be shared. It stops short of naming alternatives (e.g., respond to an existing RFQ instead of posting a new one) or stating when not to post, so it is strong context rather than a full routing rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.