amazing-binance-mcp
Provides integration with the Binance Spot and Wallet REST API, enabling reading of deposits, withdrawals, trades, balances, fiat and Pay history, market data, and—when enabled—placing and cancelling spot orders, order lists, TWAP algo orders, and conversions.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@amazing-binance-mcpshow my current BTC balance"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Binance MCP Server (amazing-binance-mcp)
A Model Context Protocol server for the Binance Spot + Wallet REST API, built on the official MCP Python SDK (FastMCP, stdio transport). It authenticates with a plain API key — Ed25519 or HMAC, no OAuth — so an LLM can read your deposits, withdrawals, trades, balances, fiat and Pay history and live market data, and — only when you flip the kill-switch — place and cancel spot orders, order lists, TWAP algo orders and conversions.
The PyPI distribution and console script are both
amazing-binance-mcp(the barebinance-mcpandbinance-mcp-servernames on PyPI belong to unrelated packages). Always runuvx amazing-binance-mcp.
Safety model
Three rails, all enforced in the HTTP client — not in the tools — so no tool can forget them:
No withdrawals, ever. There is no withdrawal tool, and the client refuses the withdrawal and fiat-rail endpoints under any configuration. Create the API key with "Enable Withdrawals" off and an IP allowlist as well;
binance_health_checkwarns if the key can withdraw.Trading is off by default. Anything that moves funds or changes account state — orders, cancels, order lists, transfers between your wallets, convert, TWAP, dust conversion — returns
Error: … trading is disableduntilBINANCE_ALLOW_TRADING=1. The order dry-run (binance_test_order) always works. Those tools are marked 🔒 below.Confirmations never claim more than Binance said. A placed order echoes the status Binance returned (an
EXPIREDFOK is reported as not live); a TWAP is accepted, not executed; a convert is converted only when the status isSUCCESS. A 5xx or timeout on a mutating call is reported as execution UNKNOWN with the tool to query before retrying — the server never retries a mutation on its own.
Everything else is read-only and works with a key that only has "Enable Reading".
Related MCP server: Binance MCP Server
Features
Your whole history, since the account was created. Deposits, withdrawals, fiat orders and payments, Binance Pay, convert trades and — per symbol, since Binance has no cross-symbol endpoint — every spot trade, via budgeted walk tools that slice the 90-day / 30-day / 24-hour windows the API imposes and hand you a resume cursor when a budget runs out (see History walks).
Spot trading for algotrading. Dry-run validation, market/limit/stop orders, cancel and cancel-replace, OCO / OTO / OTOCO lists, TWAP algo orders, convert quotes — numbers travel as strings exactly as you typed them, and every per-type mandatory parameter set is validated locally before anything is signed.
Market data without a key. Exchange info with the filters an order must respect, order book, trades, klines, tickers.
Spot, funding and earn balances, wallet-to-wallet transfers, dust, fees, dividends, and the account's API-key permissions.
Dual-format responses — markdown for humans and LLMs (default) or JSON for programmatic use, per call via
response_format.Strict inputs, uniform errors. One pydantic model per tool (
extra="forbid"), and Binance's{code, msg}errors normalised into readable strings with a hint for the codes that have a known fix (-1021clock drift,-1022signature,-2015permissions/IP,-2010filters,-1127window too wide …).stdio-only transport. No HTTP/SSE and no logging to stdout — stdout is the protocol channel.
Available Tools
All 83 tools, grouped by module. 🔒 = refused unless BINANCE_ALLOW_TRADING=1.
Tool | Description |
Health | |
| Verify connectivity, clock drift, and API-key permissions against Binance. |
Market data | |
| Fetch compressed/aggregate trades (same price, same taker order, same timestamp merged). |
| Fetch the current average price over Binance's configured window (typically 5 min). |
| Fetch the best bid/ask price and quantity for one, several, or all symbols. |
| Look up trading rules, symbol status, and order filters for spot symbols. |
| Fetch OHLCV candlestick data for a symbol. |
| Fetch the current order book (bids/asks) for a symbol. |
| Fetch the most recent public trades for a symbol. |
| Fetch price change statistics over an arbitrary rolling window. |
| Fetch 24-hour rolling price change statistics. |
| Fetch the latest price for one, several, or all symbols. |
| Fetch price change statistics for the current trading day (a fixed calendar window). |
| Fetch presentation-adjusted candlestick data, matching Binance's own chart UI. |
Spot account | |
| List Smart Order Routing (SOR) allocations — the per-symbol fills behind an SOR order. |
| Get the account's standard/special/tax commission rates for one symbol. |
| Get the account's current order-rate-limit usage (per-second/day order counts). |
| List orders rejected by Self-Trade Prevention (STP) for a symbol. |
| Get spot account state: trade/withdraw/deposit flags, commission rates, balances. |
Spot orders | |
| Cancel EVERY open order on one symbol, including order-list legs. |
| Cancel one open spot order by id. |
| Cancel one order and place its replacement in a single request. |
| List a symbol's orders — open, filled, cancelled and expired alike. |
| List the orders currently resting on the book. |
| Look up one order — open, filled, cancelled or expired — by id. |
| Place a REAL spot order on Binance. This spends real money. |
| Validate an order against Binance's filters WITHOUT sending it to the order book. |
Order lists (OCO / OTO / OTOCO) | |
| Cancel an ENTIRE order list — every leg of it — by id. |
| List this account's order lists — working, completed and cancelled — across symbols. |
| List the order lists that are still working, across every symbol. |
| Look up one order list — OCO, OTO or OTOCO — by id. |
| Place a REAL one-cancels-the-other pair (take-profit + stop). This spends real money. |
| Place a REAL one-triggers-the-other pair (entry, then follow-up). Real money. |
| Place a REAL entry that arms a take-profit/stop pair when it fills. Real money. |
Trade history | |
| Work out which symbols this account plausibly traded — Binance will not tell you. |
| Collect every fill across every symbol this account traded — the "all my trades" answer. |
| Fetch YOUR executed trades (fills) for one symbol. |
Wallet — deposits & withdrawals | |
| Every crypto deposit since |
| Every crypto withdrawal since |
| Per-coin deposit/withdraw switches, networks, fees and minimums. |
| Get the deposit address for one coin on one network. |
| List every deposit address issued for one coin, across networks. |
| List crypto deposits into the account for one window (up to 90 days). |
| List crypto withdrawals out of the account for one window (up to 90 days). |
Wallet — assets, funding & transfers | |
| Convert small balances to BNB. Irreversible — the assets are sold for BNB. |
| Report per-asset deposit/withdraw status, withdraw fee and minimum. |
| List asset distributions credited to the account (airdrops, rebates, interest). |
| Preview which small balances can be converted to BNB, and what they are worth. |
| List past dust-to-BNB conversions, with the per-asset detail of each one. |
| Read the Funding wallet — the wallet behind Binance Pay, Card and Gift Card. |
| Report the maker/taker commission rates that apply to this account. |
| List past transfers between the account's own wallets, one direction at a time. |
| List the Spot wallet's non-zero balances, optionally valued in BTC. |
| Show one total per wallet: Spot, Funding, Cross/Isolated Margin, Futures, Earn… |
| Move funds between the account's OWN wallets (Spot ⇄ Funding ⇄ Margin ⇄ Futures). |
Wallet — account status | |
| Report the account's VIP tier and which product lines are enabled. |
| Return daily balance snapshots for the SPOT, MARGIN or FUTURES wallet. |
| Report whether the account is in good standing with Binance. |
| Report the full permission flag set on the configured API key. |
| Report whether spot trading is locked and what triggered it. |
| List symbols scheduled to be delisted, with their delisting date. |
| Report whether the Binance system is up or under maintenance. |
Fiat | |
| Walk fiat deposit/withdraw or buy/sell history across pages and time windows. |
| List fiat-rail deposit or withdraw orders (bank transfer/card top-up of the fiat wallet). |
| List crypto buy/sell payments made with fiat (bank transfer or bank-issued card). |
Binance Pay | |
| Walk up to 18 months of Binance Pay history, past the 90-day / 100-row API caps. |
| Fetch Binance Pay transactions (merchant payments, C2C, refunds, payouts) for the account. |
Convert | |
| Accept a convert quote and EXECUTE the conversion. This moves real funds. |
| Cancel a resting convert limit order. |
| Show the decimal precision ( |
| List past conversions, either for one <=30-day window or across a walked range. |
| List the convert limit orders currently resting on the account. |
| Check one conversion's status by orderId or by the quoteId it came from. |
| List the convertible asset pairs and their per-pair minimum/maximum amounts. |
| Request a convert quote: a reserved ratio, valid for 10 s to 2 minutes. |
| Place a convert LIMIT order: convert automatically if the ratio is reached. |
Spot algo (TWAP) | |
| Cancel a working spot TWAP algo order. |
| List finished spot TWAP algo orders — filled, cancelled or expired. |
| List the individual orders a TWAP placed on the book, with fills and fees. |
| List the spot TWAP algo orders that are still working, across every symbol. |
| Place a REAL spot TWAP algo order on Binance. This spends real money. |
Simple Earn | |
| Summarize total Simple Earn holdings (Flexible + Locked) in BTC and USDT. |
| List the caller's Simple Earn Flexible subscriptions and their live APR. |
| List the caller's Simple Earn Locked subscriptions and their APY/redeem dates. |
Read tools return markdown (default) or JSON; mutating tools return a confirmation that echoes exactly what Binance returned.
Prerequisites
uv — for the zero-install
uvxpath and for local development (Python 3.13+ is only needed for the clone path;uvxbrings its own).A Binance API key. Binance → Account → API Management:
Choose Self-generated and paste an Ed25519 public key (recommended — Binance has deprecated HMAC keys, and an unrestricted HMAC key may only hold "Enable Reading"). Generate the pair locally and keep the private key out of the repo:
openssl genpkey -algorithm ed25519 -out ~/.config/binance/ed25519.pem openssl pkey -pubout -in ~/.config/binance/ed25519.pem # paste this one into BinanceA "System generated" HMAC key (key + secret) also works.
Permissions: Enable Reading on; Enable Spot & Margin Trading only if you will place orders; Enable Withdrawals off; Permits Universal Transfer only if you want
binance_transfer_between_wallets.Restrict access to trusted IPs — the IP of the machine that runs this server.
(Optional) Spot testnet keys from https://testnet.binance.vision to exercise the trading tools with virtual funds. The testnet serves only
/api/v3(market data, account, orders) — wallet, fiat, Pay, convert and algo tools return404there.(Optional) Docker if you prefer the container path.
Quickstart
git clone https://github.com/trustxai/binance-mcp.git
cd binance-mcp
uv sync --group dev
cp .env.example .env # set BINANCE_API_KEY and BINANCE_PRIVATE_KEY_PATH (or BINANCE_API_SECRET)
uv run amazing-binance-mcp # starts the stdio serverThe server speaks MCP over stdio, so it is normally launched by an MCP client (see
Client Configuration) rather than run by hand. Call
binance_health_check first: it reports connectivity, clock drift against Binance's
server time, and the key's permission flags — with a ⚠️ if withdrawals are enabled or
the key has no IP allowlist.
Run with uvx (zero install)
BINANCE_API_KEY=your_key BINANCE_PRIVATE_KEY_PATH=~/.config/binance/ed25519.pem uvx amazing-binance-mcpPublic market data needs no credentials at all: uvx amazing-binance-mcp with nothing
set serves the market-data and health tools.
Use
amazing-binance-mcp, notbinance-mcp. The bare name on PyPI is an unrelated package and will not run this server.
Client Configuration
Every client launches the server as a subprocess and passes credentials through env.
Replace your_key and the PEM path; for an HMAC key use BINANCE_API_SECRET instead of
BINANCE_PRIVATE_KEY_PATH. Add "BINANCE_ALLOW_TRADING": "1" only for a client you
want to be able to trade.
Cursor
Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (per project):
{
"mcpServers": {
"binance": {
"command": "uvx",
"args": ["amazing-binance-mcp"],
"env": {
"BINANCE_API_KEY": "your_key",
"BINANCE_PRIVATE_KEY_PATH": "/Users/you/.config/binance/ed25519.pem"
}
}
}
}Claude Desktop
Edit claude_desktop_config.json (Settings → Developer → Edit Config; on macOS it lives
at ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"binance": {
"command": "uvx",
"args": ["amazing-binance-mcp"],
"env": {
"BINANCE_API_KEY": "your_key",
"BINANCE_PRIVATE_KEY_PATH": "/Users/you/.config/binance/ed25519.pem"
}
}
}
}Restart Claude Desktop after saving.
Claude Code
claude mcp add binance \
--env BINANCE_API_KEY=your_key \
--env BINANCE_PRIVATE_KEY_PATH=$HOME/.config/binance/ed25519.pem \
-- uvx amazing-binance-mcpOr add the equivalent block to ~/.claude.json under mcpServers (same shape as the
Cursor example above).
MCP Inspector
BINANCE_API_KEY=your_key BINANCE_PRIVATE_KEY_PATH=~/.config/binance/ed25519.pem \
npx @modelcontextprotocol/inspector uvx amazing-binance-mcpIf you cloned the repo, uv run mcp dev src/binance_mcp/server.py does the same (the
mcp dev CLI ships in the dev dependency group).
Docker
Build the image from the repo Dockerfile, then point any client at docker run. The
PEM has to be mounted into the container; with an HMAC key you can pass the secret through
env instead and drop the volume.
docker build -t amazing-binance-mcp .{
"mcpServers": {
"binance": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "/Users/you/.config/binance/ed25519.pem:/keys/ed25519.pem:ro",
"-e", "BINANCE_API_KEY",
"-e", "BINANCE_PRIVATE_KEY_PATH",
"amazing-binance-mcp"
],
"env": {
"BINANCE_API_KEY": "your_key",
"BINANCE_PRIVATE_KEY_PATH": "/keys/ed25519.pem"
}
}
}
}The -i flag is required — the server communicates over stdin/stdout.
Authentication
Every signed request carries the key in the X-MBX-APIKEY header plus a timestamp,
a recvWindow and a signature over the query string:
Ed25519 key (recommended): the private key PEM at
BINANCE_PRIVATE_KEY_PATH(optionally encrypted —BINANCE_PRIVATE_KEY_PASSPHRASE) signs the payload; the signature is base64 and percent-encoded, as Binance requires. RSA PEMs work the same way.HMAC key:
BINANCE_API_SECRETproduces the HMAC-SHA256 hex signature. Supported, but Binance has deprecated HMAC keys.
The key is never logged or echoed. Missing credentials fail lazily at the first signed request with a clear message; public market data never needs them. The signing code is unit-tested against the example vectors Binance publishes in its own documentation.
Environment Variables
Variable | Required | Default | Description |
| for account/trading tools | — | The API key ( |
| one of the two | — | Path to the Ed25519 (or RSA) private-key PEM of a "Self-generated" key. Takes precedence over the HMAC secret. |
| no | — | Passphrase of an encrypted PEM. |
| one of the two | — | HMAC secret of a "System generated" key. |
| no | off | Kill-switch. |
| no | off |
|
| no |
| REST base URL (alternatives: |
| no |
| Signed-request validity window in ms (max 60000). Raise on |
| no |
| Per-request HTTP timeout. |
Enabling trading
Give the key Enable Spot & Margin Trading (and an IP allowlist).
Set
BINANCE_ALLOW_TRADING=1in that client'senv— and only there.Validate with
binance_test_orderfirst: it runs Binance's filter checks (lot size, price filter, notional) without touching the book.binance_get_exchange_infoshows the filters for a symbol.
Start on the testnet: BINANCE_TESTNET=1 with keys from https://testnet.binance.vision
lets you place, query and cancel orders with virtual funds. The suite's own trading
smoke test refuses to run anywhere but the testnet.
History walks
Binance caps history queries per call — deposits/withdrawals and Pay at 90 days,
convert at 30, spot trades and orders at 24 hours when you pass a time range — and
myTrades needs a symbol. The binance_get_all_* and *_history tools walk those
windows newest-first from until (default now) down to since, within a call budget
sized to the endpoint's weight (withdraw history costs 18 000 UID weight per call, so its
default budget is 10 calls; deposits cost 1 and get 60).
When a budget runs out before since, the response says so and returns
resume_before — the boundary of the next unfetched range. Call the tool again with the
same since and that resume_before to continue; rows are deduplicated by id, so an
overlap is harmless. If the budget could not finish even the newest window the tool says
so explicitly instead of handing you a cursor that would repeat the same calls.
binance_get_all_my_trades first discovers which symbols you may have traded (assets
you hold or held, crossed with the exchange's symbol list — Binance has no endpoint for
this) and walks each one with fromId; it returns a cursor of the last trade id per
symbol that you can paste back for incremental runs.
What is not available
Binance Card spending. Binance exposes no API for card transactions. The closest reads are
binance_get_funding_wallet(the wallet behind Pay/Card), Pay transactions withwalletType4/6, and spot⇄funding transfer history.Withdrawals, by design — use the Binance app.
Futures, margin trading, sub-accounts — out of scope for this server.
Running Manually
uv run amazing-binance-mcp # console script (recommended)
uv run python -m binance_mcp # module entry pointTroubleshooting
-1021 Timestamp for this request is outside of the recvWindow. Your clock drifts from Binance's.binance_health_checkprints the drift; sync the clock (NTP) or raiseBINANCE_RECV_WINDOW_MS.-1022 Signature for this request is not valid. The secret does not match the key, or the key type is wrong (an HMAC secret with a self-generated key, or vice versa).-2015 Invalid API-key, IP, or permissions for action. The key lacks the permission the tool needs (Reading, Spot & Margin Trading, Permits Universal Transfer), or this machine's IP is not on the key's allowlist.Error: … trading is disabled. Expected: setBINANCE_ALLOW_TRADING=1for the client that should trade. The dry-runbinance_test_ordernever needs it.-1127/ "window too wide". You passed a time range wider than the endpoint allows (24 h for trades/orders, 90 d for deposits/withdrawals/Pay, 30 d for convert). Narrow it, or use the walk tool for that history.429,418, or "used weight" warnings./apicalls share a 6000-weight-per-minute budget per IP;/sapihas separate per-IP and per-UID budgets. Heavy tools say so in their descriptions (account snapshot 2400, fiat orders 45 000 UID, withdraw history 18 000 UID). Back off; a418is a temporary IP ban.404on wallet/fiat/Pay/convert/algo tools. You are on the testnet, which serves only/api/v3. Those tools need the real API with a read-only key.1 validation error for …Argumentswhen calling a tool by hand. Every tool takes a singleparamsobject:{"params": {"symbol": "BTCUSDT"}}, not the bare fields. MCP clients read that from the schema; scripts and the Inspector must nest it.uvx binance-mcpruns the wrong thing. This server isamazing-binance-mcp."Why is my card spend missing?" See What is not available.
Contributing
Conventional Commits drive releases (release-please). Before pushing, run the full gate —
it must exit 0:
uv run pytest -m "not live and not trading" && uv run ruff check src/ tests/ && uv run ruff format --check src/ tests/ && uv run mypy src/Live smokes run with a read-only key in .env (uv run pytest -m live); the trading
smoke needs BINANCE_TESTNET=1 BINANCE_TEST_ALLOW_TRADING=1 and testnet keys. Regenerate
the tool table with uv run python scripts/gen_tool_table.py --write.
License
Available Tools
83 toolsbinance_accept_convert_quoteA
Accept a convert quote and EXECUTE the conversion. This moves real funds.
Calls POST /sapi/v1/convert/acceptQuote (SIGNED, UID weight 500). The
conversion is irreversible: converting back needs a new quote at whatever ratio
the market offers then, so the round trip costs the spread twice.
Kill-switch. Refused with Error: … trading is disabled … unless the server runs
with BINANCE_ALLOW_TRADING=1. The gate lives in the HTTP client, so no tool can
bypass it. If you see that error, the operator has deliberately put the server in
read-only mode — report it, do not try to work around it.
Always price the conversion with binance_get_convert_quote first (it works even
with the kill-switch off) and have the human approve that exact quoteId and amount.
When to Use:
Immediately after a human approved the ratio in a fresh quote, before it expires.
When NOT to Use:
To "see what would happen" — that is
binance_get_convert_quote.To convert at a price that is not on offer now — use
binance_place_convert_limit_order.
Returns:
A confirmation echoing exactly what Binance returned — orderId, createTime and
orderStatus verbatim (PROCESS / ACCEPT_SUCCESS / SUCCESS / FAIL). Only SUCCESS
means the assets were exchanged; the other statuses are reported as-is with the next
step, never paraphrased as "converted".
Examples: params = {"quote_id": "12415572564"}
Error Handling:
An expired or already-used quoteId is rejected by Binance — request a new quote
rather than retrying this one. A 5xx or a timeout means the execution status is
UNKNOWN: check with binance_get_convert_order_status (by quote_id) before
accepting anything again — never blind-retry a conversion.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true. The description adds crucial behavior: irreversible funds movement, the kill-switch and its bypass prevention, error handling for expired quotes, and the meaning of orderStatus values. It fully discloses the irreversible financial impact and operational constraints beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with headers (When to Use, When NOT to Use, Returns, Error Handling). The critical warning about moving real funds and irreversibility is front-loaded. Every section adds necessary context; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the full workflow: prerequisite quoting, human approval, execution semantics, status interpretation, error handling for expired quotes and 5xx/timeouts, and the next-step tool (binance_get_convert_order_status). With an output schema present and a thorough description, nothing an agent needs to call this tool safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides a clear description for the sole parameter quote_id ('The `quoteId` returned by `binance_get_convert_quote`. Accepting it EXECUTES the conversion at the quoted ratio.'). The tool description does not add new parameter-level semantics beyond reinforcing the same information. With schema coverage high, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Accept a convert quote and EXECUTE the conversion') with a clear resource and consequence ('moves real funds'). It also distinguishes itself from siblings like binance_get_convert_quote (for pricing) and binance_place_convert_limit_order (for non-current prices). The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes explicit 'When to Use' and 'When NOT to Use' sections, naming the alternative tools and the conditions that select them. It also provides a prerequisite (price with binance_get_convert_quote first) and a kill-switch condition. No ambiguity remains about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_cancel_algo_orderADestructiveIdempotent
Cancel a working spot TWAP algo order.
Calls DELETE /sapi/v1/algo/spot/order (SIGNED, IP weight 1). Pass exactly one id:
algo_id (Binance's numeric algoId) or client_algo_id (the 32-character id you
supplied when placing). Both at once is refused locally — on a destructive call an
ambiguous request is worse than a refused one.
Kill-switch. Refused with Error: … trading is disabled … unless the server runs
with BINANCE_ALLOW_TRADING=1.
Cancelling is idempotent in effect: a second cancel of the same algo order changes
nothing and comes back as a rejection. What it cannot undo is what already traded —
the sub-orders already filled stay filled, and only the unexecuted remainder is
called off. Read binance_get_algo_sub_orders to see what that remainder is.
When to Use:
Stopping a TWAP whose thesis no longer holds, mid-execution.
Freeing one of the 20 open-algo-order slots.
When NOT to Use:
To cancel an ordinary spot order — that is
binance_cancel_order(spot_orders.py); these endpoints do not see each other's orders.Before checking what is open —
binance_get_open_algo_ordersis free of consequence and gives you the algoId this tool needs.
Returns:
A confirmation echoing exactly the four fields Binance returned — algoId,
success, code, msg — with no claim about how much of the order had executed.
A success: false body (HTTP 200) is rendered as Error: <msg> (code <code>).
Examples: params = {"algo_id": 14511} params = {"client_algo_id": "abcdefghijklmnopqrstuvwxyz012345"}
Error Handling:
A rejection usually means the algo order is not cancellable: already finished, already
cancelled, or the id belongs to another account. -2015 means the key lacks Spot &
Margin Trading permission or this IP is not allowlisted. A 5xx/timeout leaves the
cancel UNKNOWN — re-read binance_get_open_algo_orders before assuming either way.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the kill-switch requirement, idempotent effect, refusal behavior, and the fact that already-filled sub-orders cannot be undone. It also explains error semantics, including the ambiguous 5xx/timeout case and re-checking open orders. This is rich, truthful behavioral context that matches the annotations with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: identity, endpoint, parameter rule, kill-switch, idempotence, use cases, return shape, examples, and error handling are all separated with clear headers and bolded lead-ins. The most critical information is front-loaded, and the structure makes it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the destructive nature, auth requirements, ambiguity risk, and Binance-specific error codes, this description is complete. It covers return values, examples, preconditions, failure modes, and what the tool cannot do. An agent has enough information to invoke it correctly and interpret the result in all meaningful cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains the two mutually exclusive identifiers, their relationship to the schema, the 32-character constraint on client_algo_id, and the local refusal when both are passed. It adds crucial semantic meaning beyond the schema fields, especially the 'exactly one' rule and why ambiguity is rejected on a destructive call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Cancel a working spot TWAP algo order.' It also identifies the exact endpoint and distinguishes this from ordinary spot order cancellation by naming the alternative tool. An agent can tell exactly what this tool does and which order type it targets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an explicit 'When to Use' section with concrete scenarios, and a 'When NOT to Use' section that names binance_cancel_order as the alternative for ordinary spot orders. It also advises checking binance_get_open_algo_orders first. This fully routes the agent to the correct tool and preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_cancel_all_open_ordersADestructiveIdempotent
Cancel EVERY open order on one symbol, including order-list legs.
Calls DELETE /api/v3/openOrders (SIGNED, IP weight 1). This is a blunt instrument:
it takes no id and cancels whatever is resting on that symbol, OCO/OTO lists included
(their legs come back as order-list objects with orderReports[]).
Kill-switch. Refused with Error: … trading is disabled … unless the server runs
with BINANCE_ALLOW_TRADING=1.
When to Use:
Flattening the working orders on one symbol — a stop-out or a strategy reset.
When several orders must go and cancelling them one by one would race the market.
When NOT to Use:
When one specific order should go — use
binance_cancel_orderwith an id.To see what would be cancelled first — call
binance_get_open_orderswith the same symbol; that read is free of consequence and this one is not.
Returns:
A confirmation listing every cancelled order, plus a section per cancelled order list
(orderListId, contingencyType, and each leg from orderReports[]).
Examples: params = {"symbol": "BTCUSDT"}
Error Handling:
-2011 means there was nothing open on that symbol. A 5xx/timeout leaves the outcome
UNKNOWN — re-read with binance_get_open_orders rather than assuming either way.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructive/non-read-only behavior, and the description adds meaningful operational context: the BINANCE_ALLOW_TRADING kill-switch, inclusion of OCO/OTO list legs, -2011 semantics, and the UNKNOWN outcome on 5xx/timeout. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core behavior in the first line, then uses scannable sections for endpoint, usage, exclusions, returns, examples, and errors. Every section adds actionable information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers invocation, side effects, alternatives, return shape, example, and ambiguous failure outcomes. For a destructive cancel-all operation with an output schema and rich annotations, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the single symbol parameter, and the description reinforces it with a concrete example params = {'symbol': 'BTCUSDT'}. Since this is a one-parameter tool, the example plus the 'on one symbol' scope is sufficient compensation for the minimal prose about parameter formatting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States an explicit verb and scope: 'Cancel EVERY open order on one symbol, including order-list legs.' It further identifies the exact REST endpoint and contrasts itself with the id-based cancel sibling, so an agent can distinguish it from binance_cancel_order and binance_cancel_order_list immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides dedicated 'When to Use' and 'When NOT to Use' sections with concrete scenarios, and names sibling alternatives binance_cancel_order and binance_get_open_orders. This is exactly the routing guidance needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_cancel_convert_limit_orderADestructiveIdempotent
Cancel a resting convert limit order.
Calls POST /sapi/v1/convert/limit/cancelOrder (SIGNED, UID weight 200).
Kill-switch. Refused with Error: … trading is disabled … unless the server runs
with BINANCE_ALLOW_TRADING=1 — cancellation is a signed non-GET like any other
state change, so the same gate applies.
When to Use:
To pull a convert limit order that no longer reflects the plan, before it triggers.
When NOT to Use:
For a spot order — that is
binance_cancel_order.To undo a completed conversion: there is no such thing. Converting back needs a new quote at the current ratio.
Returns:
A confirmation echoing exactly what Binance returned — orderId and status verbatim.
Examples: params = {"order_id": "1603680255057330400"}
Error Handling:
An already-filled, already-cancelled or unknown orderId is rejected by Binance — check
binance_get_convert_open_limit_orders for what is actually resting. A 5xx or a timeout
means the cancellation status is UNKNOWN: check
binance_get_convert_open_limit_orders before cancelling again, because the order may
already be gone.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing the kill-switch behavior tied to BINANCE_ALLOW_TRADING=1, the UNKNOWN cancellation status on 5xx/timeout, and the need to verify resting orders before retrying. This is valuable operational context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: use criteria, exclusions, return behavior, example, and error handling. It is front-loaded with the primary action and endpoint, then organized into scannable sections without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the destructive and signed nature of the operation, the description covers endpoint, authentication implication, use cases, exclusions, return payload, example, and error recovery. No information an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema itself documents order_id, the tool description reinforces it with a concrete example and explains where the ID comes from indirectly through sibling tool references. For a single required parameter, this is sufficient, though the description could have explicitly restated the parameter's source.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Cancel a resting convert limit order') and names the exact endpoint, making the tool's purpose unambiguous. It also implicitly distinguishes this convert-order cancellation from spot-order cancellation, which is reinforced in the When NOT to Use section.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description has explicit 'When to Use' and 'When NOT to Use' sections. It names binance_cancel_order as the alternative for spot orders and clarifies that completed conversions cannot be undone, leaving no ambiguity about when this tool should be selected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_cancel_orderADestructiveIdempotent
Cancel one open spot order by id.
Calls DELETE /api/v3/order (SIGNED, IP weight 1). Pass the symbol plus exactly one
id — order_id or orig_client_order_id; both at once is rejected locally because
Binance would resolve the numeric id and ignore a mismatched client id.
Kill-switch. Refused with Error: … trading is disabled … unless the server runs
with BINANCE_ALLOW_TRADING=1.
Cancelling is idempotent in effect: a second cancel of the same order returns -2011
("unknown order") and changes nothing. What it cannot undo is a fill — use
cancel_restrictions="ONLY_NEW" to make the cancel fail rather than succeed against
an order that has already started filling.
When to Use:
To pull a resting order that is no longer wanted.
Before replacing an order, when you do not need the atomicity of
binance_cancel_replace_order.
When NOT to Use:
To cancel everything on a symbol — use
binance_cancel_all_open_orders(one call, one weight unit).To cancel one leg of an OCO/OTO list — that cancels the whole list; use
binance_cancel_order_list(order_lists.py) so the intent is explicit.
Returns:
A confirmation echoing Binance's cancelled-order object: symbol, orderId,
origClientOrderId, status (CANCELED), and the executed quantities at cancellation.
Examples: params = {"symbol": "BTCUSDT", "order_id": 123456789} params = {"symbol": "BTCUSDT", "orig_client_order_id": "my-entry-001", "cancel_restrictions": "ONLY_NEW"}
Error Handling:
-2011 means the order is not cancellable: it does not exist, already filled, was
already cancelled — or cancel_restrictions did not match its current state, which is
the safe outcome, not a failure. A 5xx/timeout leaves the cancel UNKNOWN: check with
binance_get_order before assuming the order is still live.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=true, idempotentHint=true), the description discloses the kill-switch behavior, the local rejection of passing both order_id and orig_client_order_id, the idempotent effect of a second cancel, the inability to undo fills, and the meaning of -2011 errors. It also clarifies that 5xx/timeouts leave cancel state UNKNOWN and advises verification. This substantially exceeds the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly organized into labeled sections: core action, kill-switch, idempotency, when to use/not use, returns, examples, and error handling. Each section adds necessary operational knowledge, and the most essential usage constraint is front-loaded in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema details needed (output schema is present), the description covers endpoint, signing, IP weight, parameter constraints, error semantics, failure ambiguity, and concrete examples. It leaves no significant gap an agent would need to resolve before calling the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite the schema property descriptions, the tool description adds critical semantics: exactly one identifier must be passed, both at once is rejected locally, and why that matters. It also explains cancel_restrictions as the safe guard against racing a fill and interprets -2011 in that context. Examples reinforce correct usage for both identifier variants.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Cancel one open spot order by id.' It also differentiates from siblings by explicitly naming binance_cancel_all_open_orders and binance_cancel_order_list as alternatives for different intents, leaving no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides dedicated 'When to Use' and 'When NOT to Use' sections. It names specific sibling tools and the conditions that should route the agent to them, such as using binance_cancel_all_open_orders for cancelling all orders and binance_cancel_order_list for OCO/OTO legs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_cancel_order_listADestructiveIdempotent
Cancel an ENTIRE order list — every leg of it — by id.
Calls DELETE /api/v3/orderList (SIGNED, IP weight 1). Pass the symbol plus exactly
one id: order_list_id or list_client_order_id. Both at once is rejected locally.
Kill-switch. Refused with Error: … trading is disabled … unless the server runs
with BINANCE_ALLOW_TRADING=1.
Cancelling is idempotent in effect: a second cancel of the same list returns -2011
("unknown order") and changes nothing. What it cannot undo is a fill — a leg that has
already triggered is gone, and its sibling with it. Note that cancelling ONE leg (via
binance_cancel_order) also cancels the whole list; this tool just makes the intent
explicit.
When to Use:
Pulling a bracket that is no longer wanted, before replacing it.
Cleaning up after a partial fill changed the position the bracket was sized for.
When NOT to Use:
To cancel everything on a symbol, lists included —
binance_cancel_all_open_orders(spot_orders.py) does it in one call.To see what would be cancelled —
binance_get_order_listfirst; that read is free of consequence and this one is not.
Returns:
A confirmation echoing the cancelled list: orderListId, contingencyType,
listStatusType, listOrderStatus and the ### Legs table from orderReports[] with
each leg's status (CANCELED) and its original client id.
Examples: params = {"symbol": "BTCUSDT", "order_list_id": 27} params = {"symbol": "BTCUSDT", "list_client_order_id": "btc-bracket-001", "new_client_order_id": "cancel-bracket-001"}
Error Handling:
-2011 means the list is not cancellable: it does not exist, already completed, or was
already cancelled. A 5xx/timeout leaves the cancel UNKNOWN: check with
binance_get_order_list before assuming either way — do not assume the legs are gone.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive, idempotent, and non-read-only behavior, and the description adds substantial context: the BINANCE_ALLOW_TRADING=1 kill-switch, the -2011 idempotent no-op case, the risk of partial fills, and the unknown state after 5xx/timeout. This goes well beyond what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but highly structured with clear headers, bullets, examples, and error handling. The main purpose is front-loaded, and every section adds actionable information for a dangerous mutation tool without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the endpoint, authentication signature, server-side kill-switch, idempotency, error semantics, return shape, examples, and when to check the list status afterward. Combined with the output schema and annotations, an agent has everything needed to invoke this tool correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds critical meaning not obvious from the schema: exactly one of order_list_id or list_client_order_id must be passed, both at once are rejected locally, and cancelling a leg also cancels the whole list. The example illustrates the optional new_client_order_id usage, though it does not exhaustively restate every parameter's constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: cancel an ENTIRE order list by id, explicitly noting every leg is affected. This clearly differentiates it from single-order cancel tools like binance_cancel_order and bulk-cancel binance_cancel_all_open_orders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Includes explicit 'When to Use' and 'When NOT to Use' sections, naming alternatives such as binance_cancel_all_open_orders and binance_get_order_list. It also explains when cancelling one leg via binance_cancel_order makes this tool redundant, giving an agent actionable routing rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_cancel_replace_orderADestructive
Cancel one order and place its replacement in a single request.
Calls POST /api/v3/order/cancelReplace (SIGNED, IP weight 1, unfilled-order count
1). Use it to reprice a resting order without the window of exposure that a separate
cancel-then-place leaves open.
Kill-switch. Refused with Error: … trading is disabled … unless the server runs
with BINANCE_ALLOW_TRADING=1.
The two halves can diverge, and cancel_replace_mode decides how:
STOP_ON_FAILURE— if the cancel fails, the new order is never attempted.ALLOW_FAILURE— the new order is attempted regardless of the cancel's outcome, so you can end up with both orders live, or neither.
HTTP 409 is the partial-success case: the cancel succeeded and the new order
failed. It is returned as Error (409): Partial success … followed by the same
cancelResult / newOrderResult breakdown as a success — so you can see exactly which
order was cancelled. Read it as "the old order is gone, the replacement is NOT live"
and re-place deliberately.
When to Use:
Repricing or resizing a resting limit order.
Rolling a stop as the market moves.
When NOT to Use:
For a fresh order with nothing to cancel — use
binance_place_order.To only pull an order — use
binance_cancel_order.On an order-list leg — cancel the list with
binance_cancel_order_list(order_lists.py) and place a new list.
Returns:
cancelResult and newOrderResult (SUCCESS / FAILURE / NOT_ATTEMPTED) plus the two
response objects Binance returned, rendered separately so it is unambiguous which
order is live.
Examples: params = {"symbol": "BTCUSDT", "side": "BUY", "type": "LIMIT", "time_in_force": "GTC", "quantity": "0.001", "price": "19500.00", "cancel_replace_mode": "STOP_ON_FAILURE", "cancel_order_id": 123456789} params = {"symbol": "BTCUSDT", "side": "BUY", "type": "LIMIT", "time_in_force": "GTC", "quantity": "0.002", "price": "19000.00", "cancel_replace_mode": "ALLOW_FAILURE", "cancel_orig_client_order_id": "my-entry-001", "cancel_restrictions": "ONLY_NEW"}
Error Handling:
HTTP 409 = cancel succeeded, replacement failed (see above). -2021/-2022 wrap the
failing half in {code, msg, data}. -2011 means the order to cancel was not
cancellable (filled, gone, or cancel_restrictions did not match). A 5xx/timeout
leaves BOTH halves UNKNOWN: read binance_get_open_orders for the symbol before
sending anything else.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations: it discloses the kill-switch requiring BINANCE_ALLOW_TRADING=1, explains STOP_ON_FAILURE vs ALLOW_FAILURE divergence, interprets HTTP 409 as the partial-success case, and warns that 5xx/timeouts leave both halves UNKNOWN. This richly supplements the destructiveHint and openWorldHint annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but disciplined: the core behavior is front-loaded, followed by kill-switch, mode semantics, HTTP 409 interpretation, use cases, exclusions, return values, and error handling in clearly separated sections. Every paragraph earns its place and the examples are highly illustrative for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity, destructive atomic operation this is complete: it explains partial success, ambiguous failure states, error codes, return shape, and when to check binance_get_open_orders after a 5xx. Nothing an agent needs to invoke and interpret this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The prose adds real meaning to the parameters: it explains how cancel_replace_mode changes the operation's outcome, clarifies the cancelResult/newOrderResult semantics, and gives two concrete example parameter sets showing cancel_order_id vs cancel_orig_client_order_id. The schema already documents individual fields thoroughly, so the description complements rather than merely repeats — though a dedicated sentence on the either-or cancel identifier requirement would push it to 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — 'Cancel one order and place its replacement in a single request' — and names the exact endpoint. It explicitly differentiates itself from sibling tools such as binance_place_order, binance_cancel_order, and binance_cancel_order_list, leaving no ambiguity about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Dedicated 'When to Use' and 'When NOT to Use' sections give explicit conditions: reprice a resting order, roll a stop, and clearly route to alternative tools for fresh orders, pure cancels, or order-list legs. This is textbook usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_convert_dust_to_bnbA
Convert small balances to BNB. Irreversible — the assets are sold for BNB.
Calls POST /sapi/v1/asset/dust (SIGNED, UID weight 10). Every asset listed is
swapped to BNB at Binance's dust rate, minus a service charge; there is no undo and
no "cancel" endpoint.
Preview first. Run binance_get_dust_convertible and pass only assets it
listed: it names what qualifies and how much BNB each one yields, and it works even
with the kill-switch off.
Kill-switch. This call is refused with Error: … trading is disabled … unless
the server runs with BINANCE_ALLOW_TRADING=1. The gate lives in the HTTP client,
so no tool can bypass it. If you see that error, the operator has deliberately put
the server in read-only mode — report it, do not try to work around it.
Key permission. The API key needs "Enable Spot & Margin Trading"; this is a trade, not a transfer.
At most 100 assets per call — a client-side guard, not a Binance limit (Binance documents no cap). Split a longer list into batches; each batch is its own irreversible conversion.
When to Use:
After a human approved converting these specific assets, and after the preview confirmed they qualify.
When NOT to Use:
To swap a meaningful amount of one asset for another — the dust rate is worse than the market; use the convert tools (convert.py) or a spot order instead.
To see what happened in past conversions — use
binance_get_dust_log.
Returns:
A confirmation echoing exactly what Binance returned: totalTransfered (BNB
received), totalServiceCharge, and the per-asset transferResult rows with their
tranIds. Nothing is inferred; an asset Binance silently skipped simply will not
appear in the table.
Examples: params = {"assets": ["ADA"]} params = {"assets": ["ADA", "DOT", "XRP"], "account_type": "SPOT"}
Error Handling:
Error: … trading is disabled …→ the kill-switch is off; nothing was converted.-2015 means the key lacks Spot & Margin Trading permission, or this IP is not allowlisted.
"The asset does not have a dust balance" family of errors → re-run
binance_get_dust_convertible; eligibility changes with price.A 5xx or a timeout means the conversion status is UNKNOWN — check
binance_get_dust_logbefore retrying; a duplicate conversion cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations: it discloses irreversibility, lack of a cancel endpoint, service charges, the BINANCE_ALLOW_TRADING kill-switch, required Spot & Margin Trading permission, client-side batching limits, and the ambiguity of 5xx/timeout results. No contradiction with the annotations is apparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every section earns its place for a high-stakes irreversible operation. Bold headers, front-loaded warnings, examples, and error handling make the information scannable without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers prerequisites, kill-switch behavior, permissions, limits, return values, examples, and error handling. For a complex mutating operation with irreversible side effects, nothing an agent needs to safely call and verify the call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the signal says schema coverage is 0%, the description explains both parameters thoroughly: `assets` gets batching, preview, and query-key semantics, while `account_type` is clarified as SPOT or MARGIN with default behavior. Examples illustrate valid parameter shapes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Convert small balances to BNB' via `POST /sapi/v1/asset/dust`. It also clearly distinguishes this from related tools by emphasizing irreversibility and pointing to alternate tools for meaningful trades and history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an explicit 'When to Use' and 'When NOT to Use' section. It names `binance_get_dust_convertible` as a required preview step, `binance_get_dust_log` for verifying past conversions, and the convert/spot tools as better alternatives for meaningful amounts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_discover_traded_symbolsARead-onlyIdempotent
Work out which symbols this account plausibly traded — Binance will not tell you.
There is no endpoint that lists an account's traded pairs. Binance staff answered the question twice on their own developer forum, and both answers are workarounds: keep a local record from the user-data websocket stream, or infer the pairs from the account's assets (dev.binance.vision threads 4810 and 4329). This tool is the second answer, made cheap.
It unions the assets the account visibly holds or held — GET /api/v3/account
(weight 20, zero balances omitted), POST /sapi/v3/asset/getUserAsset (weight 5, the
funding/spot asset list) and GET /sapi/v1/asset/dribblet (weight 1, the last 100
dust conversions) — then crosses them with every exchangeInfo symbol (weight 20,
fetched once per process and cached) whose base asset is a candidate and whose
quote asset is either whitelisted (quote_assets) or itself a candidate. Total
discovery cost: ~46 IP weight of the 6000/min budget.
Blind spot, stated plainly: the match is on the base asset, so an asset bought and
then fully sold within spot — never deposited, withdrawn or dust-converted — leaves no
trace to discover, and its pair is missed. Name it in extra_assets. Matching on the
quote side too would not rescue it and costs a fortune: on the real exchangeInfo,
USDT alone drags in 493 TRADING pairs (9,860 weight).
When to Use:
Before
binance_get_all_my_trades, to see (and prune) the symbol list and its cost.To answer "which pairs have I ever traded?" without spending 74,000 weight.
When NOT to Use:
When you already know the pairs — pass them to
binance_get_all_my_tradesdirectly.To read balances — use
binance_get_spot_account/binance_get_user_assets.
Returns:
Markdown: the candidate assets with their source counts, the sorted symbol list, and
the estimated cost of walking it (20 IP weight per symbol). JSON: the same, as
{"assets": [...], "symbols": [...], "estimated_weight": N}.
Examples: params = {} params = {"extra_assets": ["SOL", "ADA"], "quote_assets": ["USDT", "BTC"]} params = {"include_break": true}
Error Handling: /sapi endpoints do not exist on the spot testnet (404). -2015 means the key lacks Reading or the IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses far more than the annotations alone: it reveals that the tool is a heuristic workaround (no exact endpoint), enumerates the three underlying API calls and their weights, quantifies total cost, and states the base-asset matching blind spot. It also documents a testnet 404 and -2015 auth error. This is rich behavioral context beyond readOnly/idempotent hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but its length is mostly justified by the tool's complexity — it communicates a workaround, cost, blind spots, and error states. It is well-structured with clear headings and front-loaded purpose. A few details (forum thread IDs, repeated mention of endpoint weights) could be trimmed without loss, so it is excellent but not maximally lean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Between the method explanation, cost estimate, blind spot, explicit when/when-not rules, return formats with JSON shape, concrete examples, and error handling, nothing an agent needs to decide whether and how to invoke this tool is missing. The output schema and annotations cover the remaining mechanical details. This is a complete briefing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage for the top-level 'params' wrapper is 0%, so the description bears a real burden, and it does explain extra_assets and quote_assets in context and names include_break in an example. However, it leaves full semantics of include_break and response_format to the nested schema, and there is no systematic parameter-by-parameter mapping in the description. It compensates substantially but not completely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete result — 'work out which symbols this account plausibly traded' — and immediately states the core constraint: Binance provides no endpoint for traded pairs. It explicitly distinguishes itself from binance_get_all_my_trades by framing this as the discovery step before trade retrieval. The resource, verb, and relationship to siblings are all unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description contains dedicated 'When to Use' and 'When NOT to Use' sections. It names the precise alternative (binance_get_all_my_trades) and the condition for choosing this tool (unknown pairs, cost avoidance), and lists balance-reading siblings (binance_get_spot_account / binance_get_user_assets) as wrong for that job. This is explicit routing guidance, not just implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_account_infoARead-onlyIdempotent
Report the account's VIP tier and which product lines are enabled.
Calls GET /sapi/v1/account/info (SIGNED, IP weight 1).
When to Use:
To check the account's VIP fee tier, or whether margin/futures/options are enabled before routing a request that assumes one of them.
When NOT to Use:
To read balances or trading permissions — use
binance_get_spot_account(spot_account.py) orbinance_get_api_restrictions.
Returns:
A markdown block with vipLevel and the isMarginEnabled/isFutureEnabled/
isOptionsEnabled/isPortfolioMarginRetailEnabled flags, or raw JSON with
response_format="json".
Examples: params = {}
Error Handling: -2015 means the key lacks Reading permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds meaningful behavioral context beyond that: it specifies the endpoint (GET /sapi/v1/account/info), that it is SIGNED with IP weight 1, describes the return format (markdown vs json), and explains the -2015 error meaning. This is valuable but not exhaustive (e.g., no rate limit specifics), so a 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized and concise: purpose, endpoint, usage guidance, returns, example, and error handling are each given a short labeled section. It is front-loaded with the core purpose and avoids any filler, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with an output schema (present per context), the description covers all necessary aspects: what it returns, how to invoke it (empty params), how to change output format, and how to interpret a common error. An agent can call this tool correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% per context, so the description must compensate. It does: it explains the response_format parameter's effect (markdown vs raw JSON), provides an example of an empty params object, and clarifies the default behavior. This adds meaning beyond the schema's own (minimal) descriptions, which are actually present but not counted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Report') and resource (account's VIP tier and product lines), and explicitly distinguishes itself from siblings by noting when NOT to use it for balances or trading permissions, naming binance_get_spot_account and binance_get_api_restrictions as alternatives. This makes the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'When to Use' and 'When NOT to Use' sections, giving concrete conditions (checking VIP fee tier or product-line enablement) and exclusions (reading balances or trading permissions) with named alternatives. This is exactly the guidance an agent needs to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_account_snapshotARead-onlyIdempotent
Return daily balance snapshots for the SPOT, MARGIN or FUTURES wallet.
Calls GET /sapi/v1/accountSnapshot (SIGNED, IP weight 2400 — a fifth of the
12000/min /sapi IP budget in a single call; call this sparingly, never in a tight
loop). Binance only retains roughly the last month of snapshots and rejects windows
of 30 days or more, so start_time/end_time are validated locally before the
call to fail fast with a clear message.
When to Use:
To reconstruct a historical balance curve ("what was I holding a week ago").
As an occasional, deliberate call — not for polling the current balance.
When NOT to Use:
For the current live balance — use
binance_get_spot_account(spot_account.py), which is far cheaper (IP weight 20) and reflects right now, not yesterday.
Returns:
A markdown block per snapshot day (UTC date, totalAssetOfBtc, and a table of
non-zero balances sorted largest-first, capped at 50 rows per day), or raw JSON
with response_format="json".
Windows:
start_time/end_time (int ms or ISO-8601) together must span less than 30 days;
with only start_time given, end_time defaults to now and the same 30-day span
check applies. Either way, start_time itself must be within the last 30 days —
Binance does not retain snapshots older than that, regardless of window width.
Omit both to get the most recent limit days. limit is 7-30 (Binance default 7).
Examples: params = {"type": "SPOT"} params = {"type": "SPOT", "start_time": "2026-09-01", "end_time": "2026-09-10", "limit": 10}
Error Handling:
A window of 30 days or more, or a start_time more than 30 days ago, is rejected
locally instead of round-tripping to Binance's "Support query within the last one
month only". This endpoint answers HTTP 200 with {code, msg, snapshotVos} on
failure (no success field, so the client's envelope check does not catch it) — a
non-200 code is surfaced as an Error: here. -2015 means the key lacks Reading
permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only and idempotent behavior, and the description adds substantial context: IP weight, Binance's one-month retention limit, local validation before the call, and the endpoint's unusual error envelope. It also explains that a non-200 `code` surfaces as an `Error:`, which is valuable beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely informative, with clear section headers and front-loaded purpose. Every section earns its place: usage guidance, return format, window constraints, examples, and error handling all support correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the endpoint's complexity, the description is complete: it covers what is returned, how failures are signaled, input constraints, retention limits, and cost/rate implications. The presence of an output schema means the detailed return-value explanation is a bonus rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported at 0%, so the description carries the full burden for parameter semantics. It fully compensates by explaining `type`, `limit`, `start_time`, `end_time`, and `response_format`, including defaults, the 30-day window rule, and local fail-fast validation. Concrete examples clarify how the parameters combine.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Return daily balance snapshots for the SPOT, MARGIN or FUTURES wallet.' It also distinguishes itself from a sibling by naming `binance_get_spot_account` as the tool for current balance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains explicit 'When to Use' and 'When NOT to Use' sections. It tells the agent to use this for historical balance reconstruction and specifically recommends `binance_get_spot_account` instead for live balances, citing cost and freshness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_account_statusARead-onlyIdempotent
Report whether the account is in good standing with Binance.
Calls GET /sapi/v1/account/status (SIGNED, IP weight 1). Binance flags accounts
that trip abuse/AML controls (e.g. excessive order cancellation) here; a healthy
account reports "Normal".
When to Use:
Before an automated trading run, to confirm the account is not under review.
Alongside
binance_get_api_trading_statuswhen diagnosing rejected orders.
When NOT to Use:
To read API-key permission flags — use
binance_get_api_restrictions.To read trading-specific locks/triggers — use
binance_get_api_trading_status.
Returns:
A one-line markdown status, or the raw JSON envelope with response_format="json".
Examples: params = {} params = {"response_format": "json"}
Error Handling: -2015 means the key lacks Reading permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly/idempotent hints, and the description adds rich behavioral context: the exact endpoint, SIGNED requirement, IP weight, what 'Normal' means, output format behavior, and error code -2015 semantics. This goes well beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with clear sections, front-loads the purpose, and every section (When to Use, NOT to Use, Returns, Examples, Error Handling) adds value without redundancy. It is thorough yet focused.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple status read with one optional parameter, the description includes endpoint details, auth requirements, rate-limit weight, return formats, error handling, and sibling differentiation. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported as 0%, so the description must compensate. It does so by explaining the response_format behavior in 'Returns' and providing two concrete example parameter sets, making the single parameter's effect clear even if the schema already has a short property description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description immediately states a specific verb and resource: 'Report whether the account is in good standing with Binance.' It also names two sibling tools in 'When NOT to Use' (binance_get_api_restrictions and binance_get_api_trading_status), making the boundary clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to Use' section gives concrete scenarios (pre-trading-run check, alongside API trading status when diagnosing rejects), and 'When NOT to Use' explicitly names alternatives for permission flags and trading locks. This leaves no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_agg_tradesARead-onlyIdempotent
Fetch compressed/aggregate trades (same price, same taker order, same timestamp merged).
Calls GET /api/v3/aggTrades (weight 4). Filter with from_id for a stable cursor
walk, or start_time/end_time for a time window — Binance rejects a start/end
window wider than 1 hour on this endpoint; slice a longer range into ≤ 1h calls.
When to Use:
To page through historical trades by id (
from_id), whichbinance_get_recent_tradescannot do.To reconstruct a short time window of trade flow cheaply (weight 4 vs 25).
When NOT to Use:
For the very latest trades with no filter —
binance_get_recent_tradesis simpler.
Returns:
Markdown: a table of up to 100 aggregate trades (id, time, price, qty, first/last
trade ids, side). JSON: the full requested page (up to limit), uncapped.
Windows:
start_time/end_time together must not span more than 1 hour (per Binance's own
docs); omit both, or use from_id, for a wider walk.
Examples: params = {"symbol": "BTCUSDT", "from_id": 123456} params = {"symbol": "BTCUSDT", "start_time": "2024-01-01T00:00:00Z", "end_time": "2024-01-01T00:45:00Z"}
Error Handling:
A window wider than 1 hour raises Binance -1127 More than 1 hours between startTime and endTime; combining from_id with the time window is rejected locally.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds critical behavioral context beyond that: the 1-hour window limit with error code -1127, local rejection of combining `from_id` with time filters, the weight of 4, and the exact return formats (Markdown table vs JSON). This is rich, non-redundant disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place. It is front-loaded with the core purpose and the most critical constraint (1-hour window). Sections for use cases, returns, windows, examples, and error handling are clearly labeled and free of fluff. The structure makes it easy to scan, and no sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has real complexity: multiple filtering modes, a hard time-window limit, weight/rate-limit implications, and two output formats. The description covers all of it, including error handling and examples. The output schema exists, but the description still explains return structure. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema itself has some property descriptions, the signal reports 0% coverage, so the description must carry the semantic burden. It does so thoroughly: it explains `from_id` for cursor walking, `start_time`/`end_time` for time windows, the 1-hour constraint on the window, the limit default and max, and the `response_format` options. It even provides example parameter sets. This adds far more meaning than the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact purpose: 'Fetch compressed/aggregate trades (same price, same taker order, same timestamp merged)' and names the endpoint and weight. It explicitly differentiates from sibling `binance_get_recent_trades` by noting that paging by `from_id` is unique to this tool. The verb, resource, and scope are all specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description contains dedicated 'When to Use' and 'When NOT to Use' sections. It tells the agent exactly when to prefer this tool over `binance_get_recent_trades` (paging by id, cheap time-window reconstruction) and when not to (latest trades without filters). It also explains the 1-hour window constraint and how to slice longer ranges, leaving no inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_algo_order_historyARead-onlyIdempotent
List finished spot TWAP algo orders — filled, cancelled or expired.
Calls GET /sapi/v1/algo/spot/historicalOrders (SIGNED, IP weight 1). Every filter is
optional: symbol, side, start_time, end_time. Binance's older reference marks
symbol and side as mandatory; the current per-endpoint page makes both optional, which
is what this tool follows — omit them for the whole account.
No maximum window is documented for this endpoint, so none is enforced here.
When to Use:
Reviewing how a TWAP actually executed once it is no longer open.
Reconciling a period: what algo orders ran, on what symbols, for how much.
When NOT to Use:
For orders still working —
binance_get_open_algo_orders.For the individual fills and fees of one order —
binance_get_algo_sub_orders; a row here only carries the aggregate.For ordinary spot order history —
binance_get_all_orders(spot_orders.py).
Returns:
A markdown table (bookTime, algoId, symbol, side, algoStatus, algoType, totalQty,
executedQty, executedAmt, avgPrice, urgency, endTime) capped at 50 rows, or the raw
{total, orders[]} payload with response_format="json" (which also carries
clientAlgoId).
Pagination:
page (1-based) and page_size (1-100, default 100) map to Binance's page /
pageSize. Only 50 rows are rendered, so a full 100-row page hides rows 51-100:
lower page_size to 50, or use response_format="json", for the rest.
Examples: params = {} params = {"symbol": "BTCUSDT", "side": "BUY", "page_size": 20} params = {"start_time": "2026-09-01", "end_time": "2026-09-23T23:59:59Z"}
Error Handling:
start_time / end_time accept epoch ms or ISO-8601; anything else fails locally
with a readable message. -2015 means the key lacks Reading permission or this IP is
not allowlisted. /sapi does not exist on the spot testnet.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/idempotentHint annotations, the description discloses the signed endpoint, IP weight, optional-filter semantics, absence of a maximum window, the 50-row render cap, pagination behavior, error code -2015 meaning, and testnet unavailability. This gives the agent far more behavioral context than annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly organized with clearly labeled sections: endpoint, filters, when to use, when not to use, returns, pagination, examples, and error handling. Every section earns its place, and the core purpose is front-loaded in the first line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paginated read-only endpoint with seven parameters, this description is essentially complete: it defines scope, alternatives, return shapes, pagination caveats, parameter formats, error meanings, and example calls. An agent has everything needed to select and invoke the tool correctly without additional inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the context signal reports 0% schema coverage, the nested schema actually contains property descriptions, and the tool description goes well beyond them: it clarifies every filter is optional, explains ISO-8601 vs epoch ms, documents page/page_size mapping and limits, and describes response_format effects. The description fully compensates for any schema ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List finished spot TWAP algo orders — filled, cancelled or expired.' This immediately distinguishes it from open-order tools and clearly states scope. It also names the endpoint, further pinning down exactly what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The dedicated 'When to Use' and 'When NOT to Use' sections explicitly route agents to sibling tools: binance_get_open_algo_orders for working orders, binance_get_algo_sub_orders for per-order fills, and binance_get_all_orders for ordinary spot history. This is model guidance for when to invoke this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_algo_sub_ordersARead-onlyIdempotent
List the individual orders a TWAP placed on the book, with fills and fees.
Calls GET /sapi/v1/algo/spot/subOrders (SIGNED, IP weight 1). A TWAP is executed as
a stream of ordinary orders; this is the only place to see them — what each slice
filled, at what average price, and what it cost in fees.
When to Use:
Answering "what did this TWAP actually get me?" — the executedQty / executedAmt / fee totals for one algoId.
Auditing a cancelled TWAP: what traded before the cancel landed.
When NOT to Use:
To find the algoId in the first place — that comes from
binance_get_open_algo_ordersorbinance_get_algo_order_history.For a symbol-wide trade list —
binance_get_my_trades(trade_history.py) covers every fill, algo or not.
Returns:
The order-level totals (total, executedQty, executedAmt) followed by a table of
sub-orders: bookTime, subId, orderId, symbol, side, orderStatus, executedQty,
executedAmt, avgPrice and the fee with its asset.
Pagination:
page (1-based) and page_size (1-100, default 100) map to Binance's page /
pageSize. Only 50 rows are rendered, so a full 100-row page hides rows 51-100:
lower page_size to 50, or use response_format="json", for the rest.
Examples: params = {"algo_id": 14511} params = {"algo_id": 14511, "page": 2, "page_size": 50}
Error Handling:
An unknown algoId comes back as a Binance rejection, not an empty page. An empty
subOrders array means the TWAP has not traded yet. -2015 means the key lacks Reading
permission or this IP is not allowlisted. /sapi does not exist on the spot testnet.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, but the description adds substantial behavioral context beyond that: error handling for unknown algoId, the -2015 permission error, the testnet limitation, and the 50-row rendering quirk. This goes well beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear headers (When to Use, Returns, Pagination, Examples, Error Handling). Every section carries information; there's minimal fluff. It could be slightly tightened but is far from verbose or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the presence of an output schema, and rich annotations, the description covers all necessary call-time knowledge: use cases, exclusions, pagination nuances, error handling, and examples. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptions for each parameter (algo_id, page, page_size, response_format), so baseline is 3. The description adds meaningful semantics by explaining pagination mapping, the 50-row display limit, and when to use response_format='json'. This is value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'List the individual orders a TWAP placed on the book, with fills and fees.' It explicitly differentiates from siblings by stating this is the only place to see slice-level fills and naming alternatives like binance_get_my_trades and binance_get_open_algo_orders. The purpose is unambiguous and distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description has dedicated 'When to Use' and 'When NOT to Use' sections that name exact sibling tools and conditions, such as finding algoId via binance_get_open_algo_orders and using binance_get_my_trades for symbol-wide trade lists. It leaves no ambiguity about when to select this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_all_depositsARead-onlyIdempotent
Every crypto deposit since since — the 90-day cap walked for you.
Binance only answers 90 days at a time, so this walks until → since in 89-day
windows, newest first, paging offset by 1000 inside each window until a short page
proves it is drained. Rows are deduped by their Binance id, so overlapping
windows (and a resumed run) can never double-count.
since defaults to 2017-07-01, Binance's launch: there is no API that reports
when an account was created — apiRestrictions.createTime is the API KEY's date,
not the account's — so "everything" means "since the exchange existed". Windows
before the account opened simply return nothing.
Cost: GET /sapi/v1/capital/deposit/hisrec is IP weight 1, so the default
max_calls=60 (≈ 15 years of windows) is cheap. The budget is checked BEFORE every
request and the reported call count is the real one.
When to Use:
"Show me every deposit I have ever made" — the headline question.
Reconstructing cost basis or an audit trail of money coming IN.
When NOT to Use:
For one recent window —
binance_get_deposit_historyis one call.For withdrawals — use
binance_get_all_withdrawals.For fiat on-ramps (card/bank) — use
binance_get_fiat_orders/binance_get_fiat_payments(fiat.py); they are a different rail.
Returns:
Rows sorted newest-first with per-coin totals (count + summed amount). Markdown
displays at most 50 rows; response_format="json" returns
{count, truncated, no_progress, since, until, resume_before, calls_made, totals, items} with the full set. truncated is true exactly when the walk did not reach
since; no_progress is true when it did not finish even the first window, and
then resume_before is null on purpose — see Pagination.
Pagination:
If the walk stops before since — budget exhausted, or an error — it returns the
rows it already has PLUS resume_before, the boundary of the next UNFETCHED range.
Call again with the same since and that resume_before to continue. A stop in
the middle of a window re-fetches that window, which the dedupe makes harmless.
If it stopped without completing even the FIRST window there is no cursor to give:
resume_before comes back null with no_progress: true, because repeating the run
with resume_before = until would re-issue the identical calls forever. Raise
max_calls (or fix the error) and re-run the same range instead.
Examples: params = {} params = {"since": "2024-01-01", "coin": "USDT"} params = {"since": "2017-07-01", "resume_before": 1717200000000, "response_format": "json"}
Error Handling: An over-wide-window error from Binance is tolerated: the window is halved and retried. Anything else — auth (-2015), rate limits (429/418), a Binance envelope failure — stops the walk immediately and is reported alongside the rows already collected and the resume cursor, so nothing fetched is ever thrown away.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, but the description goes far beyond by explaining the windowed walk (89-day windows, offset paging), deduplication by Binance id, the default since date and its rationale, cost per call, budget checking, resume cursor semantics, error handling (window halving, stop conditions), and exactly what truncated/no_progress mean. This rich behavioral detail is essential for correct invocation and is not available from annotations alone. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. It is structured with clear headers (When to Use, When NOT to Use, Returns, Pagination, Examples, Error Handling) and front-loaded with the core behavior. There is no fluff; each paragraph addresses a distinct aspect an agent must know. The length is proportional to the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (windowed pagination, resume cursors, deduplication, error recovery), the description covers all operational concerns: what it returns, how to continue a partial run, how to interpret flags, and how errors are handled. It also notes the output schema's JSON structure and the markdown row limit. An agent has everything needed to invoke it correctly and interpret results without further guesswork.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the schema already describes each parameter (since, until, max_calls, resume_before, response_format), the description adds crucial semantics: the walk algorithm for since/until, the meaning and handling of resume_before (it replaces until), the default max_calls covering 15 years, and the response_format differences (markdown truncation vs full JSON structure). This goes well beyond the schema's basic field descriptions and clarifies inter-parameter behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise, specific statement: 'Every crypto deposit since `since` — the 90-day cap walked for you.' It clearly identifies the resource (crypto deposits) and the action (retrieve all since a date). It further distinguishes itself from siblings by explicitly naming alternatives (binance_get_deposit_history for recent windows, binance_get_all_withdrawals for withdrawals, binance_get_fiat_orders for fiat rails). No ambiguity remains about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description contains dedicated 'When to Use' and 'When NOT to Use' sections. It lists concrete use cases ('Show me every deposit I have ever made', reconstructing cost basis) and explicit exclusions with the exact sibling tool to use instead. This is the gold standard for usage guidance—an agent is never left guessing when to pick this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_all_my_tradesARead-onlyIdempotent
Collect every fill across every symbol this account traded — the "all my trades" answer.
Binance has no such endpoint (myTrades needs a symbol; staff confirm the gap on
dev.binance.vision threads 4810 and 4329), so this tool does the only thing that
works over REST: take a symbol list — yours, or one from
binance_discover_traded_symbols — and walk each symbol by fromId at 1000 fills a
page until a short page says that symbol is exhausted.
Two brakes keep it inside the 6000/min IP budget. max_weight (default 3000 = 150
pages) is checked before every request, and the walk also stops when Binance's own
reported used weight passes weight_ceiling (default 5000). When either fires — or
when a request errors mid-walk — the fills collected so far are returned together
with a cursor, so nothing is lost and the next run resumes exactly there.
Cost, so nobody is surprised: 20 IP weight per page per symbol. 150 symbols with no trades still costs 3000 weight. Walking all 1370 TRADING symbols would cost 27,400 — about five minutes of full budget — which is why discovery narrows the list first.
When to Use:
"Show me every trade I have ever made", tax/portfolio reconstruction, a full export.
Incremental top-ups: keep the returned
cursorand pass it back next time.
When NOT to Use:
For one pair —
binance_get_my_tradesis one call.For orders that never filled, deposits, withdrawals, converts or Pay/Card spending: those are different endpoints (spot_orders, wallet_capital, convert, pay).
Returns:
Markdown: the walk status (symbols finished, calls, weight), a time-sorted table of up
to 200 fills, per-symbol totals (fills, bought/sold base and quote, fees by asset) and
the next cursor as a JSON block to paste back. JSON: the same data with every fill.
Pagination:
cursor maps symbol → the last trade id already collected; the walk restarts each
symbol at that id + 1, so re-running is cheap and never duplicates a fill. Symbols the
budget never reached keep whatever position the cursor already held. A symbol that
returns no trades gets no cursor entry, so every incremental run re-checks it from
scratch at 20 weight a time — drop the empties from symbols once you know them.
Examples: params = {} params = {"symbols": ["BTCUSDT", "ETHUSDT"], "max_weight": 200} params = {"symbols": ["BTCUSDT"], "cursor": {"BTCUSDT": 4211999}}
Error Handling:
An error mid-walk never discards work: the partial fills plus the cursor come back
alongside the error text. -2015 means the key lacks Reading or the IP is not
allowlisted; a 429/418 means the budget was already spent elsewhere — lower
weight_ceiling and wait a minute.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and the description adds substantial behavioral context beyond that: the pagination strategy (fromId, 1000 fills/page), the two budget brakes (max_weight and weight_ceiling), the cost model (20 IP weight per page per symbol), the cursor semantics, and the error-handling behavior (partial results returned with cursor on error). It also explains what happens with empty symbols and how to avoid re-checking them. This is rich, honest behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: the endpoint gap rationale, the two brakes, the cost model, when-to-use, when-not-to-use, returns, pagination, examples, and error handling. It is well-structured with clear headers and front-loaded with the core purpose. It loses one point for length — some details (e.g., the dev.binance.vision thread numbers) are arguably noise for an agent selecting a tool — but the structure keeps it navigable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multi-symbol pagination, budget management, cursor resumption, discovery fallback), the description is remarkably complete. It covers cost, error handling, return format, pagination semantics, and examples. The output schema exists, so return values are further specified. An agent has everything needed to invoke this tool correctly and to decide when it is the right choice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% per the context signal, but the description compensates thoroughly for the main parameters: symbols, cursor, max_weight, weight_ceiling are all explained with defaults and semantics. The discovery-related parameters (extra_assets, quote_assets, include_break) are only mentioned indirectly via 'same params as binance_discover_traded_symbols', which is a reasonable pointer but leaves some detail to the sibling. The response_format parameter is covered by the schema's own description. Overall, the description adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Collect every fill across every symbol this account traded' — the 'all my trades' answer. It explicitly distinguishes itself from binance_get_my_trades (single pair) and explains the workaround for Binance's missing endpoint. This is a model of purpose clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description has explicit 'When to Use' and 'When NOT to Use' sections. It names the alternative for single-pair queries (binance_get_my_trades), lists excluded transaction types (orders, deposits, withdrawals, converts, Pay/Card), and gives concrete use cases (tax/portfolio reconstruction, incremental top-ups). This is exactly the guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_allocationsARead-onlyIdempotent
List Smart Order Routing (SOR) allocations — the per-symbol fills behind an SOR order.
Calls GET /api/v3/myAllocations (SIGNED, USER_DATA). IP weight 20 per call.
When to Use:
To see how an SOR order (
binance_place_sor_order) was actually filled across symbols, with per-allocation price/qty/commission.To page through allocations for a specific order via
order_id.
When NOT to Use:
For regular (non-SOR) trade fills — use
binance_get_my_trades.
Returns:
A markdown list (or JSON) of allocations: allocationId, orderId/orderListId,
symbol, side (isBuyer), qty/price/quoteQty (via fmt_num), commission +
commissionAsset, maker/allocator flags, and time. Display is capped at
MAX_DISPLAY_ROWS (50); JSON mode returns {count, truncated, displayLimit, items} rather than a bare array, so truncation stays valid JSON.
Windows:
start_time/end_time (epoch ms or ISO-8601) accept a span of at most 24 h
— enforced locally with a readable Error: before the call reaches Binance,
since Binance would otherwise answer -1127.
Examples: params = {"symbol": "BTCUSDT"} params = {"symbol": "BTCUSDT", "start_time": "2024-01-01T00:00:00Z", "end_time": "2024-01-01T12:00:00Z"} params = {"symbol": "BTCUSDT", "order_id": 12345}
Error Handling: -1127 means the requested window is too wide (should not happen — the 24 h cap is enforced before the request). -1121 means an invalid symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, but the description adds valuable behavioral details: the IP weight (20 per call), the 24-hour window cap enforced locally with a readable error, the response format differences (markdown vs. JSON with truncation handling), and specific error codes (-1127, -1121). This goes well beyond annotations and prepares the agent for expected behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (purpose, when to use, returns, windows, examples, error handling) and every sentence contributes useful information. It is front-loaded with the core purpose and uses examples to clarify parameter usage, making it efficient despite its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all essential aspects: purpose, usage differentiation, behavior (IP weight, truncation, error handling), parameters (via examples and constraints), and output format. Given that an output schema exists, the description still adds critical context about local enforcement and display limits, making it fully complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema itself provides descriptions for each parameter, the tool description enhances semantics with concrete examples (symbol, start_time/end_time, order_id), explains the 24-hour constraint, and clarifies the pagination cursor via `from_allocation_id`. It does not explicitly mention the `limit` parameter, but the schema covers it; the description still adds meaningful context beyond schema basics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List Smart Order Routing (SOR) allocations' — a specific verb and resource — and immediately distinguishes it from regular trade fills by naming the alternative `binance_get_my_trades`. This precise scoping leaves no ambiguity about what the tool does and how it differs from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes explicit 'When to Use' and 'When NOT to Use' sections, directing agents to use this tool for SOR order fills and to use `binance_get_my_trades` for regular trades. It also mentions paging via `order_id`, providing clear guidance on invocation context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_all_order_listsARead-onlyIdempotent
List this account's order lists — working, completed and cancelled — across symbols.
Calls GET /api/v3/allOrderList (SIGNED, IP weight 20). There is no symbol filter:
the endpoint is account-wide. Narrow it with from_id (lists with orderListId >= it)
or a start_time/end_time window — Binance forbids combining them, and that is
rejected locally. The window may not exceed 24 hours, also checked here so you get
a clear message instead of Binance's -1127.
When to Use:
Reconstructing which brackets existed during a given day.
Paging list history forward with a
from_idcursor.
When NOT to Use:
For what is armed right now —
binance_get_open_order_listscosts weight 6.For one known list —
binance_get_order_listcosts weight 4.For plain (non-list) orders —
binance_get_all_orders(spot_orders.py).
Returns:
A markdown table (time, symbol, orderListId, contingencyType, listStatusType,
listOrderStatus, listClientOrderId, leg count) capped at 50 rows, or the raw array
with response_format="json".
Pagination:
limit is 1-1000 (Binance default 500) and at most 50 rows are rendered; use
response_format="json" or narrow the window for the rest. from_id pages forward:
pass the last orderListId you saw, plus one.
Windows:
start_time/end_time accept epoch ms or ISO-8601 and must span 24 h or less
together. Omit everything to get the most recent limit lists.
Examples: params = {"limit": 10} params = {"start_time": "2026-09-22T00:00:00Z", "end_time": "2026-09-22T23:59:59Z"} params = {"from_id": 27}
Error Handling:
A window wider than 24 h, and from_id combined with a time bound, are both rejected
locally. -1127 from Binance means a too-wide window reached it anyway; -1128 is an
invalid parameter combination. -2015 means the key lacks permission or this IP is not
allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds substantial behavior: SIGNED endpoint, IP weight, no symbol filtering, local rejection of invalid parameter combinations, 24-hour window limit, error codes (-1127, -1128, -2015), and response rendering caps. This goes well beyond the annotations and structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but highly structured with clear sections (When to Use, When NOT to Use, Returns, Pagination, Windows, Examples, Error Handling). The core purpose is front-loaded, and every sentence adds operational value. No filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only historical listing tool with an output schema, the description is complete: it explains the return shape (markdown table with specific fields or raw JSON), the pagination model, local validation, error semantics, and the exact endpoint. An agent has everything needed to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the schema includes per-property descriptions, the tool description adds crucial semantics: how `from_id` pages forward ('pass the last orderListId you saw, plus one'), accepted time formats (epoch ms or ISO-8601), the 24-hour window restriction, the mutual exclusivity of `from_id` with time bounds, and the interpretation of `limit` vs. the 50-row rendering cap. Concrete examples further clarify parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a specific verb ('List'), a resource ('order lists'), a scope ('this account', 'account-wide', 'across symbols'), and includes all statuses ('working, completed and cancelled'). It also names the exact endpoint and differentiates itself from sibling tools like binance_get_open_order_lists and binance_get_all_orders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to Use' and 'When NOT to Use' sections are explicit, naming alternative tools (binance_get_open_order_lists, binance_get_order_list, binance_get_all_orders) and the conditions that select each. No inference is required from the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_all_ordersARead-onlyIdempotent
List a symbol's orders — open, filled, cancelled and expired alike.
Calls GET /api/v3/allOrders (SIGNED, IP weight 20). Two ways to narrow it:
order_id as a cursor (returns orders with orderId >= it) or a start_time/
end_time window. The window may not exceed 24 hours — that cap is checked here,
before the call, so you get a clear message instead of Binance's -1127. Walk a longer
span in 24 h slices, or page by order_id.
When to Use:
Reconstructing what happened on a symbol in a given day.
Paging order history forward with an
order_idcursor.
When NOT to Use:
For what is open right now —
binance_get_open_orders(weight 6 with a symbol).For the actual fills, fees and trade ids —
binance_get_my_trades(trade_history.py); an order row only carries aggregates.
Pagination:
limit is 1-1000 (Binance default 500) and at most 50 rows are rendered; use
response_format="json" or narrow the window for the rest. order_id pages forward:
pass the last orderId you saw, plus one.
Windows:
start_time/end_time accept epoch ms or ISO-8601 and must span 24 h or less
together. Omit both to get the most recent limit orders. Orders with no fill are
archived after 90 days and stop being returned.
Examples: params = {"symbol": "BTCUSDT"} params = {"symbol": "BTCUSDT", "start_time": "2026-09-22T00:00:00Z", "end_time": "2026-09-22T23:59:59Z", "limit": 1000} params = {"symbol": "BTCUSDT", "order_id": 123456789}
Error Handling: A window wider than 24 h is rejected locally. -1127 from Binance means the same thing reached it anyway; -1121 is an unknown symbol. -2015 means the key lacks permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds substantial behavioral context beyond them: the call is SIGNED with IP weight 20, the 24-hour window cap is validated locally, only 50 rows are rendered, and orders without fills are archived after 90 days. This gives an agent accurate expectations about rate limits, pagination, and data availability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but highly structured with clear sections, bullet lists, and concrete examples. Every section adds operational value: pagination, window rules, use cases, exclusions, and error handling. The critical 24-hour constraint is prominently highlighted, and the formatting makes the length scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a network-backed read tool with pagination, time windows, and auth requirements, the description covers endpoint details, local validation, limits, paging strategies, error codes, and example parameter sets. With an output schema present, no return-format explanation is needed, and nothing required to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the nested schema has some parameter descriptions, the signal reports 0% schema description coverage, so the plain-language description carries the burden. It explains order_id cursor semantics ('orderId >= this'), start_time/end_time accepted formats (epoch ms or ISO-8601), the 24-hour span constraint, default behavior when both are omitted, and the effect of response_format, all beyond the schema fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List a symbol's orders') and immediately clarifies scope: open, filled, cancelled and expired alike. It distinguishes itself from sibling tools like binance_get_open_orders and binance_get_my_trades, so an agent can select it correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Dedicated 'When to Use' and 'When NOT to Use' sections explicitly route to alternatives: binance_get_open_orders for currently open orders and binance_get_my_trades for fills/fees/trade IDs. It also explains when to use order_id paging versus time windows, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_all_withdrawalsARead-onlyIdempotent
Every crypto withdrawal since since — the 90-day cap walked for you.
Same walk as binance_get_all_deposits (89-day windows newest-first, offset
paging by 1000 inside each, dedupe by Binance id), against
GET /sapi/v1/capital/withdraw/history. Reading only — this server can never
submit a withdrawal.
⚠️ Each call costs UID weight 18000 of the 180000/min per-account budget, and
the endpoint separately allows only 10 requests per second. That is why
max_calls defaults to 10 — one full minute of UID budget — instead of the 60
the deposit walk uses. A full 2017→today sweep needs ~35 windows, so expect to
resume across several calls; the cursor makes that exact and gap-free.
since defaults to 2017-07-01, Binance's launch: no API reports an account's
creation date (apiRestrictions.createTime is the API KEY's date).
When to Use:
"Show me every withdrawal I have ever made", including the fees they cost.
Auditing money going OUT, for tax or reconciliation.
When NOT to Use:
For one recent window —
binance_get_withdraw_historyis one call.For deposits — use
binance_get_all_deposits.To MAKE a withdrawal — impossible by design.
Returns:
Rows sorted newest-first with per-coin totals (count, summed amount, summed
transactionFee). Markdown displays at most 50 rows; response_format="json"
returns {count, truncated, no_progress, since, until, resume_before, calls_made, totals, items} with the full set. truncated is true exactly when the walk did not
reach since; no_progress is true when it did not finish even the first window,
and then resume_before is null on purpose — see Pagination.
Pagination:
If the walk stops before since — which with max_calls=10 is the normal case for
a multi-year sweep — it returns the rows it has PLUS resume_before, the boundary
of the next UNFETCHED range. Call again with the same since and that
resume_before; repeat until truncated is false. If not even the first window
completed, resume_before is null and no_progress is true: raise max_calls and
re-run the same range, since resuming at until would repeat the identical calls.
Examples: params = {} params = {"since": "2024-01-01", "coin": "BTC"} params = {"since": "2017-07-01", "resume_before": 1717200000000, "max_calls": 10}
Error Handling: An over-wide-window error is tolerated (the window is halved and retried). Auth (-2015), rate limits (429/418) and envelope failures stop the walk immediately and are reported alongside the rows already collected and the resume cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false; the description adds substantial operational detail: UID weight 18,000 per call, 10 req/s limit, default max_calls=10 rationale, windowed walking with dedupe, resume_before cursor, no_progress/truncated flags, and error handling. It reinforces the read-only claim and never contradicts annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-structured with clear section headings (rate limits, when to use, returns, pagination, examples, error handling). Every section serves a purpose for a complex windowed-walk tool, and the core purpose is front-loaded. No superfluous filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers semantics, rate limits, defaults, return shape, pagination protocol, examples, and error handling. An output schema exists, so restating return fields is unnecessary; nonetheless, the description explains the top-level JSON keys and truncation behavior. Nothing an agent needs to invoke and recover from a partial walk is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema itself documents each parameter, the description goes beyond by explaining the operational significance: why max_calls defaults to 10 based on the UID budget, how resume_before is meant to be reused, and what no_progress/truncated semantically mean. This adds meaningful guidance beyond the schema's property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Every crypto withdrawal since `since` — the 90-day cap walked for you', clearly stating the tool's function and scope. It explicitly contrasts itself with binance_get_withdraw_history and binance_get_all_deposits, so an agent can distinguish it from siblings even without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Dedicated 'When to Use' and 'When NOT to Use' sections give concrete alternatives and conditions, such as using binance_get_withdraw_history for a single recent window and binance_get_all_deposits for deposits. It also states that making a withdrawal is impossible by design, leaving no ambiguity about misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_api_restrictionsARead-onlyIdempotent
Report the full permission flag set on the configured API key.
Calls GET /sapi/v1/account/apiRestrictions (SIGNED, IP weight 1) and renders
every flag Binance returns, with the same warning wording as binance_health_check
for a withdrawals-enabled or no-IP-allowlist key.
When to Use:
To audit a key end-to-end — this is the full flag list.
Before enabling BINANCE_ALLOW_TRADING, to confirm trading is permitted and withdrawals are off.
When NOT to Use:
For a quick post-startup connectivity+permissions check — use
binance_health_check, which already calls this endpoint as part of a broader check.
Returns:
A markdown flag list (⚠️ next to anything risky), or raw JSON with
response_format="json".
Examples: params = {}
Error Handling: -2015 means the key lacks Reading permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and non-destructive, and the description adds meaningful context: the endpoint is SIGNED with IP weight 1, risky flags are marked with ⚠️, and error -2015 maps to missing Reading permission or non-allowlisted IP. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with short headed sections: core behavior, when to use, when not to use, returns, examples, and error handling. Every section adds actionable information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers the endpoint, authentication context, return format, error handling, usage boundaries, and an example call. For a tool with a single optional parameter, an agent has everything needed to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only meaningful parameter, response_format, is already described in the schema, and the description reinforces it with 'raw JSON with response_format="json"' and an example params = {}. Schema coverage is listed as 0%, but the description compensates well for the one user-controlled parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and object: 'Report the full permission flag set on the configured API key.' It also names the exact Binance endpoint and explicitly contrasts itself with binance_health_check, so an agent can distinguish this from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'When to Use' and 'When NOT to Use' sections. It names binance_health_check as the alternative for quick post-startup checks and explains that the sibling already calls this endpoint as part of a broader check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_api_trading_statusARead-onlyIdempotent
Report whether spot trading is locked and what triggered it.
Calls GET /sapi/v1/account/apiTradingStatus (SIGNED, IP weight 1). When Binance's
abuse-prevention system trips (excessive cancel ratio, etc.) it locks trading for a
cooldown window; this reports the lock state, the recovery ETA, and which trigger
fired.
When to Use:
When order placement starts failing for no obvious filter/balance reason, to check for a temporary account-wide trading lock.
When NOT to Use:
To check the account's general standing — use
binance_get_account_status.To check key permission flags — use
binance_get_api_restrictions.
Returns:
A markdown block with isLocked, the planned recovery time (rendered UTC), and the
trigger-condition thresholds (GCR = GTC cancellation ratio, IFER = IOC/FOK
expiration ratio, UFR = unfilled ratio), or raw JSON with response_format="json".
Examples: params = {}
Error Handling: -2015 means the key lacks Reading permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only, idempotent, and non-destructive; the description adds the endpoint, SIGNED/auth requirement, IP weight, the abuse-prevention lock cooldown context, and the -2015 error meaning. This is exactly the kind of behavioral context that annotations do not provide, and it does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clear labeled sections (purpose, when to use, when not to use, returns, examples, error handling) with no filler. Every sentence adds operational value, and the main purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers selection criteria, exact endpoint, authentication/error behavior, return format options, and example invocation. For a single-parameter read-only status tool, nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter (response_format), and the description demonstrates an empty params object plus the json override, while the schema supplies the enum/default details. Given the near-zero schema coverage signal, the description compensates well enough for the single optional parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource: 'Report whether spot trading is locked and what triggered it.' It is further distinguished from sibling tools by naming binance_get_account_status and binance_get_api_restrictions as different checks, so an agent can select it correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to Use' section states a concrete trigger condition (order placement failing for no filter/balance reason) and the 'When NOT to Use' section explicitly names the alternatives for general account status and key permission flags. This leaves no ambiguity about when this tool should be chosen over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_asset_detailARead-onlyIdempotent
Report per-asset deposit/withdraw status, withdraw fee and minimum.
Calls GET /sapi/v1/asset/assetDetail (SIGNED, IP weight 1). Binance answers with a
map keyed by asset, not a list.
When to Use:
To check whether deposits or withdrawals are currently suspended for an asset.
To read an asset's withdraw fee and minimum before planning a movement elsewhere.
When NOT to Use:
For per-network detail (which chain, its own fee/min) — use
binance_get_coin_config(wallet_capital.py).To actually withdraw: this server has no withdrawal tool, by design, and the HTTP client refuses
/sapi/v1/capital/withdraw/applyunder every configuration.
Returns:
A markdown table of asset / deposit / withdraw / withdraw fee / min withdraw / tip,
capped at 50 assets (pass asset to narrow), or the raw map with
response_format="json".
Examples: params = {"asset": "BTC"} params = {}
Error Handling: -2015 means the key lacks Reading permission or this IP is not allowlisted. An unknown asset comes back as an empty map, not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable behavioral context beyond that: the endpoint is SIGNED with IP weight 1, the response is a map keyed by asset (not a list), error -2015 indicates permission/IP issues, and an unknown asset returns an empty map rather than an error. It also reveals the HTTP client refuses withdrawal calls. This is rich, non-redundant disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized into clear sections (purpose, when to use/not use, returns, examples, error handling). It is front-loaded with the core purpose and uses bullet points effectively. Every sentence contributes to decision-making; there is no fluff or redundant text. The length is justified by the amount of useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the return format (markdown table with specific columns, 50-asset cap, JSON raw option), error handling (-2015, empty map), usage boundaries, and provides concrete examples. It also references the output schema implicitly. Given the tool's complexity and the presence of an output schema, this description leaves almost nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for `asset` and `response_format`. The tool description adds practical semantics: 'Omit for every asset Binance lists,' 'pass `asset` to narrow,' and clarifies the effect of `response_format="json"` (raw map). It doesn't fully explain every nuance (e.g., regex pattern for asset), but the schema covers that. This adds meaningful usage context without repeating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Report per-asset deposit/withdraw status, withdraw fee and minimum.' It explicitly names the endpoint and distinguishes itself from the sibling `binance_get_coin_config` by stating what it does not cover. This leaves no ambiguity about the tool's role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description has dedicated 'When to Use' and 'When NOT to Use' sections. It gives concrete conditions (checking suspension, reading fees) and explicitly names the alternative tool for per-network details. It even notes the server intentionally has no withdrawal tool, preventing misuse. This is exemplary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_asset_dividendsARead-onlyIdempotent
List asset distributions credited to the account (airdrops, rebates, interest).
Calls GET /sapi/v1/asset/assetDividend (SIGNED, IP weight 10). This is Binance's
"asset dividend record": savings interest, BNB fee rebates, airdrops, referral
payouts and similar credits, each with the reason in enInfo.
When to Use:
To explain a balance that grew without a trade or a deposit.
To total up rebates/airdrops over a period.
When NOT to Use:
For Simple Earn positions and their APR — use the earn tools (simple_earn.py).
For trades — use
binance_get_my_trades(trade_history.py).
Returns:
A markdown table of time / asset / amount / description / tranId, capped at 50 rows,
plus per-asset totals of the rows shown, or the raw envelope with
response_format="json".
Windows:
start_time..end_time must span at most 180 days — Binance rejects anything
wider, and this is checked locally before the call. Omit both for Binance's own
default window.
Examples: params = {"asset": "BNB", "limit": 100} params = {"start_time": "2026-01-01", "end_time": "2026-06-01"}
Error Handling:
A window wider than 180 days is rejected locally with an Error: naming the cap,
instead of round-tripping to Binance. -2015 means the key lacks Reading permission
or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint), the description discloses the API weight, the 180-day window cap with local validation, error code -2015 meaning, and the exact return format (markdown table capped at 50 rows). This adds substantial behavioral context that is not available from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (purpose, when to use, returns, windows, examples, error handling). It front-loads the primary action and then provides necessary details without unnecessary fluff. Every section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the return format, window constraints, error handling, and usage examples. It also mentions the response_format option for raw JSON. Given the tool's moderate complexity and rich schema, this is a complete and self-sufficient description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already contains detailed descriptions for every parameter (asset, limit, start_time, end_time, response_format), so schema coverage is high. The description itself adds little about parameters beyond mentioning the 180-day constraint, which is also in the schema's start_time description. Thus, the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function as listing asset distributions (airdrops, rebates, interest) and explicitly identifies the underlying API endpoint. It differentiates itself from siblings by naming specific alternatives like binance_get_my_trades and simple_earn tools, so an agent can easily distinguish its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'When to Use' and 'When NOT to Use' sections, naming exact alternatives and conditions. It tells the agent to use this for balance growth without trades and to use earn tools for Simple Earn, and binance_get_my_trades for trades. This is complete guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_avg_priceARead-onlyIdempotent
Fetch the current average price over Binance's configured window (typically 5 min).
Calls GET /api/v3/avgPrice (weight 2).
When to Use:
As a smoothed reference price, e.g. for MARKET order sanity checks.
When NOT to Use:
For the latest tick price — use
binance_get_ticker_price.
Returns:
Markdown: the price, the averaging window in minutes, and the close time. JSON: the
raw {mins, price, closeTime} object.
Examples: params = {"symbol": "BTCUSDT"}
Error Handling:
An unknown symbol raises Binance -1121 Invalid symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds substantial behavioral detail beyond that: the averaging window concept, the specific API endpoint and weight, the return formats (Markdown vs JSON), and the error handling for invalid symbols. This gives the agent a full picture of how the tool behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with clear headings: purpose, call, when to use, when not, returns, examples, and error handling. It front-loads the core purpose and uses bullet points for efficiency. Every sentence adds value, and there is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (so return structure is documented elsewhere) and only one required parameter, the description is complete. It includes an example, explains the response_format's impact, and covers error handling. Nothing an agent needs to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides good descriptions for symbol and response_format, so the baseline is 3. The description adds a concrete example with symbol and explains the effect of response_format via the Returns section (Markdown vs JSON). While it does not explicitly name response_format as a parameter, the link is clear. This is a moderate enhancement over schema-only information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch the current average price over Binance's configured window (typically 5 min).' It clearly distinguishes this from the ticker-price tool by naming the sibling in the 'When NOT to Use' section, so an agent can immediately tell them apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit 'When to Use' (smoothed reference price for MARKET order sanity checks) and 'When NOT to Use' (latest tick price, with the alternative tool named). This leaves no ambiguity about when to select this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_book_tickerARead-onlyIdempotent
Fetch the best bid/ask price and quantity for one, several, or all symbols.
Calls GET /api/v3/ticker/bookTicker. Weight: symbol → 2; omitted or symbols → 4.
When to Use:
For the current spread and top-of-book size without the full depth of
binance_get_order_book.
When NOT to Use:
For multiple price levels — use
binance_get_order_book.
Returns:
Markdown: a table of bid/ask price+qty per symbol, capped at 100 rows. JSON:
count/shown plus the tickers.
Examples: params = {"symbol": "BTCUSDT"}
Error Handling:
An unknown symbol raises Binance -1121 Invalid symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false. The description adds valuable context beyond those: the exact API endpoint, weight costs per parameter combination, row cap (100), return format details, and a specific error code. It enriches the safety and operational picture without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with headings for purpose, use cases, returns, examples, and errors. Every sentence adds actionable information; no filler or repetition. The most critical information (what it fetches) is front-loaded, and the alternative tool is named early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple symbol modes, response formats, weight variations, error handling), the description covers endpoint, rate-limit weight, use-case boundaries, return structure, row limit, and error behavior. With annotations and an output schema also present, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes symbol, symbols, and response_format with mutual exclusivity and defaults. The description adds a concrete example (params = {'symbol': 'BTCUSDT'}) and explains the effect of response_format on output (Markdown vs JSON structure), which goes beyond the schema's terse 'Output format.' Since the schema carries most parameter documentation, a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb-resource pair ('Fetch the best bid/ask price and quantity') with explicit scope (one, several, or all symbols) and distinguishes itself from binance_get_order_book by clarifying it provides top-of-book size without full depth. This leaves no ambiguity about the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Dedicated 'When to Use' and 'When NOT to Use' sections explicitly name the sibling binance_get_order_book as the alternative for multiple price levels, giving clear selection criteria. This fully covers when to invoke this tool versus others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_coin_configARead-onlyIdempotent
Per-coin deposit/withdraw switches, networks, fees and minimums.
Calls GET /sapi/v1/capital/config/getall (SIGNED, IP weight 10). The endpoint
takes no filter and returns every listed coin (hundreds), so coin is applied
client-side after the call — the cost is the same either way, which is why it is
worth calling once and reading several coins out of the JSON.
This is where you learn, before moving anything: whether deposits/withdrawals are
enabled at all for a coin, which networks it supports, which is the default, what
each network charges (withdrawFee) and its minimum (withdrawMin).
When to Use:
Before depositing — confirm
depositEnableon the network you plan to use.To compare network fees for the same asset (e.g. USDT on TRX vs ETH).
When NOT to Use:
To get the actual address — use
binance_get_deposit_address.For trading fees — that is
binance_get_trade_fees(wallet_asset.py); this is the on-chain transfer fee.
Returns:
Per coin: depositAllEnable / withdrawAllEnable, then a per-network table of
isDefault, depositEnable, withdrawEnable, withdrawFee and withdrawMin. Capped at 50
coins in markdown (pass coin to narrow); response_format="json" returns the
filtered payload in full.
Examples: params = {"coin": "USDT"} params = {"response_format": "json"}
Error Handling:
An unknown coin returns an empty result, not an error — the filter is local.
-2015 means the key lacks Reading permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safe-read profile is covered. The description adds valuable behavioral detail on top: the endpoint is SIGNED and costs IP weight 10; it takes no server-side filter, so the coin parameter is applied client-side; the response is capped at 50 coins in markdown but full JSON with response_format='json'; and unknown coins yield an empty result rather than an error. It also explains the -2015 error meaning (key lacking Reading permission or IP not allowlisted). This is rich, non-obvious behavior that an agent needs to call correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently organized with a bolded summary, a technical call line, a purpose paragraph, 'When to Use', 'When NOT to Use', Returns, Examples, and Error Handling. Every section earns its place, front-loads the most decision-relevant info (purpose and scope), and uses whitespace/headers to make scanning fast. There is no filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (single param, clear output shape, annotations covering safety), the description is complete: it covers the endpoint, auth/rate-limit cost, data returned, client-side filtering, output format behavior, error handling, and examples. An output schema exists (per the context signal), so return-value structure is documented elsewhere; the description adds the human-meaningful context (what the fields mean for deposit/withdraw decisions). Nothing an agent needs to call and interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the only real parameter is `coin` (plus the standard `response_format`). The description compensates well: it explains that `coin` is applied client-side because the endpoint takes no filter, and that passing `coin` narrows the markdown cap; it also explains the `response_format='json'` behavior. However, it doesn't enumerate possible coin values or give format details beyond what the schema already states (e.g., the schema already defines response_format enum). A 4 is warranted because the description adds essential semantics the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a crisp summary—'Per-coin deposit/withdraw switches, networks, fees and minimums'—and immediately identifies the exact endpoint, HTTP method, and signing requirement. It goes beyond a generic verb+resource by enumerating the actual data fields (depositEnable, withdrawFee, withdrawMin) that the tool exposes, which lets an agent know precisely what it will get. It is clearly distinguished from adjacent siblings (e.g., binance_get_deposit_address, binance_get_trade_fees) by stating what it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description contains explicit 'When to Use' and 'When NOT to Use' sections with concrete scenarios (e.g., before depositing to confirm depositEnable; to compare network fees for USDT on TRX vs ETH) and names specific alternatives (binance_get_deposit_address for addresses, binance_get_trade_fees for trading fees). It also gives a cost-based reason for calling once and reading multiple coins, which is operational guidance that helps an agent decide when the call is worth making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_commission_ratesARead-onlyIdempotent
Get the account's standard/special/tax commission rates for one symbol.
Calls GET /api/v3/account/commission (SIGNED, USER_DATA). IP weight 20 per call.
When to Use:
To see the exact maker/taker/buyer/seller commission that will apply on a given symbol, including any special-tier override, tax commission, or a BNB-style fee discount.
When NOT to Use:
For the account's default (non-symbol-specific) commission rates — use
binance_get_spot_account, which echoescommissionRatestoo.
Returns: A markdown block (or JSON) with the symbol, standard/special/tax commission blocks (maker/taker/buyer/seller via fmt_num), and the discount block (enabled-for-account, enabled-for-symbol, discount asset, rate).
Examples: params = {"symbol": "BTCUSDT"}
Error Handling:
-1121 means an invalid or unknown symbol — check binance_get_exchange_info.
-2015 means the key lacks Reading permission or the IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses the API endpoint (GET /api/v3/account/commission), the IP weight (20), and error handling for codes -1121 and -2015. It also describes the return format and structure. This adds substantial behavioral context about rate limits and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (purpose, API info, when to use, when not to use, returns, example, error handling). It front-loads the core purpose and then provides necessary details without redundancy. Every section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description includes all necessary information for an agent to call the tool correctly: the API endpoint, authentication context (SIGNED, USER_DATA), rate limit weight, example call, expected return structure, and error codes. Given the simple parameter set and existing annotations, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema descriptions for 'symbol' and 'response_format' are present, but the top-level 'params' has no description (coverage 0%). The description compensates with an example (params = {'symbol': 'BTCUSDT'}) and explains the return format, which clarifies how the parameters are used. It doesn't fully elaborate on response_format, but the schema's enum and default cover it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence clearly states the tool's purpose: 'Get the account's standard/special/tax commission rates for one symbol.' It uses a specific verb (get), identifies the resource (commission rates), and scopes it to a single symbol. It also distinguishes itself from siblings by naming binance_get_spot_account as the alternative for default rates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes explicit 'When to Use' and 'When NOT to Use' sections, providing concrete criteria (e.g., 'exact maker/taker/buyer/seller commission that will apply on a given symbol') and naming the alternative tool (binance_get_spot_account). This leaves no ambiguity for an agent selecting the right tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_convert_asset_infoARead-onlyIdempotent
Show the decimal precision (fraction) Convert accepts for each asset.
Calls GET /sapi/v1/convert/assetInfo (SIGNED, IP weight 100). fraction is the
number of decimal places an amount may carry for that asset on the convert rail —
sending more precision than this is what -1111 rejects.
When to Use:
Before
binance_get_convert_quote, to roundfrom_amount/to_amountcorrectly.When a quote was rejected for precision.
When NOT to Use:
To find which pairs exist or their min/max sizes — that is
binance_get_convert_pairs.
Returns:
One row per asset: asset and its accepted decimal places, filtered client-side when
asset is given. Markdown display is capped at 100 rows.
Examples: params = {} params = {"asset": "BTC"}
Error Handling:
-2015 means the key lacks permission or this machine's IP is not on the key's
allowlist; the spot testnet has no /sapi endpoints at all (404).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds valuable behavior beyond that: SIGNED endpoint, IP weight, client-side filtering, 100-row Markdown cap, the -1111 precision error, -2015 permission/IP errors, and testnet 404. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections, front-loaded purpose, and only functional details: endpoint, usage, examples, and error handling. Every sentence adds value or routes the agent away from mistakes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers endpoint, authentication/signing, rate weight, precision behavior, filtering, output cap, examples, and error codes. With a simple parameter set, strong annotations, and an output schema present, nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Context reports 0% schema description coverage, so the description must compensate. It explains asset as a client-side filter with examples and clarifies what `fraction` means for amounts. `response_format` is not mentioned in the description, but the schema already describes it, so this is a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States exactly what it does: shows the decimal precision (`fraction`) Convert accepts per asset. It also names the endpoint and explicitly differentiates itself from binance_get_convert_pairs, so an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit When to Use (before binance_get_convert_quote, when a quote is rejected for precision) and When NOT to Use (pairs/min-max, pointing to binance_get_convert_pairs). It also includes examples and error-handling guidance, leaving no ambiguity about when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_convert_historyARead-onlyIdempotent
List past conversions, either for one <=30-day window or across a walked range.
Calls GET /sapi/v1/convert/tradeFlow (SIGNED, UID weight 3000 per call of a
180,000/min budget — 60 calls a minute at most, and the default budget here spends
72,000 of it).
Binance requires both startTime and endTime and caps the span at 30 days, and
the endpoint has no cursor/offset/page parameter of any kind. The only
continuation it offers is the moreData flag: when it is true, the same window is
re-asked with endTime = min(createTime) (inclusive — an exclusive - 1 would drop
rows tied on that instant but cut off by limit; the re-read duplicates are deduped by
orderId) until it comes back false. Both modes below automate that.
Single window (default):
start_time/end_time. Give one and the other is filled locally by the 30-day rule; give neither and the last 30 days are used.Walk:
since(plus optionaluntil/resume_before) slices the range into <=29-day windows, newest-first, untilsinceis reached ormax_callsruns out.
The two sets are mutually exclusive — mixing them is rejected locally.
When to Use:
To reconcile conversions for a period, or to find the orderId of a past conversion.
To pull more than 30 days of history without hand-rolling the windowing (walk mode).
When NOT to Use:
To check one conversion you just made —
binance_get_convert_order_statusis UID 100 against this endpoint's 3000.For resting limit orders, which are not conversions yet —
binance_get_convert_open_limit_orders.
Returns:
Conversions newest-first (time, from → to amounts, ratio, status, orderId), deduped by
orderId within the call, the number of API calls spent, and — when the walk stopped
early — a resume_before cursor marking the boundary of the next unfetched range.
A failure mid-walk returns the rows collected so far plus that cursor and the
error, never the error alone. Markdown display caps at 50 rows;
response_format="json" carries every fetched row.
Pagination/Windows:
start_time/end_time/since/until/resume_before all accept epoch ms, a
=12-digit epoch-ms string, or ISO-8601. A single-window span over 30 days is rejected here with a clear message rather than sent on to become a Binance error.
limitis <= 1000 (the endpoint's own max).resume_beforeis always theendTimethe next request would have used, so resuming never leaves a gap; overlapping rows are deduped.
Examples: params = {} # the last 30 days, one window params = {"start_time": "2026-08-01", "end_time": "2026-08-20"} params = {"since": "2026-01-01", "max_calls": 12} params = {"since": "2026-01-01", "resume_before": 1756000000000}
Error Handling:
-1127 means the span exceeded Binance's cap (this tool validates first, so it should
not appear); 429 on /sapi means the UID weight budget is gone — lower max_calls and
wait; -2015 means the key lacks permission or the IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses critical execution behavior: no cursor/offset parameter, the moreData continuation mechanism, orderId-based deduplication, UID weight and rate budget, return-before-error behavior on mid-walk failures, the 50-row markdown cap, and specific Binance error codes. This is far more than the annotations alone provide and contains no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, the description is tightly organized into clear sections: mode summary, when to use, returns, pagination, examples, and error handling. It front-loads the core purpose and every section earns its place, given the tool's intricate pagination and two-mode parameterization. The examples compactly illustrate the valid parameter shapes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for an agent to call the tool correctly: it covers both modes, parameter interactions, continuation and resume semantics, response contents, failure behavior, rate-limit implications, and error interpretation. With an output schema also present, the description goes beyond what is strictly required without leaving meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The top-level schema has only one required 'params' property with 0% description coverage, so the description carries the full burden, and it delivers: start_time/end_time defaults and the 30-day rule, walk-mode semantics for since/until/resume_before, mutual exclusivity, accepted time formats, max_calls as a UID-weight budget, and limit behavior. It adds meaning well beyond the schema's property names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line, 'List past conversions, either for one <=30-day window or across a walked range,' names the exact verb, resource, and the two operational modes. The 'When NOT to Use' section further distinguishes it from binance_get_convert_order_status and binance_get_convert_open_limit_orders, so an agent can select it correctly without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'When to Use' and 'When NOT to Use' sections with concrete conditions: reconciliation, finding an orderId, pulling more than 30 days via walk mode, and alternatives for checking a single recent conversion or resting limit orders. It also states that single-window and walk parameters are mutually exclusive and rejected locally, leaving no ambiguity about invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_convert_open_limit_ordersARead-onlyIdempotent
List the convert limit orders currently resting on the account.
Calls GET /sapi/v1/convert/limit/queryOpenOrders (SIGNED, UID weight 3000 of a
180,000/min budget) — cross-asset, no filters, so poll it sparingly.
When to Use:
To see what convert limit orders are live, with their expiry instants.
Before placing another one, to avoid stacking duplicates.
After a timeout on a placement, to learn whether the order actually rested.
When NOT to Use:
For completed conversions —
binance_get_convert_history.For spot open orders —
binance_get_open_orders.
Returns: One row per resting order: creation time, from → to amounts, ratio, status, orderId and the expiry instant. Markdown display caps at 50 rows.
Examples: params = {}
Error Handling: -2015 means the key lacks permission or the IP is not allowlisted; 429 on /sapi means the UID budget is gone — this endpoint alone is 3000 per call.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, the description adds substantial behavioral context: the endpoint's weight (3000) and budget (180,000/min), a caution to poll sparingly, specific error codes (2015 for permissions, 429 for rate limit), and the exact return fields per row. This goes far beyond the annotations, giving the agent critical operational knowledge.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections, bullet points, and an example. Every sentence serves a purpose: purpose, usage guidance, return format, example, and error handling. The most critical info (what it does and when to use it) is front-loaded, and there is no redundant fluff. The length is justified by the richness of the content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a read-only query with rate-limit implications, and the description covers all necessary aspects: purpose, usage scenarios, return format (fields per row), error handling, rate limit budget, and the example invocation. Even though an output schema exists, the description adds clarity about the return fields and markdown cap. Nothing an agent needs to decide whether to call this tool and interpret its results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for parameters, and the single parameter (params) is an object with response_format. The description compensates by providing an example 'params = {}' and noting 'Markdown display caps at 50 rows', which clarifies the markdown format behavior. It does not fully explain the json output variant, but the schema itself already has a description for response_format ('markdown or json output'), so the addition is marginal but still useful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the convert limit orders currently resting on the account.' It names the exact API endpoint and clearly distinguishes from siblings like binance_get_convert_history (completed conversions) and binance_get_open_orders (spot orders). The purpose is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes dedicated 'When to Use' and 'When NOT to Use' sections with concrete scenarios (e.g., before placing another order to avoid duplicates, after a timeout to check if the order rested). It explicitly names the alternative tools for completed conversions and spot orders, leaving no ambiguity about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_convert_order_statusARead-onlyIdempotent
Check one conversion's status by orderId or by the quoteId it came from.
Calls GET /sapi/v1/convert/orderStatus (SIGNED, UID weight 100). Exactly one of
order_id / quote_id — Binance rejects both together.
When to Use:
After
binance_accept_convert_quotereturned PROCESS or ACCEPT_SUCCESS, to find out whether it settled.After a timeout or 5xx on an acceptance, to learn whether the conversion happened before retrying anything.
When NOT to Use:
For a list of past conversions — use
binance_get_convert_history.For resting limit orders — use
binance_get_convert_open_limit_orders.
Returns: The conversion's assets, amounts, ratio, status and creation time, with the status echoed verbatim.
Examples: params = {"order_id": "933256278426274426"} params = {"quote_id": "12415572564"}
Error Handling: -2015 means the key lacks permission or the IP is not allowlisted; an unknown id is rejected by Binance rather than returning an empty result.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds valuable context beyond that: it notes the endpoint is SIGNED with UID weight 100, explains that unknown ids are rejected (not empty), and mentions error code -2015. It also discloses the return fields and that status is echoed verbatim. This is strong behavioral disclosure, though it doesn't elaborate on rate-limit handling or output formatting details, which are minor for a single-item read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear headers, bullet points, and examples. It front-loads the core purpose, then efficiently covers usage, returns, examples, and errors. Each section is concise and to the point, with no redundant or filler content. The overall length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-order status-check tool, the description covers everything an agent needs: when to use it, when not to, the endpoint and weight, the parameter constraint, expected returns, examples, and error handling. The presence of an output schema further reduces the need to explain return structures. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explicitly explains the exclusivity constraint: 'Exactly one of order_id / quote_id — Binance rejects both together.' It provides concrete examples for both parameter choices. The schema's own descriptions are minimal (just 'Convert order id (from...)'), so the description adds critical semantic value by clarifying the mutual exclusion and usage, which the schema does not fully convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific statement: 'Check one conversion's status by orderId or by the quoteId it came from.' It names the resource (conversion status), the verb (check), and the two acceptable identifiers. It also distinguishes itself from siblings by explicitly stating it checks one conversion, not a list. This is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes dedicated 'When to Use' and 'When NOT to Use' sections. It tells the agent exactly when to call it (after acceptance, after timeout/5xx) and when to use alternatives (`binance_get_convert_history` for lists, `binance_get_convert_open_limit_orders` for resting orders). This explicit routing is excellent guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_convert_pairsARead-onlyIdempotent
List the convertible asset pairs and their per-pair minimum/maximum amounts.
Calls GET /sapi/v1/convert/exchangeInfo — unauthenticated (no key needed) but
IP weight 3000 of a 12,000/min budget, so four unfiltered calls exhaust a minute.
The pair list barely changes: cache the answer and pass from_asset/to_asset to
keep the response small.
When to Use:
Before quoting, to check a pair is convertible at all and that the amount you plan to convert sits between
fromAssetMinAmountandfromAssetMaxAmount.To find what a given asset can be converted into (
from_asset="BTC").
When NOT to Use:
To get a price — that is
binance_get_convert_quote(a quote reserves a ratio).To read spot symbol filters — that is
binance_get_exchange_info; convert pairs and spot trading pairs are different lists with different rules.
Returns:
One row per pair: from → to plus the min/max amount on both legs. Markdown display is
capped at 100 pairs with a note to narrow the filter; response_format="json" carries
every row returned.
Examples: params = {"from_asset": "BTC"} params = {"from_asset": "BTC", "to_asset": "USDT"}
Error Handling:
429 means the IP weight budget is gone — wait out Retry-After rather than retrying;
this single endpoint is 3000 weight per call.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses unauthenticated access, IP weight of 3000 out of a 12,000/min budget, the rarely-changing pair list with caching advice, the markdown 100-pair cap, JSON behavior, and 429 handling with `Retry-After`. This gives an agent important runtime behavior that annotations alone do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but every section earns its place: purpose, endpoint, rate limit, caching, when-to-use, when-not-to-use, return behavior, examples, and error handling. It is organized with clear headers and front-loaded with the core purpose and critical rate information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with non-obvious rate limits and close sibling tools, the description covers all necessary context: start from the key endpoint, common usage cases, alternative tools, response shape, filter examples, and error handling. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema coverage signal is 0% for the top-level `params` wrapper, the description compensates thoroughly by explaining why `from_asset`/`to_asset` should be used, providing concrete examples, and describing how `response_format` affects output. This is exactly the semantic guidance an agent needs beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List the convertible asset pairs and their per-pair minimum/maximum amounts.' It clearly identifies the endpoint (`GET /sapi/v1/convert/exchangeInfo`) and differentiates from siblings by exactly naming what the tool is not for, such as `binance_get_convert_quote` and `binance_get_exchange_info`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to Use' and 'When NOT to Use' sections give concrete scenarios: checking convertibility and amount bounds before quoting, or discovering available conversions via `from_asset`. It also names the alternative tools and the conditions under which they should be used instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_convert_quoteARead-only
Request a convert quote: a reserved ratio, valid for 10 s to 2 minutes.
Calls POST /sapi/v1/convert/getQuote (SIGNED, UID weight 200). This moves no
funds — it is on the client's POST-read allowlist, so it works with the trading
kill-switch off — but it is not free either: a quote is a short-lived reservation, so
do not poll it in a loop.
Nothing is converted until the quote is accepted with binance_accept_convert_quote
before validTimestamp. After that instant the quoteId is void and a new quote is
needed.
When to Use:
To price a conversion (what you would receive, and at what ratio) before deciding.
As the first half of every conversion: quote → human approves → accept.
When NOT to Use:
For an indicative market price —
binance_get_ticker_priceis free and does not reserve anything.To convert at a price that is not currently available — place a convert limit order with
binance_place_convert_limit_orderinstead.
Returns:
The quoteId, the ratio and inverseRatio, both amounts, and the expiry instant
(validTimestamp) rendered as UTC, plus the instruction to accept it before it
expires.
Examples: params = {"from_asset": "BTC", "to_asset": "USDT", "from_amount": "0.01"} params = {"from_asset": "USDT", "to_asset": "BTC", "to_amount": "0.5", "valid_time": "1m"}
Error Handling:
-1111 means the amount carries more decimals than the asset's fraction (see
binance_get_convert_asset_info); a rejection about limits means the amount is
outside the pair's min/max (see binance_get_convert_pairs); -2015 means the key
lacks permission or the IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true and destructiveHint=false, and the description is consistent, adding that it 'moves no funds' and nothing is converted until accepted. It goes well beyond the annotations by disclosing the UID weight 200 rate cost, that it works with the trading kill-switch off, that a quote is a short-lived non-idempotent reservation (not free, do not poll in a loop), and that the quoteId becomes void after validTimestamp — all of which align with openWorldHint=true and idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly 230 words is long, but every sentence earns its place given the reservation semantics, rate-weight, kill-switch nuance, and error codes that the description must carry at 0% schema coverage. It is front-loaded with the core purpose and behavioral headline, then uses clear labeled sections (When to Use, When NOT to Use, Returns, Examples, Error Handling) that make it scannable rather than a wall of prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the full call lifecycle: endpoint and signing, cost/weight, the allowlist quirk, the quote's expiry and invalidation, the accept step, return fields, example inputs, and the three most relevant Binance error codes. Even though an output schema exists (so return values needn't be explained), it describes the quoteId/ratio/inverseRatio/validTimestamp result anyway, making the tool callable correctly with zero prior Binance knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage reported at 0%, the description carries the parameter-semantics burden and largely succeeds: two full example param sets illustrate the exactly-one-of from_amount/to_amount decision and the valid_time format, and the Error Handling section ties failure codes to amount precision and pair limits. Minor gaps remain — wallet_type and response_format are not explained in the description text — but the core parameters an agent must get right are well covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Request a convert quote: a reserved ratio, valid for 10 s to 2 minutes', and names the exact endpoint `POST /sapi/v1/convert/getQuote`. It actively distinguishes itself from siblings — noting it is NOT for indicative prices (binance_get_ticker_price) and NOT for converting at unavailable prices (binance_place_convert_limit_order) — so an agent can separate it from the other convert/order tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to Use' and 'When NOT to Use' sections name sibling tools and the conditions selecting them: binance_get_ticker_price for free indicative prices, binance_place_convert_limit_order for unavailable prices, and binance_accept_convert_quote as the mandatory second half of the flow. This leaves nothing to inference about when to invoke this tool versus any alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_delist_scheduleARead-onlyIdempotent
List symbols scheduled to be delisted, with their delisting date.
Calls GET /sapi/v1/spot/delist-schedule (API key only — no signature, IP weight
100). Useful to avoid opening new positions in a symbol about to stop trading.
When to Use:
Before placing a new order, to check the symbol is not on the delist schedule.
As a periodic sweep of open positions against upcoming delistings.
When NOT to Use:
To check whether a symbol is trading right now — use
binance_get_exchange_info(market_data.py) and read itsstatusfield.
Returns:
A markdown table of delist date → symbols, capped at 50 rows, or raw JSON with
response_format="json".
Examples: params = {}
Error Handling: -2015 means the key is missing/invalid or this IP is not allowlisted (this endpoint only needs the X-MBX-APIKEY header, not a signature).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the exact API endpoint, authentication requirement (API key only, no signature), IP weight, output format details (markdown table capped at 50 rows, or raw JSON), and the meaning of error code -2015. These go well beyond the annotations, which already indicate a safe read-only, idempotent operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections, front-loaded purpose, and every section earning its place. It includes use cases, exclusions, return format, an example, and error handling without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for an agent to decide when and how to call this tool: it covers endpoint, auth, usage guidance, output format, example invocation, and error semantics. The output schema and annotations cover the remaining structured details, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents response_format with its enum and default, and the description references response_format='json' and shows params={} as an example. However, the description does not explicitly state the default output format or enumerate the allowed values, so it adds only moderate meaning beyond the schema. The low schema coverage signal means the description could have compensated more fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List symbols scheduled to be delisted, with their delisting date.' This clearly identifies what the tool does and the domain it operates in. It also differentiates from sibling tools by naming binance_get_exchange_info as the alternative for checking current trading status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description has explicit 'When to Use' and 'When NOT to Use' sections, giving concrete scenarios such as checking before placing an order and sweeping open positions. It names the specific alternative tool and the condition that should trigger its use, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_deposit_addressARead-onlyIdempotent
Get the deposit address for one coin on one network.
Calls GET /sapi/v1/capital/deposit/address (SIGNED, IP weight 10). Omitting
network returns the coin's default network — which is NOT always the one you
want; binance_get_coin_config lists every network with its isDefault flag.
⚠️ Sending a coin to an address on the wrong network loses the funds. Confirm the
network before using the address, and use the tag/memo when one is returned.
When to Use:
Before sending crypto into Binance from an external wallet.
When NOT to Use:
To see every address already issued for a coin — use
binance_get_deposit_addresses.To check whether deposits are even enabled for that coin/network right now — use
binance_get_coin_configfirst.
Returns:
A markdown block with address, coin, tag and Binance's url (a block-explorer
link), or raw JSON with response_format="json".
Examples: params = {"coin": "USDT", "network": "TRX"} params = {"coin": "BTC"}
Error Handling: An unknown coin/network pair returns a Binance error naming the parameter. -2015 means the key lacks Reading permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, idempotent, and non-destructive. The description adds critical behavioral context: omitting network returns default (not always desired), sending to wrong network loses funds, and error handling details like -2015. This goes well beyond the annotation safety profile, covering risk and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer but well-structured with clear sections: purpose, API call, warning, when-to-use/not-use, returns, examples, and error handling. It is front-loaded with the core purpose and each section earns its place, especially given the risk of fund loss. Slightly verbose but justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's risk and multiple parameters, the description covers purpose, usage, warnings, return formats, examples, and error handling. It mentions key output fields and the response_format option. With an output schema present, it needn't detail every field. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (each parameter has a description in the input schema), so baseline is 3. The description adds examples and clarifies the network omission behavior, but does not describe each parameter beyond what the schema already provides. It adds value through examples and risk warning, but not new parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get the deposit address for one coin on one network.' It explicitly names the API endpoint and differentiates from siblings by naming binance_get_deposit_addresses and binance_get_coin_config. This gives an agent unambiguous purpose and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes explicit 'When to Use' and 'When NOT to Use' sections, stating to use it before sending crypto into Binance and to avoid it for viewing all addresses or checking deposit enablement, with alternatives named. This leaves no inference for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_deposit_addressesARead-onlyIdempotent
List every deposit address issued for one coin, across networks.
Calls GET /sapi/v1/capital/deposit/address/list (SIGNED, IP weight 10) and marks
which address is the default for its network.
When to Use:
To recognise an address you have used before, or to audit which addresses belong to this account.
When NOT to Use:
To get an address to deposit to right now —
binance_get_deposit_addressreturns the canonical one for a coin/network pair.
Returns:
A markdown table of network, address, tag and isDefault, capped at 50 rows, or
raw JSON with response_format="json".
Examples: params = {"coin": "USDT"} params = {"coin": "USDT", "network": "BSC"}
Error Handling: -2015 means the key lacks Reading permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, but the description adds valuable context: it names the exact API endpoint, mentions SIGNED and IP weight, notes the row cap of 50, and explains the -2015 error meaning. This goes beyond annotations and enriches agent decision-making.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly organized with headings for use cases, returns, examples, and errors. It is front-loaded with the core purpose and contains no fluff. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple networks, output formats, error codes), the description covers purpose, usage, alternatives, return format, examples, and error handling. The existence of an output schema further reduces the need for return-value detail. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported as 0%, so the description must compensate. It provides examples with coin and network, and mentions response_format in the Returns section, but does not explicitly define each parameter's purpose. Still, the examples and context imply usage well enough for an agent to construct correct calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List every deposit address') with clear resource and scope ('for one coin, across networks'). It also explicitly differentiates from the sibling tool binance_get_deposit_address by noting the canonical-address alternative. This makes the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Includes explicit 'When to Use' and 'When NOT to Use' sections. The 'When NOT to Use' names the alternative tool and the exact condition (getting an address to deposit right now), leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_deposit_historyARead-onlyIdempotent
List crypto deposits into the account for one window (up to 90 days).
Calls GET /sapi/v1/capital/deposit/hisrec (SIGNED, IP weight 1). One call answers
a single window; Binance caps that window at "less than 90 days" and defaults to
the last 90 days when no times are given. The cap is enforced here, before the
request, so an over-wide window fails with a readable message instead of -1127.
When to Use:
"Did my USDT deposit land?" — a recent, bounded lookup.
Reconciling one month's deposits, or chasing one
tx_id.
When NOT to Use:
For the full history since the account opened — use
binance_get_all_deposits, which walks these windows for you and returns a resume cursor.For withdrawals — use
binance_get_withdraw_history.For fiat (card/bank) deposits — those are not here; use
binance_get_fiat_orders(fiat.py).
Returns:
A markdown table (insertTime, completeTime, coin, amount, network, status,
walletType, txId) plus per-coin totals, capped at 50 displayed rows; or the raw
Binance array with response_format="json".
Pagination:
limit is 1-1000 (Binance default 1000) and offset pages within the window. A
full page means there is more: re-call with offset += limit.
Windows:
start_time/end_time together must span under 90 days. start_time alone must be
under 90 days ago (Binance defaults endTime to now). end_time alone gets a
startTime of end_time - 89 days so the window actually brackets it.
Examples: params = {"coin": "USDT", "status": "success"} params = {"start_time": "2026-08-01", "end_time": "2026-09-01"} params = {"tx_id": "0xabc...", "response_format": "json"}
Error Handling:
An over-wide window is rejected locally. -2015 means the key lacks Reading
permission or this IP is not allowlisted. /sapi does not exist on the spot
testnet — a 404 there is expected.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description adds substantial behavioral context: it is SIGNED with IP weight 1, the 90-day window cap is enforced locally with a readable error, over-wide windows are rejected before the request, and -2015 is explained. It also documents pagination, response formats, and the expected 404 on spot testnet.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly organized with clear headings: endpoint, when to use, returns, pagination, windows, examples, and error handling. Every section adds operational knowledge an agent needs, and the most important constraint (one 90-day window) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only API wrapper with rich annotations, an output schema, and a detailed input schema, the description covers everything needed to invoke it correctly: endpoint, window constraints, pagination, error codes, return shape, and example parameter sets. There are no major gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the context signal reports low schema coverage, the description thoroughly explains the meaning and behavior of the window parameters, including start_time/end_time edge cases, offset paging, limit bounds, and response_format. The nested schema also has per-field descriptions, but the tool description goes beyond it with concrete examples and window-bracketing semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List crypto deposits into the account for one window (up to 90 days).' It names the exact endpoint and differentiates itself from binance_get_all_deposits, binance_get_withdraw_history, and binance_get_fiat_orders, so an agent can distinguish it from sibling tools without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains explicit 'When to Use' and 'When NOT to Use' sections that name alternatives and the conditions that select them, such as full-history reconciliation via binance_get_all_deposits and fiat deposits via binance_get_fiat_orders. This leaves no ambiguity about when the tool should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_dust_convertibleARead-onlyIdempotent
Preview which small balances can be converted to BNB, and what they are worth.
Calls POST /sapi/v1/asset/dust-btc (SIGNED, IP weight 1). Binance uses POST for
this query; it is on the client's read allowlist, so the preview works even with the
trading kill-switch off. Nothing is converted by this call.
When to Use:
Always, immediately before
binance_convert_dust_to_bnb— it names the exact assets that are eligible and the BNB each one yields.
When NOT to Use:
To see conversions that already happened — use
binance_get_dust_log.
Returns:
A markdown table of asset / free amount / value in BTC / BNB you would receive
(on-exchange and off-exchange rates when Binance sends both), plus the batch totals
and the service-charge percentage, or the raw envelope with response_format="json".
Examples: params = {} params = {"account_type": "MARGIN"}
Error Handling:
An empty details list means nothing currently qualifies as dust. -2015 means the
key lacks Reading permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, but the description adds valuable context beyond that: it explains that Binance uses POST for a query, that the endpoint is on the read allowlist and works even with the trading kill-switch off, emphasizes that nothing is converted, and documents error semantics (empty details, -2015). This is far more than the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with clear sections (When to Use, When NOT to Use, Returns, Examples, Error Handling) and the core purpose is front-loaded in the first sentence. It is longer than many, but every section adds operational value—especially the kill-switch note and error handling—so the length is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (SIGNED endpoint, POST-as-query, dust eligibility nuances, two parameters with defaults, error codes), the description is complete. It covers purpose, usage, parameters through examples, return format, and error handling, and an output schema is present so the return-value details in the description are a bonus rather than a requirement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the two parameters (account_type and response_format) with defaults, and the description reinforces this with concrete examples (params = {}, params = {"account_type": "MARGIN"}) and mentions response_format="json" in the Returns section. Though the contextual signal says schema description coverage is 0%, the description compensates with examples and usage nuance, so it exceeds the minimum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Preview which small balances can be converted to BNB, and what they are worth.' It explicitly contrasts with sibling tools by stating 'Nothing is converted by this call' and points to binance_get_dust_log for already-completed conversions, making the distinction clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to Use' section says to call this tool immediately before binance_convert_dust_to_bnb, and the 'When NOT to Use' section names binance_get_dust_log for prior conversions. This is explicit, actionable guidance that leaves no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_dust_logARead-onlyIdempotent
List past dust-to-BNB conversions, with the per-asset detail of each one.
Calls GET /sapi/v1/asset/dribblet (SIGNED, IP weight 1). Binance returns "only the
last 100 records" and "only records after 2020/12/01".
When to Use:
To find out what a past "convert small balances to BNB" actually converted, and what the service charge was.
To check whether an asset disappeared because it was swept as dust.
When NOT to Use:
To see what could be converted right now — use
binance_get_dust_convertible.To actually convert — that is
binance_convert_dust_to_bnb.
Returns:
One markdown section per conversion batch (time, transId, total transferred BNB,
total service charge) followed by a table of the assets in that batch, or the raw
envelope with response_format="json".
Windows:
start_time/end_time are optional; Binance caps the history at the last 100
records regardless of the window, and keeps nothing before 2020-12-01.
Examples: params = {} params = {"start_time": "2026-01-01", "end_time": "2026-06-30"}
Error Handling: -2015 means the key lacks Reading permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds substantial behavioral context beyond them: the call is SIGNED with IP weight 1, Binance caps results at the last 100 records regardless of window, no records before 2020/12/01, and error -2015 indicates a permission or allowlist problem. This gives the agent actionable expectations about side effects and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but every section earns its place: purpose, endpoint, usage routing, return format, window caveats, examples, and error handling. It is front-loaded with the core action and uses clear headings so an agent can quickly extract the needed facts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with annotations covering safety and idempotence, the description fully covers what the agent needs: when to use it, what it returns, how parameters behave, Binance's constraints, and the meaning of the main error code. Nothing essential is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes start_time, end_time, account_type, and response_format, and the description further clarifies that start_time/end_time are optional, that the 100-record cap overrides any window, and that response_format='json' returns the raw envelope. The examples ('params = {}' and a dated range) show realistic invocation shapes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific verb and resource: 'List past dust-to-BNB conversions, with the per-asset detail of each one.' It also names the exact Binance endpoint, so the tool's scope is unambiguous. The 'When NOT to Use' section explicitly distinguishes it from binance_get_dust_convertible and binance_convert_dust_to_bnb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'When to Use' and 'When NOT to Use' sections that name sibling tools and the conditions that route to them. It also discloses Binance's hard limits (last 100 records, nothing before 2020-12-01), which materially affect when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_earn_accountARead-onlyIdempotent
Summarize total Simple Earn holdings (Flexible + Locked) in BTC and USDT.
Calls GET /sapi/v1/simple-earn/account (SIGNED, USER_DATA). IP weight 150 per
call (S1 spec, 2024-10 — same unverified caveat as the position tools above).
When to Use:
For a one-call snapshot of total Earn value without listing every position.
When NOT to Use:
To see individual products or positions — use
binance_get_earn_flexible_positions/binance_get_earn_locked_positions.
Returns:
A markdown block (or JSON with response_format="json") with total, flexible-only,
and locked-only amounts, each in BTC and USDT.
Examples: params = {} params = {"response_format": "json"}
Error Handling: -2015 means the key lacks Simple Earn / USER_DATA permission or this machine's IP is not on the key's allowlist. All-zero amounts mean no funds are in Simple Earn.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false. The description adds value by disclosing the SIGNED/USER_DATA requirement, the 150 IP weight, the return format options, and specific error semantics (-2015 and all-zero amounts). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-organized with clear sections (Summary, API call, When to Use, When NOT to Use, Returns, Examples, Error Handling). Every sentence serves a purpose, and the critical summary is front-loaded. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the tool's purpose, usage context, return format, examples, and error handling. Given the output schema exists and the tool is a read-only snapshot, the description provides all necessary information for an agent to call it correctly without referencing additional docs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates somewhat with examples (params = {}, params = {"response_format": "json"}) and a mention of response_format in the Returns section. However, the schema already documents response_format with a clear description, so the description adds only marginal clarification beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Summarize total Simple Earn holdings (Flexible + Locked) in BTC and USDT.' It also names the underlying endpoint and explicitly distinguishes itself from sibling position tools, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Includes dedicated 'When to Use' and 'When NOT to Use' sections. It tells the agent exactly when a one-call snapshot is appropriate and points to the two sibling tools for individual positions, leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_earn_flexible_positionsARead-onlyIdempotent
List the caller's Simple Earn Flexible subscriptions and their live APR.
Calls GET /sapi/v1/simple-earn/flexible/position (SIGNED, USER_DATA). IP weight
150 per call (S1 spec, 2024-10 — Binance's docs site renders the Simple Earn pages
empty, so this weight was not re-verified; treat it as approximate).
When to Use:
To see which Flexible products you are subscribed to, how much is deposited, and the current (and tiered, when Binance returns tiers) annual percentage rate.
Before deciding whether to redeem or top up a Flexible position.
When NOT to Use:
For time-locked Simple Earn products — use
binance_get_earn_locked_positions.For a single aggregate balance across all Earn products — use
binance_get_earn_account.
Returns:
A markdown list (or JSON with response_format="json") of positions: asset,
product id, deposited amount, latest APR, tiered APR breakdown (when present),
yesterday's airdrop rate, redeemability, auto-subscribe flag, and cumulative
rewards (yesterday, real-time, bonus, total).
Pagination:
limit (Binance size, max 100, default 20) and offset (house-style; see the
module docstring for the offset -> current page-number mapping). total from
Binance drives has_more. Display is additionally capped at MAX_DISPLAY_ROWS
(50) even when limit asked for more — a truncation note is appended when rows
were dropped.
Examples: params = {"asset": "USDT", "limit": 20} params = {"product_id": "BTC001"}
Error Handling:
-2015 means the key lacks Simple Earn / USER_DATA permission, or this machine's
IP is not on the key's allowlist. An empty rows list means no Flexible
subscriptions exist (or the asset/product_id filter matched nothing).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the read-only, idempotent, non-destructive annotations by disclosing the SIGNED USER_DATA endpoint, approximate IP weight, pagination behavior, the `MAX_DISPLAY_ROWS` truncation with a note, and specific error semantics like -2015 and empty `rows` meaning no matching subscriptions. This is substantial behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized with clear headings, front-loaded purpose, and each section earning its place: use cases, non-use cases, returns, pagination, examples, and error handling. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity—auth requirements, pagination quirks, output format options, error codes, and sibling differentiation—the description covers everything an agent needs to call it correctly. The output schema and annotations handle the remaining structured details, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the top-level `params` wrapper lacks a description, the nested schema already documents each field, and the description adds crucial semantics: the `offset` to `current` page-number conversion, `limit` as Binance `size`, the `response_format` values, and concrete examples for `asset` and `product_id`. This fully compensates for any schema-level coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the caller's Simple Earn Flexible subscriptions and their live APR.' It clearly distinguishes itself from sibling tools by naming what it is not, such as locked positions and aggregate account balances.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to Use' and 'When NOT to Use' sections give direct routing guidance, naming `binance_get_earn_locked_positions` for locked products and `binance_get_earn_account` for aggregate balances. This leaves no ambiguity about when this tool should be selected over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_earn_locked_positionsARead-onlyIdempotent
List the caller's Simple Earn Locked subscriptions and their APY/redeem dates.
Calls GET /sapi/v1/simple-earn/locked/position (SIGNED, USER_DATA). IP weight
150 per call (S1 spec, 2024-10 — same unverified caveat as
binance_get_earn_flexible_positions; treat it as approximate).
When to Use:
To see time-locked Earn positions: duration, accrued days, APY, and redeem date.
Before deciding whether to let a position auto-renew or opt out.
When NOT to Use:
For on-demand redeemable positions — use
binance_get_earn_flexible_positions.For a single aggregate balance — use
binance_get_earn_account.
Returns: A markdown list (or JSON) of positions: asset, position id, project id, amount, APY, duration/accrued days, reward asset, purchase and redeem dates, and the renewable/auto-renew flags.
Pagination:
Same limit/offset -> Binance size/current mapping as
binance_get_earn_flexible_positions (see the module docstring).
Examples: params = {"asset": "AXS"} params = {"position_id": "123123"}
Error Handling:
-2015 as above (permission or IP allowlist). An empty rows list means no
Locked subscriptions match the filters.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond annotations: discloses signed endpoint, IP weight with caveat, pagination mapping, specific error code (-2015), empty-rows semantics, and response format. All consistent with readOnlyHint/idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear section headers and no filler. Slightly long but every paragraph serves a purpose (use cases, returns, pagination, examples, errors).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all necessary invocation details: filters, pagination, errors, response representation, and logical use case. With an output schema present, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already documents each parameter thoroughly, so baseline is 3. The description adds usage examples (asset, position_id) and a cross-reference for pagination mapping, offering extra guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: 'List the caller's Simple Earn Locked subscriptions and their APY/redeem dates.' Clearly differentiates from siblings by explicitly naming what it is not for (flexible positions, account aggregate).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'When to Use' and 'When NOT to Use' sections, naming sibling tools and the exact conditions to choose them. This is textbook usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_exchange_infoARead-onlyIdempotent
Look up trading rules, symbol status, and order filters for spot symbols.
Calls GET /api/v3/exchangeInfo (weight 20). Without symbol/symbols/permissions/
symbol_status this returns Binance's full symbol universe (3707+ symbols); the
response is always capped at 50 symbols here — pass symbol/symbols to narrow it.
When to Use:
Before placing an order, to read the LOT_SIZE/PRICE_FILTER/NOTIONAL/MARKET_LOT_SIZE filter values a quantity/price must respect (see
binance_place_order).To check whether a symbol is currently TRADING, HALTed, or in BREAK.
To discover which symbols share a base/quote asset (with
permissions/symbol_status).
When NOT to Use:
For live prices — use
binance_get_ticker_priceorbinance_get_avg_price.For account-specific trading permissions — use
binance_get_spot_account.
Returns:
Markdown: one block per symbol (status, base/quote, order types, filter values), capped
at 50 symbols with a note if more matched. JSON: the same data, count vs shown.
Examples: params = {"symbol": "BTCUSDT"} params = {"symbols": ["BTCUSDT", "ETHUSDT"]} params = {"permissions": ["SPOT"], "symbol_status": "TRADING"}
Error Handling:
An unknown symbol raises Binance -1121 Invalid symbol; combining symbol/symbols
with permissions/symbol_status is rejected locally before the call is made.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, but the description adds substantial behavioral context: the API weight (20), the 50-symbol cap, local rejection of conflicting parameters, and the exact error raised for unknown symbols. It also explains return format differences between markdown and JSON.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear section headers, front-loaded core purpose, and every sentence serves a purpose. It covers use cases, exclusions, return format, examples, and error handling without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers all necessary information: what it does, when to use it, what to expect, how to call it, and failure modes. Since an output schema exists, the description appropriately focuses on behavior and context rather than repeating return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema itself describes each parameter (mutual exclusions, defaults), and the description adds value with usage examples, the cap behavior, and the clarification that combining symbol/symbols with permissions/symbol_status is rejected locally. It doesn't enumerate every parameter but the examples and notes compensate for the top-level params wrapper having no description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('Look up trading rules, symbol status, and order filters') and explicitly distinguishes itself from sibling price tools and account tools. It names alternatives ('use binance_get_ticker_price or binance_get_avg_price') for live prices, so an agent can immediately tell this tool apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It has dedicated 'When to Use' and 'When NOT to Use' sections, listing concrete scenarios and pointing to exact sibling tools. The guidance is explicit and actionable, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_fiat_historyARead-onlyIdempotent
Walk fiat deposit/withdraw or buy/sell history across pages and time windows.
Tries ONE call spanning beginTime=since .. endTime=now (or resume_before when
resuming) and pages page until a short page signals the end. If that wide-span
attempt fails with a plausibly span-related HTTP error (commonly -1127, an
undocumented span cap on these two endpoints), falls back to walking 30-day windows
newest-first instead.
Honors a max_calls budget so one invocation can never blow past the weight-limited
call rate — deposits/withdrawals cost UID 45000/call (default budget 4, i.e. the
whole 180000/min UID budget for a minute), buys/sells cost IP 1/call (default budget
20). Every request checks the budget first, and a request that itself errors still
counts against it, since it still spent real quota.
The walk NEVER discards rows it already has: whenever it stops early — budget
exhaustion or ANY request failure, span-related or not — it renders the normal
report (rows collected so far, totals, call count) plus a resume_before cursor,
and for a failure it also shows the underlying error (via handle_api_error) as a
prominent line. Binance treats endTime as inclusive, so a re-fetched boundary row
is expected; rows are deduped by orderNo before being returned. The cursor comes
in two flavours, worded differently so one is never mistaken for the other: a
redo cursor (the wide span, or the window in progress, was not fully covered —
page order inside it is undocumented, so the whole thing must be retried) says it
"re-covers the same range, it does not advance"; an advance cursor (every window
up to it is fully covered; only the budget stopped a NEW window from starting) says
rows "were not fetched" before it and to "continue" from there.
Status values Binance returns for fiat orders/payments: Processing, Failed, Successful, Finished, Refunding, Refunded, Refund Failed, Order Partial credit Stopped.
When to Use:
A bulk backfill of fiat activity (deposits, withdrawals, or crypto buys/sells with fiat) since account creation, paged and budgeted automatically.
Continuing a previous walk that stopped early: pass its
resume_beforeback in.
When NOT to Use:
A single narrow lookup — use
binance_get_fiat_orders/binance_get_fiat_paymentsdirectly with your own begin_time/end_time; it is one call instead of many.Binance Card spend — not retrievable via any API (see the module docstring); a "Credit Card"
paymentMethodinbuys/sellsis a bank card, not the Binance Card.
Returns:
Deduped rows sorted newest-first (display capped at 50, JSON keeps the full walked
set), a per-fiat-currency total (and, for buys/sells, a per-crypto-currency received
total), how many API calls were spent, whether the window fallback triggered, and —
when the walk stopped early — a resume_before cursor plus (for a failure) the
error that caused the stop.
Examples: params = {"kind": "deposits"} params = {"kind": "buys", "since": "2023-01-01"} params = {"kind": "withdrawals", "resume_before": 1700000000000}
Error Handling:
A span-related HTTP error on the wide-span attempt triggers the 30-day-window
fallback automatically. Any failure after that point — inside a window, or an
auth/rate-limit/envelope/other error that was never span-related — stops the walk
instead of raising: the response still shows the rows already collected, the
API-call count, a resume_before cursor, and the failure itself via
handle_api_error. A malformed since/resume_before returns
Error: <field> must be epoch milliseconds or an ISO-8601 string before any call
is made.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations declaring readOnlyHint, idempotentHint, and destructiveHint, the description goes far beyond by disclosing the paging strategy, 30-day window fallback, max_calls budget mechanics (with per-call cost), deduplication by orderNo, the distinction between redo and advance cursors, and early-stop behavior that returns partial results plus a resume_before cursor. This is rich behavioral disclosure that fully informs the agent about side effects and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive but lengthy; however, it is well-structured with clear sections (general behavior, When to Use, When NOT to Use, Returns, Examples, Error Handling) and front-loaded with the core behavior. Every sentence conveys meaningful information for a complex tool, so the length is justified, though a tighter edit could trim redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with such complexity—paging, fallback logic, budget constraints, cursor semantics, deduplication, and error handling—the description covers all operational aspects: input parameters, expected returns (including totals, call count, cursor, and error details), example invocations, and detailed error handling behavior. Nothing an agent needs to correctly invoke and interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides thorough descriptions for all parameters (kind, rows, since, max_calls, resume_before, response_format), so the baseline is high. The description adds valuable context beyond the schema: the cost per call for each kind (UID vs IP), default budget values, and the semantic meaning of the resume_before cursor (redo vs advance). It does not repeat schema details, only enriches them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource: 'Walk fiat deposit/withdraw or buy/sell history across pages and time windows.' It explicitly distinguishes itself from sibling tools in the 'When NOT to Use' section by naming `binance_get_fiat_orders` and `binance_get_fiat_payments` for single narrow lookups. The purpose is unmistakable and well differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
A dedicated 'When to Use' section covers bulk backfills and resuming previous walks, while 'When NOT to Use' explicitly excludes single narrow lookups and Binance Card spend, naming alternatives. This is exemplary usage guidance with clear conditions and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_fiat_ordersARead-onlyIdempotent
List fiat-rail deposit or withdraw orders (bank transfer/card top-up of the fiat wallet).
Calls GET /sapi/v1/fiat/orders, signed. This is the UID-weighted 45000 fiat-rail
ledger — of the 180000/min UID budget that is at most 4 calls per minute. Do not
poll this tool in a loop; for a bulk backfill use binance_get_fiat_history, which
already budgets calls.
When to Use:
Seeing fiat bank-rail deposits into, or withdrawals out of, the fiat wallet (bank transfer, SEPA, card-funded top-ups of the fiat balance — not Spot).
Reconciling a specific order by scanning a narrow begin_time/end_time window.
When NOT to Use:
Buying/selling crypto with fiat (a card or bank purchase of BTC/ETH/...) — use
binance_get_fiat_payments.A long backfill across many pages or months — use
binance_get_fiat_history.Binance Card spend — there is no API for that (see the module docstring).
Returns:
A markdown list (or JSON with response_format="json") of orders: order number,
fiat currency, indicated vs settled amount, fee, method, status, created/updated
time. Status values Binance returns: Processing, Failed, Successful, Finished,
Refunding, Refunded, Refund Failed, Order Partial credit Stopped.
Pagination:
page (1-indexed) / rows (max 500) map directly to the API; the response also
reports Binance's own total row count across all pages. Markdown display is
capped at 50 rows (with a note naming the next page to request); JSON keeps
the full page.
Examples: params = {"transaction_type": "deposit", "rows": 50} params = {"transaction_type": "withdraw", "begin_time": "2026-01-01", "end_time": "2026-02-01"}
Error Handling:
A 200 body with success: false is raised by the client as BinanceEnvelopeError
and surfaced here as Error: ...; an undocumented span cap on this endpoint
typically surfaces as -1127 — narrow begin_time/end_time and retry. A malformed
begin_time/end_time returns Error: <field> must be epoch milliseconds or an ISO-8601 string without calling the API.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, destructiveHint false), the description discloses rate limits (4 calls/min), signed API requirement, pagination behavior, error handling (BinanceEnvelopeError, -1127), and return format details, offering rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections, front-loads the core purpose and critical rate limit, and every sentence provides actionable information without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers all essential aspects for correct invocation: API endpoint, rate limits, use cases, alternatives, pagination, return format, status values, and error handling, making it self-sufficient for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema description coverage is 0%, the description explains parameter usage through examples and inline notes: begin/end time formats, transaction_type mapping, pagination semantics, and the default 30-day window, adding value beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists fiat-rail deposit or withdraw orders, and explicitly differentiates from sibling tools like binance_get_fiat_payments and binance_get_fiat_history, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It has dedicated 'When to Use' and 'When NOT to Use' sections that name specific alternatives and conditions, such as using binance_get_fiat_history for bulk backfills and binance_get_fiat_payments for crypto purchases, providing explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_fiat_paymentsARead-onlyIdempotent
List crypto buy/sell payments made with fiat (bank transfer or bank-issued card).
Calls GET /sapi/v1/fiat/payments, signed, IP weight 1 (cheap — unlike
fiat/orders). A "Credit Card" paymentMethod here is a bank-issued card buying
crypto, and is NOT the Binance Card — Binance Card spend has no API surface at
all (.memory/research/03-card-and-gaps.md §1); the closest proxies are
binance_get_funding_wallet and binance_get_pay_transactions (walletType 4/6).
When to Use:
Seeing crypto bought or sold with fiat: source/obtained amounts, price, fee, payment method (buy only), status.
Reconciling a specific purchase by scanning a narrow begin_time/end_time window.
When NOT to Use:
Bank deposits/withdrawals of fiat itself — use
binance_get_fiat_orders.A long backfill across many pages or months — use
binance_get_fiat_history.
Returns:
A markdown list (or JSON with response_format="json") of payments: order number,
fiat amount/currency, obtained crypto amount/currency, price, fee, payment method
(buy only), status, created/updated time. Status values Binance returns: Processing,
Failed, Successful, Finished, Refunding, Refunded, Refund Failed, Order Partial
credit Stopped.
Pagination:
page (1-indexed) / rows (max 500) map directly to the API; the response also
reports Binance's own total row count across all pages. Markdown display is
capped at 50 rows (with a note naming the next page to request); JSON keeps
the full page.
Examples: params = {"transaction_type": "buy", "rows": 50} params = {"transaction_type": "sell", "begin_time": "2026-01-01", "end_time": "2026-02-01"}
Error Handling:
A 200 body with success: false is raised by the client as BinanceEnvelopeError
and surfaced here as Error: .... A malformed begin_time/end_time returns
Error: <field> must be epoch milliseconds or an ISO-8601 string without calling
the API.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the signed endpoint, IP weight, the Credit Card vs Binance Card distinction, the Binance status values, row-capping behavior, and error handling including BinanceEnvelopeError and malformed time errors. This significantly enriches what the annotations alone provide. There is no contradiction with the readOnly/idempotent hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but highly organized into clear sections: purpose, usage, returns, pagination, examples, and errors. Every section earns its place, and the most important scoping facts are front-loaded. It remains readable despite its detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list endpoint, the description covers the API route, safety signals, when to use it versus alternatives, return shape, pagination semantics, examples, and error behaviors. An agent has everything needed to select, invoke, and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes parameters thoroughly, including time formats, page/rows bounds, and transaction_type mapping. The description adds practical meaning with examples, the API default of 30 days when begin/end are omitted, the direct page/rows passthrough, and the markdown-vs-JSON row cap. This goes beyond schema coverage without being redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List crypto buy/sell payments made with fiat'. It also differentiates from closely related tools by explicitly saying Credit Card means bank-issued card, not the Binance Card, and distinguishes this endpoint from fiat/orders. An agent can clearly understand what the tool does and how it differs from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description has explicit 'When to Use' and 'When NOT to Use' sections, naming alternatives such as binance_get_fiat_orders for bank deposits/withdrawals and binance_get_fiat_history for long backfills. It also clarifies narrow time-window reconciliation use. This is strong, actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_funding_walletARead-onlyIdempotent
Read the Funding wallet — the wallet behind Binance Pay, Card and Gift Card.
Calls POST /sapi/v1/asset/get-funding-asset (SIGNED, IP weight 1). Binance uses
POST for this query; it is on the client's read allowlist, so it works with the
trading kill-switch off. Per Binance's own documentation this endpoint "supports
querying: Binance Pay, Binance Card, Binance Gift Card, Stock Token" — i.e. it
is the Funding wallet, and the closest thing to a card balance the API exposes.
When to Use:
To see what is sitting in Funding (Pay / Card / Gift Card / P2P proceeds).
Before a FUNDING_MAIN transfer, to check there is something to move.
When NOT to Use:
For Spot balances — use
binance_get_user_assetshere, orbinance_get_spot_account(spot_account.py) for the full account view.For a wallet-by-wallet total across Spot/Funding/Earn/Futures — use
binance_get_wallet_balances.To list Binance Card spending: that has no API endpoint at all. Card-funded Binance Pay payments show up in
binance_get_pay_transactions(pay.py) with walletType 4/6; nothing else is retrievable.
Returns:
A markdown table of asset / free / locked / freeze / withdrawing (plus a BTC
valuation column and total when need_btc_valuation is set), capped at 50 rows, or
the raw Binance array with response_format="json".
Examples: params = {} params = {"asset": "USDT"} params = {"need_btc_valuation": True, "response_format": "json"}
Error Handling:
An empty list means the Funding wallet holds nothing (common — a Spot-only account
never funds it). -2015 means the key lacks Reading permission or this IP is not
allowlisted. A 404 means the base URL has no /sapi (the spot testnet).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds substantial behavior beyond that: the unusual fact that Binance uses POST for this read, IP weight, allowlist requirements, trading kill-switch compatibility, return format details (markdown table, 50-row cap, JSON option), and specific error code meanings. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense and well-organized into clear sections: purpose, underlying endpoint, when to use, when not to use, return format, examples, and error handling. Every section earns its place, and the most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a somewhat confusing POST-based read endpoint, the description covers all necessary context: what wallet it reads, how it relates to Binance Pay/Card/Gift Card, when to use alternatives, return formats, parameters through examples, and error handling. An agent has everything needed to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported as 0%, so the description must compensate. It does so with usage examples covering empty params, asset filtering, need_btc_valuation, and response_format json, plus return-behavior notes. It could be slightly more explicit about defaults and the optional nature of each parameter, but the examples make invocation unambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Read the Funding wallet'), names the exact Binance endpoint, and clearly distinguishes it from sibling tools. The 'When NOT to Use' section explicitly routes to binance_get_user_assets, binance_get_spot_account, and binance_get_wallet_balances, so an agent can immediately tell which tool is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'When to Use' and 'When NOT to Use' sections, with concrete alternative tool names and conditions. It also explains a case where no API exists at all (Binance Card spending), preventing the agent from searching for a nonexistent capability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_klinesARead-onlyIdempotent
Fetch OHLCV candlestick data for a symbol.
Calls GET /api/v3/klines (weight 2).
When to Use:
For price history / technical analysis over a chosen interval and window.
When NOT to Use:
For presentation-smoothed candles matching Binance's own chart UI — use
binance_get_ui_klinesinstead.For the single latest price — use
binance_get_ticker_price.
Returns:
Markdown: a table of up to 100 candles (open time, OHLC, volume, close time). JSON:
the raw array-of-arrays Binance returns (up to limit), uncapped.
Pagination:
Walk forward with start_time set to the previous page's last close time + 1ms;
start_time/end_time are always interpreted in UTC even when time_zone is set.
Examples: params = {"symbol": "BTCUSDT", "interval": "1h", "limit": 200}
Error Handling:
An unknown symbol raises Binance -1121 Invalid symbol; an invalid interval is
rejected locally by the KlineInterval enum.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the safety profile is known. The description adds valuable context: API weight (2), pagination mechanics (walking forward with close time +1ms), UTC interpretation of time_zone, and error handling for invalid symbols/intervals. These go beyond annotations and materially aid correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear headers (When to Use, When NOT to Use, Returns, Pagination, Examples, Error Handling) and front-loads the core purpose. It is slightly verbose but every section adds actionable information; nothing is wasted. A tight 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description need not explain return values in depth, yet it does describe Markdown vs JSON formats. Combined with detailed pagination, error handling, and usage exclusions, the agent has everything needed to call correctly. No critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported at 0%, so the description must compensate. It explains start_time/end_time semantics (UTC even with time_zone) and pagination using close time, and provides a concrete example with limit. It does not explicitly describe limit bounds or response_format, but the example and return section partially cover them. This is strong compensation but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch OHLCV candlestick data for a symbol.' It clearly distinguishes from sibling tools by naming alternatives like binance_get_ui_klines and binance_get_ticker_price, so an agent can select correctly without inspecting other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to Use' and 'When NOT to Use' sections name the exact alternative tools and the conditions that route to them. This is textbook-level guidance that leaves no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_my_tradesARead-onlyIdempotent
Fetch YOUR executed trades (fills) for one symbol.
Calls GET /api/v3/myTrades (signed; IP weight 20, or 5 when order_id is
given). symbol is mandatory — Binance has no endpoint that returns trades across
every symbol, which is what binance_get_all_my_trades exists to work around.
Unlike the public trade endpoints, isBuyer here is your own side of the fill
(public trades expose isBuyerMaker, the aggressor's side, instead).
When to Use:
To see the fills of one pair, or of one order (
order_id).To check the exact price, fee and fee asset of a known trade.
When NOT to Use:
For the whole account's history — use
binance_get_all_my_trades.For orders that never filled — use
binance_get_all_orders(spot_orders).For anonymous market trades — use
binance_get_recent_trades(market_data).
Returns: Markdown: a table of up to 100 fills (time, side, price, qty, quote qty, commission, maker/taker) plus totals for the page — bought/sold base and quote, and fees broken down by fee asset. JSON: the full page plus the same totals.
Pagination / Windows:
Binance accepts only these combinations: symbol; symbol+order_id;
symbol+from_id; symbol+start_time; symbol+end_time;
symbol+start_time+end_time; symbol+order_id+from_id. start_time and
end_time are each legal on their own — only together do they have to span at
most 24 hours, and a wider window is rejected here with no call spent. To page,
re-call with from_id = the last id + 1.
Examples: params = {"symbol": "BTCUSDT", "limit": 100} params = {"symbol": "BTCUSDT", "order_id": 987654321} params = {"symbol": "ETHUSDT", "start_time": "2024-01-01T00:00:00Z", "end_time": "2024-01-01T23:59:59Z"} params = {"symbol": "ETHUSDT", "from_id": 4211999}
Error Handling:
An over-wide window or an illegal combination is refused locally with an Error: …
string and no API call. -2015 means the key lacks Reading or the IP is not
allowlisted; -1121 means the symbol does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description adds significant behavioral context: the signed endpoint and IP weight, the isBuyer side semantics, local rejection of invalid windows, pagination via from_id, and error code meanings. This far exceeds what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: use cases, exclusions, return format, pagination rules, examples, and error handling. Clear headings and front-loaded purpose make it scannable and practical for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the endpoint, the description is complete: it covers mandatory parameters, valid combinations, limits, output formats, pagination strategy, and error handling. An agent has everything needed to invoke this tool correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the measured schema coverage is 0%, the description thoroughly compensates by explaining every relevant parameter, legal combinations, the 24-hour window restriction, and providing four concrete usage examples. It adds meaning far beyond the raw schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch YOUR executed trades (fills) for one symbol.' It clearly distinguishes the tool from public trade endpoints and from the sibling binance_get_all_my_trades, making the tool's scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There are explicit 'When to Use' and 'When NOT to Use' sections that name alternatives like binance_get_all_my_trades, binance_get_all_orders, and binance_get_recent_trades. This gives the agent exact routing conditions and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_open_algo_ordersARead-onlyIdempotent
List the spot TWAP algo orders that are still working, across every symbol.
Calls GET /sapi/v1/algo/spot/openOrders (SIGNED, IP weight 1). It takes no filters:
one call returns everything currently running, which is also how you check the
20 open algo orders ceiling before placing another.
When to Use:
Right after
binance_place_twap_order, to confirm the order is actually working — the placement response only says "accepted".Before placing a new TWAP, to see how many of the 20 slots are free.
After a 5xx/timeout on a placement, to find out whether the order exists.
When NOT to Use:
For orders that have finished — use
binance_get_algo_order_history.For the fills of one order — use
binance_get_algo_sub_orders.For ordinary spot orders — use
binance_get_open_orders(spot_orders.py); algo and ordinary orders live in separate endpoints and neither lists the other.
Returns:
A markdown table (bookTime, algoId, symbol, side, algoStatus, algoType, totalQty,
executedQty, executedAmt, avgPrice, urgency, endTime) capped at 50 rows, or the raw
{total, orders[]} payload with response_format="json" (which also carries
clientAlgoId).
Examples: params = {} params = {"response_format": "json"}
Error Handling:
An empty list is a valid answer: nothing is working. -2015 means the key lacks Reading
permission or this IP is not allowlisted. /sapi does not exist on the spot testnet —
a 404 there is expected, not a bug.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds substantial behavioral context beyond that: it takes no filters, returns an empty list as a valid result, explains the 20 open algo orders ceiling, and details error handling (-2015 permission/allowlist, testnet 404). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: purpose, when/not, returns, examples, error handling. It is front-loaded with the core purpose and scoping, and every section earns its place. Despite length, it is efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple one-parameter schema and strong annotations, the description is thorough: it covers usage scenarios, exclusions, return formats, error codes, and the 20-slot ceiling. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents the single parameter response_format with enum, default, and a description stating 'markdown' vs 'json (raw Binance payload)'. The tool description adds detail about the markdown table columns and the extra clientAlgoId field in JSON, but this is marginal beyond the schema's own description. With schema coverage high, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), resource ('spot TWAP algo orders'), and scope ('still working, across every symbol'). It immediately distinguishes this from other order tools by name in the NOT-to-use section, so an agent can differentiate it from binance_get_algo_order_history, binance_get_algo_sub_orders, and binance_get_open_orders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to Use' and 'When NOT to Use' sections name exact alternative tools and the conditions that select them (e.g., after placement, before placing to check the 20-slot ceiling, after 5xx; finished orders go to history, fills go to sub_orders, ordinary orders go to open_orders). This leaves nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_open_order_listsARead-onlyIdempotent
List the order lists that are still working, across every symbol.
Calls GET /api/v3/openOrderList (SIGNED, IP weight 6). The endpoint takes no
filters — it is account-wide by construction, which is exactly what makes it the right
first read before placing another bracket.
When to Use:
Before placing a new bracket, to see what is already armed on the same position.
After a 5xx/timeout on a placement, when you have no id to query.
When NOT to Use:
For one known list —
binance_get_order_list(weight 4).For lists that already finished —
binance_get_all_order_lists.For plain open orders —
binance_get_open_orders(spot_orders.py); a list's legs also appear there individually.
Returns:
A markdown table (time, symbol, orderListId, contingencyType, listStatusType,
listOrderStatus, listClientOrderId, leg count) capped at 50 rows, or the raw array
with response_format="json".
Examples: params = {} params = {"response_format": "json"}
Error Handling: -2015 means the key lacks permission or this IP is not allowlisted. An empty list is a valid answer: no bracket is armed.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/idempotentHint annotations, the description discloses the API endpoint, SIGNED requirement, IP weight 6, lack of filters, output format details, the 50-row cap, and the -2015 error meaning. It also notes that an empty list is a valid response, which prevents false interpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections, front-loaded purpose, and no filler. Every sentence adds decision-relevant information, such as when to call, when not to call, return shape, and error handling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a read-only one-parameter tool: it covers use cases, exclusions, output format, examples, and error semantics. The return behavior is fully specified, and the annotations cover the safety profile, so nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains the only parameter, response_format, by specifying the markdown vs json behaviors and providing two concrete examples. Even though context reports 0% schema description coverage, the description fully compensates by documenting the parameter and its allowed values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence 'List the order lists that are still working, across every symbol' is a specific verb+resource statement that clearly distinguishes this from siblings like binance_get_all_order_lists and binance_get_open_orders. It also clarifies the account-wide scope, which is a key differentiator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides 'When to Use' and 'When NOT to Use' sections. It names exact sibling tools (binance_get_order_list, binance_get_all_order_lists, binance_get_open_orders) and the conditions that route an agent to each alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_open_ordersARead-onlyIdempotent
List the orders currently resting on the book.
Calls GET /api/v3/openOrders (SIGNED). Weight 6 with symbol, 80 without — the
no-symbol form scans every pair and costs more than a percent of the 6000/min IP
budget in one call. Pass a symbol whenever you know it.
When to Use:
To see what is working right now, before placing or cancelling anything.
After a 5xx/timeout on a placement, as a symbol-wide check when you have no id.
When NOT to Use:
For one known order —
binance_get_ordercosts weight 4 and is precise.For orders that are no longer open —
binance_get_all_orderscovers history.
Returns:
A markdown table (time, symbol, orderId, side, type, status, price, origQty,
executedQty, cumQuote) capped at 50 rows, or the raw array with
response_format="json".
Examples: params = {"symbol": "BTCUSDT"} params = {}
Error Handling: -2015 means the key lacks permission or this IP is not allowlisted. An empty list is a valid answer: nothing is resting.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and idempotent, but the description adds substantial behavioral context beyond that: it is a SIGNED call, the weight difference between 6 and 80 is called out, the no-symbol form scans every pair, error -2015 is explained, and an empty list is confirmed as a valid result. This goes well beyond what the annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized with clear headers and front-loads the most important operational constraint (weight/cost) before usage guidance. Every section — returns, examples, error handling — serves a distinct purpose, and nothing feels redundant or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition covers what the tool does, when to use it, when not to use it, the cost implications, exact return format, example params, and error semantics. Given the annotations and output schema, there are no missing operational details an agent would need to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the schema gives descriptions for `symbol` and `response_format`, the description reinforces the critical trade-off (weight 6 with symbol vs 80 without), gives exact example parameter objects, and explains how `response_format="json"` changes the output. This compensates for the low schema description coverage signal and gives an agent enough detail to invoke the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence, 'List the orders currently resting on the book,' uses a specific verb and resource that exactly matches the tool name and endpoint. The later 'When NOT to Use' section explicitly distinguishes it from `binance_get_order` and `binance_get_all_orders`, so an agent can select it correctly without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides dedicated 'When to Use' and 'When NOT to Use' sections with concrete scenarios: checking working orders before placing/cancelling, recovering after a 5xx/timeout, and avoiding it for single-order lookups or historical orders. It names the alternative tools (`binance_get_order`, `binance_get_all_orders`) and the conditions that route to them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_orderARead-onlyIdempotent
Look up one order — open, filled, cancelled or expired — by id.
Calls GET /api/v3/order (SIGNED, IP weight 4). Pass the symbol plus exactly one id:
order_id (Binance's numeric orderId) or orig_client_order_id (the id you supplied
when placing). Both at once is rejected locally: Binance searches orderId first and
would silently ignore a mismatched client id.
When to Use:
After a 5xx or a timeout on a placement — this is how you find out whether the order exists before considering a retry.
To check the final state of an order that is no longer open.
When NOT to Use:
To list what is currently resting — use
binance_get_open_orders.To page through history — use
binance_get_all_orders.For the individual trades that filled the order — use
binance_get_my_trades(trade_history.py).
Returns:
A markdown detail block (status, side, type, prices, quantities, timestamps), or the
raw Binance object with response_format="json".
Examples: params = {"symbol": "BTCUSDT", "order_id": 123456789} params = {"symbol": "BTCUSDT", "orig_client_order_id": "my-entry-001"}
Error Handling: -2011/-2013 mean no such order for that symbol — check the symbol, or the order may be older than 90 days and archived (-2026). Orders are scoped per symbol: the right id on the wrong symbol looks identical to a missing order.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this read-only and idempotent, and the description adds significant operational context: SIGNED endpoint, IP weight, local rejection when both IDs are supplied, Binance's orderId-first lookup that silently ignores mismatched client IDs, per-symbol scoping, and 90-day archiving behavior with error codes. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core lookup semantics, then organized into When/When NOT/Returns/Examples/Error Handling. Every section adds non-redundant information necessary for correct invocation, and the examples are compact and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only order lookup, the description covers selection criteria, both accepted ID forms, output options, and failure modes. The output schema exists and the description still summarizes the response format, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the full burden for parameters. It explains symbol, the exactly-one constraint between order_id and orig_client_order_id, why passing both is rejected, what each ID means, and the response_format ('markdown' vs 'json'). This fully compensates for the schema's lack of parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb ('Look up'), a precise resource ('one order'), and the full state scope ('open, filled, cancelled or expired') by id. It also clearly differentiates from sibling tools in the 'When NOT to Use' list by naming binance_get_open_orders, binance_get_all_orders, and binance_get_my_trades.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit 'When to Use' section (post-5xx/timeout placement uncertainty, final status checks) and a 'When NOT to Use' section naming concrete alternatives. This is exactly the guidance an agent needs to avoid mis-selecting among the large sibling tool set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_order_bookARead-onlyIdempotent
Fetch the current order book (bids/asks) for a symbol.
Calls GET /api/v3/depth. Weight tiers by limit: 1-100 → 5, 101-500 → 25 (this
tool's cap is 500; Binance itself allows up to 5000 at weight 250, unavailable here).
When to Use:
To see live liquidity/spread before sizing an order.
To validate a limit price against the current best bid/ask.
When NOT to Use:
For the last traded price only — use
binance_get_book_ticker(cheaper, weight 2/4).For historical trades — use
binance_get_recent_trades/binance_get_agg_trades.
Returns:
Markdown: top 50 levels per side as price/qty tables, with the book's lastUpdateId.
JSON: the full requested depth (up to limit), uncapped.
Examples: params = {"symbol": "BTCUSDT", "limit": 20}
Error Handling:
An unknown symbol raises Binance -1121 Invalid symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, the description adds meaningful behavioral detail: weight tiers by limit, the hard 500 cap, Markdown top-50 truncation vs. full uncapped JSON, lastUpdateId inclusion, and Binance error code -1121 for invalid symbols.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clear labeled sections: endpoint, weight tiers, when to use, when not to use, return format, example, and error handling. Every section adds practical value, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only market-data lookup, the description covers endpoint, cost/limits, expected return shapes, an example call, and a likely error. Nothing material is missing for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents symbol, limit, and response_format, and the description reinforces this by explaining the limit cap and weight implications, providing a concrete symbol example, and detailing how response_format changes the returned data shape. This is more than enough to guide correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch the current order book (bids/asks) for a symbol.' It also names the underlying endpoint and clearly distinguishes itself from related ticker and trade-history tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There are explicit 'When to Use' and 'When NOT to Use' sections. The description names concrete alternatives like binance_get_book_ticker, binance_get_recent_trades, and binance_get_agg_trades, and explains why they should be chosen instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_order_listARead-onlyIdempotent
Look up one order list — OCO, OTO or OTOCO — by id.
Calls GET /api/v3/orderList (SIGNED, IP weight 4). No symbol is needed: pass exactly
one id, order_list_id (Binance's numeric orderListId) or orig_client_order_id (the
listClientOrderId used when placing). Both at once is rejected locally — Binance
resolves the numeric id first and then rejects a mismatch, so the ambiguous call buys
nothing.
When to Use:
After a 5xx or a timeout on a placement — this is how you find out whether the list exists before considering a retry.
To check whether a bracket is still working, or which leg ended it.
When NOT to Use:
To see every working list —
binance_get_open_order_lists(weight 6).For history across a period —
binance_get_all_order_lists.For an individual leg's fills —
binance_get_order/binance_get_my_tradeswith the leg's orderId.
Returns:
orderListId, contingencyType, listStatusType, listOrderStatus, listClientOrderId,
symbol, transactionTime and the ### Legs table. This endpoint returns orders[]
only (ids, no per-leg status), and the answer says so rather than implying more.
response_format="json" returns the raw payload.
Examples: params = {"order_list_id": 27} params = {"orig_client_order_id": "btc-bracket-001"}
Error Handling: -2011/-2013 mean no such order list for this account. -1102 means neither id reached Binance. -2015 means the key lacks permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: the endpoint is SIGNED with IP weight 4, both id parameters cannot be passed together, Binance resolves the numeric id first, and error codes are mapped to real causes. It also explains the open-world use case of checking whether a placement actually happened after a network failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every section earns its place: purpose, endpoint details, usage, non-usage, returns, examples, and error handling. It is front-loaded with the core purpose and structured with clear headings, making it easy for an agent to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup tool, the description covers all necessary context: endpoint path, authentication/weight, id selection rules, use cases, limitations, error codes, and examples. The explicit note that orders[] contains only IDs and no per-leg status prevents the agent from assuming richer data, which is especially valuable even with an output schema present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the nested schema already describes the two id parameters, the description adds critical semantics: exactly one id must be passed, no symbol is needed, both ids are rejected locally, and the difference between order_list_id and orig_client_order_id is clarified. It also documents response_format behavior for raw JSON output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Look up one order list — OCO, OTO or OTOCO — by id.' It clearly distinguishes the tool from siblings by naming exact alternatives in the 'When NOT to Use' section, so an agent knows exactly what this tool does and what it does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to Use' and 'When NOT to Use' sections provide concrete triggering conditions, such as after a 5xx/timeout on a placement, and route to sibling tools like binance_get_open_order_lists, binance_get_all_order_lists, and binance_get_order. This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_order_rate_limitsARead-onlyIdempotent
Get the account's current order-rate-limit usage (per-second/day order counts).
Calls GET /api/v3/rateLimit/order (SIGNED, USER_DATA). IP weight 40 per call
— noticeably heavier than the other tools in this module; do not poll this tightly.
When to Use:
Before a burst of order placements, to see how much of the ORDERS rate limit (per interval, e.g. 10s/1d) has already been used.
To debug a -1015 "Too many orders" rejection.
When NOT to Use:
For the exchange-wide REQUEST_WEIGHT/RAW_REQUESTS limits — those come back in every response's rate-limit headers, not from this endpoint.
Returns:
A markdown list (or JSON) of {rateLimitType, interval, intervalNum, limit, count} entries — one per configured ORDERS rate-limit window.
Examples: params = {}
Error Handling: -2015 means the key lacks Reading permission or the IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, but the description adds valuable context beyond those: it discloses that the endpoint is SIGNED, has IP weight 40 with a caution not to poll tightly, and explains the -2015 error status. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every section earns its place: purpose, usage, non-usage, return format, example, and error handling are clearly separated under headers. It remains scannable and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, idempotent tool with a single optional parameter and rich annotations, the description covers usage scenarios, exclusions, IP weight, error handling, and return content. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema exposes only the 'params' object with 'response_format', and the description mentions 'params = {}' and 'markdown list (or JSON)'. However, it does not explicitly tie the response_format parameter to the output format, and the schema description already covers that parameter meaning, so the description adds limited new semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Get the account's current order-rate-limit usage (per-second/day order counts).' It explicitly identifies the endpoint and clearly differentiates itself from exchange-wide request-weight limits, so an agent can distinguish this from sibling tools without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to Use' and 'When NOT to Use' sections give explicit contexts: use before bursts of order placements or when debugging -1015 errors, and do not use for REQUEST_WEIGHT/RAW_REQUESTS limits. This leaves no ambiguity about when to select this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_pay_historyARead-onlyIdempotent
Walk up to 18 months of Binance Pay history, past the 90-day / 100-row API caps.
Repeatedly calls GET /sapi/v1/pay/transactions (UID weight 3000 per call) in
<=89-day windows, newest-first, from since (default: Binance's 18-month lookback
plus a two-day margin; an older since is clamped to it) up to now, or up to a resume_before cursor
from a previous truncated call. A window that comes back with exactly 100 rows (the
page limit) is bisected — split at its midpoint and re-walked — so a dense period is
not silently dropped; if bisection reaches its 1 ms floor and STILL gets a full page,
those extra rows are dropped and the response says so (possibly_incomplete).
Spends at most max_calls requests (default 30 = 90,000 UID) before stopping; the
returned resume_before cursor always marks the boundary of the next unfetched
range (never derived from which rows happened to come back), and is omitted
(no_progress) on the rare case the budget ran out before even the newest window
could make any progress — resuming then would just repeat the same calls, so raise
max_calls instead.
Binance Card spending is NOT available via API; card-funded Pay payments appear here
with walletType 4 or 6 ("card").
When to Use:
To pull a full Pay history for reconciliation without hand-rolling the 90-day windowing or the 100-row-per-window cap.
To resume a previous run that stopped early — pass the same
sinceplus itsresume_beforeback in.
When NOT to Use:
For a single recent window —
binance_get_pay_transactionsis one call and cheaper.
Returns:
Markdown (or JSON) list of transactions deduped by transactionId (scoped to this one
call — not a persistent cross-call dedupe) sorted newest-first, the number of API
calls spent, and — when the budget ran out before reaching since — a resume_before
cursor to pass back on the next call alongside the same since. Markdown display is
capped at 50 rows; response_format="json" always carries the full set collected by
this call (only clip_response's byte cap applies).
Pagination/Windows:
since accepts an ms epoch, a >=12-digit epoch-ms string, or an ISO-8601 string,
default now minus 18 months (+2 days); anything older is clamped to that floor and
reported as since_clamped. Each top-level window is at most 89 days (under
Binance's 90-day cap); a window may cost more than one call if it has to be
bisected, so max_calls bounds total calls, not windows. resume_before is always
the boundary of the next unfetched range, so a resumed call never re-walks
already-collected ranges (aside from harmless dedupe-caught edge overlaps).
Examples: params = {} # last 18 months, up to 30 calls params = {"since": "2026-01-01", "resume_before": 1700000000000, "max_calls": 10}
Error Handling:
A request failure mid-walk does NOT discard what was already fetched: the rows
collected so far come back with resume_before (the boundary of the next unfetched
range) and the failure itself in stop_error — fix the cause, then call again with
the same since and that resume_before. no_progress: true with no cursor means
nothing was collected before the failure — clear the cause and repeat the same call.
A range that ends before Binance's 18-month lookback is refused locally (nothing in
it is retrievable). -2015 means the key lacks permission or the IP is not on the
key's allowlist.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds enormous behavioral detail beyond the annotations (readOnlyHint, idempotentHint, destructiveHint=false): UID weight 3000 per call, bisection with a 1ms floor, row-dropping with possibly_incomplete flag, max_calls budget semantics, resume_before cursor contract, no_progress case, partial-fetch preservation on failure with stop_error, and the -2015 permission/allowlist meaning. No contradiction with the annotations — the description's read-only, idempotent framing aligns with them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but extremely well organized into labeled sections (When to Use, When NOT to Use, Returns, Pagination/Windows, Examples, Error Handling) and front-loads the core purpose. Every section earns its place given the algorithm's complexity; the length is justified, though it could be trimmed slightly without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Exceptionally complete for a complex paginated windowing tool. It covers return format and dedup semantics, output schema expectations, pagination/window mechanics, cursor resumption, clamping, error handling with recovery guidance, code examples, and the card-walletType caveat. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the schema already carries descriptions for since, max_calls, and resume_before, the tool description amplifies them: exact accepted formats (ms epoch, >=12-digit epoch-ms string, ISO-8601), the clamping-to-lookback behavior reported as since_clamped, the default 30 calls = 90,000 UID budget, and the precise resume_before boundary contract. It fully compensates for any schema ambiguity and goes well beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: walks up to 18 months of Binance Pay history, repeatedly calling GET /sapi/v1/pay/transactions with windowing and bisection to bypass the 90-day/100-row caps. It explicitly distinguishes itself from binance_get_pay_transactions in the 'When NOT to Use' section, so an agent can tell them apart immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Has dedicated 'When to Use' and 'When NOT to Use' sections. It names the cheaper alternative (binance_get_pay_transactions for a single recent window) and gives the reconciliation/resume scenarios where this tool is the right choice. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_pay_transactionsARead-onlyIdempotent
Fetch Binance Pay transactions (merchant payments, C2C, refunds, payouts) for the account.
Calls GET /sapi/v1/pay/transactions (UID weight 3000). Binance Card spending
is NOT available via API — this only shows Binance Pay activity; a payment funded
by the Binance Card appears here with walletType 4 or 6 ("card"), which is the
closest visibility this server has into card usage.
When to Use:
To review recent (<= 90 day) Binance Pay activity: merchant payments, C2C transfers, refunds, crypto box, payouts, remittances.
To find which wallet funded a Pay payment — pass
wallet_typeor read the rendered wallet name (funding/spot/fiat/card/earn).
When NOT to Use:
For a span over 90 days, or to page past the first 100 rows of a dense window — use
binance_get_pay_history, which walks and bisects the window for you.To see Binance Card POS spend — no endpoint returns that (03-card-and-gaps.md §1); this only shows card-funded Pay payments, not card terminal purchases.
Returns:
Markdown list (or JSON) of transactions: time, orderType, signed amount (+ income /
- expenditure) and currency, walletType name, the counterparty name, and
transactionId. Markdown display is capped at 50 rows with a note pointing at a
narrower window or binance_get_pay_history; response_format="json" always carries
every row this call fetched (still limit-capped by the API itself, <= 100).
Pagination/Windows:
start_time/end_time accept an ms epoch, a >=12-digit epoch-ms string, or an
ISO-8601 string. Give both together (span <= 90 days) or neither — Binance's
behavior for a single bound is undocumented for this endpoint, so a lone bound is
rejected locally with a clear Error: rather than sent on. When both are omitted,
Binance returns the most recent 90 days. limit is <= 100 (this endpoint's own max).
Examples: params = {"wallet_type": 4} # only card-funded Pay payments params = {"start_time": "2026-06-01", "end_time": "2026-08-01"}
Error Handling: -1127 means the startTime/endTime span exceeds Binance's cap (should not happen — this tool validates first); -2015 means the key lacks permission or the IP is not on the key's allowlist.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds substantial behavioral context: UID weight 3000, the 90-day window behavior, the local rejection of a lone time bound, the 50-row markdown cap, the client-side wallet_type filter, and error code meanings. This goes well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: scope, when/when-not, returns, pagination, examples, error handling. It is well-structured with clear headers and front-loads the core purpose. Slightly verbose in places (e.g., the card-funded explanation repeats), but the density of useful information justifies the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema, this description is complete. It covers the API endpoint, weight, time window constraints, pagination, output format differences, error codes, and the relationship to the sibling tool. An agent has everything needed to select and invoke this tool correctly, including edge cases like lone time bounds and the 50-row markdown cap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the top-level params object, but the nested PayTransactionsInput schema actually documents each parameter well. The description adds meaning beyond the schema: it explains the walletType 4/6 card semantics, the signed amount (+/-) meaning, the markdown cap behavior, and the local validation of lone time bounds. It also gives concrete examples for wallet_type and time windows.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch Binance Pay transactions (merchant payments, C2C, refunds, payouts)'. It names the exact API endpoint and clearly distinguishes itself from the sibling binance_get_pay_history by stating what it does NOT cover (Binance Card POS spend) and what it does cover (card-funded Pay payments).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description has explicit 'When to Use' and 'When NOT to Use' sections. It names the alternative tool (binance_get_pay_history) and the exact conditions that select it (span over 90 days, paging past 100 rows). It also states a hard limitation (no Binance Card POS spend endpoint) with a file reference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_prevented_matchesARead-onlyIdempotent
List orders rejected by Self-Trade Prevention (STP) for a symbol.
Calls GET /api/v3/myPreventedMatches (SIGNED, USER_DATA). IP weight 2 when
queried by prevented_match_id, 20 when queried by order_id.
When to Use:
To see which of your own orders were prevented from matching against each other (STP), including the price and quantity that was blocked.
To audit STP behavior for a specific order via
order_id.
When NOT to Use:
For orders that DID execute — use
binance_get_my_trades(trade history).
Returns:
A markdown list (or JSON) of prevented matches: preventedMatchId,
tradeGroupId, taker/maker order ids, maker symbol, price, maker quantity
prevented (via fmt_num), the self-trade-prevention mode, and the
transaction time. Display is capped at MAX_DISPLAY_ROWS (50); JSON mode
returns {count, truncated, displayLimit, items} rather than a bare array,
so truncation stays valid JSON.
Pagination:
Only valid together with order_id: from_prevented_match_id is an
inclusive cursor — pass the last-seen preventedMatchId (or one past it)
to page forward, and limit (only sent when from_prevented_match_id is
set; Binance default 500, max 1000) caps how many rows come back per call.
Display is additionally capped at MAX_DISPLAY_ROWS (50) regardless of
limit.
Examples: params = {"symbol": "BTCUSDT", "prevented_match_id": 1} params = {"symbol": "BTCUSDT", "order_id": 12345, "from_prevented_match_id": 5}
Error Handling:
Exactly one of prevented_match_id or order_id is required — validated
locally before the call. from_prevented_match_id requires order_id.
-1121 means an invalid symbol; -2013/-2011 mean the order id does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds IP weight details, local validation rules, error code meanings, display caps, and the JSON response structure. This provides rich behavioral context that annotations alone do not cover, and nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear headers, bullet points, and examples. Every section adds value, and the content is front-loaded with the purpose before diving into details. There is no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all necessary aspects: purpose, usage, pagination, examples, error handling, and return format. It also notes the output schema behavior for JSON mode. Given the tool's complexity, nothing is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains parameter relationships (mutual exclusivity of prevented_match_id and order_id, from_prevented_match_id requiring order_id, limit only sent with from_prevented_match_id) and adds context like display caps. This goes well beyond the schema's individual parameter descriptions, giving the agent a full understanding of how to combine parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List orders rejected by Self-Trade Prevention (STP) for a symbol.' It also names the alternative tool (binance_get_my_trades) in the 'When NOT to Use' section, clearly distinguishing this tool from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description has explicit 'When to Use' and 'When NOT to Use' sections, including a direct reference to an alternative tool for executed trades. It also provides detailed pagination conditions, making the decision to use this tool unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_recent_tradesARead-onlyIdempotent
Fetch the most recent public trades for a symbol.
Calls GET /api/v3/trades (weight 25). Always returns the latest trades — there is
no way to page backward here (use binance_get_agg_trades with from_id for that).
When to Use:
To see the last executed prices/sizes and maker/taker mix for a symbol.
When NOT to Use:
To page through trade history by id — use
binance_get_agg_trades.For your OWN trades — use
binance_get_my_trades(signed).
Returns:
Markdown: a table of up to 100 trades (id, time, price, qty, side). JSON: the full
requested page (up to limit), uncapped.
Examples: params = {"symbol": "BTCUSDT", "limit": 50}
Error Handling:
An unknown symbol raises Binance -1121 Invalid symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds key behavioral details: the endpoint weight (25), the impossibility of backward paging, and the error message for invalid symbols. These go beyond the annotation hints and clarify operational constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections, front-loaded purpose, and every sentence contributes value. It includes usage guidance, return format, examples, and error handling without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the presence of an output schema, and rich sibling context, the description is complete. It covers what the tool does, when to use it, what it returns, and common errors, leaving no critical gap for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden. It explains the effect of response_format (markdown caps at 100 trades, JSON uncapped), gives a concrete example with limit=50, and clarifies that limit is up to 1000. This fully compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch the most recent public trades for a symbol' and explicitly contrasts with sibling tools (binance_get_agg_trades for paging, binance_get_my_trades for own trades), making the purpose unambiguous and distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'When to Use' and 'When NOT to Use' sections, naming alternatives and the conditions that select them. This leaves no ambiguity about when to invoke this tool versus others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_rolling_tickerARead-onlyIdempotent
Fetch price change statistics over an arbitrary rolling window.
Calls GET /api/v3/ticker (weight 4 per symbol, capped at 200 once >50 symbols
requested). Unlike binance_get_ticker_24h, the window is not fixed at 24 hours.
When to Use:
For a custom window (e.g. 4h, 7d) that the fixed 24h/trading-day tickers don't cover.
When NOT to Use:
For the standard 24h window —
binance_get_ticker_24his cheaper for that case.
Returns:
Markdown: stat blocks per symbol (up to 50 shown). JSON: count/shown plus tickers.
Examples: params = {"symbol": "BTCUSDT", "window_size": "4h"} params = {"symbols": ["BTCUSDT", "ETHUSDT"], "window_size": "7d"}
Error Handling:
window_size outside 1m-59m/1h-23h/1d-7d is rejected by Binance; more than 100
symbols or neither symbol nor symbols is rejected locally.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive. The description adds API weight/cap (weight 4 per symbol, capped at 200), error handling for invalid window sizes, local rejection of >100 symbols, and return format differences – valuable operational context beyond the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: overview, usage guidance, returns, examples, and error handling. It is front-loaded with the core purpose and every line adds value – no filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers usage scope, alternatives, error conditions, return format, and concrete examples. Combined with the output schema and annotations, an agent has everything needed to correctly invoke this tool, including constraints and failure modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the description does not repeat parameter descriptions, the input schema itself fully documents every parameter (type, symbol, symbols, window_size, symbol_status, response_format) with constraints like max 100 symbols and window patterns. The description enhances this with concrete examples and error notes, providing actionable guidance without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Fetch price change statistics') over a custom rolling window, and immediately contrasts with binance_get_ticker_24h by noting the window is not fixed. This precisely scopes the tool and differentiates it from a key sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to Use' and 'When NOT to Use' sections name the alternative (binance_get_ticker_24h) and the condition that selects it (cheaper for 24h). This leaves no ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_spot_accountARead-onlyIdempotent
Get spot account state: trade/withdraw/deposit flags, commission rates, balances.
Calls GET /api/v3/account (SIGNED, USER_DATA). IP weight 20 per call.
When to Use:
To check current spot balances (free + locked) for one or all assets.
To confirm whether the account can currently trade, withdraw, or deposit, and what its maker/taker/buyer/seller commission rates are.
When NOT to Use:
For a specific symbol's commission (with any special/discount overrides) — use
binance_get_commission_rates.For non-spot wallets (Funding, Earn, ...) — use the wallet-account tools.
Returns:
A markdown block (or JSON with response_format="json") with canTrade/
canWithdraw/canDeposit, account type, commissionRates (maker/taker/buyer/
seller via fmt_num), permissions, last update time, and the balances list
(free/locked via fmt_num). When omit_zero_balances is True (the default)
and no asset filter is given, a count of hidden zero-balance assets is
shown. Display is capped at MAX_DISPLAY_ROWS (50) with a truncation note;
JSON mode instead adds truncated/balancesShown/balancesMatched fields
so truncation is machine-readable too.
Examples: params = {} params = {"omit_zero_balances": False} params = {"asset": "USDT"}
Error Handling: -2015 means the key lacks Reading permission or this machine's IP is not on the key's allowlist. An empty balances list after filtering means the asset filter matched nothing, or every balance was zero and got hidden.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false. The description adds substantial value beyond these: rate limit (IP weight 20), error code 2015 meaning, truncation behavior, and how omit_zero_balances affects output. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly structured with clear headers (purpose, when to use/not, returns, examples, errors). Every sentence contributes functional information—rate limits, defaults, edge cases—and the purpose is front-loaded. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex account-state tool, the description covers purpose, usage boundaries, output format details (including truncation and JSON fields), parameter effects, examples, and error interpretation. With an output schema present, the return-value explanation is bonus but not redundant. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already provides descriptions for asset, response_format, and omit_zero_balances, the description enriches these by explaining their effects on output (e.g., asset filter overriding omit_zero_balances, truncation notes, JSON fields). It also shows concrete parameter examples. This fully compensates for the schema coverage signal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement of what the tool does: get spot account state including trade/withdraw/deposit flags, commission rates, and balances, backed by the specific API endpoint. It explicitly contrasts with sibling tools (binance_get_commission_rates and wallet-account tools), making the tool's scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Dedicated 'When to Use' and 'When NOT to Use' sections give concrete use cases (check balances, confirm account flags/commissions) and name the exact alternatives for excluded scenarios. This is explicit routing guidance with no reliance on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_system_statusARead-onlyIdempotent
Report whether the Binance system is up or under maintenance.
Calls GET /sapi/v1/system/status (NONE — no key or signature needed, IP weight 1).
When to Use:
Before assuming a failure is account-specific — rule out a Binance-wide maintenance window first.
When NOT to Use:
To check THIS key's connectivity/permissions — use
binance_health_check.
Returns:
normal or maintenance plus Binance's message, or raw JSON with
response_format="json".
Examples: params = {}
Error Handling: This endpoint needs no credentials at all; a failure here means Binance itself is unreachable, not a key or signature problem.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond annotations: it states that no key or signature is needed, reports the IP weight, explains the error semantics ('a failure here means Binance itself is unreachable, not a key or signature problem'), and documents the return values. The readOnly and idempotent hints are consistent and reinforced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections, front-loaded purpose, and no wasted sentences. The endpoint, authentication requirement, usage guidance, return values, example, and error handling all earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple status-check tool, the description covers everything an agent needs: what to use it for, what not to use it for, authentication, return shape, and failure interpretation. The output schema covers the response_format parameter, so no essential context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even with only one parameter and a clear schema description, the tool description clarifies that the endpoint takes no real params, explains the response_format behavior ('raw JSON with response_format="json"'), and gives an example of an empty params object. This meaningfully supplements the schema, though the schema already covers the enum details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a specific verb and resource: 'Report whether the Binance system is up or under maintenance.' It also names the exact endpoint, and the 'When NOT to Use' section explicitly differentiates this from binance_health_check, so an agent can distinguish it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'When to Use' and 'When NOT to Use' sections, including the concrete alternative binance_health_check for checking key connectivity. This leaves no ambiguity about the tool's appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_ticker_24hARead-onlyIdempotent
Fetch 24-hour rolling price change statistics.
Calls GET /api/v3/ticker/24hr. Weight: symbol → 2; symbols → 2 for 1-20, 40 for
21-100, 80 for 101+; no symbol at all (all 3700+ symbols) → weight 80 — use sparingly.
When to Use:
For a market snapshot: price change %, high/low, volume over the last 24h.
When NOT to Use:
For a fixed calendar-day window — use
binance_get_trading_day_ticker.For a custom rolling window — use
binance_get_rolling_ticker.
Returns:
Markdown: up to 50 symbols as stat blocks. JSON: count/shown plus the tickers.
Examples: params = {"symbol": "BTCUSDT"} params = {"symbols": ["BTCUSDT", "ETHUSDT"], "type": "MINI"}
Error Handling:
An unknown symbol raises Binance -1121 Invalid symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses important runtime behavior: API weight costs for different symbol counts, a strong warning about the expensive all-symbols call, response format behavior, and a specific Binance error case. This is exactly the behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bold section headers, front-loads the critical weight warning, and includes only purposeful content: usage guidance, examples, return format, and error handling. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a read-only market data tool: it covers selection criteria, alternatives, API endpoint, weight limits, return format, examples, and error behavior. Nothing essential is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% at the top level, so the description must compensate. It provides concrete usage examples for `symbol`, `symbols`, and `type`, and maps `response_format` to Markdown/JSON in the Returns section. However, `symbol_status` is not addressed in the description, though the schema itself documents it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: fetching 24-hour rolling price change statistics via `GET /api/v3/ticker/24hr`. It explicitly distinguishes itself from sibling ticker tools in the When NOT to Use section, so an agent can select it without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit When to Use and When NOT to Use sections, naming concrete alternatives (`binance_get_trading_day_ticker`, `binance_get_rolling_ticker`) for different time-window needs. This gives the agent clear selection criteria beyond general market snapshot use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_ticker_priceARead-onlyIdempotent
Fetch the latest price for one, several, or all symbols.
Calls GET /api/v3/ticker/price. Weight: symbol → 2; omitted or symbols → 4
(fetching ALL prices is a flat weight-4 call — cheap even for the whole market).
When to Use:
For the current tick price with the least overhead of any ticker endpoint.
When NOT to Use:
For bid/ask spread — use
binance_get_book_ticker.For 24h stats (change %, volume) — use
binance_get_ticker_24h.
Returns:
Markdown: a symbol/price table, capped at 100 rows. JSON: count/shown plus prices.
Examples: params = {"symbol": "BTCUSDT"} params = {"symbols": ["BTCUSDT", "ETHUSDT"]}
Error Handling:
An unknown symbol raises Binance -1121 Invalid symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and non-destructive, but the description adds significant behavioral context: API weight costs per symbol, the 100-row Markdown cap, JSON `count`/`shown` fields, and the `-1121 Invalid symbol` error. This is exactly the kind of information annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections: purpose, endpoint/weight, when to use, when not to use, returns, examples, and errors. Each sentence adds value, and the most important distinguishing fact (least overhead ticker) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description, combined with the schema and output schema, covers everything an agent needs: what the tool returns, how to request single/multiple/all symbols, cost/weight implications, alternative tools, and error behavior. No meaningful gap remains for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The context signal reports 0% schema description coverage, so the description must compensate. It does so with concrete examples for `symbol` and `symbols`, notes that omitting both fetches all prices, and explains the effect of `response_format` via the Markdown/JSON Returns section. It slightly overlaps with schema text about mutual exclusivity but adds practical usage examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch the latest price for one, several, or all symbols.' It names the exact endpoint and differentiates from sibling ticker tools by contrasting with `binance_get_book_ticker` and `binance_get_ticker_24h`, so an agent can select it confidently.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains explicit 'When to Use' and 'When NOT to Use' sections, naming the exact alternative tools for bid/ask spread and 24h stats. This gives unambiguous routing guidance beyond any inference needed from the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_trade_feesARead-onlyIdempotent
Report the maker/taker commission rates that apply to this account.
Calls GET /sapi/v1/asset/tradeFee (SIGNED, IP weight 1). Without symbol Binance
returns every symbol — thousands of rows — so the rendering is capped at 50 and
the JSON output is clipped; pass symbol whenever you know it.
When to Use:
To price a trade properly before placing it.
To confirm a VIP-tier or BNB-discount fee change took effect.
When NOT to Use:
For the fee actually charged on an executed order — that is in the order's fills (
binance_place_order) or inbinance_get_my_trades(trade_history.py).For the account-level commission rates on one symbol with the order-book context —
binance_get_commission_rates(spot_account.py) reads/api/v3/account/commission.
Returns:
A markdown table of symbol / maker / taker as percentages, capped at 50 rows, or the
raw Binance array with response_format="json".
Examples: params = {"symbol": "BTCUSDT"} params = {}
Error Handling: -1121 means the symbol does not exist. -2015 means the key lacks Reading permission or this IP is not allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds significant context beyond that: the signed endpoint requirement, IP weight, the 50-row cap with JSON clipping behavior, and specific error codes (-1121, -2015) with their meanings. This fully discloses the tool's operational traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized into clear sections (purpose, usage, returns, examples, error handling) with no redundant sentences. Every part adds value, and the most critical information (purpose and symbol behavior) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only query tool, the description covers purpose, usage boundaries, return formats, parameter implications, and error handling. It also references the output schema implicitly. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already provides descriptions for symbol and response_format, the description adds crucial behavioral semantics: omitting symbol returns thousands of rows and triggers capping/clipping, and response_format='json' returns the raw Binance array. This goes beyond simple schema definitions and informs correct parameter selection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reports maker/taker commission rates for the account, names the specific API endpoint, and explicitly distinguishes it from sibling tools like binance_get_commission_rates and binance_get_my_trades. The verb+resource is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit 'When to Use' and 'When NOT to Use' sections, naming concrete alternatives (binance_place_order, binance_get_my_trades, binance_get_commission_rates) and the conditions under which they should be chosen. This leaves no ambiguity for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_trading_day_tickerARead-onlyIdempotent
Fetch price change statistics for the current trading day (a fixed calendar window).
Calls GET /api/v3/ticker/tradingDay (weight 4 per symbol, capped at 200 once >50
symbols requested; max 100 symbols per request).
When to Use:
For "today's" stats aligned to a specific timezone's midnight — e.g.
time_zone="+08:00".
When NOT to Use:
For a rolling 24h window instead of a calendar day — use
binance_get_ticker_24h.
Returns:
Markdown: stat blocks per symbol (up to 50 shown). JSON: count/shown plus tickers.
Examples: params = {"symbol": "BTCUSDT", "time_zone": "+08:00"}
Error Handling:
More than 100 symbols or neither symbol nor symbols is rejected locally.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint false), the description discloses request weight, a weight cap for large symbol counts, the 100-symbol limit, markdown/JSON return behavior, and local validation errors. This is substantial behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear headers, front-loaded purpose, and each section (endpoint, usage, returns, example, errors) earning its place. It is detailed yet skimmable for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the endpoint, rate limiting, symbol limits, response formats, example input, and error conditions. Given the schema and annotations, nothing critical is missing for correct invocation and interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the nested schema already documents each field, the description adds a practical example with time_zone, clarifies the max 100 symbols constraint, and explains local rejection logic. This meaningfully supplements the schema without repeating every parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch price change statistics for the current trading day (a fixed calendar window).' It also names the exact endpoint, GET /api/v3/ticker/tradingDay, and explicitly distinguishes the calendar-day semantics from the rolling 24h sibling, making selection unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to Use' section gives a concrete condition (today's stats aligned to a timezone's midnight) and the 'When NOT to Use' section names the alternative tool, binance_get_ticker_24h, for rolling windows. This is explicit routing guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_transfer_historyARead-onlyIdempotent
List past transfers between the account's own wallets, one direction at a time.
Calls GET /sapi/v1/asset/transfer (SIGNED, IP weight 1). Unlike the POST that
performs a transfer, this read does not need the key's "Permits Universal
Transfer" flag.
type is mandatory and Binance offers no "all directions" value: MAIN_FUNDING and
FUNDING_MAIN are two separate queries, so a full Spot⇄Funding picture costs two
calls. MAIN_FUNDING / FUNDING_MAIN is also the closest proxy to a Binance Card
top-up log, since the card was funded out of the Funding wallet.
When to Use:
To reconcile where a balance went between wallets.
To reconstruct Funding-wallet activity that Pay/fiat history does not explain.
When NOT to Use:
For deposits/withdrawals to and from other platforms — use
binance_get_deposit_history/binance_get_withdraw_history(wallet_capital.py).To perform a transfer — that is
binance_transfer_between_wallets.
Returns:
Binance's {total, rows} rendered as a markdown table of time / asset / amount /
type / status / tranId, with the page position and the per-asset totals of the rows
shown, or the raw envelope with response_format="json".
Pagination:
page → Binance's current (1-based), limit → Binance's size (max 100, Binance
default 10). total in the response is the full count for the filter, so
page * limit < total means there is more.
Windows:
Binance "supports query within the last 6 months only" and defaults to the last 7
days when start_time/end_time are omitted — so an empty result with no window
given usually means "nothing in the last week", not "never". Pass start_time to
look further back.
Examples: params = {"type": "MAIN_FUNDING"} params = {"type": "FUNDING_MAIN", "start_time": "2026-03-01", "limit": 100}
Error Handling: -2015 means the key lacks Reading permission or this IP is not allowlisted. Dates more than 6 months old simply return nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint; the description adds meaningful context: the key does not need the 'Permits Universal Transfer' flag, the type parameter has no 'all directions' option, default window is 7 days, and error code -2015 meaning. These details go well beyond the annotations and aid correct usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized with clear sections (purpose, usage, returns, pagination, windows, examples, errors). Every section carries useful information, though it could be tightened without losing value. Front-loaded with the core purpose and key constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the API endpoint, authentication flag, direction semantics, pagination logic, time window defaults, examples, and error handling. An output schema exists so return format details are not necessary, but the description still mentions the markdown/json rendering. Nothing essential for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides detailed descriptions for every parameter (type enum with full list, page/limit ranges, time formats). The description supplements this with practical guidance: type is mandatory with no all-directions value, start_time for looking back, pagination mapping, and window default. Adds value beyond the schema without repeating it fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists past transfers between the account's own wallets, one direction at a time, and explicitly distinguishes it from deposit/withdraw history and the transfer execution tool. The purpose is unambiguous and sibling differentiation is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains dedicated 'When to Use' and 'When NOT to Use' sections, naming alternative tools (binance_get_deposit_history, binance_get_withdraw_history, binance_transfer_between_wallets) and the conditions that select them. No ambiguity about when to call this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_ui_klinesARead-onlyIdempotent
Fetch presentation-adjusted candlestick data, matching Binance's own chart UI.
Calls GET /api/v3/uiKlines (weight 2). Same array shape and parameters as
binance_get_klines; Binance smooths/adjusts these for display purposes.
When to Use:
When the numbers need to match what a user sees on binance.com/binance app charts.
When NOT to Use:
For raw exchange candles used in calculations — use
binance_get_klines.
Returns:
Same shape as binance_get_klines: markdown table (capped at 100 rows) or JSON.
Examples: params = {"symbol": "BTCUSDT", "interval": "1h", "limit": 200}
Error Handling:
Same as binance_get_klines.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so safety is covered. The description adds valuable behavioral context beyond that: the endpoint, API weight (2), the display-smoothing/adjustment behavior, the return shape, the 100-row markdown cap, and the error-handling parity with binance_get_klines. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear headers: purpose, when to use, when not to use, returns, examples, and error handling. Every section earns its place and there is no filler or redundant restatement of the tool name. The most important distinguishing information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only data-fetching tool, the description is complete: it explains what the data is, when to prefer it over the sibling, what the response looks like, and that error behavior matches a known sibling. The annotations cover safety and idempotency, and the output schema covers return details. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not individually document parameters, but it references the same parameters and array shape as binance_get_klines and provides a concrete example. The input schema's nested definitions already describe each field in detail, so this is adequate but not exceptional. An agent primarily relies on the schema plus the sibling reference, making this dimension merely sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch presentation-adjusted candlestick data, matching Binance's own chart UI.' It names the exact API endpoint and explicitly contrasts itself with binance_get_klines, making the distinction from sibling tools unambiguous. An agent can immediately tell this is the UI-matching kline tool, not the raw candles tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to Use' and 'When NOT to Use' sections provide explicit, decision-ready guidance. It states to use this tool when numbers must match what users see on binance.com/app charts, and to use binance_get_klines for raw exchange candles used in calculations. This is exactly the kind of direct alternative routing that helps an agent select correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_user_assetsARead-onlyIdempotent
List the Spot wallet's non-zero balances, optionally valued in BTC.
Calls POST /sapi/v3/asset/getUserAsset (SIGNED, IP weight 5). Another Binance
query that uses POST; it is on the client's read allowlist and works with the
trading kill-switch off. With no asset filter it returns every asset with a
positive balance — unlike /api/v3/account, zero balances are omitted by Binance
itself.
When to Use:
For a compact "what do I actually hold on Spot" answer, with a BTC valuation.
As the asset seed for
binance_discover_traded_symbols(trade_history.py).
When NOT to Use:
For the full account view (permissions, commission rates, canTrade) — use
binance_get_spot_account(spot_account.py).For the Funding wallet — use
binance_get_funding_wallet.
Returns:
A markdown table of asset / free / locked / freeze / withdrawing / ipoable (plus BTC
valuation and a total when need_btc_valuation is set), capped at 50 rows, or the
raw Binance array with response_format="json".
Examples: params = {} params = {"asset": "BTC", "need_btc_valuation": True}
Error Handling:
-2015 means the key lacks Reading permission or this IP is not allowlisted. A 404
means the base URL has no /sapi (the spot testnet).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive. The description adds substantial behavioral context: the exact endpoint and method (POST /sapi/v3/asset/getUserAsset), IP weight, that it works with the trading kill-switch off, that Binance omits zero balances, a 50-row cap, response format options, and error codes. This goes far beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, the description is tightly structured with clear sections: summary, endpoint info, When to Use, When NOT to Use, Returns, Examples, and Error Handling. It front-loads the core purpose and avoids redundancy. Every sentence adds distinct value, and the length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all aspects an agent needs: purpose, usage context, differentiation from siblings, parameter semantics, return format, example calls, and error handling. Even though an output schema exists, the description explains the return structure (markdown table with specific columns) and raw JSON fallback, making it self-sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains each parameter's effect: asset filtering (with the default behavior of returning all positive balances), need_btc_valuation for BTC valuation, and response_format for markdown vs raw JSON. It provides concrete examples of parameter usage, adding meaning that the schema alone does not convey, especially given the schema's terse descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement: 'List the Spot wallet's non-zero balances, optionally valued in BTC.' It specifies the resource (Spot wallet), the verb (list), and the scope (non-zero balances). It explicitly differentiates from the full account endpoint and names sibling tools to avoid confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to Use' and 'When NOT to Use' sections are explicit, naming binance_get_spot_account and binance_get_funding_wallet as alternatives with the exact conditions that select them. It also notes the API's behavior (omits zero balances) that distinguishes it from /api/v3/account, giving clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_wallet_balancesARead-onlyIdempotent
Show one total per wallet: Spot, Funding, Cross/Isolated Margin, Futures, Earn…
Calls GET /sapi/v1/asset/wallet/balance (SIGNED, IP weight 60 — 60 of the
12000/min /sapi IP budget, so it is fine occasionally but not in a poll loop).
Binance returns one row per wallet with its total value in quote_asset and whether
the wallet is activated.
When to Use:
First call when asking "where is my money" — it says which wallets hold anything before you spend weight listing assets wallet by wallet.
Before a transfer, to confirm the source wallet actually holds the balance.
When NOT to Use:
For per-asset detail — use
binance_get_user_assets(Spot) orbinance_get_funding_wallet(Funding).For a daily history of balances — use
binance_get_account_snapshot(wallet_account.py), which is far heavier (IP 2400).
Returns:
A markdown table of wallet / activated / balance in the quote asset, plus the sum,
or the raw Binance array with response_format="json".
Examples: params = {} params = {"quote_asset": "USDT"}
Error Handling:
-2015 means the key lacks Reading permission or this IP is not allowlisted. A 404
means the base URL has no /sapi (the spot testnet).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, but the description adds substantial behavioral context beyond that: the SIGNED endpoint, IP weight 60 relative to the 12000/min budget, the one-row-per-wallet result shape with quote_asset valuation and activation status, markdown vs json output, and specific error code meanings (2015, 404). This goes well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clear, front-loaded sections: core purpose, endpoint/rate context, when to use, when not to use, returns, examples, and error handling. Every section adds distinct value and there is no filler or repetition of structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only wallet aggregation tool, the description covers everything an agent needs: rate-limit implications, usage guidance, alternatives, return format, example parameter values, and error handling. The output schema and annotations cover the remaining structured aspects, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite the context signal indicating 0% schema description coverage, the description reinforces parameter meaning: it explains quote_asset as the currency each wallet total is valued in, gives concrete examples ({}, {'quote_asset': 'USDT'}), and clarifies response_format behavior (markdown vs raw JSON). The input schema itself also contains descriptions, so the description adds value on top rather than carrying the full burden alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Show one total per wallet') and lists the wallet types covered (Spot, Funding, Margin, Futures, Earn). It names the exact endpoint and differentiates itself from sibling tools in the 'When NOT to Use' section, so an agent can clearly tell it apart without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes dedicated 'When to Use' and 'When NOT to Use' sections with concrete conditions (e.g., first call for 'where is my money', before a transfer) and explicitly names alternatives like binance_get_user_assets, binance_get_funding_wallet, and binance_get_account_snapshot. It also provides rate-limit context for why it shouldn't be polled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_get_withdraw_historyARead-onlyIdempotent
List crypto withdrawals out of the account for one window (up to 90 days).
Calls GET /sapi/v1/capital/withdraw/history (SIGNED). This is a read — this
server can never submit a withdrawal: POST /sapi/v1/capital/withdraw/apply is on
the client's forbidden-path list and no tool exists for it.
⚠️ Cost: UID weight 18000 per call (a tenth of the 180000/min per-account
budget) and a hard limit of 10 requests per second on this endpoint — Binance
reports the per-second usage in X-SAPI-USED-UID-WEIGHT-1S. Do not poll it.
Each row includes transactionFee, the network fee Binance charged for that
withdrawal, so the true cost of moving funds out is readable here.
When to Use:
"Did my withdrawal go through, and what did it cost?" — a recent, bounded lookup.
Looking up specific withdrawals by
withdraw_order_idorid_list.
When NOT to Use:
For the full history since the account opened — use
binance_get_all_withdrawals, which budgets these expensive calls for you.For deposits — use
binance_get_deposit_history.To MAKE a withdrawal — impossible by design; use the Binance app.
Returns:
A markdown table (applyTime, completeTime, coin, amount, transactionFee, network,
status, walletType, txId, withdrawOrderId) plus per-coin totals including fees,
capped at 50 displayed rows; or the raw Binance array with
response_format="json".
Pagination:
limit is 1-1000 (Binance default 1000) and offset pages within the window.
id_list accepts at most 45 ids and is sent comma-separated.
Windows:
start_time/end_time together must span under 90 days — under 7 days when
withdraw_order_id is set (Binance's own rule; it also defaults to the last 7
days in that case). Both caps are enforced locally.
Examples: params = {"coin": "BTC", "status": "completed"} params = {"start_time": "2026-08-01", "end_time": "2026-09-01"} params = {"id_list": ["b6ae22b3aa844210a7041aee7589627c"], "response_format": "json"}
Error Handling: An over-wide window is rejected locally. -2015 means the key lacks Reading permission or this IP is not allowlisted. A 429 here means the 10 req/s ceiling was hit — back off, do not retry in a loop.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint), the description discloses critical operational behavior: the endpoint is SIGNED, the server can never submit a withdrawal, there is a UID weight cost of 18000 per call and a 10 req/s hard limit, and 429 handling is specified. It also covers local enforcement of window caps and authentication errors (-2015). This adds significant context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: purpose is front-loaded, followed by cost/rate limits, usage guidance, return format, pagination, windows, examples, and error handling. The use of headings and bullet lists makes it scannable, and there is no redundant prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of an output schema, the description covers all agent-relevant aspects: safety (read-only, no withdrawal submission), cost/rate limits, authentication errors, pagination, window constraints, output formats, and examples. Error handling is also included, making the description self-sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage reported at 0%, the description carries full responsibility for parameter meaning. It explains limit range and default, offset paging, id_list max 45 and comma-separated format, window caps (90 days; 7 days with withdraw_order_id), response_format options, and provides three concrete examples covering coin/status, time windows, and id_list+json. This fully compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+scope: 'List crypto withdrawals out of the account for one window (up to 90 days)'. It explicitly differentiates from siblings by naming binance_get_all_withdrawals for full history and binance_get_deposit_history for deposits, so an agent can immediately distinguish it from similar tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to Use' and 'When NOT to Use' sections give explicit guidance including concrete scenarios ('Did my withdrawal go through...?'), alternative tool names, and a clear exclusion ('To MAKE a withdrawal — impossible by design'). This leaves no ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_health_checkARead-onlyIdempotent
Verify connectivity, clock drift, and API-key permissions against Binance.
Calls GET /api/v3/ping and GET /api/v3/time (public), then — when
credentials are configured — GET /sapi/v1/account/apiRestrictions (signed)
to report what the key is allowed to do. Also states whether the trading
kill-switch (BINANCE_ALLOW_TRADING) is on.
When to Use:
As the first call after configuring the server, to confirm the key signs correctly.
To debug -1021 (clock drift), -1022 (signature), or -2015 (permissions / IP) errors.
When NOT to Use:
To read balances (use the spot/wallet account tools).
Returns:
A markdown block with connectivity, server time vs local drift, the key's
permission flags (withdrawals should be OFF, IP restriction ON), and the
kill-switch state — or an Error ... string describing the failure.
Error Handling: -2015 means the key's IP allowlist excludes this machine or the key lacks Reading; -1022 means the secret / key type is wrong; on the spot testnet the /sapi call is skipped because the testnet has no wallet endpoints.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by documenting conditional endpoint selection (public /sapi only when credentials configured), testnet skip behavior, and error-code meanings. No contradiction with readOnly/idempotent hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose, then concise sections for usage, returns, and error handling; each sentence carries operational value and no content is redundant with annotations or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Describes exact return format (markdown block or Error string), conditional execution, and failure semantics, fully covering what an agent needs for a zero-parameter read-only health check.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so schema coverage is trivially 100% and baseline is 4. The description adds credential-dependent behavior context rather than parameter syntax, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Verify connectivity, clock drift, and API-key permissions against Binance') and later clarifies its diagnostic role, differentiating it from balance-reading siblings via the 'When NOT to Use' note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'When to Use' (first call after configuring server, debugging -1021/-1022/-2015) and 'When NOT to Use' with a direct alternative ('use the spot/wallet account tools'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_place_convert_limit_orderA
Place a convert LIMIT order: convert automatically if the ratio is reached.
Calls POST /sapi/v1/convert/limit/placeOrder (SIGNED, UID weight 500). The
order rests until limit_price is reached or expired_type (1_D / 3_D / 7_D / 30_D)
expires it. When it triggers it spends real funds, without asking again.
Kill-switch. Refused with Error: … trading is disabled … unless the server runs
with BINANCE_ALLOW_TRADING=1. The gate lives in the HTTP client, so no tool can
bypass it.
Check the pair's limits with binance_get_convert_pairs and the amount precision with
binance_get_convert_asset_info first; there is no dry-run for this endpoint.
When to Use:
To convert at a ratio the market is not offering right now, after a human approved that price and size.
When NOT to Use:
To convert at the current ratio — quote it with
binance_get_convert_quoteand accept it, which is immediate and shows you the exact ratio first.For a spot LIMIT order on a trading pair — that is
binance_place_order, a different book with different fees.
Returns:
A confirmation echoing exactly what Binance returned — orderId and status verbatim.
A resting order is not a conversion: nothing has been exchanged until it triggers, and
this confirmation never says otherwise.
Examples: params = {"base_asset": "BTC", "quote_asset": "USDT", "limit_price": "50000", "side": "BUY", "expired_type": "7_D", "quote_amount": "500"}
Error Handling:
A rejection about limits means the amount is outside the pair's min/max
(binance_get_convert_pairs); -1111 means too many decimals for the asset
(binance_get_convert_asset_info); a 5xx or timeout means the order's status is
UNKNOWN — check binance_get_convert_open_limit_orders before placing it again.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavior beyond annotations: it 'spends real funds, without asking again', has a kill-switch tied to BINANCE_ALLOW_TRADING=1, has no dry-run, and clarifies that a resting order is not yet a conversion. It also explains ambiguous error cases such as 5xx/timeout leaving status UNKNOWN. No contradiction with the annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: risk warning, endpoint context, when/when-not, return semantics, example, and error handling. It is front-loaded with the most important behavioral warning about spending real funds and organized with clear headers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a fund-spending, non-idempotent order placement tool, it covers prerequisites, alternatives, return semantics, error ambiguity, and the no-dry-run constraint. The description is complete enough for an agent to invoke the tool correctly and know what to check before and after calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents each parameter in its $defs, including enum meanings and the exactly-one-of base_amount/quote_amount rule. The description adds value through a concrete example and by mapping errors to specific parameters (limit errors to binance_get_convert_pairs, -1111 to binance_get_convert_asset_info), which helps the agent choose values correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: 'Place a convert LIMIT order: convert automatically if the ratio is reached' and names the exact endpoint. It is clearly distinguished from sibling order-placing tools like binance_place_order and binance_accept_convert_quote.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description has explicit 'When to Use' and 'When NOT to Use' sections naming alternatives: binance_get_convert_quote for immediate conversions and binance_place_order for spot LIMIT orders. It also tells the agent to check pair limits and asset precision first via binance_get_convert_pairs and binance_get_convert_asset_info.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_place_oco_orderA
Place a REAL one-cancels-the-other pair (take-profit + stop). This spends real money.
Calls POST /api/v3/orderList/oco (SIGNED, IP weight 1, unfilled-order count 2). Both
legs carry the same quantity and the same side; when one triggers, Binance cancels
the other. This is the bracket around a position you already hold (SELL) or the
breakout/dip pair for one you want (BUY).
Kill-switch. This call is refused with Error: … trading is disabled … unless the
server runs with BINANCE_ALLOW_TRADING=1. The gate lives in the HTTP client, so no
tool can bypass it. If you see that error, the operator has deliberately put the server
in read-only mode — report it, do not try to work around it.
There is no dry-run for a list. binance_test_order validates ONE order, not a
list; run it per leg if you want Binance's filter check before committing.
Leg rules, enforced locally before anything is signed:
exactly one take-profit leg (LIMIT_MAKER / TAKE_PROFIT / TAKE_PROFIT_LIMIT) and one stop leg (STOP_LOSS / STOP_LOSS_LIMIT);
on a SELL the take-profit leg is the
aboveone, on a BUY it is thebelowone;the above leg's price must be strictly greater than the below leg's. Binance's full rule is
above > last traded price > below, and this server does not know the last traded price — only the relationship between the two prices you pass is checked here. Read the market withbinance_get_ticker_pricefirst.
When to Use:
Bracketing an open position with a target and a stop in one atomic request.
Any time two orders must be mutually exclusive — placing them separately risks both filling.
When NOT to Use:
For a single order —
binance_place_order(spot_orders.py).When the bracket should only arm after an entry fills — that is
binance_place_otoco_order.To change an existing list: cancel it with
binance_cancel_order_listand place a new one; there is no amend for lists.
Returns:
A confirmation echoing exactly what Binance returned: orderListId, contingencyType,
listStatusType, listOrderStatus, listClientOrderId, and a ### Legs table built from
orderReports when the response carries one (ids only otherwise, and it says so).
Nothing is inferred.
Examples: params = {"symbol": "BTCUSDT", "side": "SELL", "quantity": "0.001", "above_type": "LIMIT_MAKER", "above_price": "72000.00", "below_type": "STOP_LOSS_LIMIT", "below_price": "58000.00", "below_stop_price": "58500.00", "below_time_in_force": "GTC", "list_client_order_id": "btc-bracket-001"} params = {"symbol": "BTCUSDT", "side": "BUY", "quantity": "0.001", "above_type": "STOP_LOSS_LIMIT", "above_price": "71000.00", "above_stop_price": "70500.00", "above_time_in_force": "GTC", "below_type": "LIMIT_MAKER", "below_price": "60000.00"}
Error Handling:
Error: … trading is disabled …→ the kill-switch is off; nothing was sent.-2010 → insufficient balance, a symbol filter (LOT_SIZE / PRICE_FILTER / NOTIONAL), or the pair sits on the wrong side of the last traded price.
-2021 means a LIMIT_MAKER leg would have taken liquidity immediately.
-1013 / -1111 are precision / filter errors — read
binance_get_exchange_info.A 5xx or a timeout means the execution status is UNKNOWN — the list may well be live. Query it with
binance_get_order_list(bylist_client_order_idif you set one) before doing anything else. NEVER resend blindly.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description substantially exceeds the coarse annotations (readOnlyHint=false, openWorldHint=true). It discloses a server-side kill-switch with BINANCE_ALLOW_TRADING=1, explains that no tool can bypass it, warns that 5xx/timeout means execution status is UNKNOWN, and details error codes including -2010, -2021, -1013, -1111. This is exactly the behavioral context an agent needs for a real-money mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: real-money warning, kill-switch, no-dry-run caveat, leg rules, usage routing, return format, examples, and error handling. It is front-loaded with the most critical fact first and uses clear headings and bullets, making the density navigable rather than bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, high-risk OCO order tool with many interdependent parameters, the description is complete. It covers preconditions, local validation, the missing last-traded-price constraint, return behavior, examples, and error recovery. An agent selecting and invoking this tool would not need to guess about side effects, failure ambiguity, or how to verify outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the top-level schema coverage is reported as 0%, the description compensates with high-value semantic rules: both legs share the same quantity and side, the above/below price relationship must satisfy above > below, SELL means the take-profit leg is above while BUY means it is below, and the server cannot verify against last traded price. The two complete examples also disambiguate how the many optional fields fit together.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Place a REAL one-cancels-the-other pair (take-profit + stop).' It immediately states the real-money consequence and names the endpoint. It also distinguishes itself from siblings in the 'When NOT to Use' section, explicitly routing to binance_place_order for single orders and binance_place_otoco_order for delayed brackets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is a dedicated 'When to Use' and 'When NOT to Use' section with explicit alternatives: binance_place_order for single orders, binance_place_otoco_order for post-entry brackets, and binance_cancel_order_list for amending lists. It also states there is no dry-run for lists and tells the agent to use binance_test_order per leg, making the routing decision unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_place_orderA
Place a REAL spot order on Binance. This spends real money.
Calls POST /api/v3/order (SIGNED, IP weight 1, unfilled-order count 1). A MARKET
order executes immediately at whatever the book offers; a LIMIT order rests until it
fills, expires or is cancelled.
Kill-switch. This call is refused with Error: … trading is disabled … unless
the server runs with BINANCE_ALLOW_TRADING=1. The gate lives in the HTTP client, so
no tool can bypass it. If you see that error, the operator has deliberately put the
server in read-only mode — report it, do not try to work around it.
Always run binance_test_order first with identical parameters: it is allowed
even with the kill-switch off and catches filter/precision rejections for free.
When to Use:
After a dry-run passed and the human has approved this specific order.
To act on a decision that already names symbol, side, type, quantity and price.
When NOT to Use:
To "see if it would work" — that is
binance_test_order.For a bracket/OCO (entry plus stop plus target) — use the order-list tools in
order_lists.py, which place the legs atomically.To modify a resting order — use
binance_cancel_replace_order, which does not leave you unhedged between the two calls.
Returns:
A confirmation echoing exactly what Binance returned: symbol, orderId,
clientOrderId, status, executedQty, cummulativeQuoteQty, and the fills table when the
response carries one. Nothing is inferred: with new_order_resp_type="ACK" Binance
reports only the ids, and the confirmation says so rather than implying a fill. When
Binance answers EXPIRED / EXPIRED_IN_MATCH / REJECTED the heading reads Order NOT
live — an IOC/FOK that never rested is not a placed order.
Examples: params = {"symbol": "BTCUSDT", "side": "BUY", "type": "LIMIT", "time_in_force": "GTC", "quantity": "0.001", "price": "20000.00", "new_client_order_id": "my-entry-001"} params = {"symbol": "BTCUSDT", "side": "SELL", "type": "MARKET", "quantity": "0.001"} params = {"symbol": "BTCUSDT", "side": "SELL", "type": "STOP_LOSS_LIMIT", "time_in_force": "GTC", "quantity": "0.001", "price": "19000.00", "stop_price": "19100.00"}
Error Handling:
Error: … trading is disabled …→ the kill-switch is off; nothing was sent.-2010 (order rejected) → insufficient balance, or a symbol filter: quantity off the LOT_SIZE step, price off the PRICE_FILTER tick, or the order under the NOTIONAL minimum. Read the filters with
binance_get_exchange_infoand re-run the dry-run.-1013 / -1111 are the same family (precision / filter).
-2021 means a LIMIT_MAKER would have taken liquidity immediately.
A 5xx or a timeout means the execution status is UNKNOWN — the order may well be live. Query it with
binance_get_order(bynew_client_order_idif you set one) orbinance_get_open_ordersbefore doing anything else. NEVER resend blindly: a duplicate market order is real money lost.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the kill-switch behavior and `BINANCE_ALLOW_TRADING=1` requirement, real-money risk, market-vs-limit execution semantics, and the critical unknown-state-after-5xx behavior. It also warns never to blindly resend a duplicate market order. Annotations already mark `readOnlyHint: false`, and the description reinforces that rather than contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though long, the description is tightly structured with bold section headers, bullet risk callouts, and clean example blocks. Every section serves a purpose: endpoint metadata, kill-switch, usage boundaries, return behavior, and error handling. The length is justified by the high-stakes nature of real-money trading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that places real orders, the description covers everything needed to call it safely: the operational precondition, pre-flight testing requirement, when-not-to-use alternatives, response semantics, error taxonomy, and post-timeout verification steps. The output schema is also present, so return-value details are reinforced by structured data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful behavioral context for order types (MARKET executes immediately, LIMIT rests) and maps error codes to parameter issues like LOT_SIZE and PRICE_FILTER. The input schema's $defs already provides thorough per-parameter descriptions, so the description doesn't need to repeat every field. Examples further clarify realistic parameter combinations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Place a REAL spot order on Binance' and names the exact endpoint, making the operation unmistakable. It also differentiates itself from `binance_test_order`, OCO/OTO order-list tools, and `binance_cancel_replace_order`, so an agent can tell this tool apart from its close siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There are explicit 'When to Use' and 'When NOT to Use' sections that name alternatives with conditions: use it only after a dry-run passes, use `binance_test_order` for dry-runs, use order-list tools for OCO brackets, and use `binance_cancel_replace_order` for modifications. The guidance to always run `binance_test_order` first is prescriptive and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_place_otoco_orderA
Place a REAL entry that arms a take-profit/stop pair when it fills. Real money.
Calls POST /api/v3/orderList/otoco (SIGNED, IP weight 1, unfilled-order count 3).
The working leg (LIMIT or LIMIT_MAKER) rests on the book; once it is fully
filled, the two pending legs go on as an OCO pair, so the first of them to
trigger cancels the other. Cancelling any leg kills the whole list.
Kill-switch. Refused with Error: … trading is disabled … unless the server runs
with BINANCE_ALLOW_TRADING=1.
There is no dry-run for a list; binance_test_order validates one order at a time.
Enforced locally before anything is signed (S2 L3571-L3579):
working_type=LIMIT→working_time_in_force;per pending leg — LIMIT_MAKER → price; STOP_LOSS / TAKE_PROFIT → stop price and/or trailing delta; STOP_LOSS_LIMIT / TAKE_PROFIT_LIMIT → price, time-in-force, and stop price and/or trailing delta;
when both pending legs are given, the OCO pairing and the price ordering (
pending_aboveprice >pending_belowprice). The last traded price is unknown to this server, so only the relationship between the prices you pass is checked; Binance applies the fullabove > last traded price > belowrule at trigger time.
Binance marks pending_below_type optional; a list without it is really an OTO, so
pass both pending legs unless you mean to place an OTO.
When to Use:
The full bracket in one request: entry, target and stop, with nothing armed until the entry fills.
When NOT to Use:
When you already hold the position — the bracket alone is
binance_place_oco_order.For entry plus a single follow-up —
binance_place_oto_order.
Returns:
A confirmation echoing orderListId, contingencyType, listStatusType, listOrderStatus,
listClientOrderId and a ### Legs table of all three legs exactly as Binance reported
them (the pending pair shows as PENDING_NEW until the working leg fills).
Examples: params = {"symbol": "BTCUSDT", "working_type": "LIMIT", "working_side": "BUY", "working_price": "60000.00", "working_quantity": "0.001", "working_time_in_force": "GTC", "pending_side": "SELL", "pending_quantity": "0.001", "pending_above_type": "LIMIT_MAKER", "pending_above_price": "66000.00", "pending_below_type": "STOP_LOSS_LIMIT", "pending_below_price": "57000.00", "pending_below_stop_price": "57500.00", "pending_below_time_in_force": "GTC", "list_client_order_id": "full-bracket-001"}
Error Handling:
Error: … trading is disabled …→ the kill-switch is off; nothing was sent.-2010 / -1013 / -1111 are balance, filter and precision failures on any leg.
-2021 means a LIMIT_MAKER leg would have taken liquidity immediately.
A 5xx or a timeout means the execution status is UNKNOWN — query with
binance_get_order_listbefore retrying.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the generic annotations by disclosing that this is a real-money order, that the kill-switch (BINANCE_ALLOW_TRADING=1) can block it, that cancelling any leg kills the whole list, and that a 5xx/timeout leaves execution status UNKNOWN. It also explains the OCO trigger semantics and the local validation rules, giving the agent a clear picture of side effects and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place. Core purpose is front-loaded, and the rest is structured with clear headers, bolded warnings, bullet lists, and a concrete example. There is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage boundaries, return fields, an example, and a full error-handling section including retry guidance. With an output schema present and annotations provided, nothing an agent needs to invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already contains detailed per-parameter descriptions, so the tool description doesn't repeat them. It adds valuable cross-parameter semantics: the working leg must rest on the book, the pending legs form an OCO pair, price ordering is only checked relative to each other (last traded price unknown), and pending_below_type is optional but effectively turns the list into an OTO. The example demonstrates correct usage of all key fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Place a REAL entry that arms a take-profit/stop pair when it fills.' This distinguishes it from the sibling OCO and OTO tools, and the body explicitly names those siblings as alternatives, so an agent can immediately tell what this tool does and what it does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Has dedicated 'When to Use' and 'When NOT to Use' sections that name the exact alternatives (binance_place_oco_order, binance_place_oto_order) and the conditions that select them. Also explains the lack of a list-level dry-run and points to binance_test_order, leaving no ambiguity about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_place_oto_orderA
Place a REAL one-triggers-the-other pair (entry, then follow-up). Real money.
Calls POST /api/v3/orderList/oto (SIGNED, IP weight 1, unfilled-order count 2). The
working leg (LIMIT or LIMIT_MAKER) goes on the book immediately. The pending
leg is only placed once the working leg is fully filled — until then it sits in
PENDING_NEW and does nothing. Cancelling either leg kills the whole list.
Kill-switch. Refused with Error: … trading is disabled … unless the server runs
with BINANCE_ALLOW_TRADING=1.
There is no dry-run for a list; binance_test_order validates one order at a time.
Mandatory extras, enforced locally (S2 L3419):
working_type=LIMIT→working_time_in_force;pending_type=LIMIT→pending_price,pending_time_in_force;pending_type=STOP_LOSS|TAKE_PROFIT→pending_stop_priceand/orpending_trailing_delta;pending_type=STOP_LOSS_LIMIT|TAKE_PROFIT_LIMIT→pending_price,pending_time_in_force, andpending_stop_priceand/orpending_trailing_delta;pending_type=LIMIT_MAKER→pending_price. A MARKET pending leg is allowed, but only bypending_quantity— Binance does not supportquoteOrderQtyinside a list, and this server never sends it.
When to Use:
Entry plus a single exit: buy at a limit, and the moment it fills, arm one stop.
Chaining two orders where the second must not exist until the first is done.
When NOT to Use:
When the follow-up should be a target AND a stop — use
binance_place_otoco_order.When both orders should be live at once — that is
binance_place_oco_order.
Returns:
A confirmation echoing orderListId, contingencyType, listStatusType, listOrderStatus,
listClientOrderId and a ### Legs table. A pending leg reported as PENDING_NEW is
NOT on the book yet; the table shows exactly what Binance said and nothing more.
Examples: params = {"symbol": "BTCUSDT", "working_type": "LIMIT", "working_side": "BUY", "working_price": "60000.00", "working_quantity": "0.001", "working_time_in_force": "GTC", "pending_type": "LIMIT", "pending_side": "SELL", "pending_quantity": "0.001", "pending_price": "66000.00", "pending_time_in_force": "GTC", "list_client_order_id": "entry-then-target-001"} params = {"symbol": "BTCUSDT", "working_type": "LIMIT_MAKER", "working_side": "BUY", "working_price": "60000.00", "working_quantity": "0.001", "pending_type": "STOP_LOSS", "pending_side": "SELL", "pending_quantity": "0.001", "pending_stop_price": "57000.00"}
Error Handling:
Error: … trading is disabled …→ the kill-switch is off; nothing was sent.-2010 / -1013 / -1111 are balance, filter and precision failures on either leg.
-2021 means the working LIMIT_MAKER would have taken liquidity immediately.
A 5xx or a timeout means the execution status is UNKNOWN — query with
binance_get_order_listbefore retrying; a duplicate entry is real money.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the sparse annotations (readOnlyHint=false, idempotentHint=false). It discloses that the pending leg sits in PENDING_NEW until the working leg fully fills, cancelling either leg kills the list, a BINANCE_ALLOW_TRADING=1 kill-switch gates execution, there is no list-level dry-run, and 5xx/timeout leaves execution status unknown. This is exactly the behavioral context an agent needs for a real-money operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every block earns its place: API endpoint, execution mechanics, kill-switch, dry-run limitation, mandatory parameter extras, use/non-use guidance, return semantics, examples, and error handling. The 'Real money' warning is front-loaded and the headings make the content scannable rather than bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, irreversible, real-money tool with an output schema present, the description covers execution semantics, error codes, retry guidance, and parameter interactions. Nothing an agent needs to select or invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite the 0% schema coverage signal, the description compensates with the mandatory-extras mapping for each pending_type, the MARKET quoteOrderQty restriction, and two complete parameter examples. It does not walk through every optional field such as icebergs or strategy IDs, but those already carry their own schema descriptions and are not needed for a correct base invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it places a real one-triggers-the-other order pair with a working leg and a pending leg. It is unmistakably differentiated from sibling tools by explicitly naming binance_place_otoco_order and binance_place_oco_order as different behaviors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes dedicated 'When to Use' and 'When NOT to Use' sections. It explicitly routes to binance_place_otoco_order when both a target and a stop are needed, to binance_place_oco_order when both orders should be live at once, and to binance_test_order for single-order validation, leaving no ambiguity about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_place_twap_orderA
Place a REAL spot TWAP algo order on Binance. This spends real money.
Calls POST /sapi/v1/algo/spot/newOrderTwap (SIGNED, UID weight 3000 of a
180,000/min budget — call it sparingly). Binance splits quantity into sub-orders and
works them over duration seconds, aiming at the time-weighted average price instead
of taking the book in one hit.
Kill-switch. This call is refused with Error: … trading is disabled … unless the
server runs with BINANCE_ALLOW_TRADING=1. The gate lives in the HTTP client, so no
tool can bypass it. If you see that error, the operator has deliberately put the
server in read-only mode — report it, do not try to work around it.
Binance's own constraints, all rejected server-side if broken:
duration300-86400 seconds (5 minutes to 24 hours) — checked locally too.Minimum notional ≈ 1,000 USDT equivalent per algo order (the docs also quote a per-symbol maximum of 200k / 2mm / 10mm; let the API arbitrate the ceiling).
At most 20 open algo orders at a time — check with
binance_get_open_algo_ordersbefore adding another.client_algo_id, when supplied, must be exactly 32 characters.
success: true means ACCEPTED, NOT EXECUTED. The response carries no fill
information at all; it only says Binance took the order. What actually traded is
visible through binance_get_open_algo_orders, binance_get_algo_order_history and
binance_get_algo_sub_orders.
When to Use:
Working a position that is large relative to the book, where a single MARKET order would move the price against you.
Spreading an entry or exit over minutes or hours on purpose.
When NOT to Use:
For an ordinary immediate or resting order — use
binance_place_order(spot_orders.py); it is weight 1, not 3000, and has no notional floor.Below ~1,000 USDT of notional — the API rejects it; place a normal order instead.
For USDⓈ-M / COIN-M futures TWAP or VP — that is a different product on a different wallet and this server does not implement it.
Returns:
A confirmation echoing exactly the four fields Binance returned — clientAlgoId,
success, code, msg — plus an explicit note that the order is accepted and not
executed, and which tool to poll. A success: false body (Binance answers those with
HTTP 200) is rendered as Error: <msg> (code <code>), never as a confirmation.
Examples: params = {"symbol": "BTCUSDT", "side": "BUY", "quantity": "0.5", "duration": 3600} params = {"symbol": "BTCUSDT", "side": "SELL", "quantity": "1.25", "duration": 7200, "limit_price": "65000.00", "client_algo_id": "abcdefghijklmnopqrstuvwxyz012345"}
Error Handling:
Error: … trading is disabled …→ the kill-switch is off; nothing was sent.A duration outside 300-86400 or a 31-character
client_algo_idfails locally, before anything is signed.-2010 / -1013 point at balance, the notional floor or a symbol filter; -2015 means the key lacks Spot & Margin Trading permission or this IP is not allowlisted.
A 5xx or a timeout means the execution status is UNKNOWN — the algo order may well be live. Check
binance_get_open_algo_orders(andbinance_get_algo_order_history) before doing anything else. NEVER resend blindly: a duplicate TWAP is a second position, and each one eats one of the 20 slots.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by disclosing the signed endpoint and UID weight 3000 rate limit, the BINANCE_ALLOW_TRADING=1 kill-switch and its non-bypassable gate, and the crucial fact that success:true means ACCEPTED, NOT EXECUTED. It also covers ambiguous outcomes on 5xx/timeout, duplicate-order risk, and what tools to poll for actual fills.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, the description is exceptionally well-structured with clear headings (kill-switch, constraints, success semantics, when to use, returns, examples, error handling) and front-loads the most critical warning ('spends real money'). Every section earns its place by providing operational guidance a model needs to call this high-stakes tool safely.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a real-money trading tool with no idempotency and ambiguous failure modes, the description is comprehensive: it covers constraints, rate limits, safety gates, response semantics, polling paths, error codes, and timeout behavior. An agent has everything needed to avoid blind resends and to route to the correct polling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the schema has some property descriptions, the description adds material runtime meaning: duration is checked locally, quantity is sent verbatim with a ~1,000 USDT notional floor, limit_price changes sub-orders to LIMIT vs market, and client_algo_id enables traceable retries and must be exactly 32 characters. These behavioral details are not present in the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Place a REAL spot TWAP algo order on Binance. This spends real money,' naming a specific verb, resource, and order type. It further distinguishes from siblings by explicitly saying when NOT to use it (use binance_place_order for ordinary orders, and futures TWAP is a different product).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Includes dedicated 'When to Use' and 'When NOT to Use' sections with explicit conditions: large orders relative to the book, intentional spreading over time, notional below ~1,000 USDT, and futures products. It also names the alternative tool (binance_place_order) and tells the agent to check binance_get_open_algo_orders before exceeding the 20-open-algo-order limit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_test_orderARead-onlyIdempotent
Validate an order against Binance's filters WITHOUT sending it to the order book.
Calls POST /api/v3/order/test (SIGNED, IP weight 1 — 20 with
compute_commission_rates). Binance runs the same validation as a real placement
(signature, recvWindow, symbol status, LOT_SIZE / PRICE_FILTER / NOTIONAL, balance
rules) and returns {} on success: nothing is matched, nothing rests on the book,
no funds move.
This tool is always allowed. It is on the client's POST_READ_ALLOWLIST, so it
works with the trading kill-switch off (BINANCE_ALLOW_TRADING unset) — which makes
it the right first step before every binance_place_order call.
When to Use:
Always, immediately before placing a real order, to catch a filter or precision error for free.
With
compute_commission_rates=trueto learn the fee rates that would apply.
When NOT to Use:
To actually trade — that is
binance_place_order.To check a symbol's filters in the abstract —
binance_get_exchange_info(market_data.py) lists tick size, step size and min notional directly.
Returns:
A confirmation that the order passed validation (and the commission-rate breakdown
when requested). A rejection comes back as an Error: line quoting Binance's reason.
Examples: params = {"symbol": "BTCUSDT", "side": "BUY", "type": "LIMIT", "time_in_force": "GTC", "quantity": "0.001", "price": "20000.00"} params = {"symbol": "BTCUSDT", "side": "SELL", "type": "MARKET", "quantity": "0.001", "compute_commission_rates": True}
Error Handling:
-1013/-2010 point at a symbol filter (step size, tick size, min notional); -1111 is a
precision error — check binance_get_exchange_info. -2015 means the key lacks Spot
Trading permission or this IP is not allowlisted. The per-type mandatory parameter
sets are checked locally, so those failures never reach Binance.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds substantial behavioral context: it runs the same validation as a real placement, returns {} on success, never matches or rests on the book, and is always allowed even with the trading kill-switch off. It also discloses error semantics and IP weight. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: purpose, when to use, when not to use, returns, examples, and error handling. Every sentence earns its place, and the most important scoping information is front-loaded. Despite its length, it is efficiently organized for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description is complete: it covers the endpoint, safety profile, usage context, return behavior, error codes, and provides two concrete examples. The output schema exists, so return values need not be fully re-explained. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the top-level params object, but the nested TestOrderInput schema is extremely rich, documenting every field with Binance names, formats, and per-type mandatory sets. The description adds value by explaining the compute_commission_rates weight increase and the local validation of mandatory parameter sets. Since the schema already carries the heavy lifting, a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Validate an order against Binance's filters WITHOUT sending it to the order book.' It names the exact endpoint, distinguishes itself from real order placement, and clearly differentiates from siblings like binance_place_order and binance_get_exchange_info. The purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description has explicit 'When to Use' and 'When NOT to Use' sections. It states to always use before binance_place_order, and explicitly excludes actual trading (binance_place_order) and abstract filter checks (binance_get_exchange_info). This is exemplary routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
binance_transfer_between_walletsA
Move funds between the account's OWN wallets (Spot ⇄ Funding ⇄ Margin ⇄ Futures).
Calls POST /sapi/v1/asset/transfer (SIGNED, UID weight 300 of the 180000/min
UID budget). The funds stay inside this Binance account: this is an internal move
between wallets, never a transfer to another user and never a withdrawal off the
platform. No tool in this server can send funds out of Binance.
Kill-switch. This call is refused with Error: … trading is disabled … unless
the server runs with BINANCE_ALLOW_TRADING=1. The gate lives in the HTTP client,
so no tool can bypass it. If you see that error, the operator has deliberately put
the server in read-only mode — report it, do not try to work around it.
Key permission. The API key additionally needs the "Permits Universal
Transfer" flag; without it Binance rejects the call even with the kill-switch on.
binance_get_api_restrictions (wallet_account.py) reports it as
permitsUniversalTransfer.
The isolated-margin directions need the pair named — from_symbol for
ISOLATEDMARGIN_MARGIN and ISOLATEDMARGIN_ISOLATEDMARGIN, to_symbol for
MARGIN_ISOLATEDMARGIN and ISOLATEDMARGIN_ISOLATEDMARGIN. Both rules are checked
locally, so a malformed transfer fails before anything is signed or sent.
When to Use:
After a human has approved this specific movement of this specific amount.
To fund Binance Pay (MAIN_FUNDING) or to sweep Funding back to Spot (FUNDING_MAIN).
When NOT to Use:
To send crypto to another exchange or wallet — this server never withdraws.
To swap one asset for another — that is the convert tools (convert.py) or a spot order (
binance_place_order).To check what a past transfer did — use
binance_get_transfer_history.
Returns:
A confirmation echoing exactly what Binance returned, which is only the tranId.
Binance sends no status field on this endpoint, so the confirmation says the transfer
was accepted and points at binance_get_transfer_history /
binance_get_wallet_balances to verify it settled. It never claims a balance changed.
Examples: params = {"type": "MAIN_FUNDING", "asset": "USDT", "amount": "25.5"} params = {"type": "FUNDING_MAIN", "asset": "BNB", "amount": "0.1"} params = {"type": "MARGIN_ISOLATEDMARGIN", "asset": "USDT", "amount": "100", "to_symbol": "BTCUSDT"}
Error Handling:
Error: … trading is disabled …→ the kill-switch is off; nothing was sent.-2015 / "permission denied" → the key lacks "Permits Universal Transfer", or this IP is not allowlisted.
-3020 / insufficient balance → the source wallet does not hold the amount.
A 5xx or a timeout means the transfer status is UNKNOWN — it may have gone through. Check
binance_get_transfer_historyfor the same type before retrying; never resend blindly.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations indicate this is a real fund-moving operation (readOnlyHint=false, idempotentHint=false) and the description substantially enriches that: it discloses the kill-switch gate (BINANCE_ALLOW_TRADING=1), the 'Permits Universal Transfer' key permission, the UID weight 300 rate limit, the local validation of isolated-margin rules, and the critical caveat that a 5xx/timeout leaves status UNKNOWN and should never be blindly retried. This goes far beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but impeccably structured with clear headers (When to Use, When NOT, Returns, Examples, Error Handling). Every section earns its place, and the core purpose is front-loaded in the first sentence. There is no filler; the detail is dense but purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the operation (31 transfer directions, isolated-margin special cases, kill-switch, permission, unknown status on failure), the description covers every aspect an agent needs to call it safely: it explains the return value (only tranId), points to verification tools, lists error codes, and warns about idempotency. The output schema is not present but the description fully explains the return behavior, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema already provides thorough descriptions for all five parameters (including the enum meaning and isolated-margin pair requirements), the description adds value through two concrete examples and reiterates the from_symbol/to_symbol rules for isolated margin. It also explains the decimal-string amount requirement indirectly via the example. The schema carries the heavy lifting, so a 4 is appropriate rather than a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description immediately states 'Move funds between the account's OWN wallets' with a clear verb and resource, and explicitly distinguishes internal moves from transfers to other users and withdrawals. It names the exact endpoint and scopes the operation precisely, making it unmistakable what the tool does and how it differs from external transfer tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes dedicated 'When to Use' and 'When NOT to Use' sections, explicitly listing approved scenarios (after human approval, funding Pay, sweeping Funding back to Spot) and exclusions (external transfers, swaps, checking history). It names sibling alternatives like convert tools and binance_get_transfer_history, leaving no ambiguity about when to select this tool.
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.
83 tool updates
v0.1.0- First observed
binance_accept_convert_quote - First observed
binance_cancel_algo_order - First observed
binance_cancel_all_open_orders - First observed
binance_cancel_convert_limit_order - First observed
binance_cancel_order - First observed
binance_cancel_order_list - First observed
binance_cancel_replace_order - First observed
binance_convert_dust_to_bnb - First observed
binance_discover_traded_symbols - First observed
binance_get_account_info - First observed
binance_get_account_snapshot - First observed
binance_get_account_status - First observed
binance_get_agg_trades - First observed
binance_get_algo_order_history - First observed
binance_get_algo_sub_orders - First observed
binance_get_all_deposits - First observed
binance_get_all_my_trades - First observed
binance_get_all_order_lists - First observed
binance_get_all_orders - First observed
binance_get_all_withdrawals - First observed
binance_get_allocations - First observed
binance_get_api_restrictions - First observed
binance_get_api_trading_status - First observed
binance_get_asset_detail - First observed
binance_get_asset_dividends - First observed
binance_get_avg_price - First observed
binance_get_book_ticker - First observed
binance_get_coin_config - First observed
binance_get_commission_rates - First observed
binance_get_convert_asset_info - First observed
binance_get_convert_history - First observed
binance_get_convert_open_limit_orders - First observed
binance_get_convert_order_status - First observed
binance_get_convert_pairs - First observed
binance_get_convert_quote - First observed
binance_get_delist_schedule - First observed
binance_get_deposit_address - First observed
binance_get_deposit_addresses - First observed
binance_get_deposit_history - First observed
binance_get_dust_convertible - First observed
binance_get_dust_log - First observed
binance_get_earn_account - First observed
binance_get_earn_flexible_positions - First observed
binance_get_earn_locked_positions - First observed
binance_get_exchange_info - First observed
binance_get_fiat_history - First observed
binance_get_fiat_orders - First observed
binance_get_fiat_payments - First observed
binance_get_funding_wallet - First observed
binance_get_klines - First observed
binance_get_my_trades - First observed
binance_get_open_algo_orders - First observed
binance_get_open_order_lists - First observed
binance_get_open_orders - First observed
binance_get_order - First observed
binance_get_order_book - First observed
binance_get_order_list - First observed
binance_get_order_rate_limits - First observed
binance_get_pay_history - First observed
binance_get_pay_transactions - First observed
binance_get_prevented_matches - First observed
binance_get_recent_trades - First observed
binance_get_rolling_ticker - First observed
binance_get_spot_account - First observed
binance_get_system_status - First observed
binance_get_ticker_24h - First observed
binance_get_ticker_price - First observed
binance_get_trade_fees - First observed
binance_get_trading_day_ticker - First observed
binance_get_transfer_history - First observed
binance_get_ui_klines - First observed
binance_get_user_assets - First observed
binance_get_wallet_balances - First observed
binance_get_withdraw_history - First observed
binance_health_check - First observed
binance_place_convert_limit_order - First observed
binance_place_oco_order - First observed
binance_place_order - First observed
binance_place_oto_order - First observed
binance_place_otoco_order - First observed
binance_place_twap_order - First observed
binance_test_order - First observed
binance_transfer_between_wallets
TDQS
Scored across 83 tools
Each of the 83 tools targets a distinct resource+action pairing (e.g., ticker_price vs book_ticker vs ticker_24h vs rolling_ticker vs trading_day_ticker), and the genuinely confusable clusters are separated by explicit cross-references. The 'When NOT to Use' sections consistently name the alternative tool, so an agent can reliably disambiguate even dense groups like the six account-status/wallet tools or the deposit_history/all_deposits pair.
Every tool follows the uniform binance_<verb>_<noun> snake_case convention: binance_get_* for all reads, binance_place_*/binance_cancel_*/binance_accept_* for mutations, with compound verbs like cancel_replace and convert_dust_to_bnb. The only deviations (health_check vs check_health, all_my_trades vs my_trades) are negligible and do not break the pattern.
83 tools is far beyond the 25+ threshold for an overloaded surface, even though the scope (the full Binance spot API) is genuinely broad and every tool maps to a distinct endpoint. The volume will strain agent context windows and slow tool selection; this surface would be easier to navigate split into market-data, trading, and wallet/capital servers.
The surface covers market data, the full spot order lifecycle (test/place/cancel/replace/cancel-all), all three order-list types, convert with quote-accept-limit lifecycle, TWAP algo orders, fiat/pay/earn, wallets, transfers, dust, and capital history — each with single-window and budgeted-walk variants. Every mutation has a documented verification path for UNKNOWN states, and the only omissions (withdrawal creation, futures/margin) are deliberate, explicitly stated design boundaries.
Maintenance
Related MCP Connectors
Binance - 340 tools for market data, order books, and trading pairs
- Era ContextOAuthapp.era
Personal finance, bank account, and shared memory connector for Claude, ChatGPT, Gemini Spark & more
Unified financial infrastructure connecting AI agents directly to trade live/demo brokerage accounts, Web3 non-custodial wallets, real-time market data across equities, ETFs, crypto, forex, options, DeFi swaps, and prediction markets, institutional research feeds, and algorithmic strategy backtesters.
Provide AI agents and automation tools with contextual access to blockchain data including balance…
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to perform cryptocurrency trading operations on Binance exchange through 30 comprehensive tools supporting spot trading, futures contracts, options, account management, market data analysis, and risk control features. Provides enterprise-grade security with local encrypted API key storage and supports multiple account types with sandbox environment testing.9MIT
- AlicenseNot gradedqualityBmaintenanceProvides over 156 tools to interact with the Binance.com global exchange API for spot trading, wallet management, and staking operations. It enables users to execute orders, retrieve market data, and manage crypto assets through natural language interfaces like Claude and ChatGPT.62 npm37MIT
- AlicenseAqualityDmaintenanceEnables Claude to query Binance Spot market data, account balances, and execute trades via natural language, with withdrawals disabled by default for security.11MIT
- AlicenseNot gradedqualityCmaintenanceConnects LLM agents to Binance Spot API for safe market data access and testnet trading with built-in risk controls.84 npmMIT