TradingCalc MCP: Options, Forex, Risk Stats, Prediction Markets, On-Chain & Crypto Futures
Server Details
Deterministic options, forex, risk, on-chain & futures math. 77 tools. Not AI estimates.
- Status
- Healthy
- Uptime
- 100.0% over 68 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- Server Listing
- TradingCalc MCP Server
TDQS
Scored across 77 tools
Descriptions are unusually careful about boundaries (primitive.average_entry vs workflow.run_dca_entry, run_carry_trade vs run_funding_arbitrage, run_breakeven_planning vs run_crypto_profit, manual vs _live variants), but there are many more than one or two near-duplicate pairs whose only difference is which extra output fields come back. Choosing between run_funding_arbitrage and run_carry_trade, or between run_pre_trade_check and run_risk_reward, still requires reading several paragraphs. Overlap is managed by prose rather than by tool design.
All names are dot-namespaced snake_case (primitive.*, workflow.*, system.*) with a predictable workflow.run_<domain> pattern, so scanning the list is easy. The deviation is that primitive.* tools drop the verb prefix (average_entry, hedge_ratio) while workflow.* tools add a generic 'run_' even to nouns (run_black_scholes, run_garch). Consistent enough to be readable, but not a single clean verb_noun convention.
77 tools is far past the point where an agent can hold the surface in mind, even for a genuinely multi-domain server (options, forex, statistics, prediction markets, on-chain, futures). A large share of the bloat is structural rather than necessary: every forex primitive exists as both a manual and a _live twin, which could be one tool with an optional accountCurrency/live flag. Breadth is real, but the count is not scoped.
Coverage is genuinely deep: full option pricing/Greeks/IV/payoff/spread/straddle/covered-call, a complete forex calculator suite, futures PnL/liquidation/sizing/funding, a broad risk-statistics set, prediction-market odds and cross-venue arbitrage, and on-chain rug/wallet/IL/market-cap checks. Gaps are minor and mostly discovery-oriented (you must already know a Deribit instrument name or a perp symbol; no listing/search or historical-data tools), which an agent can work around.
Available Tools
77 toolsprimitive.average_entryAverage Entry PriceRead-onlyInspect
Calculate the weighted average entry price from multiple buy/sell fills (DCA): the bare number only, no breakeven or per-fill breakdown. Use when user asks only "what's my average entry?" and wants just that figure. Each fill is { price, quantity } here (workflow.run_dca_entry calls the same field size). For breakeven and a per-level summary too, use workflow.run_dca_entry instead. Returns: averagePrice, totalSize, totalCost.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | Object with a "fills" array, e.g. { "fills": [{ "price": 60000, "quantity": 0.5 }, { "price": 58000, "quantity": 1 }] } | |
| symbol | Yes | Trading pair symbol, e.g. BTCUSDT | |
| contractType | No | linear = USDT-margined, average is the arithmetic mean (default). inverse = coin-margined, average is the harmonic mean (fill quantity is USD notional). | |
| exchangeCode | No | Exchange identifier (optional) |
primitive.hedge_ratioHedge RatioRead-onlyInspect
Calculate the short perpetual futures position size needed to hedge a spot holding. USDT-linear only: sizes and costs are in USD, there is no contractType and no coin-margined (inverse) mode. Use when user asks "how much should I short to hedge my BTC?" or "what margin do I need for a 100% hedge?". Returns: hedgeNotional, requiredMargin, estimatedFundingCost.
| Name | Required | Description | Default |
|---|---|---|---|
| leverage | No | Leverage on the perp short. Default 1. | |
| spotSize | Yes | Spot position value in USDT | |
| hedgeRatio | No | Percentage of spot to hedge, e.g. 100 for full hedge, 50 for half. Default 100. | |
| fundingRatePct | No | Current 8h funding rate as percentage, e.g. 0.01. Used for cost estimate. |
system.pubkeySigning Public KeyARead-onlyInspect
Return the ECDSA P-256 public key (PEM + JWK) and canonical signing format used to sign tool responses, so results can be verified offline without calling back to TradingCalc. Every tools/call result includes a signed second content block when signing is configured; also available at GET /api/mcp/pubkey.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: every tools/call result carries a signed second content block when signing is configured, which tells the agent where signatures come from and when they exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the concrete return payload before the usage rationale. Dense but every clause (PEM + JWK, canonical format, offline verification, signed second block, HTTP mirror) carries information; only the HTTP endpoint mention is arguably secondary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must convey the return value, and it does (PEM + JWK key plus canonical signing format). With annotations covering the safety profile and no parameters to document, an agent has enough to call and use it correctly; a brief note on key rotation or cache lifetime would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so baseline is 4 per the rubric. The description correctly implies no inputs are needed and instead describes the returned key formats, which is the relevant information here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: returns the ECDSA P-256 public key (PEM + JWK) plus the canonical signing format. An agent can immediately distinguish it from siblings like system.verify and the many workflow.run_* tools, since it is the only key-material provider.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the purpose-driven context for use: verifying signed tool responses offline without calling back to TradingCalc, and notes the alternate access path GET /api/mcp/pubkey. It does not explicitly name system.verify as a complementary/alternative tool, so it stops short of a full when/when-not routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
system.verifyVerify CalculationsRead-onlyInspect
Run the full regression suite: 46 canonical test vectors (linear and inverse/coin-margined) across all 12 calculators, and return a pass/fail report with counts and timestamp. Useful as a health check before relying on results in production workflows.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
workflow.run_average_downAverage DownARead-onlyInspect
Should-I-average-down check: for an already-open position, compares adding more at a worse price against the always-available alternative of buying the same final total size fresh at today's price. Returns the new blended average entry, liquidation price and breakeven (before vs. after), margin_added (the actual cash/margin required for the add at this leverage, not the full notional), and three risk figures at your stop-loss: existing_risk (what you already risk, before adding), pyramid_risk (what you'd risk after adding), and clean_entry_risk (what a fresh entry at add_price for the same total size would risk). risk_penalty_pct is how much MORE than that fresh-entry alternative you're risking - for any genuine average-down (add_price worse than existing_entry_price) pyramid_risk is provably always greater than clean_entry_risk. liquidation_before_stop is true when the new liquidation price sits at or beyond your own stop-loss, meaning the exchange would force-close the position before the stop-loss ever triggers. Use when user asks "should I add to this losing position?" or "what does averaging down actually cost me here?".
| Name | Required | Description | Default |
|---|---|---|---|
| mmr | No | Maintenance margin rate (default 0.005) | |
| side | Yes | Trade direction: "long" or "short" | |
| add_size | Yes | Additional size being considered, same unit convention as existing_size | |
| leverage | Yes | Leverage multiplier | |
| add_price | Yes | Proposed price to add at - also treated as today's current price for the fresh-entry comparison | |
| stop_loss | Yes | Stop-loss price (must be below add_price for a long, above it for a short - the position should already be closed otherwise) | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined. Risk figures come back denominated in the base coin for inverse. | |
| fee_open_pct | No | Open fee rate (default 0.0002) | |
| existing_size | Yes | Size already held: base-asset quantity for linear, USD notional (contracts) for inverse | |
| fee_close_pct | No | Close fee rate (default 0.0005) | |
| existing_entry_price | Yes | Entry price of the position already held |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and a closed world, so the safety profile is covered. The description goes well beyond that by explaining the exact semantics of key outputs: margin_added is cash/margin at this leverage rather than full notional, risk_penalty_pct is measured against the fresh-entry alternative, and liquidation_before_stop means the exchange force-closes before the stop fires. That is exactly the extra behavioral context the annotations cannot supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded correctly, opening with the purpose and closing with usage triggers, and every clause carries information. But the output-explanation passage is a single sprawling multi-clause sentence dense with em-dashes that is harder to parse than necessary; it would read better as a short bulleted field list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description rightly carries the full burden of explaining return values, and it names every notable returned field (blended average, liquidation, breakeven before/after, margin_added, the three risk figures, risk_penalty_pct, liquidation_before_stop) with meaning attached. For a computation tool with 11 documented parameters this is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter contract is fully documented in the structured data and the baseline is 3. The narrative adds interpretive meaning (e.g. add_price doubles as today's price, margin_added is not notional, inverse denomination in base coin), but most of this concerns outputs rather than the 11 input parameters themselves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it is a 'should-I-average-down check' that compares adding at a worse price against buying the same total size fresh. That is a concrete, agent-readable purpose. It does not, however, differentiate itself from the close siblings workflow.run_average_entry, primitive.average_entry, or run_dca_entry, which an agent could easily confuse with this one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit user-facing triggers ('should I add to this losing position?' / 'what does averaging down actually cost me here?') and frames the internal alternative it weighs (fresh entry at add_price). No when-NOT-to-use guidance or tool-level alternative (e.g. use run_average_entry for the plain blended price) is offered, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_black_scholesBlack-Scholes Option Price and GreeksARead-onlyInspect
Theoretical European option price and Greeks (delta, gamma, theta, vega, rho) from Black-Scholes, given manual spot/strike/days-to-expiry/volatility/risk-free-rate inputs: no live data fetch. The live variant is workflow.run_black_scholes_live, which applies when checking a real Deribit BTC/ETH instrument, since that variant also reports how far the instrument's actual quoted price sits from what this formula implies. Prices are USD-denominated (the universal convention); callPriceCoin/putPriceCoin additionally divide by spot to match Deribit's own coin-settled quoting convention. Use when user asks "what should this option be worth at X% IV?" or wants raw Greeks for a hypothetical. Returns: callPriceUsd/putPriceUsd, callPriceCoin/putPriceCoin, deltaCall/deltaPut, gamma, vegaPerPct (per 1 vol point), thetaCallPerDay/thetaPutPerDay, rhoCallPerPct/rhoPutPerPct (per 1 rate point).
| Name | Required | Description | Default |
|---|---|---|---|
| spot | Yes | Underlying spot price, USD | |
| strike | Yes | Strike price, USD | |
| daysToExpiry | Yes | Calendar days until expiry (can be fractional) | |
| volatilityPct | Yes | Annualized implied volatility in percentage points, e.g. 60 for 60% | |
| riskFreeRatePct | No | Risk-free rate in percentage points. Default 0: standard crypto-options convention. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: no live data fetch (pure manual-input computation) and the coin-denomination convention that divides price by spot. It stops short of noting edge cases (e.g. zero/negative time to expiry, vol validation), so not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is dense and front-loaded — the core purpose, the sibling routing, and the unit convention all appear before the return list. The final sentence is a long output enumeration, but since there is no output schema it earns its place; the prose is slightly heavy overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description usefully enumerates return fields and clarifies per-unit conventions (vegaPerPct per 1 vol point, theta per day, rho per 1 rate point) and USD vs coin quoting. Combined with annotations covering safety, an agent has enough to call it correctly; minor gaps remain around input validation/edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (spot, strike, daysToExpiry, volatilityPct, riskFreeRatePct) is already documented, including volatility units and the risk-free default of 0. The description restates the input set rather than adding new syntax or constraint detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific method (Black-Scholes), the exact resource (theoretical European option price and Greeks), and enumerates the output set. It explicitly distinguishes itself from run_black_scholes_live, so an agent can route between 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the concrete trigger ("what should this option be worth at X% IV?", raw Greeks for a hypothetical), the alternative (run_black_scholes_live), and the condition that selects the alternative (checking a real Deribit BTC/ETH instrument with a quoted price). When-to-use and when-not are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_black_scholes_liveBlack-Scholes Option Price and Greeks (Live)ARead-onlyInspect
Black-Scholes theoretical price and Greeks for a REAL, live Deribit BTC/ETH option instrument: pulls that instrument's own spot, strike, days to expiry, and implied volatility from Deribit, then reports how far Deribit's actual quoted mark price sits from what Black-Scholes implies at that IV (priceDiscrepancyPct). This is the trust-check tool: "is this exchange's quoted price consistent with its own volatility assumption?", not an estimate, a live formula cross-check. Use when user gives a specific instrument name (e.g. "BTC-27FEB27-90000-C") and asks "is this option fairly priced?" or "what are the Greeks on this contract?". Returns everything workflow.run_black_scholes does, plus instrumentName, currency, optionType, deribitMarkPriceCoin, deribitMarkIvPct, bsPriceCoin, priceDiscrepancyPct, available (false + error if the instrument name doesn't resolve).
| Name | Required | Description | Default |
|---|---|---|---|
| instrumentName | Yes | Exact Deribit instrument name, e.g. BTC-27FEB27-90000-C. Get one from Deribit's options chain; this tool does not browse the chain, it prices one named instrument. | |
| riskFreeRatePct | No | Risk-free rate in percentage points. Default 0: standard crypto-options convention. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, destructiveHint false, openWorldHint). The description goes beyond them by disclosing data provenance (spot/strike/DTE/IV pulled live from Deribit), the semantic intent of the discrepancy metric, and the failure mode ('available: false + error if the instrument name doesn't resolve'). It stops short of stating rate limits or freshness/latency caveats for the live pull.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the trust-check framing, and every clause carries information. The trailing enumeration of return fields is a long run-on list, but given there is no output schema it is mostly earning its place rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by naming the returned fields (instrumentName, currency, optionType, deribitMarkPriceCoin, deribitMarkIvPct, bsPriceCoin, priceDiscrepancyPct, available) and the error path. Combined with clear usage triggers and a 100%-covered schema, an agent has everything needed to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter documentation burden is already met; the description adds context beyond that by giving a concrete instrument format and clarifying that the name must come from an external options chain. It does not elaborate on riskFreeRatePct semantics, but the schema's default-0 convention note covers that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (Black-Scholes theoretical price and Greeks for a live Deribit instrument) and explicitly positions itself against its nearest sibling: 'Returns everything workflow.run_black_scholes does, plus...'. It also names the shape of the answer (priceDiscrepancyPct trust-check), so an agent can distinguish it from both the static BS tool and adjacent option workflows like run_implied_volatility.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions and quoted user phrasings ('is this option fairly priced?', 'what are the Greeks on this contract?') plus the required precondition that the user supply a specific instrument name. It also states what this tool does NOT do ('this tool does not browse the chain, it prices one named instrument'), which routes the agent away from misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_bonding_curveBonding CurveARead-onlyInspect
Pump.fun-style bonding curve calculator: exact tokens received for a buy, price impact, and graduation progress. Pure constant-product math (Uniswap V2 style) using pump.fun's official virtual-reserve constants: no live lookup needed, works for any token still on the curve (not yet graduated to a real AMM pool). Use when user asks "how many tokens do I get buying X SOL on this curve?" or "will this buy graduate the token?". Returns: tokensOut, priceImpactPct, progressPctBefore/After, willGraduate, partialFill (true if the buy exceeds remaining curve capacity).
| Name | Required | Description | Default |
|---|---|---|---|
| solToSpend | Yes | SOL amount for this buy | |
| solRaisedSoFar | Yes | SOL already raised on the curve so far (0 for a brand-new token) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false. The description adds real value beyond that: no live lookup is required (pure constant-product math with pump.fun's official virtual-reserve constants) and it discloses the partialFill edge case when a buy exceeds remaining capacity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core identity and mechanics before the usage examples and return list. The return-field enumeration is dense but every element earns its place given there is no output schema; slightly list-heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description enumerates the return values (tokensOut, priceImpactPct, progressPctBefore/After, willGraduate, partialFill) and explains partialFill's meaning. Inputs, scope, and outputs are all covered for a two-parameter pure-math tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented there, so baseline 3 applies. The description clarifies the model context (virtual-reserve constants) but adds no format, range, or unit detail for solToSpend or solRaisedSoFar beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Pump.fun-style bonding curve calculator') with sub-capabilities named: exact tokens out, price impact, graduation progress. It clearly distinguishes itself from the many AMM/pool siblings by scoping to tokens 'still on the curve (not yet graduated to a real AMM pool)'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrasing ('how many tokens do I get buying X SOL on this curve?', 'will this buy graduate the token?') plus an explicit scope boundary: works for curve tokens, not graduated AMM pools. An agent can route to it without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_breakeven_planningBreakeven PlanningARead-onlyInspect
Calculate the break-even exit price that covers all trading fees: this alone, nothing else. Use when user asks only "what price do I need to just break even?" and nothing more. If the user also gave a stop/target or wants a full trade-safety check, use workflow.run_risk_reward or workflow.run_pre_trade_check instead; both already include this breakeven figure plus more. Returns: breakevenPrice, totalFees.
| Name | Required | Description | Default |
|---|---|---|---|
| side | Yes | Trade direction: "long" or "short" | |
| sizeBase | Yes | Position size: base asset qty for linear, USD contracts for inverse | |
| entryPrice | Yes | Entry price (positive) | |
| feeOpenPct | No | Opening fee fraction, default 0.0002 | |
| feeClosePct | No | Closing fee fraction, default 0.0005 | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined. For inverse, totalFees is returned in the base coin. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context by stating this is a pure fee-only computation and naming the returned fields (breakevenPrice, totalFees) in the absence of an output schema; it could say more about fee assumptions, but that is largely in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with zero waste: purpose, then when-to-use, then when-not-to-use with alternatives, plus a return note. Every sentence earns its place, including the emphatic scoping phrase that prevents over-application.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a bounded 6-parameter read-only computation, the description supplies the selection boundary and the return fields despite there being no output schema, while the schema fully documents parameters and defaults. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including enum explanations and inverse/linear semantics, so the schema does the heavy lifting. The description adds no parameter-level detail beyond what the schema already provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Calculate the break-even exit price') and scopes it tightly ('this alone, nothing else'). It explicitly distinguishes itself from workflow.run_risk_reward and workflow.run_pre_trade_check, so an agent can select it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit positive trigger (user asks only 'what price do I need to just break even?') and explicit exclusions with named alternatives for the stop/target or full-safety-check cases. Nothing about when-not-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.
workflow.run_breakout_acceptanceMarket Profile: Breakout AcceptanceRead-onlyInspect
Market Profile breakout acceptance: did price accept (hold) beyond the value area / range, or reject back inside (fakeout)? Optional buy/sell delta. Use for "did the break above VAH get accepted?". Returns: state, accepted (boolean), direction, confidence, key_levels (VAH/VAL/VPOC), scenario_framing, invalidation level. Candles come from the venue when candles[] is omitted (past sessions are cached, so repeats are fast); supplying candles[] makes the run network-free and reproducible. session_date must be a completed UTC session, before today; a session with no candles returns an error.
| Name | Required | Description | Default |
|---|---|---|---|
| venue | Yes | Exchange to fetch candles from when candles[] not supplied | |
| candles | No | Optional OHLCV for the session; omit to fetch from venue (reproducible + 0 COGS when supplied) | |
| timeframe | No | Candle timeframe (default 15m) | |
| instrument | Yes | Symbol, e.g. BTCUSDT | |
| prev_candles | No | Optional OHLCV for the previous session | |
| session_date | Yes | Session date YYYY-MM-DD (UTC); must be before today (a completed session) | |
| include_delta | No | Include buy/sell delta analysis (default true) | |
| value_area_rule | No | Value-area fraction 0.5–0.9 (default 0.70) |
workflow.run_carry_tradeCarry TradeARead-onlyInspect
Delta-neutral carry trade (funding arbitrage) analysis, with a profitable/marginal/loss verdict on top of the same math primitive.funding_arb uses. Compared with primitive.funding_arb, this one adds output for the case where a plain-English verdict is wanted, not just the raw numbers. Use when user asks "is this carry trade worth it?": long on exchange A, short on exchange B, collect the funding rate spread. Returns: netYieldPct, grossProfit, netProfit, breakevenDays, verdict (profitable/marginal/loss).
| Name | Required | Description | Default |
|---|---|---|---|
| notional | Yes | Position notional in USDT | |
| hold_days | Yes | Hold duration in days | |
| interval_hours | No | Funding interval: 1 or 8 hours (default 8) | |
| transfer_fee_pct | No | One-way transfer fee % (default 0.1) | |
| funding_rate_long | Yes | Funding rate on long exchange per interval (decimal) | |
| funding_rate_short | Yes | Funding rate on short exchange per interval (decimal) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description usefully confirms this is a deterministic computation layered on an existing primitive and enumerates the computed outputs, though it says nothing about edge cases (e.g., zero/negative spread handling).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and trigger, but the 'compared with primitive.funding_arb' clause restates the first sentence, the math-primitive reference is an awkward sentence fragment, and the Returns list partly duplicates what the schema/verdict already implies.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly fills the gap by naming the returned fields (netYieldPct, grossProfit, netProfit, breakevenDays, verdict). It omits any note on expected input units beyond the schema or on what drives a 'marginal' classification, but is otherwise sufficient to call the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (including the interval_hours enum and fee defaults) are already documented in the schema. The description only gestures at the funding-rate spread concept and adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific analysis (delta-neutral carry trade / funding arbitrage) plus its distinguishing output (profitable/marginal/loss verdict), and explicitly names the sibling whose math it reuses. An agent can tell it apart from primitive.funding_arb and from workflow.run_funding_arbitrage 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ('use when user asks "is this carry trade worth it?"') and a discriminator against primitive.funding_arb (plain-English verdict vs raw numbers). The named alternative, however, is not in the sibling list shown, so the routing hint is slightly off-target and there is no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_cointegrationCointegration TestARead-onlyInspect
Engle-Granger two-step cointegration test for a pair of price series: do they share a long-run equilibrium relationship (their spread is stationary/mean-reverting)? The standard pairs-trading signal test. Returns the cointegrating regression's hedge ratio (beta) and an ADF t-statistic on the residuals, compared against 1%/5%/10% critical values. Use when user asks "are these two assets cointegrated?" or "is this a valid pairs trade?". Returns: alpha, beta (hedge ratio), t_stat, critical_values, cointegrated (booleans at each significance level).
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Second price series, same length and dates as y | |
| y | Yes | First price series (the dependent variable in the cointegrating regression) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so safety is covered. The description adds genuine behavioral context beyond that: the two-step method, that residual ADF stats are compared to 1/5/10% critical values, and the exact returned fields (alpha, beta, t_stat, critical_values, cointegrated).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the method and the question it answers, then the return payload. Slightly verbose with the rhetorical parenthetical, but every clause carries information an agent would want.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description responsibly enumerates the returned fields and the interpretation threshold logic, and the required parameters are fully documented in the schema. An agent can call and interpret this tool without further reference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with only two parameters, and the schema descriptions already state the role of y (dependent variable) and x (second series, same length/dates). The description adds no format or ordering guidance beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific statistical procedure (Engle-Granger two-step cointegration test) applied to a specific resource (a pair of price series), and frames the exact question it answers (shared long-run equilibrium / stationary spread). This distinguishes it cleanly from siblings like run_forex_correlation and primitive.hedge_ratio.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrasing: 'are these two assets cointegrated?' and 'is this a valid pairs trade?' — a clear usage context. It does not, however, name sibling alternatives or state when not to use it (e.g. vs a plain correlation tool), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_compound_fundingCompound FundingRead-onlyInspect
Project capital growth from reinvesting perpetual futures funding income (compounding carry). Use when user asks "how much will I make compounding 0.01% funding for 90 days?" or "what's my APY on this carry position?". Funding received is split by reinvestPct (the rest is withdrawn and still counts as earned); funding paid comes out of capital in full, and the capital never goes below 0. Returns: finalCapital, totalWithdrawn, endValue, totalEarned, totalEarnedPct, annualizedAPY, dailyEarnings, snapshots.
| Name | Required | Description | Default |
|---|---|---|---|
| reinvestPct | No | Percentage of funding received that is reinvested each interval, 0-100 (the rest is withdrawn and counts as earned; funding paid always comes out of capital). 100 = full compounding. Default 100. | |
| durationDays | Yes | Number of days to project, up to 3650 | |
| intervalHours | No | Funding interval: 8 (standard) or 1 (Hyperliquid, dYdX, Kraken: per-hour rates) | |
| fundingRatePct | Yes | Funding rate per interval as percentage, e.g. 0.01 for 0.01% | |
| initialCapital | Yes | Starting capital in USDT |
workflow.run_covered_call_protective_putCovered Call and Protective PutARead-onlyInspect
Covered call (long the coin + short a call against it, for yield) or protective put (long the coin + long a put, for downside insurance) on a Deribit BTC/ETH position. Returns the standard annualized-yield metric (premium ÷ 1 coin, annualized by 365/daysToExpiry) up front: that number doesn't depend on any price scenario. Also returns the USD value of the combined position at a given scenario price: covered call caps upside at strike + premium×scenarioPrice (the premium's own coin-denominated value still scales with price, unlike a textbook USD-settled cap); protective put floors value at strike×(1−premium), which is the true minimum across every possible settlement price, not just an approximation. Use when user asks "what annualized yield do I get selling covered calls on my BTC?" or "how much does insuring my BTC with a put cost me?". Returns: staticYieldPct, annualizedYieldPct, valueAtScenarioUsd, breakevenPrice (covered_call only), floorValueUsd (protective_put only), vsHoldingUsd (vs. just holding the coin).
| Name | Required | Description | Default |
|---|---|---|---|
| strike | Yes | Option strike, USD | |
| currency | No | Underlying coin. Default BTC. | |
| quantity | Yes | Coin units held / contracts (1:1 covered) | |
| strategy | Yes | "covered_call" (hold the coin, sell a call against it) or "protective_put" (hold the coin, buy a put as insurance) | |
| spotEntry | Yes | Price you acquired/value the underlying coin at, USD; used for the covered-call breakeven vs. cost basis | |
| premiumCoin | Yes | Premium received (covered_call) or paid (protective_put) per contract, in the base coin | |
| daysToExpiry | Yes | Calendar days until expiry; used to annualize the yield/cost | |
| scenarioPrice | Yes | Underlying price in USD to evaluate the combined position's value at |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag readOnlyHint=true and destructiveHint=false, and the description goes well beyond them: it states the annualized-yield metric is price-independent, explains exactly how upside is capped and how the floor is computed, and flags the non-textbook coin-denominated premium behavior. This is rich behavioral context an agent cannot get from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and both strategy branches are front-loaded, and the return fields are enumerated at the end. It is dense and the parenthetical formula asides are verbose, but for a multi-metric strategy workflow most of the detail earns its place rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so thoroughly, enumerating staticYieldPct, annualizedYieldPct, valueAtScenarioUsd, breakevenPrice, floorValueUsd, and vsHoldingUsd. An agent has enough to call it and interpret results; only the exact field types/units per output are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 7 parameters including the strategy enum and premium direction. The description adds formula-level meaning (premium scaling, floor/breakeven semantics) but little per-parameter syntax or format beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource pair, naming both supported strategies (covered call, protective put) and the underlying (Deribit BTC/ETH position). The two strategies are clearly distinguished from siblings like run_straddle_strangle, run_spread_payoff, and run_options_payoff by their long-coin-plus-short-call / long-put structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit trigger phrases ('what annualized yield do I get selling covered calls on my BTC?' and 'how much does insuring my BTC with a put cost me?'), which directly maps user intent to the two strategy enum values. It does not, however, name when to prefer a sibling (e.g., options_payoff) or state exclusions, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_cross_venue_arbitrageCross Venue ArbitrageARead-onlyInspect
Checks 2-5 quotes for the SAME real-world binary bet across venues (or manually-supplied probabilities) for a guaranteed, direction-independent arbitrage: buy "Yes" at whichever venue quotes it cheapest, buy "No" at whichever venue quotes "Yes" most expensively (its own "No" price is assumed to be 1 minus its own "Yes" price, the standard complementary-binary convention). Reports isArbitrage, the cost to lock in $1 of guaranteed payout, guaranteed profit and ROI for a given stake, and which side to buy where. feePctPerLeg is an optional per-leg trading-fee rate that can and does erase a real-looking spread - reported honestly via isArbitrage rather than always showing a positive number. Use when user asks "can I arbitrage this bet across venues?" or "is there a risk-free profit here?". The caller asserts the venues quote the same bet; this tool does not verify that.
| Name | Required | Description | Default |
|---|---|---|---|
| quotes | No | Live mode: one entry per venue, 2-5 total. Provide this OR manualProbabilitiesPct, not both. | |
| stakeUsd | Yes | Total capital to deploy across both legs | |
| feePctPerLeg | No | Optional per-leg trading-fee rate, e.g. 0.02 for 2% (default 0) | |
| manualProbabilitiesPct | No | Manual mode: 2-5 probabilities (0.01-99.99) already known for the same bet across different venues, when you don't want a live fetch. Provide this OR quotes, not both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe read-only, open-world computation, and the description adds substantial context beyond them: the complementary-binary convention (No = 1 - Yes), that feePctPerLeg can erase an apparent spread and is reported honestly via isArbitrage, and the important caveat that the caller asserts the same bet and the tool does not verify it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core operation and scoping, but is a single very dense paragraph with some redundancy (the fee/spread point is stated twice) and could be broken into clearer units.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description enumerates the returned fields (isArbitrage, locked-in cost, guaranteed profit, ROI, which side to buy where), covers assumptions and both input modes, and states the verification boundary—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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning beyond the schema by explaining that feePctPerLeg is optional and materially affects the result, and that quotes and manualProbabilitiesPct are alternatives rather than complements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (checks quotes across venues for arbitrage) and frames the exact scope: 2-5 quotes for the SAME binary bet, with direction-independent logic. It is clearly distinguishable from siblings like run_funding_arbitrage or run_prediction_market_edge.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrasing ("can I arbitrage this bet across venues?", "is there a risk-free profit here?") and clarifies the two input modes (live quotes vs manualProbabilitiesPct) as mutually exclusive, matching the schema's either/or design.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_crypto_profitCrypto ProfitARead-onlyInspect
Profit or loss on a spot crypto trade (coins bought and sold outright, no leverage, no funding) after both fees. Give exactly one of investment (total cash spent, buy fee included) or quantity (coins bought). Each fee is a fraction of that fill's trade value (0.001 = 0.1%): the buy fee is paid on top of the coins' cost, the sell fee comes out of the sale value. For a leveraged perpetual futures position see workflow.run_pnl_planning. Use when user asks "I bought BTC at $X, what is my profit if I sell at $Y?" or "what price do I need to sell at to break even after fees?". Returns: quantity, totalCost, proceeds, totalFees, profit, roiPct and priceChangePct (fractions), priceMultiple, breakevenSellPrice, annualizedReturnPct (a fraction, only when holdingDays is given and is at least 30, null otherwise: annualizing a shorter hold gives meaningless figures).
| Name | Required | Description | Default |
|---|---|---|---|
| buyPrice | Yes | Price paid per coin, in the quote currency (e.g. 60000 for BTC in USD) | |
| quantity | No | Number of coins bought (e.g. 0.5). Give this or investment, not both | |
| buyFeePct | No | Buy fee as a fraction of the trade value, 0 to 0.05 (0.001 = 0.1%). Default 0 | |
| sellPrice | Yes | Price per coin at the sale, or the price to test, same currency | |
| investment | No | Total cash spent on the buy, buy fee included (e.g. 1000). Give this or quantity, not both | |
| sellFeePct | No | Sell fee as a fraction of the trade value, 0 to 0.05 (0.001 = 0.1%). Default 0 | |
| holdingDays | No | Optional: days the coins were held; 30 or more also returns the annualized return |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and a closed, non-destructive calculation, so the safety profile is covered. The description adds real behavioral context beyond that: how fees are applied (buy fee on top of cost, sell fee out of proceeds), the mutually exclusive investment/quantity input rule, and the non-obvious annualization rule (only when holdingDays >= 30, otherwise null). It does not discuss rounding or currency assumptions, but the remaining gaps are minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded, and the routing/trigger sentences come before the mechanical details. The final sentence packing the full return list is dense and runs long, but every clause carries distinct information (units, conditional null), so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return-value burden and does so completely — it enumerates every returned field, notes unit conventions (fractions vs percentages), and explains the conditional annualizedReturnPct null case. Combined with the fee and input-exclusivity rules, an agent has everything needed to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining the fee semantics in words that clarify what buyFeePct/sellFeePct actually act on (a fraction of that fill's trade value, asymmetric treatment of buy vs sell), and by restating the investment-vs-quantity exclusivity. That adds interpretative value the schema fields alone do not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource — profit or loss on a spot crypto trade — and immediately scopes it ('no leverage, no funding'), which is exactly the boundary that separates it from the many other P&L siblings. It also explicitly routes the leveraged case to workflow.run_pnl_planning, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use triggers in the form of verbatim user questions ('I bought BTC at $X, what is my profit if I sell at $Y?') and explicitly names the alternative tool for the leveraged case. Nothing about selection 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.
workflow.run_dca_entryDCA EntryRead-onlyInspect
DCA entry planner: weighted average entry price, breakeven, and per-level contribution from multiple fill prices and sizes. Each fill is { price, size } here (primitive.average_entry calls the same field quantity). Compared with primitive.average_entry, this one adds output for the case where breakeven or the per-level breakdown is also wanted, not just the bare average. Use when user bought at several prices and asks "what's my average entry?" or "where is my DCA breakeven?". Returns: averageEntry, breakeven, per-level summary.
| Name | Required | Description | Default |
|---|---|---|---|
| side | Yes | Trade direction: "long" or "short" | |
| entries | Yes | Fills to average (2 to 20). Each: { price, size }, e.g. [{ "price": 60000, "size": 0.5 }, { "price": 58000, "size": 1 }]. Size is base-asset quantity for linear, USD notional (contracts) for inverse. | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined. Each fill's size is USD notional (contracts) for inverse; averageEntry is then the harmonic mean of fill prices, not the arithmetic mean. | |
| fee_open_pct | No | Open fee rate (default 0.0002) | |
| fee_close_pct | No | Close fee rate (default 0.0005) |
workflow.run_dsrDeflated Sharpe RatioARead-onlyInspect
Deflated Sharpe Ratio (Bailey & Lopez de Prado): given how many strategy variants you tried (and how correlated they are), what Sharpe ratio would the best of N clear by luck alone, and does your actual strategy still clear that higher bar? Use when user asks "is my backtested Sharpe ratio real, or did I get lucky trying many variants?" or "how many independent trials does this really represent?". Provide either trial_sharpes[] (the N trials' own observed Sharpe ratios, most rigorous) or n_trials (+ optional avg_correlation to correct for correlated trials via Kish's design effect). Two limits to know. n_trials assumes the paper's illustrative case (trial Sharpes with mean 0 and variance 1, in per-period units), which is a very high bar for a low-frequency series: the threshold is about 1.6 at N=10, 2.5 at N=100 and 3.3 at N=1000, while a daily series has a per-period Sharpe of order 0.05, so dsr comes out effectively 0; use trial_sharpes there. trial_sharpes centers the threshold on the trials' own mean Sharpe plus their dispersion times the expected-maximum factor; this answers "does my strategy beat the best of N trials drawn from the spread I observed", not the zero-skill-null variant (mean fixed at 0) used in some texts; the two thresholds differ by exactly the trials' mean Sharpe. Returns: expected_max_sharpe (the luck-alone threshold), dsr (probability your strategy's true Sharpe exceeds it, 0-1), n_trials_effective.
| Name | Required | Description | Default |
|---|---|---|---|
| returns | Yes | The candidate strategy's own return series | |
| n_trials | No | Number of strategy variants tried, if trial_sharpes were not tracked individually. Assumes trial Sharpes with mean 0 and variance 1 (per-period units): too strict for daily series, prefer trial_sharpes there. | |
| trial_sharpes | No | Observed Sharpe ratios of all N trials tried, if tracked. Takes priority over n_trials if both are given. | |
| avg_correlation | No | Average pairwise correlation between trials, 0-1 (default 0 = independent). Only used with n_trials; lowers the effective trial count via Kish's design effect. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/non-destructive/closed-world, and the description adds substantial context beyond them: the unit assumption baked into n_trials (per-period, mean 0, variance 1), concrete threshold values at N=10/100/1000, why that makes dsr effectively 0 for daily series, and that trial_sharpes centers on the observed mean rather than a zero-skill null. These are exactly the interpretive traps an agent would otherwise fall into.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with concept, then usage triggers, then two labeled limits, then return values — a sensible order. It is a dense unbroken paragraph of roughly 250 words for a four-parameter tool; the content earns its place but bullets or line breaks would improve scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite being a numeric workflow with no output schema, the description names the three returned fields and how to read them (expected_max_sharpe as the threshold, dsr as a 0-1 probability), and covers the failure mode that would otherwise produce a silent wrong answer. An agent has everything needed 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description goes beyond the schema by explaining the priority relationship, the Kish design-effect role of avg_correlation, and the unit caveat that makes n_trials unsuitable for daily data. It does not restate scalar ranges or types, which the schema already covers, so it falls just short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific, well-defined statistic (Deflated Sharpe Ratio, Bailey & Lopez de Prado) and states in plain language exactly what it computes: the Sharpe ratio the best of N trials would clear by luck alone, and whether the actual strategy still clears it. This is clearly distinguishable from a plain Sharpe calculation in the sibling list (run_sharpe_stats) 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrasing ('is my backtested Sharpe ratio real, or did I get lucky...?', 'how many independent trials does this really represent?') and an explicit selection rule between the two input paths: prefer trial_sharpes[] as most rigorous, fall back to n_trials + optional avg_correlation. It even states when NOT to use n_trials ('use trial_sharpes there' for low-frequency series). 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.
workflow.run_evt_tail_riskEVT Tail RiskARead-onlyInspect
Extreme Value Theory tail risk (Peaks-Over-Threshold): fits a Generalized Pareto Distribution to the losses beyond a high threshold via Grimshaw's (1993) profile-likelihood MLE, then extrapolates VaR/Expected Shortfall at the requested confidence, without assuming a normal distribution. Use when user asks "what's my tail VaR without assuming normality?" or "how fat is my loss tail, really?". Complements workflow.run_var_cvar (parametric, normal-distribution VaR/CVaR) for exactly the fat-tailed-return case that assumption understates. threshold_percentile (default 90) sets which percentile of the loss distribution (losses = -returns) becomes the threshold u; confidence must be deep enough into the fitted tail (1-confidence < the threshold's own exceedance rate) or the call throws. Returns: threshold, n_exceedances, exceedance_rate, xi (GPD shape: 0=exponential tail, >0=heavy/fat tail, <0=bounded tail; values <= -1 are excluded from the fit domain as a known non-regular/unbounded-likelihood case, Smith 1985), beta (GPD scale), xi_asymptotically_normal (false when xi<=-0.5: the fit is still valid but the usual MLE confidence-interval theory doesn't apply, per that same Smith 1985 result), var, es (null when xi>=1, where Expected Shortfall is mathematically undefined).
| Name | Required | Description | Default |
|---|---|---|---|
| returns | Yes | Return series, one value per period, at least 100 values (POT needs real sample depth in the tail) | |
| confidence | No | VaR/ES confidence level, 0-1 exclusive. Default 0.99. Must satisfy 1-confidence < the threshold's own exceedance rate. | |
| threshold_percentile | No | Percentile (0-100 exclusive) of the loss distribution used as the POT threshold u. Default 90. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive), so the burden is lower, yet the description still discloses real behavioral traits: the confidence-vs-threshold feasibility constraint that triggers an exception, and edge-case semantics for xi, xi_asymptotically_normal, and es becoming null when xi>=1. It omits runtime/cost characteristics, but the error and domain conditions are unusually well documented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation and use case, which is good, but the trailing 'Returns:' block is a long, dense enumeration of six fields with heavy parenthetical citations. It is information-dense but borders on over-specification and would be better absorbed by an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, no-output-schema tool, this covers method, use case, sibling differentiation, parameter meaning, error conditions, and return fields — an agent has what it needs to call it correctly. Not perfect only because return semantics are embedded in prose rather than a schema, and expected input format conventions (e.g., ordered series, sampling frequency) are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents all three parameters, so the baseline is 3. The description goes beyond by explaining the domain meaning of threshold_percentile (percentile of the loss distribution, losses = -returns) and the cross-parameter constraint on confidence, adding interpretation rather than restating format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource (fits a GPD to tail losses and extrapolates VaR/ES) and distinguishes itself from the sibling workflow.run_var_cvar by contrasting the distributional assumptions. An agent can route between the two without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggering user phrasings ('what's my tail VaR without assuming normality?') and names the alternative tool (workflow.run_var_cvar) together with the condition that selects it — the fat-tailed case that normal parametric VaR understates. When-to-use and when-to-prefer-the-sibling are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_exit_targetExit TargetARead-onlyInspect
Calculate the exact exit price needed to hit a target PnL or ROE percentage. Use when user asks "at what price do I take profit to make $500?" or "where should I set TP for 20% ROE?". Returns: targetExitPrice.
| Name | Required | Description | Default |
|---|---|---|---|
| side | Yes | Trade direction: "long" or "short" | |
| leverage | Yes | Leverage multiplier | |
| sizeBase | Yes | Position size in base asset | |
| entryPrice | Yes | Entry price | |
| feeOpenPct | No | Opening fee fraction, default 0.0002 | |
| targetMode | Yes | "pnl" = target in USDT, "roe" = target in % | |
| feeClosePct | No | Closing fee fraction, default 0.0005 | |
| targetValue | Yes | Target value (USDT/coin for pnl mode, or %) | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined. For inverse, pnl-mode targetValue and outputs are in the base coin. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile of this pure-computation tool is fully covered. The description adds the return field (targetExitPrice) which is useful given there is no output schema, but it discloses nothing further about determinism, fee handling, or edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and resource, then two illustrative queries, then the return value. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deterministic read-only calculator whose safety is covered by annotations and whose parameters are fully documented in the schema, the description is nearly complete and even covers the return field in the absence of an output schema. Detailed inverse/linear output handling is left to the schema, which is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 9 parameters, including the three enums (side, targetMode, contractType) and fee defaults, are already documented in the schema. The description only restates the PnL/ROE distinction without adding syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Calculate) plus the exact resource (the exit price needed to hit a target PnL or ROE percentage), and disambiguates the two target modes. An agent can immediately distinguish this from sibling entry/sizing tools like run_average_down or run_position_sizing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrasing ('at what price do I take profit to make $500?', 'where should I set TP for 20% ROE?'), which clearly signals when to call it. However, it does not name alternatives (e.g., run_scale_out, run_pnl_planning, run_breakeven_planning) or state 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.
workflow.run_forex_average_entryForex Average EntryARead-onlyInspect
Size-weighted average entry price across multiple forex fills: plain arithmetic mean, since forex has no coin-margined analog requiring the harmonic mean the crypto average_entry tool uses for inverse contracts. Use when user asks "what's my average entry after these fills?". Returns: totalUnits, totalCost, avgEntry.
| Name | Required | Description | Default |
|---|---|---|---|
| pair | Yes | Currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| fills | Yes | Fills to average, each with a price and a size in base-currency units |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. With no output schema, the description compensates by naming the returned fields (totalUnits, totalCost, avgEntry) and disclosing the computational method, which is genuinely useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core computation, then the method note, trigger, and return fields. The parenthetical comparing harmonic vs arithmetic means is somewhat long but earns its place by preempting a plausible sibling confusion.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates return fields, and the method note plus trigger cover the call context. For a simple 2-param, read-only computational tool the definition is essentially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only 2 parameters, so the schema already documents pair format (BASE/QUOTE) and fill structure (price, units). The description's 'size-weighted' phrasing adds marginal semantic clarity about units but nothing beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('size-weighted average entry price across multiple forex fills') and explicitly differentiates from the sibling primitive.average_entry by explaining why the arithmetic mean is used rather than the harmonic mean. An agent can distinguish it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear trigger ('Use when user asks "what's my average entry after these fills?"') and contrasts the method against the crypto average_entry tool. It does not state an explicit exclusion or when to prefer the sibling instead, but the routing context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_breakevenForex BreakevenARead-onlyInspect
Breakeven price for a forex position accounting for spread and round-trip commission, in pips and in price. Commission is quoted per standard lot (100,000 units) and expressed in the pair's own quote currency; because both commission and pip value scale with lot size, the commission-in-pips figure is independent of position size by construction. Use when user asks "where's my true breakeven after spread and commission?". Returns: pipSize, commissionPips, totalCostPips, breakevenPrice.
| Name | Required | Description | Default |
|---|---|---|---|
| pair | Yes | Currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| side | Yes | Trade direction: "long" or "short" | |
| entryPrice | Yes | Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD | |
| spreadPips | Yes | Spread at entry, in pips | |
| commissionPerLotRoundTrip | No | Round-trip commission per standard lot, in the pair's own quote currency. Default 0 (pure-spread broker model). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuine domain behavior: commission is per standard lot in the quote currency, and commission-in-pips is position-size invariant by construction. It does not discuss edge cases such as zero commission or non-standard lot conventions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, then the commission/scale invariant, then the return key list. Dense but each sentence carries meaning; the mid-sentence derivation of size-independence is slightly verbose but earns its place by preventing unit errors.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and five parameters, the description compensates fully: it enumerates the returned keys (pipSize, commissionPips, totalCostPips, breakevenPrice) and explains the unit conventions of the inputs. An agent has everything needed to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining the semantics of commissionPerLotRoundTrip (per standard lot, in quote currency, default 0 pure-spread model) and why its pip conversion is size-independent, which helps an agent reason about the units rather than just passing numbers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: computing a forex position's breakeven price inclusive of spread and round-trip commission, in both pips and price. This is well differentiated from generic breakeven siblings by the 'forex' + 'commission' scope, but it never names the closest siblings (run_breakeven_planning, run_funding_breakeven) it could be confused with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit trigger phrase: 'Use when user asks "where's my true breakeven after spread and commission?"', which gives a clear context for invocation. It stops short of stating when NOT to use it or which alternative handles the simpler spread-only case, so routing among the many breakeven/pnl siblings 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.
workflow.run_forex_correlationForex CorrelationARead-onlyInspect
Correlation coefficient and minimum-variance hedge ratio between two price series of matching length, computed on daily % returns (not raw price levels, which would give spuriously high correlation between two unrelated but both-trending series). hedgeRatio follows Hull's standard futures-hedging formula: cov(returns1,returns2)/var(returns2), "how many units of series 2 per unit of series 1 minimizes the combined position's variance." No live data fetch: supply the two price series directly. The live variant is workflow.run_forex_correlation_live, which has both series fetched automatically for two named pairs. Use when user already has two price series and wants their statistical relationship. Returns: n, correlation (-1 to 1), hedgeRatio.
| Name | Required | Description | Default |
|---|---|---|---|
| rates1 | Yes | First price series, chronological order, one price per date | |
| rates2 | Yes | Second price series, chronological order, same length and same dates as rates1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so safety is covered. The description adds genuinely non-obvious behavior: computation is on daily % returns rather than raw levels, the hedgeRatio uses Hull's cov/var formula, and no live fetch occurs. It stops short of 5 only because it doesn't discuss edge cases (e.g., zero variance, minimum series length enforcement) that an agent invoking with borderline inputs would want.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation and the key no-fetch constraint, and the return values are summarized last. The parenthetical justification of % returns and the quoted formula explanation are slightly verbose, but each sentence carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a pure-computation tool with no output schema, the description supplies the algorithmic method, the input shape requirement, the alternative sibling, and an explicit 'Returns: n, correlation, hedgeRatio' summary. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by clarifying that the series are transformed to daily % returns before computing and that both must be of 'matching length' — a constraint the schema states but the description explains the reason for. It does not document the 5-item minimum beyond what the schema declares.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource (correlation coefficient and minimum-variance hedge ratio between two price series) and immediately distinguishes itself from workflow.run_forex_correlation_live by naming the sibling and the condition that selects it ('No live data fetch: supply the two price series directly'). 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the use condition ('Use when user already has two price series and wants their statistical relationship') and names the alternative (run_forex_correlation_live) with its contrasting capability ('both series fetched automatically for two named pairs'). This is the when/when-not/alternatives pattern at full strength.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_correlation_liveForex Correlation (Live)ARead-onlyInspect
Correlation coefficient and minimum-variance hedge ratio between two forex pairs, fetched live: historical daily rates for both pairs over the given lookback window (frankfurter.app's daily ECB reference time series, business days only), aligned by matching date, computed on daily % returns. hedgeRatio follows Hull's standard futures-hedging formula: "how many units of pair2 per unit of pair1 minimizes the combined position's variance." Use when user asks "how correlated are EUR/USD and GBP/USD?" or "what hedge ratio should I use between these two pairs?". Returns: n (overlapping trading days used), correlation (-1 to 1), hedgeRatio, available (false + error if either pair has no data, or too few dates overlap).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Calendar days to look back, 14-365. Default 30. Business-day-only data means fewer actual points than this number. | |
| pair1 | Yes | First currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| pair2 | Yes | Second currency pair in BASE/QUOTE format, e.g. "GBP/USD" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover safety (readOnly/openWorld/not destructive); the description carries substantial extra behavior: ECB reference source, business-days-only data, date-aligned series, computation on daily % returns, the specific Hull formula behind hedgeRatio, and explicit failure semantics ('available: false + error if either pair has no data, or too few dates overlap').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: purpose, then data/compute method, then when-to-use, then returns. Dense but nearly every sentence earns its place; the inlined Hull formula quotation is the only slightly verbose element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully documents the return contract (n, correlation, hedgeRatio, available + error conditions), the data window semantics, and failure modes. Nothing material for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3, but the description adds real meaning beyond the schema: pairs are aligned by matching date, days is calendar days that yield fewer business-day points, and the required BASE/QUOTE format is reinforced. Adds value on top of an already-documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (correlation coefficient and minimum-variance hedge ratio between two forex pairs) and the data provenance (live, frankfurter.app ECB daily series). It is clearly separable from its non-live sibling run_forex_correlation and from primitive.hedge_ratio.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger questions ('how correlated are EUR/USD and GBP/USD?', 'what hedge ratio should I use?') and explains the live-fetch context. It does not explicitly name the alternative to use for historical/static data, which is the one clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_currency_converterForex Currency ConverterARead-onlyInspect
Converts an amount between currencies using a manually supplied rate: no live data fetch. The live variant is workflow.run_forex_currency_converter_live, which has the rate fetched automatically. Use when user already knows the exact rate they want applied. Returns: converted.
| Name | Required | Description | Default |
|---|---|---|---|
| rate | Yes | Exchange rate to apply (1 unit of source currency = rate units of target currency) | |
| amount | Yes | Amount in the source currency |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds the key behavioral trait that this is a pure, deterministic computation with no network fetch and a caller-supplied rate. It loses a point because 'Returns: converted' is an empty restatement rather than any useful detail about the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core behavior and the sibling routing. Every sentence carries weight except the trailing 'Returns: converted', which is filler and slightly dilutes an otherwise tight definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, non-destructive, deterministic conversion with no output schema, the description covers the mode of operation and when to pick it. The only gap is that the return shape is not meaningfully described, though for a simple converter that is a minor omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (rate, amount) are documented in the schema with directional semantics for the rate. The description adds only the 'manually supplied' framing, which does not extend the parameter meaning beyond what the schema already supplies, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Converts) and resource (amount between currencies) plus the defining constraint: a manually supplied rate, no live fetch. It explicitly names the sibling it is not (workflow.run_forex_currency_converter_live), so an agent can separate 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection condition ('Use when user already knows the exact rate they want applied') and names the alternative tool that should be chosen otherwise. This is exactly the routing guidance a sibling-heavy namespace needs, since many forex siblings exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_currency_converter_liveForex Currency Converter (Live)ARead-onlyInspect
Converts an amount between currencies using a live FX rate: TrueFX for its 10 quoted majors (genuinely live tick data), frankfurter.app daily ECB reference rate as the fallback for every other currency pair (30 total). Use when user asks "what's $X worth in EUR?" or any currency conversion where the rate itself isn't already known. Returns: converted, rate, source (truefx/frankfurter/identity), asOf, available (false + error if no rate could be found for that pair).
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | 3-letter target currency code, e.g. "EUR" | |
| from | Yes | 3-letter source currency code, e.g. "USD" | |
| amount | Yes | Amount in the source currency |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld annotations by disclosing the two-tier data pipeline (TrueFX live ticks for 10 majors, frankfurter.app ECB daily fallback for all other pairs, 30 total), and the failure behavior (available=false + error when no rate exists). This is exactly the operational context an agent needs for a live-data tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then source tiering and usage guidance, then return fields. Dense but every sentence carries information; the parenthetical 'genuinely live tick data' is slightly chatty but justified as differentiation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by enumerating the returned fields (converted, rate, source, asOf, available + error). Combined with source-tier and failure disclosure, nothing needed to invoke or interpret the call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds value the schema does not: it scopes which currency pairs are served and how each tier is sourced, which matters for choosing from/to codes. It does not add format syntax beyond the schema, so it stops short of 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (convert an amount between currencies) and immediately distinguishes itself from its non-live sibling workflow.run_forex_currency_converter by naming the live-rate mechanism. An agent can tell which of the two converter tools applies 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ('what's $X worth in EUR?') and a useful exclusion ('where the rate itself isn't already known'). It does not explicitly route against the non-live sibling, but the live-rate framing provides clear context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_margin_levelForex Margin LevelARead-onlyInspect
Free margin and margin level % from account equity and used margin: equity/usedMargin*100, the same stop-out proximity metric every forex platform shows. Returns null (not Infinity) when usedMargin is 0, meaning no open position. Use when user asks "how close am I to a margin call?" or "what's my free margin?". Returns: freeMargin, marginLevelPct.
| Name | Required | Description | Default |
|---|---|---|---|
| equity | Yes | Account equity (balance + floating P&L) | |
| usedMargin | Yes | Margin currently locked by open positions. 0 if none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, read-only, non-open-world calculation, so the bar is low. The description still adds real value by disclosing the usedMargin=0 edge case and the deliberate null-instead-of-Infinity return, which an agent cannot infer from annotations or schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the formula, then usage triggers, then return values, then the edge case – a sensible ordering. It is slightly dense with three separate concerns, but every clause carries information and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing the returned fields (freeMargin, marginLevelPct). Combined with the formula, edge-case note, and usage triggers, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, giving a baseline of 3. The description adds the relationship between them (equity divided by usedMargin times 100) and clarifies that usedMargin being 0 means no open position, which enriches semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact computation (equity/usedMargin*100) and names the resulting metrics (freeMargin, marginLevelPct), so the agent knows precisely what is produced. It also implicitly separates itself from the sibling run_forex_margin_required by framing itself as the stop-out proximity metric rather than a margin requirement calculation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrasings ("how close am I to a margin call?", "what's my free margin?") that map directly to invocation. It does not explicitly name alternatives such as run_forex_margin_required for exclusion, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_margin_requiredForex Margin RequiredARead-onlyInspect
Notional and margin required for a forex position, in the pair's own quote currency: no live FX rate needed. Never built for Phase 1 of this domain since a margin figure has no natural currency-neutral form the way pip value does. The live variant is workflow.run_forex_margin_required_live, which applies when the account currency differs from the pair's quote currency. Use when user asks "how much margin do I need for X lots of EUR/USD at 50:1?". Returns: notionalQuote, marginQuote, base, quote.
| Name | Required | Description | Default |
|---|---|---|---|
| pair | Yes | Currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| price | Yes | Entry or current price | |
| units | Yes | Position size in base-currency units | |
| leverage | Yes | Leverage multiplier, e.g. 50 for 50:1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: it is a self-contained pure computation needing no live FX rate, and it enumerates the return fields (notionalQuote, marginQuote, base, quote). It stops short of stating units/precision conventions, hence a 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence and the alternative-tool sentence are well front-loaded and actionable. However, the sentence 'Never built for Phase 1 of this domain since a margin figure has no natural currency-neutral form the way pip value does' is internal design rationale that does not help an agent decide or invoke, weakening the signal-to-noise ratio.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description helpfully lists the returned fields and chains to the sibling variant. For a four-parameter read-only calculation this is nearly complete; only unit/tolerance conventions and the lots-vs-units question are left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented, which sets the baseline at 3. The example ('X lots ... at 50:1') loosely maps units and leverage, but it also introduces 'lots' while the schema says 'units in base-currency units' — an unreconciled mismatch rather than added clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb/resource: computes notional and margin required for a forex position, and pins down the currency form ('pair's own quote currency: no live FX rate needed'). It clearly distinguishes itself from the sibling workflow.run_forex_margin_required_live, so an agent can pick 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (the _live variant) and the selecting condition ('when the account currency differs from the pair's quote currency'), and even supplies a concrete trigger query ('how much margin do I need for X lots of EUR/USD at 50:1?'). Both when-to-use and when-to-use-the-other are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_margin_required_liveForex Margin Required (Live)ARead-onlyInspect
Notional and margin required for a forex position, converted to a given account currency via a live FX rate (same TrueFX/frankfurter.app source as workflow.run_forex_pip_value_live). Use when user asks "how much margin do I need in my account currency?" and the account currency differs from the pair's own quote currency. Returns everything workflow.run_forex_margin_required does, plus accountCurrency, notionalAccount, marginAccount, fxRate, fxSource, available (false + error if no rate could be found).
| Name | Required | Description | Default |
|---|---|---|---|
| pair | Yes | Currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| price | Yes | Entry or current price | |
| units | Yes | Position size in base-currency units | |
| leverage | Yes | Leverage multiplier, e.g. 50 for 50:1 | |
| accountCurrency | Yes | 3-letter account currency code, e.g. "GBP" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, destructiveHint=false, openWorldHint). The description adds real value beyond them: it names the external FX source (TrueFX/frankfurter.app) and discloses the failure mode (available=false + error when no rate is found), which an agent needs to handle the open-world dependency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then usage, then return fields in three dense sentences; the output-field enumeration is long but earns its place given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the added return fields (accountCurrency, notionalAccount, marginAccount, fxRate, fxSource, available) and the error condition, so an agent knows both input and output contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented; the description only restates accountCurrency's role and lists output fields. Baseline 3 applies since the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (notional and margin required for a forex position) and the exact scope qualifier (converted to account currency via a live FX rate). It also explicitly distinguishes itself from workflow.run_forex_margin_required, which it extends.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ("how much margin do I need in my account currency?") plus the selecting condition (account currency differs from the pair's quote currency), and names the non-live alternative for the other case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_pip_valueForex Pip ValueARead-onlyInspect
Value of 1 pip for a given forex pair and position size, in that pair's own quote currency (e.g. EUR/USD's pip value comes back in USD, USD/JPY's in JPY): no live FX rate needed, since a pair's pip value is naturally denominated in its own quote currency. Pip size is 0.0001 for non-JPY pairs, 0.01 for JPY-quoted pairs, a universal market convention verified against real broker documentation, not broker-specific. The live variant is workflow.run_forex_pip_value_live, which applies when the account currency differs from the pair's quote currency. Use when user asks "what's 1 pip worth on X lots of EUR/USD?". Returns: pipSize, pipValueQuote, base, quote.
| Name | Required | Description | Default |
|---|---|---|---|
| pair | Yes | Currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| units | Yes | Position size in base-currency units (1 standard lot = 100,000, mini = 10,000, micro = 1,000, nano = 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it as a safe read-only operation. The description adds useful context beyond annotations: no live FX rate needed, pip size conventions (0.0001 vs 0.01), and the conditions when the live variant is required. However, it does not document error cases or limitations (e.g., unsupported pairs).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information is front-loaded and reasonably efficient, but slightly verbose with parenthetical explanations and a meta-comment about verification. Every sentence contributes, though some could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a simple 2-parameter read-only calculator: covers purpose, the key alternative, and output fields. With no output schema, it lists the returned fields, which is helpful. Minor gap: no explicit handling of invalid pair formats or edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description provides example output naming and the pip size convention, but doesn't add format details for the parameters beyond what the schema says. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: the value of 1 pip for a forex pair and position size, clearly denominated. Distinguishes itself from the live sibling and scopes the calculation to the pair's own quote currency.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (workflow.run_forex_pip_value_live) and the condition that selects it (account currency differs from quote currency). Also gives a natural-language usage trigger.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_pip_value_liveForex Pip Value (Live)ARead-onlyInspect
Value of 1 pip for a forex pair and position size, converted to a given account currency via a live FX rate: TrueFX for its 10 quoted majors (genuinely live tick data), frankfurter.app daily ECB reference rate as the fallback for every other currency (30 total). Use when user asks "what's 1 pip worth in my account currency?" and the account currency differs from the pair's own quote currency (if it matches, workflow.run_forex_pip_value alone is enough, no live fetch needed). Returns everything workflow.run_forex_pip_value does, plus accountCurrency, pipValueAccount, fxRate, fxSource (truefx/frankfurter/identity), available (false + error if no rate could be found for that currency).
| Name | Required | Description | Default |
|---|---|---|---|
| pair | Yes | Currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| units | Yes | Position size in base-currency units | |
| accountCurrency | Yes | 3-letter account currency code, e.g. "GBP" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real behavioral value beyond that: the two data sources (TrueFX live ticks for 10 majors, frankfurter.app ECB daily fallback for the other ~30 currencies) and the availability/failure contract (available=false plus error when no rate exists).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and the key routing rule before the data-source and return-value details. Dense but each clause carries information; the sourcing/return enumeration is slightly long but earns its place given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description compensates by enumerating the return fields (accountCurrency, pipValueAccount, fxRate, fxSource, available/error). Combined with the routing rule and data-source disclosure, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented in the schema, giving a baseline of 3. The description reinforces how accountCurrency drives the FX conversion and that units is a base-currency position size, but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: computes the value of 1 pip for a forex pair and position size, converted to an account currency via a live FX rate. It explicitly distinguishes itself from the sibling workflow.run_forex_pip_value and names the exact use case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use when user asks what's 1 pip worth in my account currency?') and an explicit exclusion with the alternative: when the account currency matches the pair's quote currency, use workflow.run_forex_pip_value alone. 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.
workflow.run_forex_pnlForex PnLARead-onlyInspect
Profit or loss for a closed or hypothetical forex trade, in pips and in the pair's own quote currency, long or short. Use when user asks "what did I make/lose on this trade?" or "what would X pips be worth on Y lots?". Returns: pips (signed, positive favors the position taken), pnlQuote.
| Name | Required | Description | Default |
|---|---|---|---|
| pair | Yes | Currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| side | Yes | Trade direction: "long" or "short" | |
| units | Yes | Position size in base-currency units | |
| exitPrice | Yes | Exit price, same quote convention as the entry price | |
| entryPrice | Yes | Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds behavior the annotations cannot: that it works for both closed and hypothetical trades, and that the returned pips figure is signed with positive favoring the position taken. No output schema exists, so this return-value disclosure is the main carrier of behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences: purpose and scope first, then trigger phrasings, then the return contract. Every clause carries information and nothing is repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a pure computation tool with full annotation coverage the description is nearly complete, and it compensates for the absent output schema by naming the two return fields and the sign convention. Only minor edge cases (JPY-style pairs, pip definition per pair) are left implicit, which is acceptable given the schema's price-convention notes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all five parameters, so entry/exit price conventions, side enum and units are already fully documented structurally. The description reinforces the quote-currency convention and the long/short choice, but adds no syntax or constraint beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compute profit or loss) and a specific resource (a closed or hypothetical forex trade), and scopes it as pips plus the pair's own quote currency for long or short positions. That is enough to separate it from siblings such as run_forex_pip_value, run_forex_risk_reward and run_pnl_planning 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete user phrasings that select this tool ("what did I make/lose on this trade?", "what would X pips be worth on Y lots?"), which is strong situational guidance. It stops short of naming an alternative or an exclusion, so it is clear context rather than a full when/when-not routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_position_size_liveForex Position Size (Live)ARead-onlyInspect
Position size (units and standard lots) from a risk amount and stop distance, in a given account currency, via a live FX rate to convert pip value into that currency (same TrueFX/frankfurter.app source as the other forex _live tools). Never has a meaningful account-currency-agnostic form: sizing a position from a risk budget genuinely requires knowing what 1 pip is worth in the currency that budget is denominated in. Use when user asks "how many lots should I trade to risk $X on this setup?". Returns: stopDistancePips, units, lots, pipValuePerUnitAccount, fxRate, fxSource, available (false + error if entry equals stop, or if no rate could be found).
| Name | Required | Description | Default |
|---|---|---|---|
| pair | Yes | Currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| stopPrice | Yes | Stop-loss price, same quote convention as the entry price | |
| entryPrice | Yes | Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD | |
| riskAmount | Yes | Amount to risk, in accountCurrency | |
| accountCurrency | Yes | 3-letter account currency code, e.g. "USD" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/non-destructive, so the bar is lower. The description adds real value beyond them: the live data source (TrueFX/frankfurter.app), the returned fields, and the failure behavior (available=false with an error when entry equals stop or no rate is found).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then rationale, trigger, and returns in a logical order. The middle justification sentence about the account-currency-agnostic form is slightly verbose but does explain the required parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the return fields and error cases, and it names the live data source. For a five-param, all-required read-only tool, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters and the baseline is 3. The description adds only light framing (risk amount denominated in account currency, stop distance driving pip value) without new syntax or format details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (position size in units and standard lots) plus the exact inputs (risk amount, stop distance, account currency) and the live-FX mechanism. It is clearly distinguishable from siblings like run_forex_pip_value_live, which supplies the rate this tool consumes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete usage trigger ("how many lots should I trade to risk $X on this setup?") and explains why accountCurrency is mandatory. It does not, however, name a specific alternative or exclusion versus siblings such as run_position_sizing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_risk_rewardForex Risk RewardARead-onlyInspect
Risk and reward distance in pips from entry/stop/target, and the resulting ratio (reward/risk): a raw number, not a verdict. ratio is null when the stop sits exactly at entry (no risk distance), and also when validSetup is false (stop/target on the wrong side of entry for the given side, e.g. a long with its stop above entry) - check validSetup before trusting the ratio. Use when user asks "what's my risk/reward on this setup?". Returns: riskPips, rewardPips, validSetup, ratio.
| Name | Required | Description | Default |
|---|---|---|---|
| pair | Yes | Currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| side | Yes | Trade direction: "long" or "short" | |
| stopPrice | Yes | Stop-loss price, same quote convention as the entry price | |
| entryPrice | Yes | Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD | |
| targetPrice | Yes | Take-profit price, same quote convention as the entry price |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/non-destructive annotations, it discloses non-obvious output behavior: ratio is null when stop equals entry and when validSetup is false, with a concrete example (a long with its stop above entry). That pre-empts a real misinterpretation an agent would otherwise make.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the computed quantity, then the null-edge cases, then the trigger, then the return fields. Every sentence carries information; the "a raw number, not a verdict" clause usefully clarifies output semantics rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return field list (riskPips, rewardPips, validSetup, ratio) and the conditions under which ratio is null. Combined with a fully documented input schema and safe-read annotations, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented (including the BASE/QUOTE convention and side enum). The description adds only conceptual reference to entry/stop/target and no new per-parameter syntax or constraint, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific computation (risk/reward distance in pips from entry/stop/target plus the reward/risk ratio) on a specific resource (forex setup). It is clearly separable from generic siblings like workflow.run_risk_reward and from adjacent forex tools such as run_forex_pnl or run_forex_pip_value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger phrase ("Use when user asks 'what's my risk/reward on this setup?'") and a precondition (check validSetup before trusting the ratio). It does not name or exclude alternative siblings, so the when-not guidance is absent, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_scenarioForex ScenarioARead-onlyInspect
PnL across a range of hypothetical price moves (in pips, signed by actual price direction, not pre-adjusted for side), for a single forex position size, long or short. Use when user asks "what if price moves X pips in either direction?". Returns: scenarios[] (deltaPips, exitPrice, pnlQuote).
| Name | Required | Description | Default |
|---|---|---|---|
| pair | Yes | Currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| side | Yes | Trade direction: "long" or "short" | |
| units | Yes | Position size in base-currency units | |
| deltasPips | Yes | Hypothetical price moves in pips, e.g. [-50, 0, 50] | |
| entryPrice | Yes | Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false) and are not contradicted. The description adds a genuinely valuable behavioral note: pips are signed by actual price direction and are not pre-adjusted for side, a convention trap an agent would otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: what it computes, its sign caveat, when to use it, and the return shape. Front-loaded with the core purpose and no filler, though the return-shape sentence could be trimmed since it is mechanically enumerable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description compensates by naming the return fields (deltaPips, exitPrice, pnlQuote). For a 5-required-param read-only workflow tool the description covers purpose, trigger, and result shape adequately; only sibling differentiation is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description earns a bump by clarifying deltasPips semantics (signed, side-agnostic) — precisely the parameter most likely to be misused. It also ties the single-position-size constraint to units without re-listing schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: PnL over a range of hypothetical price moves for a single forex position, long or short. An agent can tell this apart from most siblings, though nothing in the text distinguishes it from close relatives like run_forex_pnl or run_scenario_planning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ("what if price moves X pips in either direction?") which is exactly the user phrasing that should select this tool. It stops short of naming an alternative or a when-not condition, which matters given the dense forex sibling cluster.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_swap_costForex Swap CostARead-onlyInspect
Total swap/rollover cost (or credit) for holding a forex position overnight, in the pair's own quote currency: no live FX rate needed. Swap rates are broker-set with no free live feed available, so swapPerLotPerNight is always a manual input (quoted per standard lot, matching how commission is quoted in workflow.run_forex_breakeven), not fetched. Negative = cost (you pay), positive = credit (you receive). The live variant is workflow.run_forex_swap_cost_live, which applies when the account currency differs from the pair's quote currency. Use when user asks "how much will holding this position overnight cost me?". Returns: lots, totalSwapQuote, base, quote.
| Name | Required | Description | Default |
|---|---|---|---|
| pair | Yes | Currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| units | Yes | Position size in base-currency units | |
| nights | Yes | Number of nights the position is held | |
| swapPerLotPerNight | Yes | Swap rate per standard lot (100,000 units) per night, in the pair's quote currency. Negative = cost, positive = credit. Broker-set: get this from the user's broker platform, there is no live source for it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower; the description nonetheless adds real behavioral context: swap rates are broker-set with no free live feed, so swapPerLotPerNight is always a manual input quoted per standard lot, and the sign convention (negative=cost, positive=credit). It does not need to explain return format beyond the field list it already gives, but it stops short of noting anything about precision/rounding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then the manual-input caveat, sign convention, sibling disambiguation, trigger phrase, and return fields – well ordered and each sentence carries information. Slight redundancy with the schema on the negative/positive convention keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-required-parameter computation tool with no output schema, the description supplies the missing pieces: currency context for the result, the manual-input rationale for the only non-obvious parameter, the sign convention, the sibling routing rule, and the returned field list (lots, totalSwapQuote, base, quote). An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by explaining why swapPerLotPerNight is manual (no live source), that it is quoted per standard lot and mirrors how commission is quoted in workflow.run_forex_breakeven, and by reinforcing the negative/positive sign semantics. This adds genuine meaning beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('total swap/rollover cost for holding a forex position overnight') with the unit of account (pair's own quote currency) and explicitly names the sibling it is not (workflow.run_forex_swap_cost_live). An agent can distinguish it from the many other forex workflow tools 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use when user asks "how much will holding this position overnight cost me?"') and a routing rule to the alternative ('The live variant ... applies when the account currency differs from the pair's quote currency'). Both when-to-use and when-to-use-the-other are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_forex_swap_cost_liveForex Swap Cost (Live)ARead-onlyInspect
Total swap/rollover cost (or credit) for holding a forex position overnight, converted to a given account currency via a live FX rate (same TrueFX/frankfurter.app source as the other forex _live tools). swapPerLotPerNight is still always a manual input: swap rates are broker-set, with no free live feed available for them. Use when user asks "how much will holding this position overnight cost me in my account currency?" and it differs from the pair's own quote currency. Returns everything workflow.run_forex_swap_cost does, plus accountCurrency, totalSwapAccount, fxRate, fxSource, available (false + error if no rate could be found).
| Name | Required | Description | Default |
|---|---|---|---|
| pair | Yes | Currency pair in BASE/QUOTE format, e.g. "EUR/USD" | |
| units | Yes | Position size in base-currency units | |
| nights | Yes | Number of nights the position is held | |
| accountCurrency | Yes | 3-letter account currency code, e.g. "GBP" | |
| swapPerLotPerNight | Yes | Swap rate per standard lot per night, in the pair's quote currency. Negative = cost, positive = credit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety and network profile is covered. The description adds real value beyond that: it names the live FX source (same as other forex _live tools), discloses the failure mode (available=false + error if no rate found), and explains why swapPerLotPerNight must be supplied manually (broker-set, no free live feed).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the definition of the returned metric and the usage trigger, and the return-value sentence is compact. Slightly dense in the middle (FX source asides), but nearly every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description enumerates the extra return fields (accountCurrency, totalSwapAccount, fxRate, fxSource, available) and the error case, and explains what the non-live sibling already returns. Nothing an agent needs to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented, including the sign convention for swapPerLotPerNight. The description only reinforces that swapPerLotPerNight is a manual, broker-set input—useful but not additive over the schema's own detail. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific output (total swap/rollover cost converted to account currency) and names the exact condition that separates it from its sibling workflow.run_forex_swap_cost (live FX conversion to a non-quote account currency). An agent can pick this tool apart from the non-live variant 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger with a quoted user question ('how much will holding this position overnight cost me in my account currency?') plus the qualifier that it applies when the account currency differs from the pair's quote currency. It also implicitly routes to workflow.run_forex_swap_cost when no conversion is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_funding_arbitrageFunding ArbitrageRead-onlyInspect
Calculate funding rate arbitrage profit: annualized yield, net profit, and breakeven days for a long/short basis trade across two exchanges: the bare numbers only, no plain-English verdict. For the same math plus a profitable/marginal/loss verdict, use workflow.run_carry_trade instead. Use when user asks "is this funding arb worth it?" or "how many days to break even on transfer fees?". Returns: netProfitUsdt, annualizedYieldPct, breakevenDays.
| Name | Required | Description | Default |
|---|---|---|---|
| durationDays | Yes | Holding period in days | |
| positionSize | Yes | Position size in USDT | |
| intervalHours | No | Funding interval: 8 (standard) or 1 (Hyperliquid, dYdX, Kraken: per-hour rates) | |
| transferFeePct | No | One-time transfer/setup fee as percentage, e.g. 0.1 for 0.1% | |
| longFundingRate | Yes | Funding rate on long side (% per interval, positive = you pay) | |
| shortFundingRate | Yes | Funding rate on short side (% per interval, positive = you receive) |
workflow.run_funding_breakevenFunding BreakevenRead-onlyInspect
Price move needed to cover funding cost + fees over a holding period. Use when user asks "how much does BTC need to move for me to profit after funding?" or "is funding killing my edge on this trade?". Returns: breakevenWithFunding, breakevenWithoutFunding, requiredMovePct.
| Name | Required | Description | Default |
|---|---|---|---|
| side | Yes | Trade direction: "long" or "short" | |
| size | Yes | Position size in base currency | |
| hold_hours | Yes | Hold duration in hours | |
| entry_price | Yes | Entry price | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined. size is USD notional (contracts) for inverse; notional/funding_cost/fee_total/total_carry_cost come back denominated in the base coin. | |
| fee_open_pct | No | Open fee rate (default 0.0002) | |
| funding_rate | Yes | Funding rate per funding interval (decimal, e.g. 0.0001) | |
| fee_close_pct | No | Close fee rate (default 0.0005) | |
| funding_interval_hours | No | Hours per funding payment: 8 (default) or 1 (Hyperliquid, dYdX and Kraken, whose rate is per hour) |
workflow.run_funding_costFunding CostRead-onlyInspect
Calculate the total funding cost (or income) for holding a perpetual futures position. Use when user asks "how much funding will I pay holding X days?" or "is funding eating my profit?". Returns: totalCost (positive = you pay, negative = you receive; in the coin for inverse), costPerDay, annualPct, totalPeriods, breakevenShift (size of the price move whose PnL equals the funding: up for a positive rate, down for a negative one, for either side).
| Name | Required | Description | Default |
|---|---|---|---|
| days | Yes | Number of days to hold | |
| side | Yes | Trade direction: "long" or "short" | |
| sizeBase | Yes | Position size in base asset | |
| entryPrice | Yes | Entry price | |
| fundingRate | Yes | Funding rate per 8h period as fraction, e.g. 0.0001 | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined. For inverse, sizeBase is USD contracts and cost figures come out in the base coin. |
workflow.run_garchGARCH VolatilityARead-onlyInspect
GARCH(1,1) volatility model, fit by maximum likelihood on a return series: estimates omega/alpha/beta (the variance-persistence parameters) and forecasts next-period volatility. Use when user asks "what's my GARCH volatility forecast?" or "how persistent is volatility in this return series?". This is a backward-looking statistical fit, not a market prediction guarantee. Returns: mu, omega, alpha, beta, persistence (alpha+beta), unconditional_vol, forecast_vol, loglikelihood.
| Name | Required | Description | Default |
|---|---|---|---|
| returns | Yes | Return series, one value per period, at least 50 values (GARCH needs real sample depth to identify persistence) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description adds a meaningful expectation caveat that the output is a backward-looking fit rather than a forecast guarantee. It also enumerates the returned fields, which no structured field provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences ordered purpose, routing cues, caveat, returns; nothing is repeated from the title or schema, and the return list compensates for the absent output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating returned fields, and the single parameter is fully documented in-schema. It is nearly complete for a single-input statistical tool; only an explicit pointer to sibling volatility tools is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the sole parameter's minItems constraint plus rationale (at least 50 values needed to identify persistence) is already documented in the schema. The description adds no syntax or preprocessing detail beyond what the schema states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific model (GARCH(1,1) fit by maximum likelihood), names the estimated quantities (omega/alpha/beta) and the output (next-period volatility forecast). This clearly separates it from siblings like run_implied_volatility or run_evt_tail_risk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete user phrasings that should route here and sets a boundary that it is a statistical fit, not a prediction guarantee. It does not name alternative volatility tools (e.g. implied volatility, EVT tail risk) as an explicit when-not branch, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_hurst_exponentHurst ExponentARead-onlyInspect
Hurst exponent via rescaled-range (R/S) analysis: is this return/price series trending/persistent (H>0.5, a move tends to be followed by a move in the same direction), mean-reverting/anti-persistent (H<0.5), or consistent with a random walk (H~0.5)? Use when user asks "is this asset trending or mean-reverting?" or "does this series show long-range dependence?". Takes a return series, not raw price levels. Returns: hurst, interpretation (trending/mean_reverting/random_walk), window_sizes, rs_values.
| Name | Required | Description | Default |
|---|---|---|---|
| values | Yes | Return series (not raw price levels) | |
| min_window | No | Smallest R/S analysis window size (default 8) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read-only, closed-world, non-destructive operation, so the bar is lower. The description adds real behavioral value beyond that: the interpretation bands (H>0.5, H<0.5, H~0.5) and the critical input constraint that it takes a return series, not raw price levels, which directly affects correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core computation, then usage triggers, then the input caveat and return shape. Dense but almost every clause earns its place; the interpretation parentheticals are slightly verbose but useful for interpreting output since no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the return fields (hurst, interpretation, window_sizes, rs_values) and the meaning of the interpretation values. Combined with the input constraint and usage triggers, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the input constraint 'Return series (not raw price levels)' is already present in the schema for values. The description restates this same constraint rather than adding syntax or guidance on min_window beyond what the schema default already provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource – computing the Hurst exponent via rescaled-range (R/S) analysis – and immediately distinguishes itself from siblings like run_garch and run_cointegration by naming the exact diagnostic it performs. The parenthetical interpretation thresholds give the agent a concrete sense of the output's meaning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit trigger phrasing ('is this asset trending or mean-reverting?', 'does this series show long-range dependence?') that maps a user question directly onto the tool. It doesn't name alternative tools or when NOT to use it, but the triggering questions are specific enough to route correctly among the 60+ workflow siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_impermanent_lossImpermanent LossARead-onlyInspect
Impermanent loss for a liquidity-pool position: compares providing liquidity against simply holding the same tokens, at a manually-supplied entry and current price. Two modes: full_range (standard 50/50 constant-product pool, the textbook 2*sqrt(k)/(1+k)-1 closed form) or concentrated (a Uniswap-V3-style position confined to [lowerPrice, upperPrice] - IL is always worse than full_range for the same price move when the range is tight, and the position is fully single-asset, no longer earning fees, once price exits the range). impermanentLossPct is always <= 0 and is measured relative to the quote token (dimensionless, exact regardless of what the quote token is); the optional dollar figures additionally assume the quote token's own USD price stayed roughly stable (true for a stablecoin-quoted pool). Use when user asks "how much am I losing to impermanent loss?" or "is this LP position still worth it after fees?". Returns: impermanentLossPct, lpValueMultiplier, hodlValueMultiplier, inRange, lossUsd/netResultUsd (null unless depositValueUsd given).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default full_range. | |
| entryPrice | Yes | Base token's price in quote-token terms when liquidity was deposited | |
| lowerPrice | No | Range lower bound - required for concentrated mode, must be below entryPrice | |
| upperPrice | No | Range upper bound - required for concentrated mode, must be above entryPrice | |
| currentPrice | Yes | Base token's current price in quote-token terms | |
| feesEarnedUsd | No | Optional trading fees earned so far in USD (default 0), folded into netResultUsd alongside lossUsd | |
| depositValueUsd | No | Optional: USD value deposited at entry, to also report dollar-denominated lpValueUsd/hodlValueUsd/lossUsd |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a safe, non-destructive, closed-world read, and the description adds substantial behavior beyond that: sign invariant (impermanentLossPct is always <= 0), normalization frame (relative to the quote token, dimensionless), the concentration caveat (IL worse than full_range when tight, position becomes fully single-asset and fee-less once price exits the range), and the stable-quote assumption behind the optional USD figures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core definition and mode split before the trigger phrasing and return list, and nearly every clause carries information. It is a single dense block with the textbook closed form noted parenthetically, which is arguably more formula detail than an agent needs to select the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema but a 7-parameter, mode-dependent computation, the description compensates by listing the returned fields (impermanentLossPct, lpValueMultiplier, hodlValueMultiplier, inRange, lossUsd/netResultUsd) and noting when they are null. Mode requirements and range constraints are covered between description and schema, leaving no material gap for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning the schema lacks: what 'mode' actually selects between, why the concentrated bounds change the economics, and what the dollar outputs assume. It does not restate the schema's own constraints verbatim, which is the right call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Impermanent loss for a liquidity-pool position: compares providing liquidity against simply holding the same tokens') and enumerates the two computation modes with their distinct formulas. The phrase 'manually-supplied entry and current price' implicitly separates it from the sibling workflow.run_impermanent_loss_live, so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete user-facing triggers ('how much am I losing to impermanent loss?', 'is this LP position still worth it after fees?'), which tells the agent when to select it. It does not state exclusions or name the live variant as the alternative for auto-fetched prices, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_impermanent_loss_liveImpermanent Loss (Live)ARead-onlyInspect
Live variant of workflow.run_impermanent_loss: fetches each token's current live USD price (Solana or any of 5 EVM chains) and derives currentPrice as their ratio, instead of it being supplied manually. entryPrice stays a manual, historical input (a fact the caller must supply, not something a live quote should overwrite), same convention as every other live-capable tool in this product. Use when the caller has the pool's two token addresses but doesn't already know the current price ratio. Returns the same fields as workflow.run_impermanent_loss, plus currentPrice, baseSymbol, quoteSymbol, routable (false + error if either token's price can't be resolved).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default full_range. | |
| baseMint | Yes | Address of the base token | |
| baseChain | No | Chain of the base (volatile) token. Default solana. | |
| quoteMint | Yes | Address of the quote token | |
| entryPrice | Yes | Base token's price in quote-token terms when liquidity was deposited (manual - a historical fact) | |
| lowerPrice | No | Range lower bound - required for concentrated mode | |
| quoteChain | No | Chain of the quote token. Default solana. | |
| upperPrice | No | Range upper bound - required for concentrated mode | |
| feesEarnedUsd | No | Optional trading fees earned so far in USD (default 0) | |
| depositValueUsd | No | Optional: USD value deposited at entry |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false, and openWorldHint=true, covering the safety profile, so the description's added value is the failure surface: 'routable (false + error if either token's price can't be resolved)' and the invariant that entryPrice is never overwritten by a live quote. It stops short of describing latency, caching, or chain-specific resolution behavior, which matters for an open-world price fetch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core distinction (live price derivation vs. manual), followed by the usage condition and the return deltas. The parenthetical rationale about not overwriting entryPrice is slightly discursive but earns its place by preventing a plausible caller error; overall still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned deltas (currentPrice, baseSymbol, quoteSymbol, routable) and the error condition. Combined with 100% schema coverage and read-only/open-world annotations, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 10 parameters including entryPrice as 'manual - a historical fact'. The description reinforces why entryPrice stays manual and clarifies that currentPrice is derived rather than an input, but adds no new syntax, units, or default guidance beyond what the schema/enums already provide. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource (fetches each token's current live USD price and derives currentPrice as their ratio) and explicitly frames itself as the live variant of workflow.run_impermanent_loss, which is itself in the sibling list. An agent can distinguish it from both the non-live variant and unrelated workflow tools 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection condition: 'Use when the caller has the pool's two token addresses but doesn't already know the current price ratio.' It also contrasts behavior with workflow.run_impermanent_loss (manual price supplied there, derived here), effectively naming the when-not case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_implied_volatilityImplied VolatilityARead-onlyInspect
Solves for the volatility that makes Black-Scholes reproduce an observed option price (Newton-Raphson with a bisection fallback for cases where vega is too flat to converge, e.g. deep ITM/OTM or very short-dated). Checks the price against its no-arbitrage bounds first and refuses to solve (converged: false + error) rather than return a garbage number when the price is impossible for the given spot/strike/rate. Use when user asks "what IV does this option price imply?" or gives a market price and wants the volatility, not the reverse. Returns: impliedVolatilityPct, iterations, method (newton-raphson/bisection), converged, identifiable, warning, priceAtSolution. identifiable is false when many volatilities reproduce the price (deep ITM, far OTM): warning then says the returned volatility is one of them. When converged is false, identifiable is false and error explains.
| Name | Required | Description | Default |
|---|---|---|---|
| spot | Yes | Underlying spot price, USD | |
| strike | Yes | Strike price, USD | |
| optionType | Yes | Option type: "call" or "put" | |
| daysToExpiry | Yes | Calendar days until expiry (can be fractional) | |
| targetPriceUsd | Yes | The observed option price, USD, to solve the implied volatility from | |
| riskFreeRatePct | No | Risk-free rate in percentage points. Default 0: standard crypto-options convention. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the readOnlyHint annotation: discloses the solver (Newton-Raphson with bisection fallback), why bisection is used (flat vega in deep ITM/OTM or short-dated), the pre-check against no-arbitrage bounds, and the deliberate refusal path (converged=false + error) instead of returning a garbage number. That refusal and the identifiable=false ambiguity case are exactly the traits an agent needs before trusting output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core solve, then the numerical method, then the guardrail, then the return contract. It is dense but each sentence carries distinct information; the only mild bloat is re-explaining the identifiable/converged interaction in two places.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return contract itself and does so fully: field-by-field enumeration of impliedVolatilityPct, iterations, method, converged, identifiable, warning, priceAtSolution, plus the semantics of the ambiguous and failed cases. Nothing needed to interpret a result correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (including the risk-free rate default) are already documented in the schema, making 3 the correct baseline. The description reinforces targetPriceUsd as the observed price and names the supporting inputs (spot/strike/rate) but adds no format or unit guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: solves for the volatility that makes Black-Scholes reproduce an observed option price. It also explicitly distinguishes the direction of the calculation ('the volatility, not the reverse'), which separates it from the Black-Scholes pricing sibling 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ('what IV does this option price imply?' or a market price with a desire for volatility) and a negative condition (not the reverse). It stops short of naming the inverse tool to route to, leaving the agent to infer run_black_scholes for the reverse case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_kelly_frontierKelly Growth-Security FrontierARead-onlyInspect
Kelly growth-security frontier (MacLean, Ziemba & Blazenko 1992): for a strategy compounding at a fraction lambda of full Kelly, the probability wealth ever falls to a fraction alpha of its starting value is P = alpha^(2/lambda-1). Provide either lambda_fraction (to compute that probability) or max_probability (to solve for the largest lambda that keeps the ruin probability at or below it). Use when user asks "if I bet half-Kelly, what's my chance of ever losing half my bankroll?" or "what fraction of Kelly keeps my chance of a 50% drawdown under 5%?". Valid lambda range is (0, 2]; beyond 2 the probability is certain (1), not the raw formula value. Returns: probability, lambda_fraction (echoed or solved).
| Name | Required | Description | Default |
|---|---|---|---|
| alpha | Yes | Fraction of starting capital, 0-1 exclusive (e.g. 0.5 = "ever falls to half my starting bankroll") | |
| lambda_fraction | No | Fraction of full Kelly being bet (1 = full Kelly, 0.5 = half Kelly). Provide this OR max_probability, not both. | |
| max_probability | No | Target ceiling on the ruin probability, 0-1 exclusive. Provide this to solve for the safe lambda_fraction instead of supplying it directly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive, so the safety profile is covered. The description adds genuine behavioral context the annotations don't: the closed-form formula, the boundary behavior that lambda > 2 yields probability 1 rather than the raw formula value, and what is returned. It stops short of discussing numerical edge cases like alpha approaching 0/1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the reference and formula, then modes, then examples, then return values. Dense but every sentence carries information; the two illustrative examples are the only mildly redundant element against the mode description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by explicitly listing the returns (probability, lambda_fraction echoed or solved) and disclosing boundary behavior. For a 3-parameter read-only calculator, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description still adds value by framing the mutual exclusivity of lambda_fraction and max_probability as a mode switch, and by restating the (0, 2] validity bound that constrains the input beyond the schema's raw type descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific computation (Kelly growth-security frontier probability) with an academic citation, and precisely states the two operating modes: compute probability from lambda_fraction, or solve lambda from max_probability. No sibling tool overlaps, so the agent can distinguish it purely from the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit selection logic ('Provide either lambda_fraction ... or max_probability ...') plus two natural-language user-phrasing examples that anchor real invocation intents. It also states the valid lambda range (0, 2], which is a usage constraint rather than just a domain fact.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_liquidation_safetyLiquidation SafetyRead-onlyInspect
Calculate the liquidation price for an isolated-margin futures position with one flat maintenance margin rate (mmr, which you supply from your exchange's tier). It is a generic flat-rate model, for linear and inverse alike, not any one exchange's engine: no tiered maintenance amounts, no liquidation fee, no cross-margin (shared collateral) logic, so it does not apply to cross-margin accounts and can differ from an exchange's own figure. Use when user asks "where will I get liquidated?" or "how close is my liq price?". Returns: liquidationPrice, distancePct (how far from entry).
| Name | Required | Description | Default |
|---|---|---|---|
| mmr | No | Maintenance margin rate, default 0.005 (0.5%) | |
| side | Yes | Trade direction: "long" or "short" | |
| leverage | Yes | Leverage multiplier, e.g. 10 for 10x | |
| entryPrice | Yes | Entry price (positive) | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined (e.g. Deribit/Bybit/MEXC BTC-settled perps). |
workflow.run_market_cap_comparisonMarket Cap ComparisonARead-onlyInspect
Compares two tokens' live market caps (Solana or any of 5 EVM chains; the two tokens can be on different chains) and projects what an investment would be worth if the first token's market cap matched the second's. Narrative-agnostic ("if X reaches Y's market cap"): works for any token pair, not tied to one hype cycle or one chain. A snapshot ratio, not a forecast: assumes fixed supply on both sides. Use when user asks "what if this token reaches [other token]'s market cap?". Returns: multiplier, projectedValueUsd, projectedPriceUsd, profitUsd, comparable (false + error if either market cap can't be resolved).
| Name | Required | Description | Default |
|---|---|---|---|
| tokenMint | Yes | Address of the token you hold or are evaluating (base58 for Solana, 0x... for EVM chains) | |
| tokenChain | No | Chain of the token you hold. Default solana. | |
| compareToMint | Yes | Address of the token whose market cap to compare against | |
| investmentUsd | Yes | Investment amount in USD | |
| compareToChain | No | Chain of the comparison token. Default solana. Can differ from tokenChain. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, non-destructive, open-world behavior. The description goes further by disclosing the fixed-supply assumption and the failure mode (comparable=false plus error when either market cap can't be resolved), which is genuinely useful operational context. It does not cover rate limits or latency, keeping 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then scope, then caveats, then return shape. Sentences are dense but each carries information; the parentheticals and quoted example slightly lengthen it without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description enumerates the return fields (multiplier, projectedValueUsd, projectedPriceUsd, profitUsd, comparable) and the error condition. Combined with full parameter coverage, 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.
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 meaning beyond it: chains may be Solana or one of 5 EVM chains and the two tokens can reside on different chains, which explains why tokenChain and compareToChain exist as separate parameters. That cross-chain nuance is not obvious from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('compares two tokens' live market caps ... projects what an investment would be worth'), plus the cross-chain scope. No sibling in the list performs market-cap comparison, and the description makes the capability unmistakable even without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit trigger phrase ('Use when user asks "what if this token reaches [other token]'s market cap?"') and bounds the tool's applicability by declaring it narrative-agnostic and pair-agnostic. It also clarifies the model's assumption ('snapshot ratio, not a forecast'), which tells the agent when the output is and isn't appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_market_implied_oddsMarket Implied OddsARead-onlyInspect
Reads Kalshi's full live BTC or ETH year-end price ladder (a set of mutually-exclusive prediction markets covering the whole price range) and reports what the market itself implies: the median (50th-percentile) price bucket, the single most-likely (mode) bucket, and the probability of ending the year at or above any real bucket boundary. Deliberately does not compute an expected value or interpolate inside a bucket: the top/bottom buckets are open-ended, so any point estimate there would need an invented assumption; every number this tool returns traces back to one live, sourced price. Use when user asks "what does the market think BTC will be worth by year end?" or "what are the odds ETH ends the year above $X?". Returns: buckets[] (label, floor, cap, probabilityPct), medianBucketLabel, modeBucketLabel, vigPct, probabilityAtOrAbovePct + snappedThresholdUsd (only when thresholdUsd is supplied).
| Name | Required | Description | Default |
|---|---|---|---|
| coin | No | Which coin's year-end ladder to read. Default BTC. | |
| thresholdUsd | No | Optional price threshold: returns the probability of ending the year at or above the nearest real bucket boundary at or below this value. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, openWorld, non-destructive); the description goes well beyond them by disclosing the deliberate methodological choices (no expected value, no intra-bucket interpolation, open-ended tail buckets) and that every returned figure traces to a live sourced price. This is exactly the kind of behavioral context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and method rationale, and the trailing 'Returns:' list earns its place given there is no output schema. The prose sentence before it is long and slightly dense, but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full return-value burden and does so explicitly (buckets[], medianBucketLabel, modeBucketLabel, vigPct, conditional probabilityAtOrAbovePct + snappedThresholdUsd). Combined with the when-to-use examples, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented, including the default-BTC behavior and the threshold snapping rule. The description largely restates the schema's threshold semantics and only marginally extends it by naming snappedThresholdUsd as an output, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (reads Kalshi's live BTC/ETH year-end price ladder) and immediately characterizes the data as a set of mutually-exclusive prediction markets, which differentiates it from the sibling prediction-market tooling (run_prediction_market_edge, run_odds_converter). An agent can identify the tool's function without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete triggering user utterances ('what does the market think BTC will be worth by year end?', 'what are the odds ETH ends the year above $X?'), which gives strong when-to-use signal. It does not explicitly name or exclude alternative tools, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_max_leverageMax LeverageRead-onlyInspect
Calculate the maximum safe leverage based on account size, max acceptable drawdown, and asset daily volatility. Use when user asks "what's the max leverage I should use on BTC?" or "how much leverage is safe given 3% daily volatility?". Returns: maxLeverage (maxDrawdownPct / (volatilityPct + mmr x 100), rounded down to 0.1, never below 1x), marginAtRisk (accountSize x maxDrawdownPct / 100, in USDT), safeMargin (USDT) and liquidationBuffer (percent). maxDrawdownPct and volatilityPct are percents (10 means 10%); mmr is a fraction (0.005 is 0.5%).
| Name | Required | Description | Default |
|---|---|---|---|
| mmr | No | Maintenance margin rate, default 0.005 (0.5%) | |
| accountSize | Yes | Total account size in USDT | |
| volatilityPct | Yes | Expected daily price volatility as percentage, e.g. 3 for 3% | |
| maxDrawdownPct | Yes | Maximum acceptable drawdown as percentage, e.g. 10 for 10% |
workflow.run_odds_converterOdds ConverterARead-onlyInspect
Converts one probability into decimal odds, American odds, and breakeven win rate: either from a manually supplied probability, or from one market read live from Kalshi, Polymarket, ADI Predictstreet, Limitless, or Myriad (five independent crypto-price prediction market venues, all public keyless market data). One market on one venue per call; it does not compare prices across venues (to compare the same bet on two or more venues, see workflow.run_spread_reader). When a Kalshi, Polymarket, Limitless, or Myriad source is supplied, also returns the vig (the exchange's built-in edge), computed from the market's own YES+NO prices, not estimated; ADI Predictstreet's crypto contracts currently have no live trading volume on any venue, so this returns available:false with an explanation rather than a fake price (use workflow.run_window_fair_value for a theoretical price on those instead). Use when user asks "what odds does a 35% probability work out to?" or "what's the vig on this Kalshi/Polymarket/Limitless/Myriad market?". Provide exactly one of probability/kalshiTicker/polymarketSlug/adiSymbol/limitlessSlug/myriadSlug. Returns: probability, decimalOdds, americanOdds, breakevenWinRatePct, vigPct (null unless a live two-sided source was used), source (manual/kalshi/polymarket/adi/limitless/myriad), identifier, label.
| Name | Required | Description | Default |
|---|---|---|---|
| adiSymbol | No | An ADI Predictstreet market symbol (e.g. BTC1D-20260920T0000). Currently always returns available:false; these contracts have no live trading volume yet. | |
| myriadSlug | No | A Myriad Markets market slug, from the market URL (e.g. eth-at-three-digits-when-bitcoin-goes-below-50k), to fetch a live price from. On-chain (Abstract L2); not every market has a Yes/No outcome, some are multi-outcome ladders. | |
| probability | No | Probability as a decimal 0-1 (e.g. 0.35). Use this OR one of the live sources below, not both. | |
| kalshiTicker | No | A Kalshi market ticker (e.g. KXBTCY-27JAN0100-T149999.99) to fetch a live price from. One market only; for the same bet on several venues use workflow.run_spread_reader. | |
| limitlessSlug | No | A Limitless Exchange market slug, from the market URL (e.g. btc-up-or-down-5-min-1790249100), to fetch a live price from. On-chain (Base), mostly short-duration (5min/15min/daily) crypto up/down contracts. | |
| polymarketSlug | No | A Polymarket market slug, from the market URL (e.g. will-bitcoin-reach-100k-in-september-2026), to fetch a live price from. One market only; for the same bet on several venues use workflow.run_spread_reader. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this readOnly and non-destructive, and the description goes well beyond them: it discloses that vig is computed from the market's own YES+NO prices (not estimated), that NULL vig results when no live two-sided source is used, and that ADI Predictstreet returns available:false with an explanation rather than a fabricated price. That last point is exactly the kind of honesty an agent needs to interpret a null result correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then alternatives, then exceptions, then return shape – a sensible order. It is dense and long for a single call, but nearly every clause carries distinct information; only the venue-chain details for Myriad/Limitless edge toward redundancy with the schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description compensates by enumerating every returned field (probability, decimalOdds, americanOdds, breakevenWinRatePct, vigPct, source, identifier, label) and their null conditions. For a six-input tool with a degenerate-mode caveat, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the mutually-exclusive selection rule across the six parameters and characterizes the five venues by data source (public keyless, on-chain chains). It stops short of describing format details per parameter, which the schema already carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (converts) and a specific, three-part output (decimal odds, American odds, breakeven win rate), with two input modes spelled out. It also explicitly scopes itself against workflow.run_spread_reader for cross-venue comparison, so an agent can distinguish it from that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrasings ('what odds does a 35% probability work out to?', 'what's the vig on this Kalshi market?'), states the one-market-one-venue limit, and names the alternative for multi-venue comparison. The 'provide exactly one of ...' constraint is stated outright rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_open_analysisMarket Profile: Open AnalysisRead-onlyInspect
Market Profile open analysis: where and how price opened vs the prior session value area. Use for "how did BTC open today?" / "what does the open imply for the session?". Returns: open_location, open_type (OD/OTD/ORR/OAIR) with description/implication, confidence, key_levels (VAH/VAL/VPOC/IB), tails (session-high/low rejection tails and single prints), scenario_framing (bullish/bearish/neutral), invalidation level. Candles come from the venue when candles[] is omitted (past sessions are cached, so repeats are fast); supplying candles[] makes the run network-free and reproducible. session_date must be a completed UTC session, before today; a session with no candles returns an error.
| Name | Required | Description | Default |
|---|---|---|---|
| venue | Yes | Exchange to fetch candles from when candles[] not supplied | |
| candles | No | Optional OHLCV for the session; omit to fetch from venue (reproducible + 0 COGS when supplied) | |
| timeframe | No | Candle timeframe (default 15m) | |
| instrument | Yes | Symbol, e.g. BTCUSDT | |
| prev_candles | No | Optional OHLCV for the previous session | |
| session_date | Yes | Session date YYYY-MM-DD (UTC); must be before today (a completed session) | |
| value_area_rule | No | Value-area fraction 0.5–0.9 (default 0.70) |
workflow.run_options_payoffOptions PayoffARead-onlyInspect
Payoff, P&L, and breakeven price for a single-leg Deribit BTC/ETH option (long or short call/put) at a given scenario price at expiry. Deribit BTC/ETH options are coin-settled: premium, P&L, and the max profit/loss caps come back denominated in the base coin (BTC/ETH), not USD; a scenarioPnlUsd convenience field converts the coin P&L back to USD at the scenario price. Coin settlement means a long call's upside is capped (max profit = 1 − premium per unit, not unlimited) while a long put's upside is technically unbounded as price falls toward zero, the mirror image of a USD-settled option's payoff shape, not a bug. Use when user asks "what does my BTC call/put pay off at price X?" or "where's my breakeven on this option?". Returns: intrinsicPerUnitCoin, scenarioPnlCoin, scenarioPnlUsd, breakevenPrice, maxLossCoin/maxProfitCoin (null = unbounded), isProfitable.
| Name | Required | Description | Default |
|---|---|---|---|
| strike | Yes | Strike price in USD | |
| currency | No | Underlying coin. Default BTC. | |
| position | Yes | Option position: "long" (bought) or "short" (sold) | |
| quantity | Yes | Number of contracts (Deribit BTC/ETH options have contract_size 1.0, so this is coin-denominated size) | |
| optionType | Yes | Option type: "call" or "put" | |
| premiumCoin | Yes | Premium paid/received per contract, in the base coin (matches Deribit's own quoted price, e.g. 0.02 BTC); must be < 1 for a call | |
| scenarioPrice | Yes | Underlying price in USD to evaluate the payoff at |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive, closed-world), and the description adds substantial domain behavior on top: coin settlement means P&L and caps come back in BTC/ETH not USD, the scenarioPnlUsd conversion exists, a long call's upside is capped while a long put's is unbounded, and null caps mean unbounded. It even pre-empts the natural 'this looks like a bug' reaction to the asymmetric payoff shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and output list, then the coin-settlement explanation. It is dense and longer than most definitions, but nearly every sentence carries non-obvious information (settlement denomination, capped vs unbounded upside). Slightly over-explained in the payoff-shape passage, costing a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description enumerates the return fields (intrinsicPerUnitCoin, scenarioPnlCoin, scenarioPnlUsd, breakevenPrice, maxLossCoin/maxProfitCoin, isProfitable) and explains the null-means-unbounded convention. Combined with the settlement context, an agent has everything needed to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds interpretive meaning the schema lacks: it explains that premiumCoin is coin-denominated per unit (matching Deribit quotes) and that coin settlement is why P&L is reported in the base coin. This clarifies the units and semantics of the numeric inputs rather than just restating them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Payoff, P&L, and breakeven price for a single-leg Deribit BTC/ETH option (long or short call/put) at a given scenario price at expiry.' The 'single-leg' qualifier implicitly separates it from multi-leg siblings like run_spread_payoff or run_straddle_strangle, so an agent can route without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete trigger phrases ('what does my BTC call/put pay off at price X?', 'where's my breakeven on this option?'), which is clear context for when to use it. It does not explicitly name the alternative to reach for a multi-leg payoff (e.g. run_spread_payoff), so the exclusion is only implied by 'single-leg'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_orderbook_impactOrderbook ImpactARead-onlyInspect
Order-book "walk the book" impact/capacity: given order-book levels (price, size in base-asset units) and EITHER a target notional or an impact budget in bps, computes VWAP and price impact for that size, or (via bisection) the largest notional that stays inside the impact budget. Use when user asks "what's my price impact if I trade $X" or "how much can I trade before impact exceeds Y bps". side="buy" walks the asks, side="sell" walks the bids; impact is measured from the book's own mid ((best_bid+best_ask)/2) and is always a positive "cost in bps" number regardless of side. Returns: mid_price, spread_bps, vwap, impact_bps - both null when EITHER the loaded book doesn't cover the requested notional (book_sufficient=false flags this specific case) OR the notional involved is ~0 (book_sufficient stays true then; happens for a near-zero notional_usd, or in capacity mode when even an infinitesimal trade already exceeds impact_budget_bps, in which case max_notional itself resolves to 0) - and in capacity mode, max_notional plus capacity_is_lower_bound (true if the ENTIRE supplied book was consumed within budget, meaning true market capacity may exceed what was supplied - this tool only sees the levels given to it).
| Name | Required | Description | Default |
|---|---|---|---|
| asks | Yes | Ask levels as [price, size_base] pairs, any order | |
| bids | Yes | Bid levels as [price, size_base] pairs, any order | |
| side | Yes | "buy" walks the asks, "sell" walks the bids | |
| notional_usd | No | Target notional to walk the book for. Provide this OR impact_budget_bps, not both. | |
| impact_budget_bps | No | Max acceptable impact in bps; solves for the largest notional within it. Provide this OR notional_usd, not both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds what the annotations provide. Documents side semantics (buy walks asks, sell walks bids), that impact is always a positive cost number from the book's own mid, the edge cases where vwap/impact are null (book insufficient vs ~0 notional), and the capacity_is_lower_bound caveat when the whole supplied book is consumed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in the first clause and then qualifies behavior. Some sentences are dense and the return-value enumeration is long, but every statement earns its place and no filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value contract fully, including the null conditions, book_sufficient flag, and capacity_is_lower_bound semantics. 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.
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 meaningfully enriches it: it explains side semantics, the either/or relationship between notional_usd and impact_budget_bps, and the return fields correlated with each parameter mode. It stops short of describing the [price, size_base] level format, which the schema handles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('walk the book' impact/capacity) and precisely describes the two computational modes. The description would let an agent distinguish it from siblings like run_swap_price_impact without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrases ('what's my price impact if I trade $X', 'how much can I trade before impact exceeds Y bps') that map cleanly to the two modes. No explicit when-not or named alternative, but the usage context is very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_pnl_planningPnL PlanningARead-onlyInspect
Calculate net PnL, ROE, fees and gross profit/loss for a futures trade. Use when user asks "what's my profit/loss on this trade?" Returns: grossPnl, fees, netPnl, netPnlUsdt, roe (%), maxLossBound (only non-null for an inverse/coin-margined short: the finite ceiling on net coin-denominated loss as price rises without limit, (size/entryPrice)×(1+feeOpenPct) - includes the opening fee, since it survives the exit-price-to-infinity limit while the closing fee vanishes - null for every other side/contractType combination, which either has no such bound or a trivial one).
| Name | Required | Description | Default |
|---|---|---|---|
| side | Yes | Trade direction | |
| size | Yes | Position size: base asset qty for linear, USD contracts for inverse | |
| exitPrice | Yes | Exit price (positive) | |
| entryPrice | Yes | Entry price (positive) | |
| feeOpenPct | No | Opening fee as fraction, e.g. 0.0002 = 0.02% | |
| feeClosePct | No | Closing fee as fraction | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined. For inverse, pnl/fees are returned in the base coin, not USDT. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description goes further by enumerating the returned fields and giving a genuine edge-case disclosure (maxLossBound is non-null only for inverse/coin-margined shorts, includes the opening fee, null otherwise). That is real behavioral context beyond structured data, though it is buried in a dense sentence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence and return-field list are front-loaded and efficient, but the maxLossBound clause is a single ~70-word parenthetical with nested asides that is hard to parse and could be split or trimmed. Roughly half the description's weight sits in an over-stuffed sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly carries the return-value burden by naming grossPnl, fees, netPnl, netPnlUsdt, roe and maxLossBound. With annotations covering the safety profile and the schema covering all params, this is nearly complete; only the unwieldy maxLossBound phrasing weakens it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (side, size, entryPrice, exitPrice, feeOpenPct, feeClosePct, contractType) is already documented with units and semantics. The description adds only one parameter-related fact (inverse PnL/fees are in base coin) which the schema also states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (calculate) and resource list (net PnL, ROE, fees, gross P/L) scoped to 'a futures trade', which distinguishes it from the sibling run_forex_pnl. An agent can identify the tool's function without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger phrase ('what's my profit/loss on this trade?') that maps user intent to this tool. It does not name when-not-to-use or point at alternatives such as run_forex_pnl or run_breakeven_planning, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_portfolio_riskPortfolio RiskARead-onlyInspect
Aggregates risk across multiple open positions in one call: total notional, total P&L, total margin in use, margin usage as a % of account balance (if given), and which single position sits closest to liquidation. Each position is computed through the same canonical PnL/liquidation math as the single-position tools, then rolled up. Linear (USDT-margined) positions sum into one USD total; inverse (coin-margined) positions are grouped by settlement coin instead, since a BTC-margined P&L cannot be summed with an ETH-margined one without a live conversion rate. Returns a verdict: healthy / watch / reduce / critical, driven by the closest liquidation distance and margin usage. Use when user asks "how exposed am I across all my positions?" or "which of my positions is closest to liquidation?". Position size follows the product-wide convention: base-asset quantity for linear, USD notional (contracts) for inverse.
| Name | Required | Description | Default |
|---|---|---|---|
| positions | Yes | Open positions to aggregate (1 to 50). Each: { side, entry_price, mark_price, size, leverage }, plus optional fees, mmr, contractType, coin, label. | |
| account_balance | No | Optional account balance in USD, used to compute margin_usage_pct: linear margin plus every inverse position's own margin marked to market at its mark_price, all as one USD total |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint, openWorldHint=false, and destructiveHint=false already declaring the safety profile, the description adds rich behavioral context: the computation pipeline, why linear sums into USD while inverse groups by settlement coin, the need for a live conversion rate, and the healthy/watch/reduce/critical verdict logic. No auth or rate-limit constraints are needed for this compute tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads aggregation and output list, then explains mechanics, verdict, use cases, and size convention. Dense but every sentence supports correct invocation or interpretation; minor redundancy with the schema on position-size wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must explain return values; it does by listing total notional, total P&L, total margin, margin usage %, the position closest to liquidation, and verdict categories. It also covers input conventions and aggregation logic, making it complete for this complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds the product-wide position-size convention and explains account_balance's effect on margin usage, but this information is already present in the schema descriptions and adds no new syntax or constraints beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: aggregates risk across multiple open positions. Lists the exact outputs and explicitly contrasts with single-position tools by noting roll-up and canonical math. An agent can distinguish it from siblings like run_open_analysis or run_liquidation_safety without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit trigger questions: 'how exposed am I across all my positions?' and 'which of my positions is closest to liquidation?'. Clear context for use, but no when-not-to-use guidance or named alternatives, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_portfolio_tearsheetPortfolio TearsheetARead-onlyInspect
Core risk/return tearsheet from a single return series: annualized return (compounded, not linear) and volatility, Sharpe (plain + Lo 2002-corrected + Pezier-White skew/kurtosis-adjusted), Sortino, max drawdown, Calmar ratio, the drawdown-ratio cluster (Ulcer Index/Martin ratio, Pain Index/Pain ratio, Burke ratio + modified), Omega-Sharpe ratio, Upside Potential Ratio, skewness, kurtosis, Probabilistic Sharpe Ratio, win rate, best/worst single-period return. Use when user asks for a full risk summary/report on a strategy or portfolio's returns, not just one metric. Returns all of the above in one call. Returns are decimals (0.02 is 2%), at least 3 periods; the call returns an error when the series never draws down (Calmar undefined) or no period falls below mar (Sortino undefined).
| Name | Required | Description | Default |
|---|---|---|---|
| mar | No | Minimum acceptable return for the Sortino ratio, same periodicity as returns (default 0) | |
| returns | Yes | Return series, one value per period | |
| benchmark_sharpe | No | Benchmark Sharpe ratio for the PSR figure, same periodicity as returns (default 0) | |
| periods_per_year | No | Periods per year for annualization (default 365). Any number from 1 to 100 million, e.g. 365.25. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/non-destructive annotations, the description discloses genuine behavioral traits: returns are decimals (0.02 is 2%), at least 3 periods are required, and the call errors when the series never draws down (Calmar undefined) or no period falls below mar (Sortino undefined). It does not describe the shape of the returned object, but the error conditions and unit convention are meaningful additions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with purpose, then usage, then return/error semantics. The first sentence is a long run-on metric list, but every item earns its place by telling the agent exactly what comes back from a tool with no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a complex analytics tool with no output schema, the description compensates by enumerating every returned metric, stating input units, minimum periods, and the two error conditions. Nothing essential for calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by clarifying the decimal convention for returns and tying the mar parameter to the Sortino error condition, though it does not elaborate on benchmark_sharpe or periods_per_year beyond what the schema says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb/resource: 'Core risk/return tearsheet from a single return series,' and enumerates the metrics produced. It distinguishes itself from the many single-metric siblings by stating 'not just one metric,' though it never names run_sharpe_stats or run_portfolio_risk explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use trigger: 'Use when user asks for a full risk summary/report on a strategy or portfolio's returns, not just one metric.' That implicitly routes single-metric requests elsewhere, but no explicit when-not conditions or named alternatives are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_position_sizingPosition SizingARead-onlyInspect
Calculate the correct position size given a maximum risk in USDT and a stop-loss price. Use when user asks "how many coins should I buy?" or "size my position so I risk exactly $X". Returns: positionSize (base), positionUsdt, marginRequired.
| Name | Required | Description | Default |
|---|---|---|---|
| side | Yes | Trade direction: "long" or "short" | |
| leverage | No | Leverage, default 1 | |
| riskUsdt | Yes | Maximum acceptable loss in USDT | |
| stopLoss | Yes | Stop-loss price | |
| entryPrice | Yes | Entry price | |
| feeOpenPct | No | Opening fee fraction, default 0.0002 | |
| feeClosePct | No | Closing fee fraction, default 0.0005 | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined. For inverse, sizeQuote is USD contracts and margin is returned in the base coin. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds value beyond them by enumerating the three return fields (positionSize, positionUsdt, marginRequired), which matters because no output schema exists. It omits that inverse contracts return margin in the base coin, a behavioral quirk left only to 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences: what it computes, when to reach for it, what it returns. The core computation is front-loaded and no sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateless read-only calculator with no output schema, describing the return fields and the required inputs is sufficient. Minor gaps remain: no note on how leverage/fees/contractType shift the output, and no indication of failure modes (e.g., stopLoss equal to entryPrice).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all eight parameters are already documented in the schema. The description only echoes stopLoss and riskUsdt and adds no syntax or interaction detail (e.g., how leverage or the fee fractions influence the result). Baseline 3 applies when the schema carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (calculate), resource (position size), and the two governing inputs (max risk in USDT, stop-loss price). This clearly separates it from reporting/normalizing siblings like run_forex_pip_value or run_breakeven_planning, though it does not name a specific alternative tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete trigger phrasings ("how many coins should I buy?", "size my position so I risk exactly $X") that map directly to the required params riskUsdt and stopLoss. No when-not conditions or explicit sibling routing are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_prediction_market_edgePrediction Market EdgeARead-onlyInspect
Compares your own probability estimate for an event against a prediction market's price (manual entry, or a live Kalshi ticker, Limitless slug, or Myriad slug) and sizes a bet using fractional Kelly criterion bet sizing (default: quarter-Kelly, a standard conservative haircut on full Kelly, stated explicitly as a convention). Returns zero recommended stake whenever your probability doesn't exceed the market's price: no edge, no bet. Use when user asks "does this bet have edge?" or "how much should I stake given my probability estimate vs the market's?". Provide exactly one of marketProbabilityPct/kalshiTicker/limitlessSlug/myriadSlug. Returns: edgePct, evPerDollarStaked, fullKellyFraction, cappedKellyFraction, recommendedStakeUsd, verdict (skip_this_one/think_twice/worth_the_risk/take_it).
| Name | Required | Description | Default |
|---|---|---|---|
| myriadSlug | No | A Myriad Markets market slug to fetch the market probability from live instead of supplying it manually. Not every market has a Yes/No outcome. | |
| bankrollUsd | Yes | Bankroll available for this bet, in USD | |
| kalshiTicker | No | A Kalshi market ticker to fetch the market probability from live instead of supplying it manually. | |
| limitlessSlug | No | A Limitless Exchange market slug to fetch the market probability from live instead of supplying it manually. | |
| kellyFractionCap | No | Fraction of full Kelly to actually stake, 0.01-1. Default 0.25 (quarter-Kelly). | |
| yourProbabilityPct | Yes | Your own probability estimate, 0.01-99.99 | |
| marketProbabilityPct | No | The market's probability (price), 0.01-99.99. Use this OR one of the live sources below, not both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorld=true), so the description's job is to add context — which it does: it discloses the no-edge/no-bet rule (zero stake returned), states the Kelly convention explicitly, and notes live-source fetching. It does not clarify that no bet is actually placed, only a recommendation returned, which keeps it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core comparison-and-sizing action, then usage triggers, then returns. Sentence two is somewhat heavy ("default: quarter-Kelly, a standard conservative haircut on full Kelly, stated explicitly as a convention") and duplicates the schema's default, so it is efficient but not lean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description compensates by enumerating every returned field (edgePct, evPerDollarStaked, fullKellyFraction, cappedKellyFraction, recommendedStakeUsd, verdict) plus the verdict enum values. An agent has everything needed to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value beyond it: the exclusive-or rule across the four market-price sources and the quarter-Kelly default convention. Marginal value is genuine, though it repeats the schema's own default statement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource pair: compares the user's own probability estimate against a market price and sizes a stake via fractional Kelly. It is clearly separable from neighbours like run_kelly_frontier, run_position_sizing, and run_market_implied_odds because it is the only one framed around prediction-market edge and bet sizing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrasing ("does this bet have edge?", "how much should I stake…") and a hard input constraint ("Provide exactly one of marketProbabilityPct/kalshiTicker/limitlessSlug/myriadSlug"). It does not name an alternative sibling tool or state when NOT to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_pre_trade_checkPre Trade CheckRead-onlyInspect
Full pre-trade decision card: orchestrates position sizing, breakeven, liquidation, and funding cost in one call. Use when user describes a full trade setup and asks "should I take this trade?" or "run the numbers on this setup". Provide exchange+symbol to fetch live funding rate automatically. For an R:R-graded verdict on an entry, stop and target, see workflow.run_risk_reward. Returns: positionSize, breakeven, liquidationPrice, fundingCost, overnightBreakevenShift, verdict.
| Name | Required | Description | Default |
|---|---|---|---|
| mmr | No | Maintenance margin rate, default 0.005 | |
| side | Yes | Trade direction: "long" or "short" | |
| symbol | No | Perpetual symbol, e.g. "BTCUSDT". | |
| exchange | No | Exchange code, e.g. "binance" or "bybit". Used to fetch the live funding rate if funding_rate is omitted, and to set funding_interval_hours when that is omitted (1 for Hyperliquid, dYdX and Kraken, whose rates are per hour; pass funding_interval_hours: 8 if your rate is per 8 hours). | |
| leverage | Yes | Leverage multiplier | |
| risk_pct | Yes | Risk as % of balance, e.g. 1.0 = 1% | |
| stop_loss | Yes | Stop-loss price (positive) | |
| hold_hours | No | Expected hold time in hours for overnight shift calc. Default 8. | |
| entry_price | Yes | Entry price (positive) | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined (e.g. Bybit BTCUSD). All returned figures (notional, margin, risk_amount, funding_cost_*) stay USD-denominated either way; recommended_size is USD notional (contracts) for inverse. | |
| fee_open_pct | No | Opening fee fraction, default 0.0002 | |
| funding_rate | No | Funding rate per funding interval as decimal, e.g. 0.0001. If omitted, fetched live from exchange. | |
| fee_close_pct | No | Closing fee fraction, default 0.0005 | |
| account_balance | Yes | Total account balance in USDT | |
| funding_interval_hours | No | Hours per funding payment: 8 or 1 (Hyperliquid, dYdX and Kraken, whose rate is per hour). Omitted: taken from exchange when given, else 8. When funding_rate is also omitted and fetched live, the exchange interval is always used, since the fetched rate is quoted per it. |
workflow.run_price_consensusPrice ConsensusARead-onlyInspect
Cross-exchange agreement check for one perpetual futures price: fetches the same asset USDT/USDC-margined perpetual from a reference set of 7 liquid exchanges (Binance, Bybit, OKX, Gate, KuCoin, Hyperliquid, MEXC; the chosen one is compared against the rest) and reports the median of the others, the spread across all, and how far the chosen exchange sits from that median. Says the exchanges disagree instead of guessing: status is agree (under 0.25%), warn (0.25% to 1%), diverge (1% or more) or insufficient (fewer than 3 other exchanges returned a comparable contract; inverse, dated and unlisted contracts are not compared, and that is not a verdict on the price). Use before acting on a live price: "is this Bybit BTC price in line with the market?" Symbol is the perp symbol as that exchange names it (e.g. BTCUSDT on bybit, ETH-USDT-SWAP on okx). Returns: status, summary, median, peerMedian, spreadPct, deviationPct, sources, quotes (price per exchange), thresholds_pct, as_of.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | That exchange's own perpetual symbol, e.g. BTCUSDT (bybit/binance), ETH-USDT-SWAP (okx), BTCUSDC (hyperliquid) | |
| exchange | Yes | Exchange code of the price being checked, e.g. bybit, binance, okx, gate, kucoin, hyperliquid, mexc |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, and the description adds substantial context beyond them: the reference exchange set, exact threshold bands (0.25%/1%), the meaning of the 'insufficient' status, and the exclusion of inverse, dated and unlisted contracts. This is exactly the kind of behavioral detail annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but dense and front-loaded: the core check is stated first, then the exchange set, then thresholds, then usage, then the return shape. Every sentence carries information, though the return-field enumeration is slightly list-heavy for a description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description enumerates the returned fields (status, summary, median, peerMedian, spreadPct, deviationPct, sources, quotes, thresholds_pct, as_of) and defines the status vocabulary, so an agent knows both inputs and outputs well enough to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by stressing that the symbol must be the exchange-native perp symbol (with per-exchange examples such as BTCUSDT on bybit and ETH-USDT-SWAP on okx) and by explaining that the chosen exchange is compared against the rest. That prevents a common cross-exchange symbol mismatch.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('cross-exchange agreement check for one perpetual futures price') and immediately bounds the scope to 7 named exchanges with the chosen one compared against the rest. An agent can distinguish this from sibling workflows like run_cross_venue_arbitrage or run_pre_trade_check 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use before acting on a live price') plus a worked example question ('is this Bybit BTC price in line with the market?'). It also clarifies when NOT to treat the result as a verdict (insufficient status, non-comparable contract types), which is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_risk_parityRisk Parity WeightsARead-onlyInspect
Risk-parity (equal or custom risk contribution) portfolio weights for N assets: given a covariance matrix (or N return series to compute one from), finds long-only weights where each asset contributes its target share of total portfolio risk. Use when user asks "what weights give each asset equal risk contribution?" or "how do I risk-parity-weight this portfolio?". A portfolio-construction calculation, not a buy/sell recommendation. Returns: weights, risk_contributions (should match risk_budgets exactly at convergence), portfolio_volatility.
| Name | Required | Description | Default |
|---|---|---|---|
| returns | No | One return series per asset (2+ assets, all series the same length). Provide this OR covariance, not both. | |
| covariance | No | Direct NxN covariance matrix, if not supplying returns[][] directly. | |
| risk_budgets | No | Target risk share per asset, one per asset (need not sum to 1, normalized internally). Default: equal (1/N each). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds genuine behavioral context beyond that: it specifies long-only output, an iterative convergence criterion, and the exact return fields including risk_contributions matching risk_budgets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation and constraint, followed by usage triggers and the return contract. Dense but each sentence contributes; the parenthetical return-list is compact rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden and does so by enumerating weights, risk_contributions, and portfolio_volatility. Combined with full parameter coverage and a clear safety profile, an agent has what it needs; only edge-case behavior (non-convergence, asset-count limits) is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters including the returns-or-covariance exclusivity and the internal normalization of risk_budgets. The description restates the covariance/return-series duality but adds no syntax or format detail beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('finds long-only weights where each asset contributes its target share of total portfolio risk') and names the domain constraint (risk parity, equal or custom risk contribution). An agent can distinguish this from siblings like run_portfolio_risk or run_kelly_frontier without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit trigger phrasing ('what weights give each asset equal risk contribution?') and a clear exclusion ('A portfolio-construction calculation, not a buy/sell recommendation'). It stops short of naming a specific alternative sibling to route to, so it is clear context without full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_risk_rewardRisk RewardARead-onlyInspect
Full risk:reward analysis: takes a trade with entry, stop, AND target (all three). Calculates R:R ratio, position size, liquidation price, breakeven, and P&L at both stop and target. Returns a verdict: strong (3:1+) / good (2:1+) / marginal / poor, specifically graded on the R:R ratio. For a full setup check tied to a live exchange/symbol (including funding cost), see workflow.run_pre_trade_check; its verdict covers overall setup safety, not just R:R. Use when user asks "is this trade worth taking?" or "what's my risk reward on this setup?".
| Name | Required | Description | Default |
|---|---|---|---|
| mmr | No | Maintenance margin rate (default 0.005) | |
| side | Yes | Trade direction: "long" or "short" | |
| leverage | Yes | Leverage multiplier | |
| risk_pct | Yes | Max risk as % of account | |
| stop_loss | Yes | Stop-loss price | |
| entry_price | Yes | Entry price | |
| take_profit | Yes | Take-profit price | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined (e.g. Bybit BTCUSD). position_size/notional are USD notional (contracts) for inverse; pnl_at_stop/pnl_at_target come back denominated in the base coin. | |
| fee_open_pct | No | Open fee rate (default 0.0002) | |
| fee_close_pct | No | Close fee rate (default 0.0005) | |
| account_balance | Yes | Account balance in USDT |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds real behavioral value beyond that: it discloses the grading scale for the verdict (strong 3:1+ / good 2:1+ / marginal / poor) and that grading is on R:R alone, not overall setup safety. It does not discuss failure modes or input validation, keeping this 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical scoping and routing information is front-loaded, and the tool-vs-sibling boundary comes before the trigger phrases. Slightly long, with two example user quotes that are useful but could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of describing return values, and it does: it lists R:R, position size, liquidation price, breakeven, P&L at stop and target, and the verdict tiers. Combined with rich annotations and full schema coverage, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented, including defaults and the subtle inverse-contract denomination semantics. The description only adds the emphasis that entry, stop, AND target are all required, which largely restates the required array; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (full risk:reward analysis) and enumerates the computed outputs: R:R ratio, position size, liquidation price, breakeven, and P&L at stop/target. It also explicitly distinguishes itself from the nearest sibling, workflow.run_pre_trade_check, and from forex/other R:R variants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative tool and the condition that selects it ('For a full setup check tied to a live exchange/symbol (including funding cost), see workflow.run_pre_trade_check'), and states the user phrasings that should trigger this tool. It also implicitly states the precondition that all three price levels are required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_scale_outScale OutARead-onlyInspect
Scale-out planner: P&L, ROI, and cumulative P&L for each partial exit level. Use when user wants to take profit at multiple targets: "close 30% at $90k, 30% at $95k, 40% at $100k, what's my total P&L?". Returns: per-level pnl, weightedAvgExitPrice, totalRoi.
| Name | Required | Description | Default |
|---|---|---|---|
| side | Yes | Trade direction: "long" or "short" | |
| exits | Yes | Partial exit levels (2 to 10). Each: { price, pct }, e.g. [{ "price": 90000, "pct": 30 }, { "price": 95000, "pct": 70 }]; the pct values must not sum to more than 100. | |
| total_size | Yes | Total position size in base currency | |
| entry_price | Yes | Entry price | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined. total_size is USD notional (contracts) for inverse, and per-level pnl comes back denominated in the base coin. | |
| fee_open_pct | No | Open fee rate (default 0.0002) | |
| fee_close_pct | No | Close fee rate (default 0.0005) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds the return shape (per-level pnl, weightedAvgExitPrice, totalRoi), which is valuable since no output schema exists, though it says nothing about fee defaults (delegated to schema) or numeric edge cases like pct sums below 100.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the usage condition, then the return fields. The quoted user example is long but earns its place by pinning down exactly what 'scale out' means; only the quoted scenario is slightly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter read-only computation tool with no output schema, the description supplies the key return fields and a usage scenario, and the schema carries the rest. It is complete enough to call correctly, with only minor gaps around fee handling and boundary conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the nested exits, contractType margin semantics, and fee rates is already documented in the schema. The description adds no parameter detail beyond what structured fields provide, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (scale-out planner computing P&L, ROI, cumulative P&L per partial exit level) and the concrete worked example ('close 30% at $90k... what's my total P&L?') makes it immediately distinguishable from single-target exit tools like run_exit_target or run_pnl_planning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use when user wants to take profit at multiple targets" gives a clear trigger condition, reinforced by the example. It does not name a sibling or state exclusions, so it stops short of the 5-level when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_scenario_planningScenario PlanningARead-onlyInspect
Run a scenario analysis: compute PnL for multiple price-change percentages at once. Use when user asks "show me my P&L if BTC moves -10%, -5%, +5%, +10%". Returns: array of { deltaPct, exitPrice, netPnl, roe }.
| Name | Required | Description | Default |
|---|---|---|---|
| side | Yes | Trade direction: "long" or "short" | |
| size | Yes | Position size in base asset | |
| deltasPct | Yes | List of price change percentages, e.g. [-10, -5, 0, 5, 10]. Must be at least -100 (exactly -100 only for linear contracts; inverse contracts need more than -100) | |
| entryPrice | Yes | Entry price | |
| feeOpenPct | No | Opening fee fraction | |
| feeClosePct | No | Closing fee fraction | |
| contractType | No | linear = USDT-margined (default), inverse = coin-margined. For inverse, size is USD contracts and pnl/fees come out in the base coin. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds value beyond the annotations by disclosing the batch-computation behavior and the exact return shape (array of { deltaPct, exitPrice, netPnl, roe }), which matters since no 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the action, then the trigger, then the return shape. Every sentence carries distinct information and nothing is redundant with the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter read-only tool with no output schema, the description supplies the crucial missing piece: the return value structure. It is complete enough to invoke correctly, though it could say more about how the fee/contractType parameters affect results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters (including enums for side and contractType, and the -100 delta constraint) are already documented in the schema. The description adds no syntax or format meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compute PnL) and resource (scenario analysis over multiple price-change percentages), which is a clear purpose. It does not explicitly differentiate itself from overlapping siblings like workflow.run_pnl_planning or workflow.run_forex_scenario, so it lands just below the top tier rather than at 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete usage trigger with a natural-language example ("show me my P&L if BTC moves -10%, -5%, +5%, +10%"), which makes the use case unambiguous. However it names no alternatives and gives no when-not-to-use guidance, despite several sibling PnL/scenario tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_session_structureMarket Profile: Session StructureRead-onlyInspect
Market Profile day-type classifier: trend / balance / neutral_trend / normal / normal_var, from TPO, initial balance, range extension and value migration. Use for "is this a trend day or a balance day?". Returns: structure (the day-type label), description, bias, key_signals, key_levels (VAH/VAL/VPOC/IB/session high-low), tails (session-high/low rejection tails and single prints), scenario_framing, invalidation level. Candles come from the venue when candles[] is omitted (past sessions are cached, so repeats are fast); supplying candles[] makes the run network-free and reproducible. session_date must be a completed UTC session, before today; a session with no candles returns an error.
| Name | Required | Description | Default |
|---|---|---|---|
| venue | Yes | Exchange to fetch candles from when candles[] not supplied | |
| candles | No | Optional OHLCV for the session; omit to fetch from venue (reproducible + 0 COGS when supplied) | |
| timeframe | No | Candle timeframe (default 15m) | |
| instrument | Yes | Symbol, e.g. BTCUSDT | |
| prev_candles | No | Optional OHLCV for the previous session | |
| session_date | Yes | Session date YYYY-MM-DD (UTC); must be before today (a completed session) | |
| value_area_rule | No | Value-area fraction 0.5–0.9 (default 0.70) |
workflow.run_sharpe_statsSharpe Ratio StatisticsARead-onlyInspect
Sharpe ratio with the Lo (2002) serial-correlation-aware annualization correction, computed in its lag-1 form rather than the full multi-lag sum (the naive sqrt(periods_per_year) scaling overstates or understates the true annualized Sharpe when returns are autocorrelated), plus the Probabilistic Sharpe Ratio (Bailey & Lopez de Prado): the probability the true Sharpe exceeds a benchmark, adjusted for the sample's skewness/kurtosis and length, not just its point estimate. Use when user asks "what's my real annualized Sharpe, not the naive one?" or "how confident can I be this Sharpe ratio is actually good?". Returns: sharpe_period, sharpe_annualized_naive, sharpe_annualized_lo, autocorrelation_lag1, psr, skewness, kurtosis.
| Name | Required | Description | Default |
|---|---|---|---|
| returns | Yes | Return series, one value per period | |
| benchmark_sharpe | No | Benchmark Sharpe ratio for the PSR test, same periodicity as returns (default 0) | |
| periods_per_year | No | Periods per year for annualization (default 365, crypto convention - trades every day). Any number from 1 to 100 million, e.g. 365.25. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe read-only, closed-world computation, so the description correctly focuses on methodology. It adds genuinely useful behavioral context: the correction is the lag-1 form rather than the full multi-lag sum, and it explains why naive sqrt(periods_per_year) scaling misleads under autocorrelation, plus it enumerates the returned fields since no 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core computation and the returns list at the end, but the opening sentence is a dense multi-clause parenthetical pileup that is hard to parse at a glance. Supporting detail earns its place, yet the prose could be split and trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, listing the return fields (sharpe_annualized_lo, psr, autocorrelation_lag1, skewness, kurtosis) is necessary and correct. Methodology, trigger conditions, and outputs are all covered; only edge-case guidance (min sample size, defaults for periods_per_year) is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (returns, benchmark_sharpe, periods_per_year) are already documented in structured form, including defaults and ranges. The description only alludes to the benchmark ('exceeds a benchmark') and does not add format or interpretation detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific computation: Sharpe ratio with Lo (2002) serial-correlation-aware annualization plus Probabilistic Sharpe Ratio, making it immediately distinguishable from a naive Sharpe calculation. It does not name any sibling (e.g., run_dsr, run_unsmoothing) that might overlap, so differentiation is by topic rather than by explicit routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete trigger phrasings ('what's my real annualized Sharpe, not the naive one?', 'how confident can I be this Sharpe is actually good?') that map directly to the two computations offered. However, it gives no when-not-to-use guidance and does not point to related tools like run_dsr for multiple-testing-adjusted Sharpe.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_spread_payoffSpread PayoffARead-onlyInspect
Payoff, breakeven(s), and max profit/loss for a Deribit BTC/ETH vertical spread (2 legs, same option type, opposite direction, e.g. a bull call spread) or an iron condor/butterfly (4 legs: 2 calls + 2 puts) at a scenario price. Coin-settled, and the max profit/loss are genuinely NOT the flat, textbook USD-settled values: because each leg's own payoff is divided by the settlement price, (1) a debit vertical spread's peak payoff occurs exactly at its short strike, not "anywhere beyond it" - and its profit is a finite WINDOW that closes again at a high enough price, decaying back toward a full loss of the premium paid, and (2) an iron condor/butterfly's max loss is genuinely UNBOUNDED toward price->0 (maxLossCoin: null) if it has a put wing, unlike the "capped at wing width" USD-settled result - only the call side is actually bounded. Use when user asks about a bull/bear call/put spread, vertical spread, iron condor, or iron butterfly, e.g. "what's my max loss on this BTC call spread?" or "where do my iron condor breakevens sit?". Returns: structureType (vertical_spread/iron_condor/iron_butterfly, inferred from the legs given), netDebitCoin (negative = credit received), scenarioPayoffCoin, scenarioPnlCoin/Usd, breakevenPrices (0-3, ascending), maxLossCoin/maxProfitCoin (null = unbounded), isProfitable.
| Name | Required | Description | Default |
|---|---|---|---|
| legs | Yes | Exactly 2 legs (same option type, opposite position - a vertical spread) or 4 legs (2 calls + 2 puts - an iron condor/butterfly). Each leg: { optionType: call|put, position: long|short, strike: number, premiumCoin: number }. | |
| currency | No | Underlying coin. Default BTC. | |
| quantity | Yes | Number of spread/condor units | |
| scenarioPrice | Yes | Underlying price in USD to evaluate the payoff at |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint/openWorldHint/destructiveHint), yet the description goes further with genuinely important behavior: coin-settlement effects that make max P&L differ from textbook USD-settled values, the finite profit window of a debit vertical, and unbounded loss (maxLossCoin: null) when a put wing is present. This is exactly the non-obvious behavior an agent would otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and ends with a clean structured Returns list, so it is easy to scan. The middle coin-settlement sentence is dense and run-on, but its content is load-bearing rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully enumerates the return fields (structureType, netDebitCoin, scenarioPayoffCoin, scenarioPnlCoin/Usd, breakevenPrices, maxLossCoin/maxProfitCoin, isProfitable) and flags null semantics for unbounded values, leaving nothing an agent needs to call or interpret this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds interpretation beyond the raw schema: it defines the valid leg combinations (2 same-type opposite-position legs, or 2 calls + 2 puts), states that structureType is inferred from the given legs, and notes netDebitCoin is negative for a credit received.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compute payoff/breakeven/max P&L) and resource (Deribit BTC/ETH vertical spread or iron condor/butterfly), and explicitly delimits the structure into 2-leg vs 4-leg cases. This distinguishes it from siblings like run_options_payoff, run_straddle_strangle, and run_spread_reader without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear usage context is given (bull/bear call/put spread, vertical spread, iron condor, iron butterfly) plus concrete triggering queries. However it never names the nearest alternatives or states when NOT to use it, so a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_spread_readerSpread ReaderARead-onlyInspect
Reads the same real-world bet's live price from 2-5 prediction-market venues at once (Kalshi, Polymarket, ADI Predictstreet, Limitless, Myriad) in a single call and reports the spread between the cheapest and most expensive. Takes every venue's identifier together in quotes[], for example one Kalshi ticker and one Polymarket slug for the same bet, and returns the venue with the lowest yes midpoint price, before fees and depth. The caller supplies each venue's own identifier for what they've confirmed is the same underlying bet; this tool never auto-matches events across venues, only reads and compares prices for identifiers you provide. For the odds, breakeven win rate or vig of a single market, see workflow.run_odds_converter. Use when user asks "is this bet priced differently on Kalshi vs Polymarket?" or "which venue has the best price on this?". Returns: quotes[] (venue, identifier, label, probabilityPct, available, error), availableCount, cheapestVenue, mostExpensiveVenue, spreadPct (percentage points, null if fewer than 2 quotes resolved).
| Name | Required | Description | Default |
|---|---|---|---|
| quotes | Yes | One entry per venue you want to compare: 2 to 5 total, all in this one call (a Kalshi ticker and a Polymarket slug for the same bet are two entries). Each must genuinely be the same real-world bet; this tool does not verify that for you. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, openWorld, non-destructive), and the description adds real operational context: comparison uses yes midpoint before fees and depth, the tool never auto-matches events, and spreadPct is null when fewer than two quotes resolve. It stops short of discussing rate limits or venue availability behavior beyond the per-quote error field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core capability and the identifier requirement are front-loaded, and the returns summary is compact. The single dense paragraph is long but nearly every clause carries required information (venue list, spread definition, output fields).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description enumerates the return shape (quotes[], availableCount, cheapestVenue, mostExpensiveVenue, spreadPct with null semantics). Combined with the readOnly annotations, an agent has everything needed to select and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented; the description nevertheless adds semantic value by explaining that quotes[] takes one venue-native identifier per venue (Kalshi ticker vs Polymarket slug) for the same bet and that the tool does not verify equivalence. That goes beyond the schema's field-level text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reads the same real-world bet's live price from 2-5 prediction-market venues'), enumerates the venues, and names what it computes (the spread). It is clearly distinguishable from siblings like run_odds_converter, which it explicitly points to.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrases ('is this bet priced differently on Kalshi vs Polymarket?', 'which venue has the best price?') and explicitly redirects single-market odds/breakeven/vig questions to workflow.run_odds_converter. The no-auto-matching constraint is stated as a usage boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_straddle_strangleStraddle and StrangleARead-onlyInspect
Payoff, P&L, and both breakeven prices for a long or short straddle/strangle (a call + a put on the same Deribit BTC/ETH underlying, both legs the same direction) at a scenario price. A straddle is callStrike === putStrike; any callStrike > putStrike makes it a strangle, same formula either way. Coin-settled like workflow.run_options_payoff: a long position's max loss is the flat total premium paid (between the strikes, both legs worthless); max profit is technically unbounded, dominated by the put leg's payoff as price falls toward zero. Use when user asks about a straddle or strangle, e.g. "what does a BTC straddle pay off if price barely moves?" or "where are my breakevens on this strangle?". Returns: combinedIntrinsicCoin, scenarioPnlCoin, scenarioPnlUsd, upperBreakevenPrice, lowerBreakevenPrice, maxLossCoin/maxProfitCoin (null = unbounded), isStraddle, isProfitable.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | Underlying coin. Default BTC. | |
| position | Yes | Option position: "long" (bought) or "short" (sold) | |
| quantity | Yes | Number of straddle/strangle units (both legs sized equally) | |
| putStrike | Yes | Put leg strike, USD. Must be <= callStrike. | |
| callStrike | Yes | Call leg strike, USD. Equal to putStrike for a straddle, higher for a strangle. | |
| scenarioPrice | Yes | Underlying price in USD to evaluate the payoff at | |
| putPremiumCoin | Yes | Put leg premium per contract, in the base coin | |
| callPremiumCoin | Yes | Call leg premium per contract, in the base coin (e.g. 0.02 BTC) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), and the description adds real substance: coin settlement, that a long's max loss equals the flat premium paid, and the full return field list including null-as-unbounded semantics. However the claim that long max profit is 'unbounded, dominated by the put leg's payoff as price falls toward zero' is internally inconsistent — downside put profit is bounded by the strike and the unbounded upside comes from the call leg — which weakens confidence in the disclosed behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then definition, then risk/settlement behavior, then usage examples, then returns — a sensible priority order. It is dense and slightly long, and the flawed max-profit sentence costs space without earning it, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly enumerates the return fields (combinedIntrinsicCoin, scenarioPnlCoin, scenarioPnlUsd, upper/lowerBreakevenPrice, maxLossCoin/maxProfitCoin, isStraddle, isProfitable), so an agent knows what comes back. All 8 params are documented in the schema and the strike/direction semantics are restated, leaving nothing critical missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter-level baseline is 3, but the description adds meaning the schema does not carry: both legs must be the same direction and equally sized ('straddle/strangle units'), and premiums are per-contract in the base coin. This clarifies how the required params relate to one another beyond their individual descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Payoff, P&L, and both breakeven prices for a long or short straddle/strangle at a scenario price') and disambiguates the two instruments definitionally (callStrike === putStrike vs callStrike > putStrike). An agent can separate it from siblings like run_options_payoff and run_spread_payoff 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use when user asks about a straddle or strangle') plus two concrete example utterances covering the payoff and breakeven cases. It references run_options_payoff as the analogous coin-settled model, but never states when to prefer run_options_payoff or run_spread_payoff instead, so the routing is implied rather than fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_swap_price_impactSwap Price ImpactARead-onlyInspect
Live price-impact quote for a Solana token swap: routed through Jupiter (the same aggregator real swaps use) across every pool it knows about, not a single-pool estimate. Works in both directions: side "sell" (default) sells a token into USDC or SOL, side "buy" spends USDC or SOL to buy the token. Use when user asks "how much slippage will I eat swapping X tokens?", "what will I actually get if I sell N tokens?" or "what do I get buying this token with 500 SOL?". Returns: side, outputAmount (quote asset when selling, tokens when buying), priceImpactPct, effectivePrice (quote asset per token in both directions), marketPriceUsd, liquidityUsd, routable (false + error if the size can't be routed at all).
| Name | Required | Description | Default |
|---|---|---|---|
| mint | Yes | Solana mint address of the token being sold or bought (base58) | |
| side | No | sell: sell the token for outputAsset (default). buy: spend outputAsset to buy the token. | |
| amount | Yes | Amount to swap, in human units (not raw base units): tokens when side is sell, units of outputAsset to spend when side is buy | |
| outputAsset | No | The quote asset: received when selling, paid with when buying. Default USDC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, open-world), and the description goes further by naming the data source (Jupiter, all known pools), enumerating the returned fields, and disclosing the failure mode ('routable: false + error if the size can't be routed at all'). It also clarifies units and directionality of outputAmount/effectivePrice, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single dense paragraph that leads with the core mechanism, then directions, then trigger examples, then returns — a logical front-loaded order with no filler sentences. It is on the long side, but every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry return-value semantics — and it does, listing side, outputAmount, priceImpactPct, effectivePrice, marketPriceUsd, liquidityUsd, and routable with their direction-dependent meanings. Combined with full schema coverage, nothing material is missing for correct invocation or interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with enums documented for side and outputAsset, so the schema already does the heavy lifting. The description reinforces direction semantics ('sell (default)' vs 'buy spends USDC or SOL') and shows a worked amount example, but adds little beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('live price-impact quote for a Solana token swap') and qualifies the mechanism ('routed through Jupiter ... not a single-pool estimate'), which separates it from single-venue siblings like run_orderbook_impact. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrasings ('how much slippage will I eat swapping X tokens?', 'what do I get buying this token with 500 SOL?') and explains the two directions plus defaults, which is strong usage context. It stops short of explicitly stating when to prefer a different sibling (e.g. run_pre_trade_check or run_token_risk_check) over this quote.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_token_risk_checkToken Risk CheckARead-onlyInspect
Token rug-pull MECHANISM check for a Solana token (mint address): can the deployer still mint supply, freeze wallets, pull liquidity, swap metadata, or has RugCheck flagged a known scam pattern (e.g. copycat token)? Fetches live facts from RugCheck (GoPlus as fallback) and returns a transparently-weighted composite score. Deliberately does NOT score holder concentration or "whale dump" impact: those are properties of any liquid market (a legit protocol's top holders are routinely treasury/vesting/exchange wallets), not rug signals; they are returned separately as informational market_context. Use when user asks "is this token a rug pull?" or "is [token] safe to buy?". This is a sourced, timestamped read of public facts, not a safety guarantee. Returns: score (0-100), verdict (clean/caution/high_risk/red_flags), verdict_summary, components breakdown, facts, market_context, sources.
| Name | Required | Description | Default |
|---|---|---|---|
| mint | Yes | Solana token mint address (base58) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/openWorld/destructive=false; the description adds substantial behavioral context beyond that: live facts sourced from RugCheck with GoPlus fallback, transparently-weighted composite score, timestamped snapshot, and an explicit caveat that it is 'not a safety guarantee'. It even discloses a deliberate scoring exclusion and why.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the failure modes, then the sourcing, then the exclusions, then the return shape. Dense but every clause carries information; the semicolon-chained 'does NOT score...' passage is long, costing a point on tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description takes on the burden and delivers it: it lists the returned fields (score, verdict, verdict_summary, components, facts, market_context, sources) and the verdict enum values. Given one simple required param, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema description coverage, so the schema fully documents 'mint' as a base58 Solana mint address. The description repeats but does not meaningfully extend the schema's parameter semantics; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Token rug-pull MECHANISM check for a Solana token (mint address)') and enumerates the exact failure modes it inspects (mint supply, freeze wallets, pull liquidity, swap metadata, scam patterns). An agent can distinguish it from the adjacent run_wallet_flag_check 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions ('Use when user asks "is this token a rug pull?" or "is [token] safe to buy?"') and explicitly states what the tool does NOT cover (holder concentration / whale dump impact, deferred to market_context). It does not, however, name a sibling tool as an alternative for the excluded concerns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_unsmoothingReturn UnsmoothingARead-onlyInspect
Return "unsmoothing" for infrequently-marked/illiquid or appraisal-based series: Getmansky-Lo-Makarov (2004) MA(2) smoothing index plus Blundell-Ward (1987) AR(1) volatility inflation, two complementary models answering "this return series looks smoother than it really is; what's the true volatility?". Use when user asks "how much is appraisal smoothing understating my real volatility?" or "what's my de-smoothed Sharpe ratio?". Returns: glm_theta (MA(2) weights), glm_smoothing_index (xi, 1=no smoothing, down to 1/3 for max MA(2) smoothing), glm_true_volatility_multiplier, glm_converged (false if the fit may be unreliable - treat that result with caution), bw_alpha (AR(1) coefficient = lag-1 autocorrelation, can be negative), bw_smoothing_detected (false when alpha<=0: no evidence of smoothing, bw_volatility_multiplier is then pinned to 1 with no correction applied rather than a misleading below-1 value), bw_volatility_multiplier, and each model's own true_stdev estimate.
| Name | Required | Description | Default |
|---|---|---|---|
| returns | Yes | The observed (possibly smoothed) return series, at least 20 values |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety profile (readOnly, non-destructive, closed world), and the description adds rich behavioral detail: glm_converged=false means the fit may be unreliable and should be treated with caution, and bw_smoothing_detected=false pins the multiplier to 1 rather than emitting a misleading below-1 value. This edge-case disclosure is exactly the context annotations cannot provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a long description, but with no output schema present, the enumerated return-field list is load-bearing rather than padding. The purpose statement is front-loaded before the field glossary, and each sentence carries meaning, though the single dense paragraph could be more scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain return values, and it does so comprehensively, including convergence flags and the no-smoothing degenerate case. Nothing an agent needs in order to call this correctly or interpret its results appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (the 'returns' array documents at-least-20-values), so the schema already carries parameter meaning. The description only echoes this with 'observed (possibly smoothed) return series' and adds no format or preprocessing detail beyond the schema. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return unsmoothing') and immediately names the two models involved (Getmansky-Lo-Makarov 2004 MA(2) and Blundell-Ward 1987 AR(1)), plus the exact question it answers. An agent can distinguish it from siblings like run_garch or run_hurst_exponent 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit user-intent triggers ('how much is appraisal smoothing understating my real volatility?', 'what's my de-smoothed Sharpe ratio?') and scopes it to infrequently-marked/illiquid or appraisal-based series. It does not name a sibling alternative or a when-not-to-use condition, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_value_migrationMarket Profile: Value MigrationRead-onlyInspect
Market Profile value-area migration across sessions: is value migrating up, down, or overlapping (directional conviction vs balance)? Use for "is value moving higher day over day?". Returns: state, direction, migration_pct, key_levels (current vs. prior session VAH/VAL/VPOC), tails (session-high/low rejection tails and single prints), scenario_framing, invalidation level. Candles come from the venue when candles[] is omitted (past sessions are cached, so repeats are fast); supplying candles[] makes the run network-free and reproducible. session_date must be a completed UTC session, before today; a session with no candles returns an error.
| Name | Required | Description | Default |
|---|---|---|---|
| venue | Yes | Exchange to fetch candles from when candles[] not supplied | |
| candles | No | Optional OHLCV for the session; omit to fetch from venue (reproducible + 0 COGS when supplied) | |
| timeframe | No | Candle timeframe (default 15m) | |
| instrument | Yes | Symbol, e.g. BTCUSDT | |
| prev_candles | No | Optional OHLCV for the previous session | |
| session_date | Yes | Session date YYYY-MM-DD (UTC); must be before today (a completed session) | |
| value_area_rule | No | Value-area fraction 0.5–0.9 (default 0.70) | |
| lookback_sessions | No | Sessions to compare, 1–5 (default 1) |
workflow.run_var_cvarVaR and CVaRARead-onlyInspect
Parametric Value at Risk (VaR) and Conditional VaR / Expected Shortfall (CVaR), the variance-covariance method (assumes normally distributed returns), plus Modified VaR (Cornish-Fisher skew/kurtosis correction, Boudt/Peterson/Croux) when a return series is supplied. Supply either a return series or a mean/stdev pair directly, at a confidence level. Output is at the same periodicity as the input (no automatic annualization) - a daily return series gives a daily VaR/CVaR. Use when user asks "what's my VaR at 95%/99%?", "what's my expected shortfall on this position?", or "does my Sharpe/VaR estimate need a fat-tails correction?". Returns: var, cvar (both positive loss magnitudes; cvar >= var always), z, mean, stdev, skewness, excess_kurtosis (both null unless 3+ returns were supplied), var_modified (skew/kurtosis-adjusted VaR; null when skewness is, OR when this series' skew/kurtosis are too extreme for the Cornish-Fisher expansion to be a valid quantile - skewness/excess_kurtosis are still returned in that case).
| Name | Required | Description | Default |
|---|---|---|---|
| mean | No | Mean return, if not supplying returns[] directly | |
| stdev | No | Standard deviation of returns, if not supplying returns[] directly | |
| returns | No | Return series (e.g. daily % returns as decimals). Provide this OR mean+stdev, not both. | |
| confidence | No | Confidence level, 0-1 exclusive (default 0.95) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, non-destructive, and non-open-world, but the description adds substantial behavioral detail: no automatic annualization, positivity of var/cvar, the cvar >= var invariant, and exactly when skewness, excess_kurtosis, and var_modified are null. This is rich disclosure beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is dense but front-loaded with the core purpose and method, then usage triggers, then output details. Given the absence of an output schema, the long Returns sentence is necessary and every clause carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a computation tool with four optional parameters, no output schema, and safety annotations already present, the description covers input modes, method variants, output fields, and edge-case null behavior. Nothing an agent needs to invoke it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter meanings are already fully documented. The description repeats the either/or input requirement and confidence level but adds little syntax or format detail beyond the schema, matching the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific computation and methods: parametric VaR/CVaR via variance-covariance, plus Modified VaR with Cornish-Fisher correction. This clearly separates it from broader risk tools like run_portfolio_risk or run_evt_tail_risk without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage triggers such as 'what's my VaR at 95%/99%?' and 'what's my expected shortfall on this position?' and explains that either returns or mean/stdev are supplied. It does not explicitly state when not to use it or name an alternative sibling, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_wallet_flag_checkWallet Flag CheckARead-onlyInspect
Checks a wallet address (Solana or any of 5 EVM chains) against independent flag databases: GoPlus (malicious-address categories, all chains), Webacy (address analysis + sanctions check, all chains), and ScamSniffer (public phishing/drainer blacklist, EVM chains only), and returns each source's own facts separately, never merged into one invented score. Use when user asks "is this wallet address flagged?" or "is it safe to send to this address?". A clean result means "nothing found in these databases," not a certified-safe verdict. Returns: goplus (flags[], categoriesChecked), webacyGeneral (overallRisk, dprk/hack/ofacSanctioned, exchangeLabel), webacySanctions (status), scamSniffer (flagged; not applicable on Solana). Each source has an available flag: false + error if that source failed independently.
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Chain of the wallet address. Default solana. | |
| walletAddress | Yes | Wallet address (base58 for Solana, 0x... for EVM chains) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/open-world safety profile, and the description adds substantial behavioral context beyond them: sources are never merged into one score, each source carries an `available` flag with independent error reporting, and ScamSniffer is inapplicable on Solana. This is precisely the kind of extra disclosure that earns credit over the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then use cases, caveat, and return shape. Dense but every line conveys actionable information (return fields stand in for the absent output schema). Slightly long, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing the return fields per source and the `available`/error semantics. Chain coverage and the Solana caveat are also addressed, leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning to `chain` by enumerating 'Solana or any of 5 EVM chains' and clarifying that ScamSniffer is EVM-only. It adds modest value beyond the schema's enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('checks a wallet address'), names the exact sources consulted, and scopes chain support ('Solana or any of 5 EVM chains'). It is clearly distinguishable from the adjacent token-oriented siblings like run_token_risk_check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrases ('is this wallet address flagged?', 'is it safe to send to this address?') and a caveat that a clean result is not a certified-safe verdict. It stops short of naming a sibling alternative or a when-not-to-use condition, so it falls just below the top mark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow.run_window_fair_valueWindow Fair ValueARead-onlyInspect
Theoretical fair value for a time-windowed crypto up/down contract (the shape ADI Predictstreet and Kalshi-style daily crypto markets use: pays out based on whether the settlement price finishes at/above or below a reference price pinned at window open, by a fixed close time): a cash-or-nothing digital option, priced with the standard N(d2) formula. It gives the probability at the close time only, not the probability of touching a level at any point before it (first passage). Time convention: a year is 365 days. Use this when there's no live market price to read (e.g. a venue's contract has real terms but zero trading volume) instead of a live-market odds tool. Volatility is a required manual input; there is no live implied-vol market on these contracts to pull it from. Use when user asks "what should this up/down contract be worth?" or "what's the fair probability BTC finishes above $X in N minutes?". Returns: d1, d2, probAbovePct, probBelowPct, fairPriceAboveCents, fairPriceBelowCents (cents convention, directly comparable to how these venues quote a contract).
| Name | Required | Description | Default |
|---|---|---|---|
| currentPrice | Yes | Current spot price of the coin, in USD. | |
| volatilityPct | Yes | Annualized volatility, in percentage points (e.g. 50 for 50%). Required; no live source for this on these contracts. | |
| minutesToClose | Yes | Minutes remaining until the window closes/settles. | |
| referencePrice | Yes | The reference/pinned price the contract resolves against (the window's open price, or a stated strike). | |
| riskFreeRatePct | No | Risk-free rate in percentage points. Default 0: negligible for these short windows. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/openWorld=false/non-destructive; the description adds substantial non-annotation context: it computes terminal distribution only (not first passage/touch), uses a 365-day year convention, and requires volatility as a manual input because there is no live implied-vol market for these contracts. Those are exactly the assumptions that would otherwise cause silent misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the payout definition, then usage, then returns — a sensible order with no filler sentences. The venue-naming parenthetical ("the shape ADI Predictstreet and Kalshi-style...") is slightly verbose and could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description enumerates the returned fields (d1, d2, probAbovePct, probBelowPct, fairPriceAboveCents, fairPriceBelowCents) and their convention. Combined with the model assumptions and the manual-vol caveat, an agent has everything needed to call and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3; the description earns extra credit by explaining that volatilityPct has no live source and must be supplied manually, and by clarifying the cents convention that makes outputs directly comparable to venue quotes. It does not elaborate on how minutesToClose interacts with the annualization beyond the 365-day note, leaving a little on the table.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (price/theoretical fair value) and a precise resource (time-windowed crypto up/down cash-or-nothing digital contract), and pins down the exact model used (N(d2)). It explicitly delimits itself from adjacent concepts: probability at close only, not first-passage/touch probability. An agent can distinguish this from run_black_scholes, run_black_scholes_live, and run_market_implied_odds without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use condition ("no live market price to read... e.g. a venue's contract has real terms but zero trading volume") and an explicit alternative class to use instead (a live-market odds tool). It also provides two concrete user-phrasing triggers ("what should this up/down contract be worth?", "fair probability BTC finishes above $X in N minutes").
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.
4 tool updates
- Changed
workflow.run_compound_funding1 field changed- changed
Input schema / properties / intervalHours / descriptionPrevious value: -"Funding interval: 8 (standard) or 1 (Hyperliquid)"New value: +"Funding interval: 8 (standard) or 1 (Hyperliquid, dYdX, Kraken: per-hour rates)"
- Changed
workflow.run_funding_arbitrage1 field changed- changed
Input schema / properties / intervalHours / descriptionPrevious value: -"Funding interval: 8 (standard) or 1 (Hyperliquid)"New value: +"Funding interval: 8 (standard) or 1 (Hyperliquid, dYdX, Kraken: per-hour rates)"
- Changed
workflow.run_funding_breakeven2 fields changed- added
Input schema / properties / funding_interval_hoursAdded value: +{ + "description": "Hours per funding payment: 8 (default) or 1 (Hyperliquid, dYdX and Kraken, whose rate is per hour)", + "enum": [ + 8, + 1 + ], + "type": "number" +} - changed
Input schema / properties / funding_rate / descriptionPrevious value: -"Funding rate per 8h period (decimal, e.g. 0.0001)"New value: +"Funding rate per funding interval (decimal, e.g. 0.0001)"
- Changed
workflow.run_pre_trade_check3 fields changed- changed
Input schema / properties / exchange / descriptionPrevious value: -"Exchange code, e.g. \"binance\" or \"bybit\". Used to fetch live funding rate if funding_rate is omitted."New value: +"Exchange code, e.g. \"binance\" or \"bybit\". Used to fetch the live funding rate if funding_rate is omitted, and to set funding_interval_hours when that is omitted (1 for Hyperliquid, dYdX and Kraken, whose rates are per hour; pass funding_interval_hours: 8 if your rate is per 8 hours)." - added
Input schema / properties / funding_interval_hoursAdded value: +{ + "description": "Hours per funding payment: 8 or 1 (Hyperliquid, dYdX and Kraken, whose rate is per hour). Omitted: taken from exchange when given, else 8. When funding_rate is also omitted and fetched live, the exchange interval is always used, since the fetched rate is quoted per it.", + "enum": [ + 8, + 1 + ], + "type": "number" +} - changed
Input schema / properties / funding_rate / descriptionPrevious value: -"Funding rate per 8h as decimal, e.g. 0.0001. If omitted, fetched live from exchange."New value: +"Funding rate per funding interval as decimal, e.g. 0.0001. If omitted, fetched live from exchange."
4 tool updates
- Changed
workflow.run_compound_funding7 fields changed- changed
Input schema / properties / durationDays / descriptionPrevious value: -"Number of days to project"New value: +"Number of days to project, up to 3650" - added
Input schema / properties / durationDays / exclusiveMinimumAdded value: +0 - added
Input schema / properties / durationDays / maximumAdded value: +3650 - added
Input schema / properties / initialCapital / exclusiveMinimumAdded value: +0 - changed
Input schema / properties / reinvestPct / descriptionPrevious value: -"Percentage of earnings reinvested each interval. 100 = full compounding, 0 = no reinvestment. Default 100."New value: +"Percentage of funding received that is reinvested each interval, 0-100 (the rest is withdrawn and counts as earned; funding paid always comes out of capital). 100 = full compounding. Default 100." - added
Input schema / properties / reinvestPct / maximumAdded value: +100 - added
Input schema / properties / reinvestPct / minimumAdded value: +0
- Changed
workflow.run_dsr1 field changed- changed
Input schema / properties / n_trials / descriptionPrevious value: -"Number of strategy variants tried, if trial_sharpes were not tracked individually"New value: +"Number of strategy variants tried, if trial_sharpes were not tracked individually. Assumes trial Sharpes with mean 0 and variance 1 (per-period units): too strict for daily series, prefer trial_sharpes there."
- Changed
workflow.run_portfolio_tearsheet3 fields changed- changed
Input schema / properties / periods_per_year / descriptionPrevious value: -"Periods per year for annualization (default 365)"New value: +"Periods per year for annualization (default 365). Any number from 1 to 100 million, e.g. 365.25." - added
Input schema / properties / periods_per_year / maximumAdded value: +100000000 - added
Input schema / properties / periods_per_year / minimumAdded value: +1
- Changed
workflow.run_sharpe_stats3 fields changed- changed
Input schema / properties / periods_per_year / descriptionPrevious value: -"Periods per year for annualization (default 365, crypto convention - trades every day)"New value: +"Periods per year for annualization (default 365, crypto convention - trades every day). Any number from 1 to 100 million, e.g. 365.25." - added
Input schema / properties / periods_per_year / maximumAdded value: +100000000 - added
Input schema / properties / periods_per_year / minimumAdded value: +1
4 tool updates
- Changed
workflow.run_breakout_acceptance1 field changed- changed
Input schema / properties / session_date / descriptionPrevious value: -"Session date YYYY-MM-DD (UTC)"New value: +"Session date YYYY-MM-DD (UTC); must be before today (a completed session)"
- Changed
workflow.run_open_analysis1 field changed- changed
Input schema / properties / session_date / descriptionPrevious value: -"Session date YYYY-MM-DD (UTC)"New value: +"Session date YYYY-MM-DD (UTC); must be before today (a completed session)"
- Changed
workflow.run_session_structure1 field changed- changed
Input schema / properties / session_date / descriptionPrevious value: -"Session date YYYY-MM-DD (UTC)"New value: +"Session date YYYY-MM-DD (UTC); must be before today (a completed session)"
- Changed
workflow.run_value_migration1 field changed- changed
Input schema / properties / session_date / descriptionPrevious value: -"Session date YYYY-MM-DD (UTC)"New value: +"Session date YYYY-MM-DD (UTC); must be before today (a completed session)"
2 tool updates
- Changed
workflow.run_odds_converter2 fields changed- changed
Input schema / properties / kalshiTicker / descriptionPrevious value: -"A Kalshi market ticker (e.g. KXBTCY-27JAN0100-T149999.99) to fetch a live price from."New value: +"A Kalshi market ticker (e.g. KXBTCY-27JAN0100-T149999.99) to fetch a live price from. One market only; for the same bet on several venues use workflow.run_spread_reader." - changed
Input schema / properties / polymarketSlug / descriptionPrevious value: -"A Polymarket market slug, from the market URL (e.g. will-bitcoin-reach-100k-in-september-2026), to fetch a live price from."New value: +"A Polymarket market slug, from the market URL (e.g. will-bitcoin-reach-100k-in-september-2026), to fetch a live price from. One market only; for the same bet on several venues use workflow.run_spread_reader."
- Changed
workflow.run_spread_reader1 field changed- changed
Input schema / properties / quotes / descriptionPrevious value: -"One entry per venue you want to compare: 2 to 5 total. Each must genuinely be the same real-world bet; this tool does not verify that for you."New value: +"One entry per venue you want to compare: 2 to 5 total, all in this one call (a Kalshi ticker and a Polymarket slug for the same bet are two entries). Each must genuinely be the same real-world bet; this tool does not verify that for you."
1 tool update
- Changed
workflow.run_swap_price_impact4 fields changed- changed
Input schema / properties / amount / descriptionPrevious value: -"Amount of the token to swap, in human units (not raw base units)"New value: +"Amount to swap, in human units (not raw base units): tokens when side is sell, units of outputAsset to spend when side is buy" - changed
Input schema / properties / mint / descriptionPrevious value: -"Solana mint address of the token being sold (base58)"New value: +"Solana mint address of the token being sold or bought (base58)" - changed
Input schema / properties / outputAsset / descriptionPrevious value: -"Asset to receive. Default USDC."New value: +"The quote asset: received when selling, paid with when buying. Default USDC." - added
Input schema / properties / sideAdded value: +{ + "description": "sell: sell the token for outputAsset (default). buy: spend outputAsset to buy the token.", + "enum": [ + "sell", + "buy" + ], + "type": "string" +}
1 tool update
- Changed
workflow.run_crypto_profit1 field changed- changed
Input schema / properties / holdingDays / descriptionPrevious value: -"Optional: days the coins were held, to also return the annualized return"New value: +"Optional: days the coins were held; 30 or more also returns the annualized return"
1 tool update
- Added
workflow.run_crypto_profit
27 tool updates
- Changed
primitive.average_entry2 fields changed- added
Input schema / properties / input / descriptionAdded value: +"Object with a \"fills\" array, e.g. { \"fills\": [{ \"price\": 60000, \"quantity\": 0.5 }, { \"price\": 58000, \"quantity\": 1 }] }" - added
Input schema / properties / input / properties / fills / descriptionAdded value: +"Buy/sell fills to average, each with a price and a quantity (at least 1)"
- Changed
workflow.run_average_down1 field changed- added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_breakeven_planning1 field changed- added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_covered_call_protective_put1 field changed- added
Input schema / properties / strategy / descriptionAdded value: +"\"covered_call\" (hold the coin, sell a call against it) or \"protective_put\" (hold the coin, buy a put as insurance)"
- Changed
workflow.run_cross_venue_arbitrage1 field changed- added
Input schema / properties / quotes / items / properties / venue / descriptionAdded value: +"Prediction-market venue this quote comes from"
- Changed
workflow.run_dca_entry4 fields changed- added
Input schema / properties / entries / descriptionAdded value: +"Fills to average (2 to 20). Each: { price, size }, e.g. [{ \"price\": 60000, \"size\": 0.5 }, { \"price\": 58000, \"size\": 1 }]. Size is base-asset quantity for linear, USD notional (contracts) for inverse." - added
Input schema / properties / entries / items / properties / price / descriptionAdded value: +"Fill price" - added
Input schema / properties / entries / items / properties / size / descriptionAdded value: +"Fill size" - added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_exit_target1 field changed- added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_forex_average_entry2 fields changed- added
Input schema / properties / fills / items / properties / price / descriptionAdded value: +"Fill price" - added
Input schema / properties / fills / items / properties / units / descriptionAdded value: +"Fill size in base-currency units"
- Changed
workflow.run_forex_breakeven2 fields changed- added
Input schema / properties / entryPrice / descriptionAdded value: +"Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD" - added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_forex_pnl3 fields changed- added
Input schema / properties / entryPrice / descriptionAdded value: +"Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD" - added
Input schema / properties / exitPrice / descriptionAdded value: +"Exit price, same quote convention as the entry price" - added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_forex_position_size_live2 fields changed- added
Input schema / properties / entryPrice / descriptionAdded value: +"Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD" - added
Input schema / properties / stopPrice / descriptionAdded value: +"Stop-loss price, same quote convention as the entry price"
- Changed
workflow.run_forex_risk_reward4 fields changed- added
Input schema / properties / entryPrice / descriptionAdded value: +"Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD" - added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\"" - added
Input schema / properties / stopPrice / descriptionAdded value: +"Stop-loss price, same quote convention as the entry price" - added
Input schema / properties / targetPrice / descriptionAdded value: +"Take-profit price, same quote convention as the entry price"
- Changed
workflow.run_forex_scenario2 fields changed- added
Input schema / properties / entryPrice / descriptionAdded value: +"Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD" - added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_funding_breakeven1 field changed- added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_funding_cost1 field changed- added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_implied_volatility1 field changed- added
Input schema / properties / optionType / descriptionAdded value: +"Option type: \"call\" or \"put\""
- Changed
workflow.run_liquidation_safety1 field changed- added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_options_payoff2 fields changed- added
Input schema / properties / optionType / descriptionAdded value: +"Option type: \"call\" or \"put\"" - added
Input schema / properties / position / descriptionAdded value: +"Option position: \"long\" (bought) or \"short\" (sold)"
- Changed
workflow.run_portfolio_risk2 fields changed- added
Input schema / properties / positions / descriptionAdded value: +"Open positions to aggregate (1 to 50). Each: { side, entry_price, mark_price, size, leverage }, plus optional fees, mmr, contractType, coin, label." - added
Input schema / properties / positions / items / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_position_sizing1 field changed- added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_pre_trade_check1 field changed- added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_risk_reward1 field changed- added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_scale_out3 fields changed- added
Input schema / properties / exits / descriptionAdded value: +"Partial exit levels (2 to 10). Each: { price, pct }, e.g. [{ \"price\": 90000, \"pct\": 30 }, { \"price\": 95000, \"pct\": 70 }]; the pct values must not sum to more than 100." - added
Input schema / properties / exits / items / properties / price / descriptionAdded value: +"Exit price for this level" - added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_scenario_planning1 field changed- added
Input schema / properties / side / descriptionAdded value: +"Trade direction: \"long\" or \"short\""
- Changed
workflow.run_spread_payoff2 fields changed- added
Input schema / properties / legs / items / properties / optionType / descriptionAdded value: +"Option type: \"call\" or \"put\"" - added
Input schema / properties / legs / items / properties / position / descriptionAdded value: +"Option position: \"long\" (bought) or \"short\" (sold)"
- Changed
workflow.run_spread_reader1 field changed- added
Input schema / properties / quotes / items / properties / venue / descriptionAdded value: +"Prediction-market venue this quote comes from"
- Changed
workflow.run_straddle_strangle1 field changed- added
Input schema / properties / position / descriptionAdded value: +"Option position: \"long\" (bought) or \"short\" (sold)"
1 tool update
- Added
workflow.run_price_consensus
1 tool update
- Changed
workflow.run_scenario_planning1 field changed- changed
Input schema / properties / deltasPct / descriptionPrevious value: -"List of price change percentages, e.g. [-10, -5, 0, 5, 10]"New value: +"List of price change percentages, e.g. [-10, -5, 0, 5, 10]. Must be at least -100 (exactly -100 only for linear contracts; inverse contracts need more than -100)"
Related MCP Connectors
Options analytics: 17 pricing models, 17 Greeks, GEX, IV, 23 screeners, unusual, dark pool, max pain
Read-only crypto indicators, risk sizing and rule backtests. Not financial advice.
11Real-time & historical options analytics: GEX, dealer positioning, vol, VRP, 0DTE, CME futures
Crypto backtesting & Bitcoin cycle analytics. Point-in-time, DSR-corrected, look-ahead-aware.
Related MCP Servers
- AlicenseAqualityBmaintenance63 deterministic quant computation tools for autonomous financial agents. Options pricing, derivatives, risk metrics, portfolio optimization, statistics, crypto/DeFi, macro/FX, time value of money. 1,000 free calls/day, no signup required.7413MIT
- AlicenseNot gradedqualityCmaintenanceThe verifiable risk engine for autonomous agents: deterministic, self-verifying financial calculations that an agent can delegate and prove. It covers liquidation and funding, position sizing and risk of ruin, options Greeks and margin, LP divergence, treasury concentration and depeg, execution quality checks, plus intelligence on options, DeFi, prediction markets, and transaction safety analysis.4 npm2MIT
- FlicenseNot gradedqualityDmaintenanceProvides real-time options analytics, pricing with Greeks, Monte Carlo simulations, volatility analysis, strategy backtesting, and risk metrics using actual market data from Yahoo Finance and Polygon.io.1-
- AlicenseNot gradedqualityCmaintenanceDeterministic market-state engine for trading agents — zero LLM in the signal path. 8 tools: structural market state & phase, action gate (GO/WATCH/HOLD), entry/target/invalidation coordinates, bar-by-bar state timeline, composed view cards, and pre-trade intent validation. Every output traces to a bar-stamped ledger with a public daily self-scoring track record.3MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.