Skip to main content
Glama

Server Details

Perpetual futures trading for AI agents on the user's own exchange accounts, behind one risk gate.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.3/5.0

Scored across 29 tools

Disambiguation5/5

Tools target clearly distinct actions and resources, and descriptions explicitly disambiguate close vs cancel, stop tightening vs stop rules, alerts vs trigger orders, and account vs risk limits. The many 'Not for… use…' notes make misselection unlikely.

Naming Consistency4/5

Names mostly follow a consistent verb-first snake_case convention (cancel_open_order, get_my_open_positions, preview_perp_order). A few outliers are unusually long or include suffixes like '15m' and 'close_or_notify_later', but the overall pattern remains predictable.

Tool Count2/5

At 29 tools, the surface is heavy for an agent to navigate in a single domain, even though the tools are mostly distinct. The platform is complex, but the count still exceeds a well-scoped 3-15 range and adds selection overhead.

Completeness5/5

The set covers the full trading lifecycle: market comparison, order books, candles, indicators, sizing, preview/execute, positions, orders, stops, take-profits, plans, alerts, permissions, risk limits, trade history, and emergency stop. No obvious lifecycle gap remains for the stated perpetual-futures trading purpose.

Available Tools

29 tools
cancel_open_orderCancel an open orderA
DestructiveIdempotent
Inspect

Cancel one resting order on an exchange. Use to withdraw an unfilled limit order or a take-profit. A held position's stop-loss cannot be cancelled (move it with a new stop or close the position): this keeps every position protected. Not for closing positions (use close_perp_position_reduce_only). Inputs: order_id (from get_my_open_orders), symbol, venue. Works while trading is halted. Next: get_my_open_orders.

NameRequiredDescriptionDefault
venueNoVenue: sandbox, hyperliquid, okx, bybit or binance. Omitted: the agent's only venue, else hyperliquid, else your only connected venue, else sandboxhyperliquid
symbolYesBase coin, e.g. BTC
order_idYesFrom get_my_open_orders

Output Schema

NameRequiredDescription
okYesFalse when rejected or failed
feeNoOnce executed: the trading fee, estimated at once and replaced by the amount the exchange charged once its fill records show it
errorNoWhy it was rejected or failed
venueNoVenue name
checksNoChecks run at execution
sl_oidNoVenue order id of the protective stop
statusYespending_approval, armed (a trigger entry waiting for its price), executed, rejected, failed, expired, declined, cancelled, or executing (TradeHub has not confirmed the outcome yet: check get_order_request_status)
receiptNoSigned receipt (compact JWS, EdDSA) once executed: request, checks, preview price, fill, slippage, order ids, delegation. Verify with /.well-known/tradehub-receipts.jwks
order_idNoVenue order id of the fill
fill_priceNoAverage fill, USD per coin
request_idYesOrder request id; get_order_request_status(request_id) follows it
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
filled_sizeNoFilled size, in the base coin (e.g. BTC), not USD
take_profitsNoset_take_profit_levels: the take-profits now on the exchange
trigger_priceNostatus armed: opens at market when the mark reaches this, USD per coin
trigger_expires_atNostatus armed: when it lapses unless reached, ISO 8601 UTC
approval_expires_atNoWhile pending: when the approval request lapses, ISO 8601 UTC

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, and the description still contributes real context: the hard rule that a held position's stop-loss cannot be cancelled (and the workaround), why that rule exists, and that cancellation works while trading is halted. These are non-obvious constraints an agent could not infer from 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and prohibitions are front-loaded, and nearly every clause carries operational weight (the stop-loss exclusion, the halted-trading note). The 'Inputs:' enumeration is the one mildly redundant passage given full schema coverage, keeping it just short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool, the description covers the safety boundary, the exclusion case with its alternative, a surprising availability trait (works while halted), and the follow-up call. With an output schema present, return values correctly need not be described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters — including venue defaults and symbol format — are already documented in the schema. The description's 'Inputs: order_id (from get_my_open_orders), symbol, venue' largely restates that, adding no format or constraint detail beyond it; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Cancel one resting order on an exchange') and immediately scopes it to unfilled limit orders and take-profits. It explicitly names the sibling it is not for (close_perp_position_reduce_only), so the agent can distinguish it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('withdraw an unfilled limit order or a take-profit'), an explicit when-not ('Not for closing positions'), and the required alternative. It also closes the loop with a next step ('Next: get_my_open_orders'), so both selection and follow-up are unambiguous.

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

cancel_price_alertCancel a price alertA
Idempotent
Inspect

Remove a waiting price alert so it never fires. Use when the user no longer wants it or to make room (at most 20 wait). Not for orders (use cancel_open_order). Input: alert_id from get_my_price_alerts. An app can delete only the alerts it created. Next: get_my_price_alerts.

NameRequiredDescriptionDefault
alert_idYesFrom set_price_alert or get_my_price_alerts

Output Schema

NameRequiredDescription
priceYesThe level, USD per coin
venueYesThe exchange whose mark is watched; null: the reference price (median of the exchanges' marks; on the sandbox deployment the sandbox's real-market price)
statusYesactive (waiting), triggered (fired once, done) or deleted
symbolYesBase coin
alert_idYesAlert id, alr_…
directionYesabove: fires when the price is at or above the level; below: at or below
created_atYesISO 8601 UTC
created_byYesThe agent that created it, or person
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
triggered_atNoWhen it fired, ISO 8601 UTC
current_priceNoOn creation: the price it is compared with now, USD per coin
triggered_priceNoThe price that fired it, USD per coin

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish that this is a non-read-only, non-destructive, idempotent operation. The description adds useful behavioral context beyond that: the alert is removed so it 'never fires' and 'An app can delete only the alerts it created,' which is an important authorization boundary.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the effect, followed by usage, exclusion, input source, permission constraint, and next step. Every sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation tool with an output schema and annotations, the description supplies the key missing context: ownership restrictions, capacity limit, input origin, sibling exclusion, and follow-up action. Nothing essential is omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single alert_id parameter is already documented. The description adds only that alert_id comes from get_my_price_alerts, while the schema also mentions set_price_alert; appropriate baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Remove a waiting price alert so it never fires.' It also explicitly distinguishes the tool from cancel_open_order, so the agent can route correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear when-to-use guidance ('user no longer wants it or to make room'), names the exclusion ('Not for orders (use cancel_open_order)'), states a capacity constraint ('at most 20 wait'), and points to the next step ('get_my_price_alerts').

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

close_perp_position_reduce_onlyClose a position (reduce-only)A
Destructive
Inspect

Close all or part of a perpetual futures position with a reduce-only market order, so it can never open or flip a position. Use to take profit, cut a loss or reduce exposure; it is also the only way to undo a filled order. Third-party apps can close only positions they opened. Not for cancelling resting orders (use cancel_open_order). Inputs: symbol, venue, close_pct (1-100, default 100). Works while trading is halted. Next: get_my_open_positions.

NameRequiredDescriptionDefault
venueNoVenue: sandbox, hyperliquid, okx, bybit or binance. Omitted: the agent's only venue, else hyperliquid, else your only connected venue, else sandboxhyperliquid
symbolYesBase coin, e.g. BTC
close_pctNoPercent of the position to close, 1-100

Output Schema

NameRequiredDescription
okYesFalse when rejected or failed
feeNoOnce executed: the trading fee, estimated at once and replaced by the amount the exchange charged once its fill records show it
errorNoWhy it was rejected or failed
venueNoVenue name
checksNoChecks run at execution
sl_oidNoVenue order id of the protective stop
statusYespending_approval, armed (a trigger entry waiting for its price), executed, rejected, failed, expired, declined, cancelled, or executing (TradeHub has not confirmed the outcome yet: check get_order_request_status)
receiptNoSigned receipt (compact JWS, EdDSA) once executed: request, checks, preview price, fill, slippage, order ids, delegation. Verify with /.well-known/tradehub-receipts.jwks
order_idNoVenue order id of the fill
fill_priceNoAverage fill, USD per coin
request_idYesOrder request id; get_order_request_status(request_id) follows it
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
filled_sizeNoFilled size, in the base coin (e.g. BTC), not USD
take_profitsNoset_take_profit_levels: the take-profits now on the exchange
trigger_priceNostatus armed: opens at market when the mark reaches this, USD per coin
trigger_expires_atNostatus armed: when it lapses unless reached, ISO 8601 UTC
approval_expires_atNoWhile pending: when the approval request lapses, ISO 8601 UTC

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the destructive/non-idempotent annotations by explaining the reduce-only guarantee (cannot open or flip a position), the third-party permission constraint (only positions the app opened), and that it works while trading is halted. These are exactly the constraints an agent needs before invoking a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and guarantee, then usage, exclusions, inputs, and next step in a tight sequence. The 'Inputs:' recap is largely redundant given full schema coverage and slightly dilutes an otherwise efficient paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A destructive mutation tool with annotations and an output schema, so return values need no explanation; the description still covers semantics, permissions, exclusion, and follow-up. Nothing an agent needs to call it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters are already documented, including the venue fallback chain and the 1-100 close_pct range. The description's 'Inputs:' line only restates those names and defaults rather than adding new meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource ('Close all or part of a perpetual futures position with a reduce-only market order') and immediately distinguishes it from cancel_open_order. An agent can identify the operation and its scope without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use cases (take profit, cut loss, reduce exposure, undo a filled order) and an explicit when-not-to-use with the named alternative ('Not for cancelling resting orders (use cancel_open_order)'). It also states the follow-up step ('Next: get_my_open_positions').

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

compare_funding_rates_across_venuesCompare funding rates across exchangesA
Read-onlyIdempotent
Inspect

Current perpetual futures funding rate for one coin on every exchange TradeHub supports, per interval and annualised, with the age of each reading. Use when choosing where to hold a long or a short, or to check a funding spread. Not a forecast: rates change every interval. Input: symbol (base coin). Rates are fractions; positive means longs pay shorts. Sorted by annualised rate, highest first; TradeHub takes no rebates from any exchange. Next: get_perp_contract_rules(venue, symbol) or size_position_by_risk.

NameRequiredDescriptionDefault
symbolYesBase coin, e.g. BTC

Output Schema

NameRequiredDescription
as_ofYesISO 8601 UTC
symbolYesBase coin
venuesYesHighest annualised rate first
neutralityYesCommercial relationships that could affect the order (none)
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
ranking_basisYesHow the list is ordered
cheapest_for_longsYesFresh venue with the lowest annualised rate (longs pay least / earn most)
cheapest_for_shortsYesFresh venue with the highest annualised rate (shorts earn most)

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the read-only annotations, the description discloses key behavioral and semantic traits: rates are fractions, positive means longs pay shorts, results are sorted by annualised rate highest first, each reading includes its age, and rates change every interval. It also states that TradeHub takes no rebates, which clarifies neutrality of the comparison.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core result and scope, then moves efficiently to usage, caveats, input, and next tools. Most sentences earn their place, though the 'TradeHub takes no rebates' clause is slightly promotional rather than strictly operational.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only comparison tool with an output schema, the description supplies everything an agent needs: data scope, sorting, sign convention, reading age, when to use it, and what to call next. The annotations already cover safety and idempotency, so the remaining description is complete and appropriately focused.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already defines `symbol` as a base coin such as BTC. The description repeats this with 'Input: symbol (base coin)' but adds no further syntax, format, or edge-case guidance beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: current perpetual futures funding rates for one coin across every supported exchange, per interval and annualised. It clearly describes the scope but does not explicitly distinguish itself from the sibling `compare_perp_quotes_across_venues`, so it falls short of the strongest possible sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use it: choosing where to hold a long or short, or checking a funding spread. It also names useful next steps (`get_perp_contract_rules`, `size_position_by_risk`) and cautions that it is not a forecast. It stops short of naming a specific alternative tool or stating when not to use it.

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

compare_perp_quotes_across_venuesCompare quotes and costs across exchangesA
Read-onlyIdempotent
Inspect

