_ registry / mcp streamable-http · checked 6h ago

bull-otc

https://www.bull.family

Registry code: 00f01816b1ca9a4e

api record

Bull is a non-custodial OTC escrow for token block trades. Buyers post an RFQ, sellers send sealed quotes, one escrow transaction settles the swap. Start with bull_info. Chains: Robinhood Chain.

endpoint
https://www.bull.family/api/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is bull-otc live?
Yes — it answered the hub's last check (checked 6h ago). It answered 100% of checks over the last 30 days.
Is bull-otc free to use?
Yes — the hub reached it with no key and no payment.
What tools does bull-otc have?
16 tools: bull_get_receipt, bull_create_rfq, bull_send_quote, bull_get_quotes, bull_counter_quote, bull_revise_quote, bull_accept_quote, bull_attach_deal, ….
Is bull-otc safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
454ms

last good check

priced tools
0

of 16 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 16 tools
2 open 14 never probed 2 of 16 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • bull_stats open 6h ago

    Use to check Bull's track record: number of settled deals, total volume, open RFQs and the latest settled deals, read from the escrow contract. Public, no signature needed.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {}
    }
    arguments 5 lines
  • bull_list_rfqs open 6h ago

    Use when you SELL or hold a token and want to find buyers: lists open requests for quotes on Bull (token, size in USD, window, buyer's price limit). Returns rfqIds to answer with bull_send_quote. Public, no signature needed. Not for finding market prices.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {
        "chain": {
          "type": "string",
          "description": "Chain name. Default: Robinhood Chain."
        },
        "token": {
          "type": "string",
          "description": "Token contract address to filter by (optional)."
        }
      }
    }
    arguments 14 lines
  • bull_get_receipt unknown never probed

    Use to get proof of a completed trade: a signed receipt for a settled deal (buyer, seller, token, amounts, fee) that anyone can re-check onchain. Public. Fails with not_settled for deals that are still open.

    mcp-tool

    {
      "type": "object",
      "required": [
        "dealId"
      ],
      "properties": {
        "dealId": {
          "type": "string",
          "description": "Deal number."
        }
      }
    }
    arguments 12 lines
  • bull_create_rfq unknown never probed

    Use when you want to BUY a token in size (a block trade) without moving the market price: posts a private request for quotes on Bull, a non-custodial atomic OTC settlement layer. Returns an rfqId; sellers answer with sealed quotes only you can read. Optional maxPrice limit and webhook; set dryRun to only validate, idempotencyKey to make retries safe. Not for small market swaps (use a DEX) or paying for API calls (use x402). Signed: the first call returns a message to sign; call again with the same arguments plus timestamp and signature.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token",
        "sizeUsd",
        "address"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Short note to sellers (optional)."
        },
        "chain": {
          "type": "string",
          "description": "Chain name. Default: Robinhood Chain."
        },
        "token": {
          "type": "string",
          "description": "Token contract address you want to buy."
        },
        "dryRun": {
          "type": "boolean",
          "description": "true = only check the request, nothing is created. Optional."
        },
        "symbol": {
          "type": "string",
          "description": "Token symbol (optional)."
        },
        "address": {
          "type": "string",
          "description": "Your wallet address (the buyer or seller). Required."
        },
        "sizeUsd": {
          "type": "number",
          "description": "Size in USD (minimum 5 during beta)."
        },
        "webhook": {
          "type": "string",
          "description": "https URL that receives events: quote.received, quote.revised, deal.settled (optional)."
        },
        "maxPrice": {
          "type": "string",
          "description": "Your limit: the most you will pay in total, in ETH (optional). Quotes above it are refused."
        },
        "signature": {
          "type": "string",
          "description": "EIP-191 personal_sign of `message` from the previous response. Leave empty on the first call."
        },
        "timestamp": {
          "type": "string",
          "description": "From the previous bull_* response. Leave empty on the first call."
        },
        "windowMin": {
          "type": "number",
          "description": "How long the request stays open, in minutes: 15, 30, 60, 360 or 1440. Default 60."
        },
        "idempotencyKey": {
          "type": "string",
          "description": "Unique key (8-64 characters) so a retry never creates a duplicate. Optional."
        }
      }
    }
    arguments 62 lines
  • bull_send_quote unknown never probed

    Use when you want to SELL tokens to a buyer who posted an RFQ: sends a sealed quote (token amount and total ETH price) that only the buyer sees. Returns a quoteId. The swap settles atomically in one escrow transaction, so you never deliver before you are paid. Not for listing prices publicly. Signed: the first call returns a message to sign; call again with the same arguments plus timestamp and signature.

    mcp-tool

    {
      "type": "object",
      "required": [
        "rfqId",
        "tokens",
        "price",
        "address"
      ],
      "properties": {
        "price": {
          "type": "string",
          "description": "Total price in ETH, e.g. \"0.25\"."
        },
        "rfqId": {
          "type": "string",
          "description": "RFQ id."
        },
        "dryRun": {
          "type": "boolean",
          "description": "true = only check the request, nothing is created. Optional."
        },
        "payout": {
          "type": "string",
          "description": "Wallet that receives the payment (optional)."
        },
        "tokens": {
          "type": "string",
          "description": "Token amount, e.g. \"1000\"."
        },
        "address": {
          "type": "string",
          "description": "Your wallet address (the buyer or seller). Required."
        },
        "webhook": {
          "type": "string",
          "description": "https URL that receives events: quote.countered, quote.accepted, quote.rejected, deal.buyer_funded, deal.settled (optional)."
        },
        "signature": {
          "type": "string",
          "description": "EIP-191 personal_sign of `message` from the previous response. Leave empty on the first call."
        },
        "timestamp": {
          "type": "string",
          "description": "From the previous bull_* response. Leave empty on the first call."
        },
        "idempotencyKey": {
          "type": "string",
          "description": "Unique key (8-64 characters) so a retry never creates a duplicate. Optional."
        }
      }
    }
    arguments 51 lines
  • bull_get_quotes unknown never probed

    Use as a BUYER to read the sealed quotes on your own RFQ: seller, token amount, total price, counter state, deal status. Returns a list of quotes with quoteIds. Only the RFQ's buyer can read it. Signed: the first call returns a message to sign; call again with the same arguments plus timestamp and signature.

    mcp-tool

    {
      "type": "object",
      "required": [
        "rfqId",
        "address"
      ],
      "properties": {
        "rfqId": {
          "type": "string",
          "description": "RFQ id."
        },
        "address": {
          "type": "string",
          "description": "Your wallet address (the buyer or seller). Required."
        },
        "signature": {
          "type": "string",
          "description": "EIP-191 personal_sign of `message` from the previous response. Leave empty on the first call."
        },
        "timestamp": {
          "type": "string",
          "description": "From the previous bull_* response. Leave empty on the first call."
        }
      }
    }
    arguments 25 lines
  • bull_counter_quote unknown never probed

    Use as a BUYER to negotiate: propose a different total price (and optionally a different token amount) on a pending quote. Returns the stored counter. The seller can answer with bull_revise_quote. Works only while the quote is pending. Signed: the first call returns a message to sign; call again with the same arguments plus timestamp and signature.

    mcp-tool

    {
      "type": "object",
      "required": [
        "quoteId",
        "price",
        "address"
      ],
      "properties": {
        "price": {
          "type": "string",
          "description": "Your proposed total price in ETH."
        },
        "tokens": {
          "type": "string",
          "description": "Your proposed token amount (optional)."
        },
        "address": {
          "type": "string",
          "description": "Your wallet address (the buyer or seller). Required."
        },
        "quoteId": {
          "type": "string",
          "description": "Quote id."
        },
        "signature": {
          "type": "string",
          "description": "EIP-191 personal_sign of `message` from the previous response. Leave empty on the first call."
        },
        "timestamp": {
          "type": "string",
          "description": "From the previous bull_* response. Leave empty on the first call."
        }
      }
    }
    arguments 34 lines
  • bull_revise_quote unknown never probed

    Use as a SELLER to change the price and/or token amount of your own pending quote, for example to meet the buyer's counter. Returns the new terms. The buyer then accepts with bull_accept_quote. Works only while the quote is pending. Signed: the first call returns a message to sign; call again with the same arguments plus timestamp and signature.

    mcp-tool

    {
      "type": "object",
      "required": [
        "quoteId",
        "address"
      ],
      "properties": {
        "price": {
          "type": "string",
          "description": "New total price in ETH (optional)."
        },
        "tokens": {
          "type": "string",
          "description": "New token amount (optional)."
        },
        "address": {
          "type": "string",
          "description": "Your wallet address (the buyer or seller). Required."
        },
        "quoteId": {
          "type": "string",
          "description": "Quote id."
        },
        "signature": {
          "type": "string",
          "description": "EIP-191 personal_sign of `message` from the previous response. Leave empty on the first call."
        },
        "timestamp": {
          "type": "string",
          "description": "From the previous bull_* response. Leave empty on the first call."
        }
      }
    }
    arguments 33 lines
  • bull_accept_quote unknown never probed

    Use as a BUYER to accept a quote. Returns the exact createDeal transaction (with Bull's signed fee quote) for your wallet to send; Bull never holds your funds. Then call bull_attach_deal with the dealId from the DealCreated event. Safe to call again to refresh the fee quote. Signed: the first call returns a message to sign; call again with the same arguments plus timestamp and signature.

    mcp-tool

    {
      "type": "object",
      "required": [
        "quoteId",
        "address"
      ],
      "properties": {
        "address": {
          "type": "string",
          "description": "Your wallet address (the buyer or seller). Required."
        },
        "quoteId": {
          "type": "string",
          "description": "Quote id."
        },
        "payAsset": {
          "type": "string",
          "description": "\"base\" to pay in ETH (default) or \"alt\" to pay in the stablecoin."
        },
        "signature": {
          "type": "string",
          "description": "EIP-191 personal_sign of `message` from the previous response. Leave empty on the first call."
        },
        "timestamp": {
          "type": "string",
          "description": "From the previous bull_* response. Leave empty on the first call."
        }
      }
    }
    arguments 29 lines
  • bull_attach_deal unknown never probed

    Use as a BUYER after sending createDeal: report the dealId. Bull checks it against the quote and returns the payment transactions (approve if needed, then fundPayment) to send from the buyer wallet. When the seller deposits, the swap settles in that transaction. Signed: the first call returns a message to sign; call again with the same arguments plus timestamp and signature.

    mcp-tool

    {
      "type": "object",
      "required": [
        "quoteId",
        "dealId",
        "address"
      ],
      "properties": {
        "dealId": {
          "type": "string",
          "description": "Deal number from the DealCreated event."
        },
        "address": {
          "type": "string",
          "description": "Your wallet address (the buyer or seller). Required."
        },
        "quoteId": {
          "type": "string",
          "description": "Quote id."
        },
        "signature": {
          "type": "string",
          "description": "EIP-191 personal_sign of `message` from the previous response. Leave empty on the first call."
        },
        "timestamp": {
          "type": "string",
          "description": "From the previous bull_* response. Leave empty on the first call."
        }
      }
    }
    arguments 30 lines
  • bull_deposit_plan unknown never probed

    Use as a SELLER after the buyer has paid into escrow: returns what to sign to deposit your tokens, either a gasless EIP-2612 permit (Bull's relayer pays gas) or direct approve + fundTokens transactions. Fails with not_ready until the buyer has funded. Signed: the first call returns a message to sign; call again with the same arguments plus timestamp and signature.

    mcp-tool

    {
      "type": "object",
      "required": [
        "quoteId",
        "address"
      ],
      "properties": {
        "address": {
          "type": "string",
          "description": "Your wallet address (the buyer or seller). Required."
        },
        "quoteId": {
          "type": "string",
          "description": "Quote id."
        },
        "signature": {
          "type": "string",
          "description": "EIP-191 personal_sign of `message` from the previous response. Leave empty on the first call."
        },
        "timestamp": {
          "type": "string",
          "description": "From the previous bull_* response. Leave empty on the first call."
        }
      }
    }
    arguments 25 lines
  • bull_deposit unknown never probed

    Use as a SELLER to submit the signed permit from bull_deposit_plan. Bull's relayer sends it and pays the gas; the swap settles in that transaction and you are paid in the same step. Returns the transaction hash. Signed: the first call returns a message to sign; call again with the same arguments plus timestamp and signature.

    mcp-tool

    {
      "type": "object",
      "required": [
        "quoteId",
        "permitDeadline",
        "v",
        "r",
        "s",
        "address"
      ],
      "properties": {
        "r": {
          "type": "string",
          "description": "Signature r."
        },
        "s": {
          "type": "string",
          "description": "Signature s."
        },
        "v": {
          "type": "number",
          "description": "Signature v."
        },
        "address": {
          "type": "string",
          "description": "Your wallet address (the buyer or seller). Required."
        },
        "quoteId": {
          "type": "string",
          "description": "Quote id."
        },
        "signature": {
          "type": "string",
          "description": "EIP-191 personal_sign of `message` from the previous response. Leave empty on the first call."
        },
        "timestamp": {
          "type": "string",
          "description": "From the previous bull_* response. Leave empty on the first call."
        },
        "permitDeadline": {
          "type": "string",
          "description": "message.deadline from the permit."
        }
      }
    }
    arguments 45 lines
  • bull_quote_status unknown never probed

    Use as BUYER or SELLER to check a quote and its onchain deal: status (pending, confirmed, funded, released), dealId, counter, who has funded. Poll this or use webhooks. Only the two parties can read it. Signed: the first call returns a message to sign; call again with the same arguments plus timestamp and signature.

    mcp-tool

    {
      "type": "object",
      "required": [
        "quoteId",
        "address"
      ],
      "properties": {
        "address": {
          "type": "string",
          "description": "Your wallet address (the buyer or seller). Required."
        },
        "quoteId": {
          "type": "string",
          "description": "Quote id."
        },
        "signature": {
          "type": "string",
          "description": "EIP-191 personal_sign of `message` from the previous response. Leave empty on the first call."
        },
        "timestamp": {
          "type": "string",
          "description": "From the previous bull_* response. Leave empty on the first call."
        }
      }
    }
    arguments 25 lines
  • bull_reject_quote unknown never probed

    Use as a BUYER to reject a quote you do not want. Returns status rejected. Not needed for quotes that simply expire. Signed: the first call returns a message to sign; call again with the same arguments plus timestamp and signature.

    mcp-tool

    {
      "type": "object",
      "required": [
        "quoteId",
        "address"
      ],
      "properties": {
        "address": {
          "type": "string",
          "description": "Your wallet address (the buyer or seller). Required."
        },
        "quoteId": {
          "type": "string",
          "description": "Quote id."
        },
        "signature": {
          "type": "string",
          "description": "EIP-191 personal_sign of `message` from the previous response. Leave empty on the first call."
        },
        "timestamp": {
          "type": "string",
          "description": "From the previous bull_* response. Leave empty on the first call."
        }
      }
    }
    arguments 25 lines
  • bull_info unknown never probed

    Use first to see what Bull is: supported chains, escrow contract, fee tiers, minimum size and auth rules. Public. Bull is a non-custodial atomic OTC/RFQ settlement layer.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {}
    }
    arguments 5 lines
  • bull_get_deal unknown 6h ago

    Use to verify any escrow deal onchain: open, settled or cancelled, and whether buyer and seller have funded. Public, no signature needed. Returns the deal state read from the contract.

    mcp-tool

    {
      "type": "object",
      "required": [
        "dealId"
      ],
      "properties": {
        "dealId": {
          "type": "string",
          "description": "Deal number from the DealCreated event."
        }
      }
    }
    arguments 12 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 00f01816b1ca9a4e.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/00f01816b1ca9a4e/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/00f01816b1ca9a4e/badge.svg)](https://brick.blue/agent/00f01816b1ca9a4e?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.