Use to choose where to trade one perpetual futures coin: bid, ask, spread, trading fee (your account's rate or the published one) and 7-day execution, per exchange. With side (and size_base or notional_usd): ranked by price plus taker fee plus a cost for poor execution; hold_hours adds funding, exit fee. cheapest_venue: cheapest overall; best_venue: cheapest you can trade on now (connected, allowed, enough margin); if they differ, say both. Not for one venue's depth (use get_order_book). No rebates. Next: preview_perp_order with best_venue, or venue "best".

NameRequiredDescriptionDefault
sideNoOptional: rank by the all-in price for this side (the price you would take plus the venue's taker fee)
symbolYesBase coin, e.g. BTC
leverageNoFor the margin needed, e.g. 5
size_baseNoOptional, with side: size in the base coin, to see each venue's cost in USD and whether your free margin there covers it
hold_hoursNoOptional, with side: how long you expect to hold, in hours; adds funding at today's rate and the exit fee, and ranks by that total cost
notional_usdNoOr the size in USD

Output Schema

NameRequiredDescription
as_ofYesWhen this comparison was made, ISO 8601 UTC
symbolYesBase coin
venuesYesOne entry per venue that lists the coin, in ranking order
best_venueNoWith side: the cheapest all-in venue you can use (connected, allowed, enough margin); without an account, the cheapest overall; null if none
neutralityYesCommercial relationships that could affect the order (none)
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
ranking_basisYesHow the list is ordered
best_ask_venueYesFresh venue with the lowest ask (best to buy)
best_bid_venueYesFresh venue with the highest bid (best to sell)
cheapest_venueNoWith side: the cheapest all-in real venue, whether or not you can use it (fresh quotes only); null if none

TDQS

A4.4/5.0
Behavior4/5

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

Goes well beyond the readOnly/idempotent annotations by disclosing the ranking formula (price + taker fee + execution cost), that hold_hours folds in funding at today's rate plus exit fee, that rebates are excluded, and what 'tradeable now' means (connected, allowed, enough margin). It stops short of any note on rate limits, failure modes, or how stale/conditional a quote might be.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb and payoff, then usage modes, then exclusions and next steps. Highly compressed to the point of near-telegraphic phrasing ('cheapest you can trade on now'), which is efficient but risks ambiguity for a weaker reader.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter read-only comparison tool with full schema coverage and an output schema, the description covers selection criteria, conditional parameter interactions, exclusions, and follow-up actions. Nothing an agent needs in order to pick and call this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter already carries a substantive description, so the schema does the heavy lifting. The description adds real value only at the combination level ('with side (and size_base or notional_usd)', 'hold_hours adds funding, exit fee'), which slightly exceeds the baseline but does not redefine any individual parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('choose where to trade one perpetual futures coin') and immediately enumerates the exact return dimensions (bid, ask, spread, fee, 7-day execution) per exchange. It also carves out the sibling boundary explicitly: 'Not for one venue's depth (use get_order_book).'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage modes (side + size_base/notional_usd, hold_hours) and explains what each adds. It also defines the two summary outputs (cheapest_venue vs best_venue) and instructs the agent to report both when they differ, then points to the next call (preview_perp_order with best_venue or venue 'best').

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

execute_previewed_orderExecute a previewed orderA
DestructiveIdempotent
Inspect

Execute a preview from preview_perp_order: re-checked at a fresh price, then sent to the exchange with its stop-loss placed there. Use only after a successful preview. Not for new or changed orders (preview again). If a person must approve (propose level, or no trade:execute scope) it waits; wait_seconds (0-30) holds the call open for the decision. Inputs: preview_id, client_order_id (idempotency key: repeating it returns the first result). A fill cannot be undone; the remedy is close_perp_position_reduce_only. Next: get_order_request_status(request_id) while pending.

NameRequiredDescriptionDefault
preview_idYesFrom preview_perp_order, within 30 seconds
wait_secondsNoIf the order needs a person's approval, wait up to this long for the decision before returning
client_order_idYesYour idempotency key, unique per agent; repeating it returns the first result instead of a second order

Output Schema

NameRequiredDescription
okYesFalse when rejected or failed
feeNoOnce executed: the trading fee, estimated at once and replaced by the amount the exchange charged once its fill records show it
errorNoWhy it was rejected or failed
venueNoVenue name
checksNoChecks run at execution
sl_oidNoVenue order id of the protective stop
statusYespending_approval, armed (a trigger entry waiting for its price), executed, rejected, failed, expired, declined, cancelled, or executing (TradeHub has not confirmed the outcome yet: check get_order_request_status)
receiptNoSigned receipt (compact JWS, EdDSA) once executed: request, checks, preview price, fill, slippage, order ids, delegation. Verify with /.well-known/tradehub-receipts.jwks
order_idNoVenue order id of the fill
fill_priceNoAverage fill, USD per coin
request_idYesOrder request id; get_order_request_status(request_id) follows it
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
filled_sizeNoFilled size, in the base coin (e.g. BTC), not USD
take_profitsNoset_take_profit_levels: the take-profits now on the exchange
trigger_priceNostatus armed: opens at market when the mark reaches this, USD per coin
trigger_expires_atNostatus armed: when it lapses unless reached, ISO 8601 UTC
approval_expires_atNoWhile pending: when the approval request lapses, ISO 8601 UTC

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses the fresh-price re-check, that the stop-loss is placed at the exchange, that approval levels can block execution, and that wait_seconds (0-30) holds the call open. It also states the key irreversible consequence ('a fill cannot be undone') and the idempotency behavior (repeat returns the first result) in plain language.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and the usage gate, then parameters, then the safety consequence and next step — every clause is load-bearing. The telegraphic phrasing ('Next: get_order_request_status(request_id) while pending') is dense but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema covers return values, and the description covers everything else an agent needs: prerequisite preview, approval-wait semantics, idempotency, irreversibility, and the correct follow-up call. Nothing essential is left to inference for a destructive financial mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds real context by tying preview_id to its source (preview_perp_order), framing client_order_id as a per-agent idempotency key, and explaining that wait_seconds only matters in the human-approval branch. It does not restate the 30-second expiry of preview_id, which the schema carries.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('execute a preview from preview_perp_order') and immediately distinguishes it from the sibling that creates previews and from cancel/close tools. An agent knows exactly which tool this is without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit gating: 'Use only after a successful preview' and 'Not for new or changed orders (preview again)' names the exclusion and the alternative. It also names the follow-up tool (get_order_request_status) for the pending case and close_perp_position_reduce_only as the remedy path.

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

get_my_account_balancesMy account balancesA
Read-onlyIdempotent
Inspect

Equity, free margin, used margin and open profit or loss on every exchange account the user connected (Hyperliquid, Bybit, Binance, OKX, sandbox), and the total. Use to report balances or to compare free margin across exchanges. Not needed before opening: size_position_by_risk reads equity itself. Not for positions (use get_my_open_positions). No inputs. Amounts in USD (USDC / USDT count as USD). Next: get_my_open_positions.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
venuesYesOne entry per connected venue
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
total_equityYesSum of equity on every connected venue, USD

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/openWorldHint, so the safety profile is free. The description still adds real value by disclosing currency normalization (USDC/USDT treated as USD), the inclusion of sandbox accounts, and the aggregate-total behavior. It stops short of describing freshness/caching or latency, which would matter for a live-account read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what is returned, then routing, then a 'Next:' handoff. Every sentence carries distinct information — no restatement of the title and no filler — despite the telegraphic style.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return shape needn't be explained; description covers the remaining essentials for a read-only, zero-arg, open-world call: venue coverage, unit normalization, aggregation, and the follow-up tool. Nothing needed 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so baseline is 4; the description confirms 'No inputs' and clarifies that venue scope is fixed to everything the user connected rather than selectable. No further parameter semantics are possible.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific resource (equity, free margin, used margin, open P/L, plus total) and enumerates the exact venues covered (Hyperliquid, Bybit, Binance, OKX, sandbox). It explicitly contrasts with get_my_open_positions, so an agent can separate it from the nearest sibling without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives positive triggers ('report balances', 'compare free margin across exchanges'), a negative trigger ('Not for positions – use get_my_open_positions'), and an explicit 'not needed before opening' note pointing at size_position_by_risk. That is when-to-use, when-not-to-use, and named alternatives in three compact sentences.

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

get_my_agent_performanceMy performanceA
Read-onlyIdempotent
Inspect

How this agent has done: trades opened and closed, wins, realised profit or loss in USD, and its most common refusals with what to do differently, over the last N days. Use at the start of a session or after a run of rejections, to avoid repeating mistakes. Not for the trades themselves (use get_my_trade_history). Input: days (1-90). Only this agent's own record; a person sees all agents together. Next: get_my_trading_permissions.

NameRequiredDescriptionDefault
daysNoLook-back window in days

Output Schema

NameRequiredDescription
daysYesWindow, in days
winsYesClosed with a profit
closedYesOf those, closed
tradesYesPositions opened in the window
refusedYesRefused previews or executions
agent_idYesThis agent (null: a person, all agents together)
refusalsYesMost common refusals first
win_rateYeswins / closed, as a fraction
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
order_callsYesPreviews and refusals
average_pnl_usdYesrealized_pnl_usd / closed, USD
realized_pnl_usdYesSum of realised profit or loss, USD
fixed_within_3_callsYesRefusals the agent should fix itself (error.who = agent) followed by a successful preview within the next 3 calls

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely non-schema context: the result is scoped to this agent only, while a human sees all agents aggregated, and refusals are surfaced with corrective guidance. It stops short of noting pagination or output shape, which is acceptable given an output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what the tool returns before moving to usage, exclusions, input and next step — a sensible order for an agent scanning for relevance. Slightly dense as a single run-on block, and "Input: days (1-90)" duplicates the schema, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with an output schema, the description covers scope, trigger, exclusion, sibling alternative and follow-up call. Return values need not be explained because the output schema carries them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the `days` property already carries a description plus 1-90 bounds and a default of 30. The description's "Input: days (1-90)" merely restates the schema, adding no syntax, default behavior, or window-selection guidance, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and enumerates exactly what it returns: trades opened/closed, wins, realised P&L in USD, and most common refusals, over a look-back window. It explicitly distinguishes itself from the nearest sibling (get_my_trade_history) so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete trigger conditions ("at the start of a session or after a run of rejections"), an explicit exclusion ("Not for the trades themselves (use get_my_trade_history)"), and a follow-on step ("Next: get_my_trading_permissions"). Nothing about when to select this tool 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.

get_my_events_since_last_check_or_waitWhat happened since I last lookedA
Read-only
Inspect

What happened on the account while you were away: fills, rejections, approvals, positions closed (stop, take-profit, plan, liquidation), plan rules fired, price alerts, warnings near liquidation or the daily loss limit. TradeHub remembers where you stopped, so a new session gets only what is new. Use at the start of a session, or with wait_seconds (up to 30) to wait for the next event. Not for current state (use get_my_open_positions). Inputs: types, limit, after (keep your own place). Next: act on what changed, e.g. get_my_open_positions.

NameRequiredDescriptionDefault
afterNoAn event id (last_event_id of an earlier answer) to read after it and keep your own place; leave out to continue from where you last checked
limitNoAt most this many events, 1-100
typesNoOnly these event types, e.g. ["plan.triggered", "position.closed"]
wait_secondsNoWhen nothing is new, wait up to this long (0-30) for the next event

Output Schema

NameRequiredDescription
moreYesTrue when more events are waiting: call again at once
sinceYeslast_check (where this agent last stopped), after, or first_look (the last 24 hours)
eventsYesEvents in the order they happened
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
last_event_idNoPass as after to keep your own place; null when nothing new was read

TDQS

A4.6/5.0
Behavior5/5

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

The annotations already cover the read-only and non-destructive profile, but the description adds substantial behavioral context: TradeHub remembers the last position, new sessions return only new events, and waiting is capped at 30 seconds. It also describes the event categories and warning scenarios, which 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and event types, then moves into usage and alternatives. It is clear and useful, though the event list and the short 'Inputs' recap make it slightly longer than strictly necessary given the complete schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only event-feed tool with a complete schema, annotations, and an output schema, the description supplies everything an agent needs to select and invoke it correctly. It covers what it returns at a high level, when to use it, when not to use it, and how the cursor and wait behavior work.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents after, limit, types, and wait_seconds thoroughly. The description briefly mentions the inputs and explains that after keeps your own place, but it largely repeats what the schema already says rather than adding materially new parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific resource and scope: account events that occurred since the last check, including the concrete event categories it returns. It explicitly distinguishes this from sibling tools by saying it is not for current state and naming get_my_open_positions as the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit timing guidance: use at the start of a session, or use wait_seconds to wait for the next event. It also states when not to use it and names the better alternative for current-state queries, leaving little ambiguity.

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

get_my_open_ordersMy open ordersA
Read-onlyIdempotent
Inspect

Resting orders on the user's exchange accounts, including protective stop-loss and take-profit orders (is_trigger = true), and trigger entries TradeHub holds (type TRIGGER_ENTRY, order_id req_…). Use to find an order_id to cancel or to confirm a stop is in place. Not for filled trades (use get_my_trade_history). Inputs: optional venue and symbol filters. Sizes in the base coin, prices in USD. Next: cancel_open_order(order_id).

NameRequiredDescriptionDefault
venueNoOnly this venue
symbolNoOnly this base coin

Output Schema

NameRequiredDescription
ordersYesResting orders, including protective stops
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent safety, but the description adds domain behavior annotations cannot express: that trigger-based orders are folded into the result set under specific type and order_id conventions, and that sizes are denominated in the base coin while prices are in USD. Those are exactly the facts an agent needs to interpret results correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, each carrying distinct information: scope, inclusions, usage/exclusion, inputs/units, and the follow-up call. Scope and routing information are front-loaded with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be described. Given that, the description covers everything an agent needs for a read-only, zero-required-parameter query: what is included, how to filter, what units to expect, when not to use it, and what to call next.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both properties already carry descriptions ('Only this venue', 'Only this base coin'), so the baseline is 3. The description adds that both filters are optional and reinforces that symbol is a base-coin filter, but contributes no format, casing, or combining-behavior detail beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (resting orders on the user's exchange accounts) and immediately disambiguates the non-obvious inclusions: protective stops/takes (is_trigger = true) and TradeHub trigger entries (type TRIGGER_ENTRY, order_id req_…). An agent can distinguish this from get_my_open_positions and get_my_trade_history without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives two concrete use cases ('find an order_id to cancel', 'confirm a stop is in place'), an explicit exclusion with the correct alternative ('Not for filled trades (use get_my_trade_history)'), and a next-step pointer to cancel_open_order. When-to-use, when-not, and the alternative are all stated.

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

get_my_open_positionsMy open positionsA
Read-onlyIdempotent
Inspect

Every open perpetual futures position on every connected exchange account: side, size, entry, mark, open profit or loss, leverage, the liquidation price with how far away it is, and the trade plan left on it (set_position_plan_close_or_notify_later). Use first in a new session, and before closing, adjusting a stop or reporting exposure. Not for resting orders or stops (use get_my_open_orders). No inputs. Sizes in the base coin, prices in USD. Next: close_perp_position_reduce_only or get_my_open_orders.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
positionsYesOpen positions on every connected venue
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog

TDQS

A4.6/5.0
Behavior4/5

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

The annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds real context beyond them: cross-account coverage, that there are no inputs, and that sizes are in the base coin while prices are in USD — unit conventions the annotations do not convey. It does not mention authentication or latency, which is a minor gap for a read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the scope and returned fields, then usage, exclusions, and follow-ups — a logical order with no filler. The only redundancy is that get_my_open_orders appears twice, once as the excluded alternative and again in the 'Next:' list, which slightly muddies the routing signal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description still summarizes the payload shape. With no parameters, a complete safety annotation set, and covered units, scope, exclusions, and follow-up actions, an agent has everything needed to select and call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the baseline is 4 and nothing needs compensating for. The description confirms 'No inputs' explicitly, removing any doubt that the call takes arguments and reinforcing the unit conventions used in the response.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (open perpetual futures positions), its scope (every connected exchange account), and enumerates the fields returned: side, size, entry, mark, P&L, leverage, liquidation price and distance, and attached trade plan. It explicitly separates itself from resting orders and stops, which are handled by get_my_open_orders. An agent can distinguish it from every sibling without reading a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use cues ('Use first in a new session, and before closing, adjusting a stop or reporting exposure'), an explicit when-not ('Not for resting orders or stops (use get_my_open_orders)'), and names the recommended follow-up tools. Both the alternative and the condition that selects it are stated, so 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.

get_my_price_alertsMy price alertsA
Read-onlyIdempotent
Inspect

The price alerts waiting, and those that fired in the last day with the price that fired them. An app sees only the alerts it created. Use before adding one or to find an alert_id to delete. Not for orders waiting for a price (use get_my_open_orders). No inputs. Next: cancel_price_alert.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
alertsYesWaiting alerts, and those that fired in the last 24 hours
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds genuinely new behavioral context: per-app visibility scoping (an app sees only alerts it created) and a one-day retention window for fired alerts. It stops short of auth or volume details, but the critical access-scoping trait is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short fragments, each carrying distinct information: return contents, visibility scope, use cases, exclusion, and next step. Nothing is repeated from the title or annotations, and the most important content leads.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema covers return shape, so the description's job is routing and scoping, both of which it handles fully. An agent has everything needed to decide to call it and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4; the description also states 'No inputs' explicitly, removing any doubt. There is no further parameter meaning to convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (price alerts) and precise scope: pending alerts plus those that fired in the last day, including the triggering price. It explicitly separates itself from get_my_open_orders, so no sibling ambiguity remains.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use triggers (before adding an alert, to find an alert_id to delete), an explicit when-not-to-use with the alternative named (get_my_open_orders for orders waiting on price), and even a next-step pointer to cancel_price_alert.

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

get_my_risk_limits_usageMy risk limits and usageA
Read-onlyIdempotent
Inspect

The person's global risk limits (per-trade risk, daily / weekly / monthly loss, drawdown, leverage, open positions) and how much of each is used, across all exchanges, plus limit increases waiting to take effect. Use when a trade was rejected by a user-level limit or before planning several trades. Not for this agent's own permissions (use get_my_trading_permissions). No inputs. Fractions of equity and USD; real money and the sandbox are counted separately. Next: size_position_by_risk.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
bookYesreal or sandbox: the two are counted separately
as_ofYesISO 8601 UTC
equityYesEquity in this book, USD
limitsYesmax_risk_per_trade, loss limits and max_drawdown as fractions; max_leverage; max_open_positions; symbols
drawdownYesDrop from peak equity, as a fraction
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
realized_pnlYesRealised profit or loss for day / week / month (UTC), USD
open_positionsYesNumber of open positions
trading_haltedYesTrue after a stop
pending_looseningYesLimit increases a person asked for that are not in force yet

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is low, and the description still adds real context: no inputs, values reported as fractions of equity and USD, real money and sandbox counted separately, and pending limit increases included in the result. It stops short of describing how stale the usage figures are or when limits reset, which would be the remaining behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The covered limit types are front-loaded in the first clause, followed by units, scope, exclusion and next step as compact fragments. No sentence is redundant and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained in prose. Between the enumerated limit types, usage fractions, units, sandbox separation, pending increases, the permission-tool exclusion and the next-step pointer, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4. The description confirms 'No inputs', which is consistent with the empty schema and prevents an agent from inventing arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (global risk limits) and enumerates exactly what it covers: per-trade risk, daily/weekly/monthly loss, drawdown, leverage, open positions, with usage fractions per limit plus pending limit increases. It also explicitly separates itself from get_my_trading_permissions, so an agent can distinguish it from siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete trigger conditions ('when a trade was rejected by a user-level limit or before planning several trades'), an explicit exclusion with the correct alternative ('Not for this agent's own permissions (use get_my_trading_permissions)'), and a follow-up step ('Next: size_position_by_risk').

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

get_my_trade_historyMy trade historyA
Read-onlyIdempotent
Inspect

Recent trades opened through TradeHub with entry, stop, take-profit, leverage and realised profit or loss. Third-party apps see only the trades they opened; the user's own keys and Telegram see all. Use for reviews and reports. Not for live positions (use get_my_open_positions). Input: limit (1-200), closed_since, before (pages: pass next_before back until it is null). Sizes in the base coin, money in USD. Next: get_my_open_positions.

NameRequiredDescriptionDefault
limitNoMost recent N trades
beforeNoNext page: the next_before of the previous answer
closed_sinceNoOnly trades closed at or after this time (ISO 8601); open trades are left out

Output Schema

NameRequiredDescription
tradesYesNewest first
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
next_beforeNoMore trades: pass this as before for the next page; null at the end

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (which already declare readOnly/idempotent), it discloses a non-obvious access-scoping rule: third-party apps see only trades they opened, while the user's own keys and Telegram see all. It also explains pagination behaviour ('pass next_before back until it is null') and unit conventions (sizes in base coin, money in USD), which are not derivable from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose, visibility scope, usage/exclusion, input contract and next step all appear in a short, front-loaded block with no filler. Every clause carries information an agent needs at call time.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be detailed, and the description nonetheless names the key fields. Pagination and unit conventions are covered, leaving only minor gaps such as ordering guarantees or default-range behaviour if closed_since is omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real value: it restates the limit bounds and, more importantly, explains that `before` is a cursor fed from the previous response's next_before and must be followed until null. Units for returned sizes/prices are also clarified, though per-parameter edge cases are left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Recent trades opened through TradeHub') and enumerates the returned fields (entry, stop, take-profit, leverage, realised PnL). It explicitly contrasts itself with the sibling get_my_open_positions, so an agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use for reviews and reports. Not for live positions (use get_my_open_positions)' gives both the when and the when-not with a named alternative. It also closes the loop with 'Next: get_my_open_positions', routing the agent onward for a natural follow-up.

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

get_my_trading_permissionsMy trading permissionsA
Read-onlyIdempotent
Inspect

What this agent may do right now on TradeHub: autonomy level (read, propose = every order needs a person's approval, preauth = executes within limits), allowed venues, symbols and actions, per-trade and daily limits, today's usage, connected venues and whether trading is halted. Use first in every session and after any rejection that mentions your mandate. Not for account balances (use get_my_account_balances). No inputs. Limits are fractions of equity or USD. Only a person can widen them, on the Web, and widening waits 24 hours. Next: size_position_by_risk or get_my_open_positions.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
todayYesorders_today and realized_pnl_today (USD) for this agent, UTC day
scopesYesOAuth / API key scopes this caller holds
mandateYesThis agent's trading permissions (its mandate): level (read / propose / preauth), venues, symbols, actions, max_risk_pct (fraction of equity at stop), max_leverage, max_notional_usd, max_positions, daily_loss_budget_usd, daily_order_limit, expires_at. null on a limit = only the user's global limit
delegationNoWho this agent acts for and where its rights come from
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
trading_haltedYesTrue after a stop: no new positions until a person resumes on the Web
venues_connectedYesVenues the user has connected (sandbox is always there)

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: it defines the three autonomy levels (read, propose, preauth), states that limits are fractions of equity or USD, and discloses a key authorization constraint — only a person can widen limits, on the Web, with a 24-hour delay. That is exactly the governance context an agent needs before deciding whether to attempt a trade.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core definition, then usage trigger, exclusion, input expectation, limit semantics, governance constraint, and next steps. Despite the density, every clause carries distinct information and nothing is repeated from the annotations or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out — yet the description still signals the shape of the response. Combined with the mutation-free annotations and the zero-parameter schema, an agent has everything needed to call this correctly on the first turn of a session.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no inputs, and the description confirms this with "No inputs." That is the correct baseline for a zero-parameter tool; there are no parameter semantics beyond that to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource and then enumerates exactly what is returned: autonomy level, allowed venues/symbols/actions, per-trade and daily limits, today's usage, connected venues, and halt status. It explicitly distinguishes itself from get_my_account_balances, so an agent can separate it from the closest sibling without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use first in every session and after any rejection that mentions your mandate" gives an explicit trigger condition, and "Not for account balances (use get_my_account_balances)" names the alternative and the exclusion. It also chains forward to size_position_by_risk and get_my_open_positions, 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.

get_order_bookOrder bookA
Read-onlyIdempotent
Inspect

Order book levels for one perpetual futures contract on one exchange, best first, as [price, size]. Use to judge liquidity before a large market order. Not for the best price across exchanges (use compare_perp_quotes_across_venues). Inputs: symbol, venue (without an account: hyperliquid only), depth (1-50 levels). Prices in USD per coin, sizes in the base coin. Next: preview_perp_order.

NameRequiredDescriptionDefault
depthNoLevels per side
venueNoVenue: sandbox, hyperliquid, okx, bybit or binance. Omitted: the agent's only venue, else hyperliquid, else your only connected venue, else sandboxhyperliquid
symbolYesBase coin, e.g. BTC

Output Schema

NameRequiredDescription
asksYes[price (USD per coin), size (in the base coin (e.g. BTC), not USD)], best first
bidsYes[price (USD per coin), size (in the base coin (e.g. BTC), not USD)], best first
venueYesVenue name
symbolYesBase coin
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare read-only/idempotent semantics, but the description adds ordering (best first), return tuple shape, unit conventions (USD per coin, sizes in base coin), and an auth-related constraint (venue without an account: hyperliquid only). These are exactly the traits an agent needs that annotations can't express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: purpose first, exclusion second, inputs/units/next-step last. No filler and nothing buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return-value documentation is optional; the description still covers ordering and units, plus the auth constraint and sibling routing. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description goes further by disclosing the unauthenticated venue restriction and clarifying what price and size mean, though depth's 1-50 range merely repeats the schema bounds.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (order book levels for one perp contract on one exchange) and immediately differentiates from the closest sibling compare_perp_quotes_across_venues. An agent can distinguish 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit use case ('judge liquidity before a large market order'), an explicit exclusion with a named alternative ('Not for the best price across exchanges'), and a next-step routing ('Next: preview_perp_order').

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

get_order_request_statusOrder request statusA
Read-onlyIdempotent
Inspect

The current state of an order request made with execute_previewed_order: pending_approval, executed, rejected, failed, expired or declined, with fill price and stop order id once executed. Use to follow an order that was waiting for a person's approval. Not for listing orders (use get_my_open_orders). Input: request_id. Next: get_my_open_positions once executed.

NameRequiredDescriptionDefault
request_idYesFrom execute_previewed_order

Output Schema

NameRequiredDescription
okYesFalse when rejected or failed
feeNoOnce executed: the trading fee, estimated at once and replaced by the amount the exchange charged once its fill records show it
errorNoWhy it was rejected or failed
venueNoVenue name
checksNoChecks run at execution
sl_oidNoVenue order id of the protective stop
statusYespending_approval, armed (a trigger entry waiting for its price), executed, rejected, failed, expired, declined, cancelled, or executing (TradeHub has not confirmed the outcome yet: check get_order_request_status)
receiptNoSigned receipt (compact JWS, EdDSA) once executed: request, checks, preview price, fill, slippage, order ids, delegation. Verify with /.well-known/tradehub-receipts.jwks
order_idNoVenue order id of the fill
fill_priceNoAverage fill, USD per coin
request_idYesOrder request id; get_order_request_status(request_id) follows it
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
filled_sizeNoFilled size, in the base coin (e.g. BTC), not USD
take_profitsNoset_take_profit_levels: the take-profits now on the exchange
trigger_priceNostatus armed: opens at market when the mark reaches this, USD per coin
trigger_expires_atNostatus armed: when it lapses unless reached, ISO 8601 UTC
approval_expires_atNoWhile pending: when the approval request lapses, ISO 8601 UTC

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the bar is lower. The description adds useful lifecycle context: the full set of terminal states and the fact that fill price and stop order id appear once executed. It does not cover error handling for unknown request ids, but the state enumeration is meaningful added value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core meaning, then packs statuses, exclusion, input, and next step into compact clauses with no filler. Every sentence contributes routing or behavioral information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained in depth, and the description still names the key returned fields and all states. Combined with explicit sibling routing and a follow-up action, nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single request_id parameter is already fully documented, including its origin in execute_previewed_order. The description's 'Input: request_id' restates the schema rather than adding format or lookup guidance; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('current state of an order request made with execute_previewed_order') and enumerates the possible states plus execution details. It explicitly distinguishes itself from the sibling get_my_open_orders, so an agent can route correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the exact scenario ('follow an order that was waiting for a person's approval'), an explicit exclusion ('Not for listing orders (use get_my_open_orders)'), and a next step ('get_my_open_positions once executed'). Both the alternative and the follow-up path are named.

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

get_perp_contract_rulesPerpetual contract rulesA
Read-onlyIdempotent
Inspect

Rules and current funding for one perpetual futures contract on one exchange: mark price, size step, minimum size, price tick, maximum leverage, funding rate per interval and annualised. Use when a limit price or leverage must fit the venue; not needed for market orders (sizing and preview round for you). Not for comparing exchanges (use compare_perp_quotes_across_venues or compare_funding_rates_across_venues). Inputs: symbol (base coin, e.g. BTC), venue (without an account: hyperliquid only). Prices in USD per coin, sizes in the base coin, rates as fractions. Next: size_position_by_risk.

NameRequiredDescriptionDefault
venueNoVenue: sandbox, hyperliquid, okx, bybit or binance. Omitted: the agent's only venue, else hyperliquid, else your only connected venue, else sandboxhyperliquid
symbolYesBase coin, e.g. BTC

Output Schema

NameRequiredDescription
venueYesVenue name
symbolYesBase coin
min_sizeYesSmallest order, in the base coin (e.g. BTC), not USD
size_stepYesSmallest size increment, in the base coin (e.g. BTC), not USD
mark_priceYesMark price, USD per coin
price_tickYesSmallest price increment, USD per coin
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
funding_rateYesFunding rate per interval, as a fraction (0.0001 = 0.01%); positive: longs pay
max_leverageYesHighest leverage the venue allows for this contract
funding_annualizedYesfunding_rate scaled to a year, as a fraction
funding_interval_hoursYesHours between funding payments

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the description focuses on what annotations cannot express: the account constraint ('without an account: hyperliquid only'), the venue-resolution default, and the units conventions for prices, sizes and rates. That is real added context, though it does not mention rate limits or caching freshness of the funding figures.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then usage, then exclusions/alternatives, then input conventions, then the next step, in a tight set of sentences. The field enumeration is dense but each item carries information an agent needs to interpret the response.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with an output schema and full annotation coverage, everything an agent needs is present: scope, exclusions, auth/venue constraint, unit conventions and a follow-up tool. Return-value formatting is correctly left to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already spells out the venue resolution order, so the baseline is 3. The description goes further by fixing the semantics of the values involved ('symbol (base coin, e.g. BTC)', 'prices in USD per coin, sizes in the base coin, rates as fractions'), which prevents unit mistakes even though it partly describes output rather than inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Rules and current funding for one perpetual futures contract on one exchange', then enumerates the exact fields returned (mark price, size step, min size, price tick, max leverage, funding rate). It explicitly distinguishes itself from the comparison siblings by name, so an agent can pick it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when ('when a limit price or leverage must fit the venue'), an explicit when-not ('not needed for market orders (sizing and preview round for you)'), and names two alternatives for the adjacent comparison task. It also adds a 'Next:' pointer to size_position_by_risk, which routes the follow-up call.

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

get_price_candlesPrice candlesA
Read-onlyIdempotent
Inspect

Price history for one coin as candles: open, high, low, close and volume per interval (1m, 5m, 15m, 1h, 4h, 1d), up to 500, oldest first, from Hyperliquid's public market, the same prices the sandbox trades at. Use to look back at price action, find recent highs and lows for a stop, or judge the trend. Not for the live best price (use compare_perp_quotes_across_venues) or ready-made indicators (use get_technical_indicators_15m). Inputs: symbol (base coin), interval (default 1h), limit (default 100). Prices in USD per coin, volume in the base coin, times UTC. Next: size_position_by_risk.

NameRequiredDescriptionDefault
limitNoHow many candles, newest last (1-500)
symbolYesBase coin, e.g. BTC
intervalNoCandle length1h

Output Schema

NameRequiredDescription
lowYesLowest low over these candles, USD per coin
highYesHighest high over these candles, USD per coin
sourceYesWhere the prices come from
symbolYesBase coin
candlesYesOldest first
intervalYesCandle length
change_pctYesFrom the first open to the last close, as a fraction
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the description is free to add the non-obvious context it does: data provenance ('Hyperliquid's public market, the same prices the sandbox trades at'), the 500-row ceiling, oldest-first ordering, and units (USD per coin, volume in base coin, times UTC). Those are behavioral facts an agent could not infer from structured fields and they materially affect interpretation of results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the payload shape, then usage, then exclusions, then inputs — a sensible order with no filler. The one redundant element is the trailing 'Inputs:' sentence, which repeats what the schema already declares verbatim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present the description needn't explain return values, and it still covers provenance, units, ordering, and caps; annotations cover the safety profile and the schema covers parameter details. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters including the enum and defaults. The description's 'Inputs:' line largely restates the schema defaults (symbol, interval default 1h, limit default 100) without adding format or constraint nuance, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Price history for one coin as candles') and enumerates exactly what each candle contains (open, high, low, close, volume), the supported intervals, the 500-candle cap, and ordering. It also explicitly differentiates itself from two named siblings, so an agent can place it precisely without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete use cases ('look back at price action, find recent highs and lows for a stop, or judge the trend') plus explicit exclusions routed to alternatives: live best price goes to compare_perp_quotes_across_venues, ready-made indicators to get_technical_indicators_15m. It even names the natural next step, size_position_by_risk.

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

get_technical_indicators_15mTechnical indicators (15-minute)A
Read-onlyIdempotent
Inspect

RSI, MACD, Bollinger %B, ATR, EMA trend and volume rank on Hyperliquid's 15-minute candles for one coin, plus the current funding rate. Use as inputs to your own decision; it is not a trading recommendation. ATR is useful for placing a stop. Not for live quotes (use compare_perp_quotes_across_venues). Input: symbol (base coin). Prices in USD per coin. Next: size_position_by_risk.

NameRequiredDescriptionDefault
symbolYesBase coin, e.g. BTC

Output Schema

NameRequiredDescription
bbYesBollinger %B (0 = lower band, 1 = upper band)
atrYesATR(14) on 15-minute candles, USD per coin
rsiYesRSI(14), 0-100
macdYesMACD line
symbolYesBase coin
ema_trendYesDirection of the EMA trend
timestampYesLast candle's open time (ms since epoch)
close_priceYesLast close, USD per coin
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
macd_signalYesMACD signal line
volume_rankYesLatest volume's percentile among recent candles, 0-1
funding_rateYesCurrent funding rate per interval, fraction
macd_histogramYesMACD minus signal

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely non-structured context: the numeric units (USD per coin), the presence of a funding rate alongside the candle indicators, the ATR-stop-placement affordance, and the disclaimer that output is not a recommendation. It does not discuss candle staleness beyond 'not live quotes', which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the indicator inventory, then the caveats and routing in short clauses — dense but scannable. The liability disclaimer is arguably padding, though it does affect how an agent should present results.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one required parameter, an output schema, and full annotation coverage, the description only needs to convey scope, units, exclusions, and the follow-up step — all present. Minor gap: nothing says how recent the 15-minute bar is or whether indicators are computed on the latest closed candle.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the symbol property is already documented as 'Base coin, e.g. BTC', so 'Input: symbol (base coin)' largely restates the schema. The added unit note ('Prices in USD per coin') describes output values rather than parameter semantics, so this stays at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names the exact indicator set (RSI, MACD, Bollinger %B, ATR, EMA trend, volume rank), the candle interval, the venue (Hyperliquid), the scope (one coin), and the extra funding-rate field. It also explicitly separates itself from the live-quote sibling, so an agent can pick it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit exclusion with the alternative ('Not for live quotes (use compare_perp_quotes_across_venues)') and a downstream next step ('Next: size_position_by_risk'). It also states the interpretive frame ('inputs to your own decision; not a trading recommendation') and a concrete use case for ATR in stop placement.

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

get_venue_healthExchange healthA
Read-onlyIdempotent
Inspect

Whether each exchange is reachable right now: TradeHub's public price feed per exchange, and, with an account, each connected exchange account's latency, last error and rate-limit headroom. Use after a VENUE_UNAVAILABLE error or before trading on an exchange that misbehaved. Not for prices (use compare_perp_quotes_across_venues). No inputs. Next: retry the failed call, or use another venue.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
venuesYesYour connected venue accounts: connected, latency_ms, last_error, rate-limit headroom (empty without an account)
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
public_dataYesPer venue: ok, updated_at, error for TradeHub's public price feed

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already cover the read-only/idempotent/non-destructive safety profile, and the description adds the key behavioral distinction that the account-scoped fields only appear 'with an account', i.e. an auth prerequisite. It also frames the result as a point-in-time snapshot ('right now') and supplies remediation guidance. It stops short of disclosing freshness guarantees, caching, or cost/latency of the call itself.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the what, then the when, then the exclusion, then the next step — three tight sentences with zero filler. Every clause carries distinct information; the 'Not for prices' pointer and 'Next:' line both earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value detail is unnecessary, and with no parameters the input side is trivially complete. What remains — when to call it, what scope of data appears under each auth level, and what to do afterwards — is all present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the description says so explicitly ('No inputs'), which is the correct baseline handling for a no-arg tool. There is nothing further to disambiguate beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (exchange reachability) plus exactly what it returns: the public price feed per exchange and, when authenticated, per-account latency, last error, and rate-limit headroom. It also explicitly separates itself from compare_perp_quotes_across_venues, so an agent can pick it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives both a trigger ('after a VENUE_UNAVAILABLE error') and a preventive use ('before trading on an exchange that misbehaved'), plus an explicit exclusion routing price lookups to compare_perp_quotes_across_venues. It even names the follow-up action, 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.

preview_perp_orderPreview a perpetual futures orderA
Read-only
Inspect

Check a perpetual futures order with its stop-loss (optional take-profit) against this agent's permissions, the person's limits and the price band, sending nothing. Use before every new position, also one that waits for a price (trigger_price). Not for closing (use close_perp_position_reduce_only). size_base (base coin): from size_position_by_risk; the stop: stop_loss (USD) or stop_pct. Returns preview_id (valid 30 s), notional, risk, margin, likely fill and every check; a rejection names the failing check and, when a fix is certain, suggested_args. Next: execute_previewed_order(preview_id).

NameRequiredDescriptionDefault
sideYesbuy = open or add to a long, sell = open or add to a short
priceNoLimit price, USD per coin (limit orders only)
venueNoVenue: sandbox, hyperliquid, okx, bybit or binance. Omitted: the agent's only venue, else hyperliquid, else your only connected venue, else sandbox; or "best": the cheapest all-in venue (price plus fee) you may use and have the margin forhyperliquid
reasonNoOptional: why, in your words (up to 500 characters). The person sees it on the approval card and in history; other agents never do
symbolYesBase coin, e.g. BTC
leverageNoLeverage, e.g. 5
stop_pctNoOr the stop as a distance from the entry (trigger price, limit price or mark), 0.02 = 2%
size_baseYesSize in the base coin (BTC, not USD); rounded down to the venue step. Get it from size_position_by_risk
stop_lossNoRequired stop-loss, USD per coin: below entry for buys, above for sells. Or give stop_pct
hold_hoursNoOptional: how long you expect to hold, in hours, to see funding and the round trip's cost (and, with venue "best", to choose by them)
order_typeNomarket
take_profitNoOptional take-profit, USD per coin
trigger_priceNoOptional: hold the order and open it at market only when the mark reaches this price (a breakout or a pullback), re-checked then; market orders only. Risk is computed from this price
trigger_valid_hoursNoWith trigger_price: hours it waits before lapsing, 1-168 (default 24)

Output Schema

NameRequiredDescription
okYesTrue: every check passed
sideYesbuy or sell
sizeYesSize after rounding down to the venue step, in the base coin (e.g. BTC), not USD
venueYesVenue name
checksYesEvery check that ran, all pass
symbolYesBase coin
risk_usdYesLoss if the stop fills, USD
expires_atYesISO 8601 UTC
fee_sourceNoaccount (your own rate), published (the base rate) or none (sandbox)
margin_usdYesMargin needed, USD
mark_priceYesMark at preview time, USD per coin
preview_idYesPass to execute_previewed_order within 30 seconds
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
est_fee_usdNoTrading fee for this order, USD: taker rate for market orders, maker for limit; the exit pays a fee too
fee_rate_bpsNoThe rate used, basis points of notional
notional_usdYessize x entry, USD
venue_choiceNoWith venue "best": why this venue (all-in price and the alternatives)
trigger_priceNoA trigger entry: opens at market only when the mark reaches this, USD per coin
est_fill_priceNoMarket orders: average fill if executed now against the book, USD per coin; null for limit orders or when the book is too thin to say
est_funding_usdNoWith hold_hours: funding over that time at today's rate, USD; negative = received
est_slippage_bpsNoest_fill_price against mark_price in basis points, positive = worse; a market order never fills beyond the price band
requires_approvalYesTrue: execute_previewed_order will wait for a person's approval
trigger_valid_hoursNoA trigger entry: hours it waits before lapsing
est_round_trip_cost_usdNoWith hold_hours: entry fee, exit fee at the taker rate and that funding, USD

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say readOnlyHint=true and destructiveHint=false; the description adds substantive behavior beyond that — the checks performed, that a rejection names the failing check and may return suggested_args, and that preview_id expires in 30 seconds. That expiry constraint is the kind of operational detail an agent cannot infer from the schema and is essential for sequencing the two-step preview/execute flow.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and usage, then parameters, then returns and next step — a clean ordering with no filler sentences. The heavy parenthetical nesting ('(optional take-profit)', '(trigger_price)', '(USD)') makes it dense, but every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter, two-step preview tool the description covers what is checked, what comes back, the 30 s validity window, failure shape, and the follow-up call. An output schema exists, yet the return summary is well-scoped rather than exhaustive, and nothing needed 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 93%, so most parameter meaning is carried by the schema. The description still adds cross-tool provenance ('size_base: from size_position_by_risk') and the stop-loss/stop-pct either-or plus the trigger_price waiting semantics, though parts of that restate schema text. Slight redundancy keeps it below 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Check a perpetual futures order ... against permissions, limits and the price band') with the crucial qualifier that nothing is sent. It explicitly excludes the closing case and names the sibling to use instead, so an agent can distinguish it from close_perp_position_reduce_only without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use before every new position, also one that waits for a price (trigger_price)' gives a clear invocation policy, and 'Not for closing (use close_perp_position_reduce_only)' names the alternative and the condition that selects it. The next step, execute_previewed_order(preview_id), is spelled out.

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

set_position_plan_close_or_notify_laterLeave a plan on a positionA
Idempotent
Inspect

Have TradeHub act on a held position later, with no agent connected: "close it if still open in 3 days", "tell me if its funding passes 50% a year", "close half below 94000". Up to 5 rules, each fired once: when price_above / price_below (mark), held_hours (since set) or funding_above (yearly rate it pays, 0.5 = 50%), then notify the person or close close_pct reduce-only. thesis: why it is open, what proves it wrong, for later sessions. Use right after entry, not your own timers. Not a stop-loss. A new plan replaces the old; rules=[] removes it. Next: get_my_open_positions.

NameRequiredDescriptionDefault
rulesYesUp to 5 rules, each fires once; [] removes the plan
venueNoVenue: sandbox, hyperliquid, okx, bybit or binance. Omitted: the agent's only venue, else hyperliquid, else your only connected venue, else sandboxhyperliquid
symbolYesBase coin, e.g. BTC
thesisNoWhy the position is open and what would prove it wrong, for the next session to read back; seen only by you and the person

Output Schema

NameRequiredDescription
okYesTrue when the plan is stored
planYesThe plan now on the position; null after rules=[]
venueYesVenue name
symbolYesBase coin
mark_priceYesMark when the plan was set, USD per coin
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, it discloses the 5-rule cap, that each rule fires exactly once, that a new plan overwrites the old and an empty array removes it, that notify routes to Telegram/events/webhooks, and that close is reduce-only with a percentage. This is the kind of consequence-level detail an agent needs before committing a position to a deferred automation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and examples, and the operative constraints (when to use, what it is not, replacement semantics) come before the trailing navigation hint. It is dense with quoted example strings that partially restate the same semantics as the rule fields, which costs a little economy but not clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. Combined with full schema coverage and annotations, the description covers timing, alternatives, side effects, replacement/removal, and the next call an agent should make.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

At 100% schema coverage the baseline is 3, and the description still adds meaning: it clarifies that price triggers use the mark, that funding is a yearly fraction (0.5 = 50%), and illustrates partial exit with "close half below 94000". It does not add anything about the venue or thesis parameters beyond the schema, so it stops short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource: have the system act on a held position at a later time while no agent is connected, and backs it with three quoted example rules. It also explicitly rules out the nearest sibling concept ("Not a stop-loss"), so an agent can separate it from set_stop_loss_rule and set_price_alert at a glance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit timing ("Use right after entry, not your own timers"), an exclusion ("Not a stop-loss"), replacement semantics ("A new plan replaces the old; rules=[] removes it"), and a next step ("Next: get_my_open_positions"). Nothing about when to select this tool 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.

set_price_alertAlert me at a priceAInspect

Tell the person when a coin's price reaches a level: one message (Telegram, the event stream and webhooks get a price.alert event), then the alert is done. Use when the user asks to be told or woken at a price, instead of polling prices. Not an order: nothing is traded (for an order that waits for a price use preview_perp_order with trigger_price). Inputs: symbol, price, optional direction (default: from the current price) and venue. At most 20 wait at once. Next: get_my_price_alerts.

NameRequiredDescriptionDefault
priceYesThe price level, USD per coin
venueNoOptional: watch one exchange's mark. Omitted: the reference price (median of the exchanges' marks)
symbolYesBase coin, e.g. BTC
directionNoFire when the price is at or above / at or below the level. Omitted: from the current price (a level above it fires on the way up)

Output Schema

NameRequiredDescription
priceYesThe level, USD per coin
venueYesThe exchange whose mark is watched; null: the reference price (median of the exchanges' marks; on the sandbox deployment the sandbox's real-market price)
statusYesactive (waiting), triggered (fired once, done) or deleted
symbolYesBase coin
alert_idYesAlert id, alr_…
directionYesabove: fires when the price is at or above the level; below: at or below
created_atYesISO 8601 UTC
created_byYesThe agent that created it, or person
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
triggered_atNoWhen it fired, ISO 8601 UTC
current_priceNoOn creation: the price it is compared with now, USD per coin
triggered_priceNoThe price that fired it, USD per coin

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare a non-read-only, non-idempotent, non-destructive write; the description explains why — it fires exactly once and is then done, which accounts for the non-idempotent hint. It also discloses a concrete quota ('At most 20 wait at once') and the delivery channels (Telegram, event stream, webhooks get a price.alert event), which annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its one-shot semantics, then the when-to-use, then the non-order exclusion, then inputs and the cap. Dense with parentheticals, but every clause carries information; only the 'Inputs:' sentence is arguably redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the lifecycle (single fire), the delivery mechanism, the concurrency cap, the non-trading guarantee, and the follow-up tool. An output schema exists, so return values need not be explained, and 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents price, symbol, venue and direction including defaults and enum values. The description only restates the parameter list and the direction default, adding no format or edge-case detail beyond the structured fields. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: notify when a coin's price reaches a level, firing one message then completing. It distinguishes itself from the sibling tools cancel_price_alert, get_my_price_alerts and preview_perp_order by name and by scope, so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit triggering conditions ('when the user asks to be told or woken at a price, instead of polling prices'), an explicit exclusion ('Not an order: nothing is traded'), and a named alternative with the parameter to use instead (preview_perp_order with trigger_price). It even names the follow-up tool.

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

set_stop_loss_ruleLet a position's stop follow the priceA
Idempotent
Inspect

Make a held position's stop-loss move by itself, only ever toward the price: trailing (it follows the best price at trail_pct behind it) or breakeven (it moves to the entry once the price reaches activate_at). TradeHub checks about every 5 seconds; each move follows tighten_stop_loss's rules and is audited. Use to lock in profit on a winning position. One rule per position: a new one replaces it, kind=none removes it, it ends when the position closes. Not for a one-off move (use tighten_stop_loss). Next: get_my_open_positions shows the rule.

NameRequiredDescriptionDefault
kindYestrailing: the stop follows the best price at trail_pct behind it; breakeven: the stop moves to the entry once the price reaches activate_at; none: remove the rule
venueNoVenue: sandbox, hyperliquid, okx, bybit or binance. Omitted: the agent's only venue, else hyperliquid, else your only connected venue, else sandboxhyperliquid
symbolYesBase coin, e.g. BTC
trail_pctNotrailing only: distance behind the best price as a fraction, 0.001-0.2 (0.02 = 2%)
activate_atNoPrice, USD per coin, from which the rule acts; required for breakeven (beyond the entry on the profit side), optional for trailing

Output Schema

NameRequiredDescription
okYesTrue when the rule is stored
ruleYesThe rule now following the position; null after kind=none
venueYesVenue name
symbolYesBase coin
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond annotations by disclosing the polling cadence (~every 5 seconds), that each move inherits tighten_stop_loss's rules and is audited, the one-rule-per-position replacement semantics, removal via kind=none, and automatic termination when the position closes. Annotations only supply the generic safety profile (idempotent, non-destructive, open-world); the lifecycle behavior here is genuinely additive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and mode definitions are front-loaded, and every sentence carries operational information (cadence, lifecycle, sibling routing). It is dense and leans on nested parentheticals, which slightly impedes scanning, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a stateful mutation tool with an output schema, high schema coverage, and safety annotations, the description supplies what structured fields cannot: timing, replacement/removal semantics, rule lifetime, and the audit trail. The only unaddressed area is error behavior when no held position exists, a minor omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters (including the kind enum and the trail_pct/activate_at ranges) are already fully documented. The description restates the same trailing/breakeven mechanics rather than adding new semantics, so the baseline of 3 applies. The one mild addition is signaling that breakeven depends on activate_at reaching the entry.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('make a held position's stop-loss move by itself') and immediately enumerates the two operating modes (trailing, breakeven) with their mechanics. It explicitly distinguishes itself from the sibling tighten_stop_loss, so an agent can select between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an affirmative use case ('lock in profit on a winning position'), an explicit exclusion with the correct alternative ('Not for a one-off move (use tighten_stop_loss)'), and a follow-up call ('get_my_open_positions shows the rule'). When-to-use, when-not-to-use, and the alternative are all named.

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

set_take_profit_levelsSet a position's take-profitsA
Idempotent
Inspect

Replace a held position's take-profits: one level or several (e.g. 50% at 98000, the rest at 101000), each a reduce-only trigger on the exchange, so it can only shrink the position. Use after entry, or to move or remove them ([] removes all). Not for the stop-loss (use tighten_stop_loss) or for closing now (use close_perp_position_reduce_only). Inputs: symbol, levels [{price, close_pct}], venue. New orders are placed before the old ones go. Works while trading is halted. Next: get_my_open_orders.

NameRequiredDescriptionDefault
venueNoVenue: sandbox, hyperliquid, okx, bybit or binance. Omitted: the agent's only venue, else hyperliquid, else your only connected venue, else sandboxhyperliquid
levelsYesUp to 4 levels, percentages adding up to at most 100; [] removes every take-profit
symbolYesBase coin, e.g. BTC

Output Schema

NameRequiredDescription
okYesFalse when rejected or failed
feeNoOnce executed: the trading fee, estimated at once and replaced by the amount the exchange charged once its fill records show it
errorNoWhy it was rejected or failed
venueNoVenue name
checksNoChecks run at execution
sl_oidNoVenue order id of the protective stop
statusYespending_approval, armed (a trigger entry waiting for its price), executed, rejected, failed, expired, declined, cancelled, or executing (TradeHub has not confirmed the outcome yet: check get_order_request_status)
receiptNoSigned receipt (compact JWS, EdDSA) once executed: request, checks, preview price, fill, slippage, order ids, delegation. Verify with /.well-known/tradehub-receipts.jwks
order_idNoVenue order id of the fill
fill_priceNoAverage fill, USD per coin
request_idYesOrder request id; get_order_request_status(request_id) follows it
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
filled_sizeNoFilled size, in the base coin (e.g. BTC), not USD
take_profitsNoset_take_profit_levels: the take-profits now on the exchange
trigger_priceNostatus armed: opens at market when the mark reaches this, USD per coin
trigger_expires_atNostatus armed: when it lapses unless reached, ISO 8601 UTC
approval_expires_atNoWhile pending: when the approval request lapses, ISO 8601 UTC

TDQS

A4.7/5.0
Behavior4/5

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

Goes well past the annotations by disclosing reduce-only enforcement, the ordering guarantee ('new orders are placed before the old ones go'), and that it works while trading is halted. It does not cover permission/authorization requirements or what happens on partial failure mid-replacement, which keeps it at 4 rather than 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the replace semantics, then exclusions, then inputs, then the follow-up call. Every sentence carries information the schema doesn't, including the ordering guarantee and the halt tolerance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A mutation tool with an output schema, so return values need no explanation. The description covers replacement semantics, removal, ordering, halted-trading behavior, sibling exclusions, and the natural next call, leaving no gap an agent would need to guess at.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, but the description adds a worked example of level semantics ('50% at 98000, the rest at 101000') and restates the empty-list removal case, giving the agent a concrete mental model of how price/close_pct interact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Replace a held position's take-profits') plus the concrete mechanism (reduce-only triggers on the exchange). It explicitly distinguishes itself from tighten_stop_loss and close_perp_position_reduce_only, so an agent can route correctly without opening a sibling schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit timing ('after entry'), the mutate case ('to move or remove them'), the removal syntax ('[] removes all'), and negative routing for both stop-loss and immediate close. Nothing about when-to-use 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.

size_position_by_riskSize a position by riskA
Read-onlyIdempotent
Inspect

Turns "risk 1% of equity, stop 2% below" into a size in the base coin, rounded down to the venue step and capped by every limit (this agent's, the person's and TradeHub's). Reads equity, mark and contract rules itself: no need for get_my_account_balances or get_perp_contract_rules first. Use before every preview_perp_order. Not an order: nothing is sent. Inputs: symbol, stop_loss (USD) or stop_pct with side, risk_pct or risk_usd (default: the most allowed), venue, entry_price (default: mark), leverage. Next: preview_perp_order with the returned size_base, stop_loss and leverage.

NameRequiredDescriptionDefault
sideNobuy = long, sell = short; needed with stop_pct
venueNoVenue: sandbox, hyperliquid, okx, bybit or binance. Omitted: the agent's only venue, else hyperliquid, else your only connected venue, else sandboxhyperliquid
symbolYesBase coin, e.g. BTC
leverageNoLeverage for the margin estimate, e.g. 5
risk_pctNoLoss at stop as a fraction of equity (0.01 = 1%); omitted with risk_usd also omitted: the largest your limits allow
risk_usdNoLoss at stop in USD (instead of risk_pct)
stop_pctNoStop distance from entry as a fraction (0.02 = 2%), instead of stop_loss; needs side
stop_lossNoStop-loss price, USD per coin; below entry for a long, above for a short. Or give stop_pct and side instead
entry_priceNoPlanned entry, USD per coin; omitted: the mark
notional_usdNoOr the position's value in USD ("buy $200 worth"), instead of risk_pct / risk_usd; still capped by the risk limits

Output Schema

NameRequiredDescription
sideYesbuy (long) or sell (short), from the stop's side of entry
venueYesVenue name
symbolYesBase coin
leverageYesLeverage assumed
risk_usdYesLoss if the stop fills, USD
capped_byYesWhich limit made the size smaller than asked, if any
size_baseYesSuggested size, in the base coin (e.g. BTC), not USD, rounded down to the venue's size step; pass it to preview_perp_order as size_base
stop_lossYesStop-loss used, USD per coin
equity_usdYesEquity used for the calculation (the venue's book), USD
margin_usdYesMargin needed at the given leverage, USD
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
entry_priceYesEntry used, USD per coin (the mark when not given)
notional_usdYessize_base x entry, USD
within_limitsYesFalse if even the capped size cannot pass (e.g. below the venue minimum)
risk_pct_of_equityYesrisk_usd / equity, as a fraction

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations it discloses the real behavioral traits: rounding down to venue step size, capping by three distinct limit layers (agent, person, TradeHub), self-fetching of equity/mark/contract rules, and the default of risking the maximum allowed when neither risk input is given. This is exactly the context an agent cannot infer from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then exclusions, then inputs, then the next step. Dense but every clause carries information; no filler or marketing language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only calculation tool with an output schema, the description covers purpose, required inputs and their alternatives, defaults, safety framing, and the downstream call. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameter meanings are already fully documented in the input schema. The description's "Inputs:" line mostly restates that, though it does compactly surface the either/or relationships (stop_loss vs stop_pct+side, risk_pct vs risk_usd) and the mark default for entry_price. Baseline 3 is the right level given the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a concrete transformation (risk % + stop distance -> size in base coin) and names the resource (position size), then explicitly separates itself from order-placing siblings: "Not an order: nothing is sent." An agent can distinguish this from preview_perp_order and execute_previewed_order without reading any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit placement rule ("Use before every preview_perp_order") and an explicit exclusion of redundant prerequisite calls ("no need for get_my_account_balances or get_perp_contract_rules first"). It even names the follow-up call and which returned fields to pass along.

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

stop_all_trading_nowStop all trading nowA
DestructiveIdempotent
Inspect

Emergency stop for the whole account: cancel every resting order, close every position on every exchange with reduce-only orders, and block new positions. Use only when the person asks to stop everything or something is clearly wrong. Only a person can resume, on the Web with a verification code; third-party apps never get this permission. Not for closing one position (use close_perp_position_reduce_only). Input: reason. Next: get_my_open_positions to confirm nothing is left.

NameRequiredDescriptionDefault
reasonNoWhy, for the user and the audit logkill switch

Output Schema

NameRequiredDescription
okYesTrue when nothing is left open
haltedYesAlways true: new positions are blocked until a person resumes on the Web
reasonYesThe reason given
statusYesOutcome of the stop
receiptNoSigned receipt (compact JWS, EdDSA); verify with /.well-known/tradehub-receipts.jwks
sequenceYesThe steps taken, in order
remainingYesAnything that could not be closed; retry or close it by hand
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
orders_cancelledYesNumber of orders cancelled
positions_closedYesNumber of positions closed (reduce-only)

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover destructive/idempotent/openWorld, but the description adds what the annotations cannot: what actually executes (cancel all orders, reduce-only closes, position blocking), who can reverse it (a human on Web with a verification code), and that third-party apps are denied the permission. That is exactly the operational context an agent needs before an irreversible account-wide action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the blast radius in the first sentence, then trigger condition, then exclusions, then the follow-up check. No repetition of the title and every clause carries new information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, high-stakes tool with an output schema already documenting returns, the description covers scope, authorization, reversibility, exclusion, and a recommended verification step (get_my_open_positions). 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single `reason` field is already documented as "Why, for the user and the audit log." The description only restates it as "Input: reason," adding no format, length, or default guidance beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb + resource + scope: cancels every resting order, closes every position on every exchange with reduce-only orders, and blocks new positions. It explicitly distinguishes itself from the nearest sibling by naming close_perp_position_reduce_only as the tool for single-position exits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the trigger condition ("only when the person asks to stop everything or something is clearly wrong") and the exclusion ("not for closing one position") with the exact alternative tool named. It also adds a resume constraint that governs whether the agent should call it at all.

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

tighten_stop_lossTighten a position's stop-lossAInspect

Move a held position's stop-loss closer to the current price, e.g. to breakeven or to lock in profit: the new stop is placed first, then the old one is cancelled, so the position is never unprotected. Use when the user asks to raise a long's stop or lower a short's. Not for widening a stop (never allowed while the position is open) or for closing (use close_perp_position_reduce_only). Inputs: symbol, stop_loss (USD per coin), venue. Works while trading is halted. Next: get_my_open_orders to see the new stop.

NameRequiredDescriptionDefault
venueNoVenue: sandbox, hyperliquid, okx, bybit or binance. Omitted: the agent's only venue, else hyperliquid, else your only connected venue, else sandboxhyperliquid
symbolYesBase coin, e.g. BTC
stop_lossYesNew stop price, USD per coin: closer to the price than the current stop (higher for a long, lower for a short), still on the loss side of the mark

Output Schema

NameRequiredDescription
okYesFalse when rejected or failed
feeNoOnce executed: the trading fee, estimated at once and replaced by the amount the exchange charged once its fill records show it
errorNoWhy it was rejected or failed
venueNoVenue name
checksNoChecks run at execution
sl_oidNoVenue order id of the protective stop
statusYespending_approval, armed (a trigger entry waiting for its price), executed, rejected, failed, expired, declined, cancelled, or executing (TradeHub has not confirmed the outcome yet: check get_order_request_status)
receiptNoSigned receipt (compact JWS, EdDSA) once executed: request, checks, preview price, fill, slippage, order ids, delegation. Verify with /.well-known/tradehub-receipts.jwks
order_idNoVenue order id of the fill
fill_priceNoAverage fill, USD per coin
request_idYesOrder request id; get_order_request_status(request_id) follows it
deprecationNoPresent only while this tool is deprecated: replacement, removal_date, changelog
filled_sizeNoFilled size, in the base coin (e.g. BTC), not USD
take_profitsNoset_take_profit_levels: the take-profits now on the exchange
trigger_priceNostatus armed: opens at market when the mark reaches this, USD per coin
trigger_expires_atNostatus armed: when it lapses unless reached, ISO 8601 UTC
approval_expires_atNoWhile pending: when the approval request lapses, ISO 8601 UTC

TDQS

A4.7/5.0
Behavior5/5

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

The description adds important behavior beyond the annotations: the new stop is placed before the old one is cancelled, so the position is never unprotected, and it works while trading is halted. These details are operationally significant for a non-read-only trading mutation and are not captured by the annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and safety property, then covers usage, exclusions, inputs, and a useful next step. Every sentence carries actionable information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given full schema coverage, annotations, and an output schema, the description supplies everything else an agent needs: purpose, when to use it, when not to use it, the safety mechanism, halted-trading behavior, and a follow-up tool. No material gap remains for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents symbol, stop_loss, and venue in detail, including the stop-loss side and proximity constraints. The description briefly lists the inputs and repeats that stop_loss is USD per coin, but adds no meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: moving a held position's stop-loss closer to the current price. It also distinguishes the operation from widening a stop and from closing a position, naming close_perp_position_reduce_only as the alternative for closing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit use conditions: when the user asks to raise a long's stop or lower a short's stop. It also states exclusions, namely widening a stop (never allowed while open) and closing (use close_perp_position_reduce_only), so the agent can route correctly among siblings.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Addedget_my_events_since_last_check_or_wait
  2. 2 tool updates
    • Changedget_my_open_positions3 fields changed
      • addedOutput schema / $defs / PlanOut
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "created_at": {
        +      "description": "When it was set, ISO 8601 UTC",
        +      "title": "Created At",
        +      "type": "string"
        +    },
        +    "created_by": {
        +      "description": "Agent id that set the plan, or person",
        +      "title": "Created By",
        +      "type": "string"
        +    },
        +    "deprecation": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Present only while this tool is deprecated: replacement, removal_date, changelog",
        +      "title": "Deprecation"
        +    },
        +    "plan_id": {
        +      "description": "Plan id",
        +      "title": "Plan Id",
        +      "type": "string"
        +    },
        +    "rules": {
        +      "description": "The rules, each fired at most once",
        +      "items": {
        +        "$ref": "#/$defs/PlanRuleOut"
        +      },
        +      "title": "Rules",
        +      "type": "array"
        +    },
        +    "status": {
        +      "description": "active, done, ended, replaced or cancelled",
        +      "title": "Status",
        +      "type": "string"
        +    },
        +    "symbol": {
        +      "description": "Base coin",
        +      "title": "Symbol",
        +      "type": "string"
        +    },
        +    "thesis": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Why the position is held, as its author wrote it; present only for the agent that wrote it and the person",
        +      "title": "Thesis"
        +    },
        +    "venue": {
        +      "description": "Venue name",
        +      "title": "Venue",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "plan_id",
        +    "venue",
        +    "symbol",
        +    "rules",
        +    "created_by",
        +    "created_at",
        +    "status"
        +  ],
        +  "title": "PlanOut",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / PlanRuleOut
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "action": {
        +      "description": "notify or close",
        +      "title": "Action",
        +      "type": "string"
        +    },
        +    "close_pct": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "close: percent of the position it closes",
        +      "title": "Close Pct"
        +    },
        +    "deprecation": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Present only while this tool is deprecated: replacement, removal_date, changelog",
        +      "title": "Deprecation"
        +    },
        +    "fired_at": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "When it fired, ISO 8601 UTC; null while waiting",
        +      "title": "Fired At"
        +    },
        +    "outcome": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "notified, closed, or the error code that stopped the close",
        +      "title": "Outcome"
        +    },
        +    "value": {
        +      "description": "price_*: USD per coin; held_hours: hours since the plan was set; funding_above: yearly rate this position pays, as a fraction (0.5 = 50%)",
        +      "title": "Value",
        +      "type": "number"
        +    },
        +    "when": {
        +      "description": "price_above, price_below, held_hours or funding_above",
        +      "title": "When",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "when",
        +    "value",
        +    "action"
        +  ],
        +  "title": "PlanRuleOut",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / PositionOut / properties / plan
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/PlanOut"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The trade plan on this position (set_position_plan_close_or_notify_later), if any"
        +}
    • Addedset_position_plan_close_or_notify_later
  3. 2 tool updates
    • Changedcompare_perp_quotes_across_venues1 field changed
      • addedOutput schema / properties / cheapest_venue
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With side: the cheapest all-in real venue, whether or not you can use it (fresh quotes only); null if none",
        +  "title": "Cheapest Venue"
        +}
    • Changedget_my_trade_history3 fields changed
      • addedInput schema / properties / before
        Added value: +{
        +  "anyOf": [
        +    {
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Next page: the next_before of the previous answer",
        +  "title": "Before"
        +}
      • addedInput schema / properties / closed_since
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Only trades closed at or after this time (ISO 8601); open trades are left out",
        +  "title": "Closed Since"
        +}
      • addedOutput schema / properties / next_before
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "More trades: pass this as before for the next page; null at the end",
        +  "title": "Next Before"
        +}
  4. 3 tool updates
    • Addedcancel_price_alert
    • Addedget_my_price_alerts
    • Addedset_price_alert
  5. 2 tool updates
    • Changedcompare_perp_quotes_across_venues11 fields changed
      • addedInput schema / properties / hold_hours
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "maximum": 2160,
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional, with side: how long you expect to hold, in hours; adds funding at today's rate and the exit fee, and ranks by that total cost",
        +  "title": "Hold Hours"
        +}
      • changedOutput schema / $defs / VenueQuote / properties / all_in_price / description
        Previous value: -"With side: price plus the taker fee, USD per coin; the ranking key"New value: +"With side: price plus the taker fee, USD per coin"
      • addedOutput schema / $defs / VenueQuote / properties / effective_cost_bps
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With hold_hours: total_cost_bps plus quality_bps; the ranking key",
        +  "title": "Effective Cost Bps"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / effective_price
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With side: all_in_price adjusted by quality_bps, USD per coin; the ranking key without hold_hours",
        +  "title": "Effective Price"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / est_funding_bps
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With hold_hours: funding you would pay over that time at today's rate, basis points of notional; negative = you receive it",
        +  "title": "Est Funding Bps"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / est_funding_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With hold_hours and a size: that funding in USD",
        +  "title": "Est Funding Usd"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / est_total_cost_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With hold_hours and a size: the whole round trip's cost in USD",
        +  "title": "Est Total Cost Usd"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / funding_interval_hours
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With hold_hours: hours between funding payments",
        +  "title": "Funding Interval Hours"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / funding_rate
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With hold_hours: funding rate per interval now, positive = longs pay",
        +  "title": "Funding Rate"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / quality_bps
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With side: measured execution quality as a cost, basis points (the rule is in ranking_basis); 0 without executions",
        +  "title": "Quality Bps"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / total_cost_bps
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With hold_hours: entry cost against the mid, entry and exit taker fees and that funding",
        +  "title": "Total Cost Bps"
        +}
    • Changedpreview_perp_order3 fields changed
      • addedInput schema / properties / hold_hours
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "maximum": 2160,
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional: how long you expect to hold, in hours, to see funding and the round trip's cost (and, with venue \"best\", to choose by them)",
        +  "title": "Hold Hours"
        +}
      • addedOutput schema / properties / est_funding_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With hold_hours: funding over that time at today's rate, USD; negative = received",
        +  "title": "Est Funding Usd"
        +}
      • addedOutput schema / properties / est_round_trip_cost_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With hold_hours: entry fee, exit fee at the taker rate and that funding, USD",
        +  "title": "Est Round Trip Cost Usd"
        +}
  6. 8 tool updates
    • Changedcancel_open_order2 fields changed
      • addedOutput schema / $defs / FeeOut
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "actual": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The charged amount in asset; negative = a rebate",
        +      "title": "Actual"
        +    },
        +    "actual_usd": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "What the exchange charged, USD; null until its fill records show it (or when charged in another asset, see actual and asset)",
        +      "title": "Actual Usd"
        +    },
        +    "asset": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The asset it was charged in (USDT, USDC, BNB …)",
        +      "title": "Asset"
        +    },
        +    "deprecation": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Present only while this tool is deprecated: replacement, removal_date, changelog",
        +      "title": "Deprecation"
        +    },
        +    "estimated_usd": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The account's rate x the filled notional, USD",
        +      "title": "Estimated Usd"
        +    },
        +    "kind": {
        +      "description": "open or close",
        +      "title": "Kind",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "pending (not read yet), done, or unknown (the exchange never showed it)",
        +      "title": "Status",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind",
        +    "estimated_usd",
        +    "actual_usd",
        +    "actual",
        +    "asset",
        +    "status"
        +  ],
        +  "title": "FeeOut",
        +  "type": "object"
        +}
      • addedOutput schema / properties / fee
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/FeeOut"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Once executed: the trading fee, estimated at once and replaced by the amount the exchange charged once its fill records show it"
        +}
    • Changedclose_perp_position_reduce_only2 fields changed
      • addedOutput schema / $defs / FeeOut
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "actual": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The charged amount in asset; negative = a rebate",
        +      "title": "Actual"
        +    },
        +    "actual_usd": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "What the exchange charged, USD; null until its fill records show it (or when charged in another asset, see actual and asset)",
        +      "title": "Actual Usd"
        +    },
        +    "asset": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The asset it was charged in (USDT, USDC, BNB …)",
        +      "title": "Asset"
        +    },
        +    "deprecation": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Present only while this tool is deprecated: replacement, removal_date, changelog",
        +      "title": "Deprecation"
        +    },
        +    "estimated_usd": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The account's rate x the filled notional, USD",
        +      "title": "Estimated Usd"
        +    },
        +    "kind": {
        +      "description": "open or close",
        +      "title": "Kind",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "pending (not read yet), done, or unknown (the exchange never showed it)",
        +      "title": "Status",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind",
        +    "estimated_usd",
        +    "actual_usd",
        +    "actual",
        +    "asset",
        +    "status"
        +  ],
        +  "title": "FeeOut",
        +  "type": "object"
        +}
      • addedOutput schema / properties / fee
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/FeeOut"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Once executed: the trading fee, estimated at once and replaced by the amount the exchange charged once its fill records show it"
        +}
    • Changedcompare_perp_quotes_across_venues2 fields changed
      • addedOutput schema / $defs / VenueExecution / properties / median_fee_bps
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Fee the exchange actually charged, basis points of notional (from its fill records); null until known",
        +  "title": "Median Fee Bps"
        +}
      • changedOutput schema / $defs / VenueExecution / required
        Previous value: -[
        -  "executions",
        -  "fill_rate",
        -  "median_slippage_bps",
        -  "downtime_minutes"
        -]New value: +[
        +  "executions",
        +  "fill_rate",
        +  "median_slippage_bps",
        +  "median_fee_bps",
        +  "downtime_minutes"
        +]
    • Changedexecute_previewed_order2 fields changed
      • addedOutput schema / $defs / FeeOut
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "actual": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The charged amount in asset; negative = a rebate",
        +      "title": "Actual"
        +    },
        +    "actual_usd": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "What the exchange charged, USD; null until its fill records show it (or when charged in another asset, see actual and asset)",
        +      "title": "Actual Usd"
        +    },
        +    "asset": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The asset it was charged in (USDT, USDC, BNB …)",
        +      "title": "Asset"
        +    },
        +    "deprecation": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Present only while this tool is deprecated: replacement, removal_date, changelog",
        +      "title": "Deprecation"
        +    },
        +    "estimated_usd": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The account's rate x the filled notional, USD",
        +      "title": "Estimated Usd"
        +    },
        +    "kind": {
        +      "description": "open or close",
        +      "title": "Kind",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "pending (not read yet), done, or unknown (the exchange never showed it)",
        +      "title": "Status",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind",
        +    "estimated_usd",
        +    "actual_usd",
        +    "actual",
        +    "asset",
        +    "status"
        +  ],
        +  "title": "FeeOut",
        +  "type": "object"
        +}
      • addedOutput schema / properties / fee
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/FeeOut"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Once executed: the trading fee, estimated at once and replaced by the amount the exchange charged once its fill records show it"
        +}
    • Changedget_my_trade_history4 fields changed
      • addedOutput schema / $defs / Trade / properties / fees_settled
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "True when fees_usd is entirely the amounts actually charged",
        +  "title": "Fees Settled"
        +}
      • addedOutput schema / $defs / Trade / properties / fees_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Trading fees for opening and closing it, USD: what the exchange charged where its fill records say, else the estimate",
        +  "title": "Fees Usd"
        +}
      • addedOutput schema / $defs / Trade / properties / net_pnl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "pnl minus fees_usd, USD (null while open)",
        +  "title": "Net Pnl"
        +}
      • changedOutput schema / $defs / Trade / properties / pnl / description
        Previous value: -"Realised profit or loss, USD (null while open)"New value: +"Realised profit or loss before fees, USD (null while open)"
    • Changedget_order_request_status2 fields changed
      • addedOutput schema / $defs / FeeOut
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "actual": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The charged amount in asset; negative = a rebate",
        +      "title": "Actual"
        +    },
        +    "actual_usd": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "What the exchange charged, USD; null until its fill records show it (or when charged in another asset, see actual and asset)",
        +      "title": "Actual Usd"
        +    },
        +    "asset": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The asset it was charged in (USDT, USDC, BNB …)",
        +      "title": "Asset"
        +    },
        +    "deprecation": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Present only while this tool is deprecated: replacement, removal_date, changelog",
        +      "title": "Deprecation"
        +    },
        +    "estimated_usd": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The account's rate x the filled notional, USD",
        +      "title": "Estimated Usd"
        +    },
        +    "kind": {
        +      "description": "open or close",
        +      "title": "Kind",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "pending (not read yet), done, or unknown (the exchange never showed it)",
        +      "title": "Status",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind",
        +    "estimated_usd",
        +    "actual_usd",
        +    "actual",
        +    "asset",
        +    "status"
        +  ],
        +  "title": "FeeOut",
        +  "type": "object"
        +}
      • addedOutput schema / properties / fee
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/FeeOut"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Once executed: the trading fee, estimated at once and replaced by the amount the exchange charged once its fill records show it"
        +}
    • Changedset_take_profit_levels2 fields changed
      • addedOutput schema / $defs / FeeOut
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "actual": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The charged amount in asset; negative = a rebate",
        +      "title": "Actual"
        +    },
        +    "actual_usd": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "What the exchange charged, USD; null until its fill records show it (or when charged in another asset, see actual and asset)",
        +      "title": "Actual Usd"
        +    },
        +    "asset": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The asset it was charged in (USDT, USDC, BNB …)",
        +      "title": "Asset"
        +    },
        +    "deprecation": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Present only while this tool is deprecated: replacement, removal_date, changelog",
        +      "title": "Deprecation"
        +    },
        +    "estimated_usd": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The account's rate x the filled notional, USD",
        +      "title": "Estimated Usd"
        +    },
        +    "kind": {
        +      "description": "open or close",
        +      "title": "Kind",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "pending (not read yet), done, or unknown (the exchange never showed it)",
        +      "title": "Status",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind",
        +    "estimated_usd",
        +    "actual_usd",
        +    "actual",
        +    "asset",
        +    "status"
        +  ],
        +  "title": "FeeOut",
        +  "type": "object"
        +}
      • addedOutput schema / properties / fee
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/FeeOut"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Once executed: the trading fee, estimated at once and replaced by the amount the exchange charged once its fill records show it"
        +}
    • Changedtighten_stop_loss2 fields changed
      • addedOutput schema / $defs / FeeOut
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "actual": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The charged amount in asset; negative = a rebate",
        +      "title": "Actual"
        +    },
        +    "actual_usd": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "What the exchange charged, USD; null until its fill records show it (or when charged in another asset, see actual and asset)",
        +      "title": "Actual Usd"
        +    },
        +    "asset": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The asset it was charged in (USDT, USDC, BNB …)",
        +      "title": "Asset"
        +    },
        +    "deprecation": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Present only while this tool is deprecated: replacement, removal_date, changelog",
        +      "title": "Deprecation"
        +    },
        +    "estimated_usd": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The account's rate x the filled notional, USD",
        +      "title": "Estimated Usd"
        +    },
        +    "kind": {
        +      "description": "open or close",
        +      "title": "Kind",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "pending (not read yet), done, or unknown (the exchange never showed it)",
        +      "title": "Status",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind",
        +    "estimated_usd",
        +    "actual_usd",
        +    "actual",
        +    "asset",
        +    "status"
        +  ],
        +  "title": "FeeOut",
        +  "type": "object"
        +}
      • addedOutput schema / properties / fee
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/FeeOut"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Once executed: the trading fee, estimated at once and replaced by the amount the exchange charged once its fill records show it"
        +}
  7. 2 tool updates
    • Changedcompare_perp_quotes_across_venues23 fields changed
      • addedInput schema / properties / leverage
        Added value: +{
        +  "default": 5,
        +  "description": "For the margin needed, e.g. 5",
        +  "maximum": 125,
        +  "minimum": 1,
        +  "title": "Leverage",
        +  "type": "integer"
        +}
      • addedInput schema / properties / notional_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Or the size in USD",
        +  "title": "Notional Usd"
        +}
      • addedInput schema / properties / side
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "buy",
        +        "sell"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional: rank by the all-in price for this side (the price you would take plus the venue's taker fee)",
        +  "title": "Side"
        +}
      • addedInput schema / properties / size_base
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional, with side: size in the base coin, to see each venue's cost in USD and whether your free margin there covers it",
        +  "title": "Size Base"
        +}
      • addedOutput schema / $defs / VenueExecution
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "deprecation": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Present only while this tool is deprecated: replacement, removal_date, changelog",
        +      "title": "Deprecation"
        +    },
        +    "downtime_minutes": {
        +      "description": "Minutes the venue was unreachable",
        +      "title": "Downtime Minutes",
        +      "type": "number"
        +    },
        +    "executions": {
        +      "description": "Orders TradeHub executed or failed to execute there",
        +      "title": "Executions",
        +      "type": "integer"
        +    },
        +    "fill_rate": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Share that filled, 0-1; null without executions",
        +      "title": "Fill Rate"
        +    },
        +    "median_slippage_bps": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Fill against the preview's mark, basis points, positive = worse",
        +      "title": "Median Slippage Bps"
        +    }
        +  },
        +  "required": [
        +    "executions",
        +    "fill_rate",
        +    "median_slippage_bps",
        +    "downtime_minutes"
        +  ],
        +  "title": "VenueExecution",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / all_in_price
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With side: price plus the taker fee, USD per coin; the ranking key",
        +  "title": "All In Price"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / allowed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With an account: this agent's permissions allow it",
        +  "title": "Allowed"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / connected
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With an account: you have this venue connected",
        +  "title": "Connected"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / cost_bps
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With side: all_in_price against the mid in basis points (half the spread plus the fee); lower is cheaper",
        +  "title": "Cost Bps"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / enough_margin
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With a size: free margin covers it",
        +  "title": "Enough Margin"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / est_cost_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With a size: what trading at all_in_price costs against the mid, USD",
        +  "title": "Est Cost Usd"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / execution_7d
        Added value: +{
        +  "$ref": "#/$defs/VenueExecution",
        +  "description": "TradeHub's measured execution on this venue, all users, last 7 days"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / fee_source
        Added value: +{
        +  "description": "account: your own rate as the exchange reports it; published: the base rate (no account, or the exchange does not say); none: the sandbox",
        +  "enum": [
        +    "account",
        +    "published",
        +    "none"
        +  ],
        +  "title": "Fee Source",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / fee_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With a size: the taker fee in USD",
        +  "title": "Fee Usd"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / free_margin_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With an account and side: free margin on this venue, USD",
        +  "title": "Free Margin Usd"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / maker_fee_bps
        Added value: +{
        +  "description": "Fee for an order that rests on the book, basis points of notional",
        +  "title": "Maker Fee Bps",
        +  "type": "number"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / margin_needed_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With a size: margin needed at the given leverage, USD",
        +  "title": "Margin Needed Usd"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / price
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With side: the price you would take (ask to buy, bid to sell), USD per coin",
        +  "title": "Price"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / size_base
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With a size: the size used, base coin",
        +  "title": "Size Base"
        +}
      • addedOutput schema / $defs / VenueQuote / properties / taker_fee_bps
        Added value: +{
        +  "description": "Fee for an order that takes liquidity (market orders), basis points of notional",
        +  "title": "Taker Fee Bps",
        +  "type": "number"
        +}
      • changedOutput schema / $defs / VenueQuote / required
        Previous value: -[
        -  "venue",
        -  "bid",
        -  "ask",
        -  "mid",
        -  "mark",
        -  "spread_bps",
        -  "age_seconds",
        -  "stale"
        -]New value: +[
        +  "venue",
        +  "bid",
        +  "ask",
        +  "mid",
        +  "mark",
        +  "spread_bps",
        +  "age_seconds",
        +  "stale",
        +  "maker_fee_bps",
        +  "taker_fee_bps",
        +  "fee_source",
        +  "execution_7d"
        +]
      • addedOutput schema / properties / best_venue
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With side: the cheapest all-in venue you can use (connected, allowed, enough margin); without an account, the cheapest overall; null if none",
        +  "title": "Best Venue"
        +}
      • changedOutput schema / properties / venues / description
        Previous value: -"One entry per venue that lists the coin"New value: +"One entry per venue that lists the coin, in ranking order"
    • Changedpreview_perp_order5 fields changed
      • changedInput schema / properties / venue / description
        Previous value: -"Venue: sandbox, hyperliquid, okx, bybit or binance. Omitted: the agent's only venue, else hyperliquid, else your only connected venue, else sandbox"New value: +"Venue: sandbox, hyperliquid, okx, bybit or binance. Omitted: the agent's only venue, else hyperliquid, else your only connected venue, else sandbox; or \"best\": the cheapest all-in venue (price plus fee) you may use and have the margin for"
      • addedOutput schema / properties / est_fee_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Trading fee for this order, USD: taker rate for market orders, maker for limit; the exit pays a fee too",
        +  "title": "Est Fee Usd"
        +}
      • addedOutput schema / properties / fee_rate_bps
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The rate used, basis points of notional",
        +  "title": "Fee Rate Bps"
        +}
      • addedOutput schema / properties / fee_source
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "account (your own rate), published (the base rate) or none (sandbox)",
        +  "title": "Fee Source"
        +}
      • addedOutput schema / properties / venue_choice
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With venue \"best\": why this venue (all-in price and the alternatives)",
        +  "title": "Venue Choice"
        +}
  8. 24 tool updates
    • First observedcancel_open_order
    • First observedclose_perp_position_reduce_only
    • First observedcompare_funding_rates_across_venues
    • First observedcompare_perp_quotes_across_venues
    • First observedexecute_previewed_order
    • First observedget_my_account_balances
    • First observedget_my_agent_performance
    • First observedget_my_open_orders
    • First observedget_my_open_positions
    • First observedget_my_risk_limits_usage
    • First observedget_my_trade_history
    • First observedget_my_trading_permissions
    • First observedget_order_book
    • First observedget_order_request_status
    • First observedget_perp_contract_rules
    • First observedget_price_candles
    • First observedget_technical_indicators_15m
    • First observedget_venue_health
    • First observedpreview_perp_order
    • First observedset_stop_loss_rule
    • First observedset_take_profit_levels
    • First observedsize_position_by_risk
    • First observedstop_all_trading_now
    • First observedtighten_stop_loss

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    F
    maintenance
    AI-native cryptocurrency exchange built for autonomous agents. Register, deposit USDC, select a strategy, and trade 8 crypto pairs (BTC, ETH, SOL + more) programmatically — no KYC required. Includes sandbox with 10,000 virtual USDC for testing.
    -
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI agents to autonomously trade Bitunix USDT-M perpetual futures through an agentic reasoning loop, providing tools for market scanning, order execution, risk management, and long-term memory.
    -
  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables AI agents to execute prediction-market trades through a risk-control gateway that enforces signed mandates and generates proof trails for accountability.
    0
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources