Skip to main content
Glama
PublicDotCom

Public.com MCP Server

Official
by PublicDotCom

Public.com MCP Server

License Python MCP

An MCP (Model Context Protocol) server that connects AI assistants to your Public.com brokerage account. Trade stocks, options, and crypto — get quotes, manage orders, and view your portfolio — all through natural language.

Disclaimer: For illustrative and informational purposes only. Not investment advice or recommendations. Use at your own risk.

Tools

Read-Only

Tool

Description

check_setup

Verify API credentials and connectivity

get_accounts

List all brokerage accounts

get_portfolio

View positions, equity, buying power (including dayTradeBuyingPower), open orders

get_orders

List active/open orders (bracket legs share a bracketId)

get_order

Status and details of a specific order, including its fills (trades with each fill's venue MIC, filledAt, replacedAt, lastModified); last 30 days

search_orders

Search order history — any status, last 30 days, up to 500 orders, filtered by status/side/symbols/type/time

get_history

Transaction history (trades, deposits, dividends, etc.)

get_quotes

Real-time quotes for stocks, crypto, options, event contracts

get_price_history

OHLCV price history for equities, crypto, options, indices, or event contracts

get_instrument

Details about a specific tradeable instrument

get_all_instruments

List all available instruments with filters

search_bonds

Filtered, paged search for fixed income instruments

get_bond_details

Pricing, ratings, coupon and maturity info for a bond

get_option_expirations

Available expiration dates for options

get_option_chain

Full option chain (calls + puts) for a symbol

get_option_greeks

Greeks (delta, gamma, theta, vega, rho, IV) for multiple options

get_option_greek

Greeks for a single option symbol

get_tax_lots

Unrealized tax-lot summary (per-lot gain/loss, term, cost basis)

get_tax_lots_for_symbol

Unrealized tax-lot detail for a single symbol

get_tax_lots_csv

Export unrealized tax lots as a Base64-encoded CSV file

get_strategy_quote

Consolidated quote for a multi-leg option strategy

get_event_categories

Event-contract (prediction market) categories, subcategories and frequency filters

get_event_summary

Browse event contracts by category / symbol / frequency / resolution time, 100 per page

get_event_details

One event's outcomes (with floorStrike), YES/NO contract prices, timeline and CFTC terms, plus per-outcome tradable / secondsLeft / winner

get_event_contract_bars

Price-history bars for up to 8 contracts of one event

get_current_event

The window of a recurring market (e.g. 15-minute KXBTC15M) trading right now; optional bounded wait

wait_for_settlement

Wait (bounded) for an event outcome to settle and report the winning contract

preflight_order

Estimate costs/impact before placing a single-leg order

preflight_multileg_order

Estimate costs for multi-leg options strategies

preflight_short_order

Estimate costs before placing a short-sale order

preflight_call_credit_spread

Estimate costs for a Bear Call Spread

preflight_call_debit_spread

Estimate costs for a Bull Call Spread

preflight_put_credit_spread

Estimate costs for a Bull Put Spread

preflight_put_debit_spread

Estimate costs for a Bear Put Spread

preflight_buy_event_contract

Estimate costs before buying an event contract (YES or NO side)

Write (Destructive)

Tool

Description

place_order

Place a single-leg order (stocks, crypto, options), including market-on-close / limit-on-close; optionally a bracket order via order_class + exit-leg prices, or target specific tax lots via tax_lot_matching_instructions

place_multileg_order

Place multi-leg orders (spreads, straddles, etc.)

place_call_credit_spread

Place a Bear Call Spread

place_call_debit_spread

Place a Bull Call Spread

place_put_credit_spread

Place a Bull Put Spread

place_put_debit_spread

Place a Bear Put Spread

place_short_order

Place an equity short-sale order

buy_event_contract

Buy an event contract (YES or NO side) with a DAY limit order, at the ask by default

flatten_and_go_short

Sell an existing long position then go short (experimental)

cancel_order

Cancel an existing order

cancel_and_replace_order

Atomically cancel and replace an order

Order types

place_order, preflight_order, cancel_and_replace_order and the short-sale tools take order_type as one of:

order_type

Price arguments

MARKET

none

LIMIT

limit_price

STOP

stop_price

STOP_LIMIT

stop_price and limit_price

MARKET_ON_CLOSE

none — executes at the closing auction

LIMIT_ON_CLOSE

limit_price — executes at the closing auction

place_order, preflight_order and the short-sale tools also reject a price argument the order type doesn't take (e.g. limit_price on MARKET_ON_CLOSE). Bracket entries are LIMIT or MARKET only, and multi-leg orders are always LIMIT.

Bracket orders

place_order places a bracket by setting order_class to BRACKET, OCO or OTO and supplying at least one exit leg:

Argument

Meaning

order_class

SIMPLE (default, standalone) or BRACKET / OCO / OTO

take_profit_limit_price

Limit price of the take-profit leg

stop_loss_stop_price

Stop price of the stop-loss leg

stop_loss_limit_price

Optional — makes the stop-loss a STOP_LIMIT rather than a STOP

The exit legs are submitted automatically when the entry order fills, and every leg of the bracket — the entry included — reports the entry's order ID as its bracketId, so get_orders groups them.

The API accepts brackets for EQUITY and OPTION only; they need a whole-share quantity (not amount), must use the CORE market session, and the entry order_type must be LIMIT or MARKET (LIMIT only for OCO). preflight_order validates the entry order only — it has no view of the exit legs.

Order history

get_orders lists only the open/active orders in the portfolio snapshot. For everything else use the order-history tools:

Tool

Returns

search_orders

Orders in any status (filled, cancelled, rejected, …) matching optional status, side, symbols ("SYMBOL" or "SYMBOL:TYPE"), security_type, open_close_indicator, created_after / created_before filters

get_order

One order by ID in the same shape

Both are limited by the API to orders created within the last 30 days, and search_orders returns at most 500 orders. Each order includes trades (the individual fills, each with the marketIdentificationCode — the ISO 10383 MIC of the execution venue, e.g. XNAS — when reported), filledAt, replacedAt, lastModified and equityMarketSession. Note that equityMarketSession uses REGULAR / REST_OF_DAY / TWENTY_FOUR_HOURS, which is not the CORE / EXTENDED / TWENTY_FOUR_HOURS vocabulary that place_order's equity_market_session argument takes.

Event contracts

Browse event contracts (prediction markets) with get_event_categories → get_event_summary (page with next_token) → get_event_details, and chart with get_event_contract_bars. Prices are dollars from 0.00 to 1.00 and equal the implied probability. EventSummary.symbols lists related instruments (e.g. BTC-CRYPTO), not the event's contracts — those come from get_event_details. Outcome ids carry no exchange prefix (e.g. KXBALANCESHEET-EO26-6.6).

Trading recurring markets

For a recurring market such as the 15-minute "Up or Down" windows:

  1. get_current_event(series="KXBTC15M") — the window open right now (series is the series ticker, shown on every get_event_summary / get_event_details result). Pass wait_seconds (≤ 120) to wait between windows.

  2. get_event_details(event_symbol) — the YES/NO contracts, their asks, and whether the outcome is tradable and how many secondsLeft.

  3. preflight_buy_event_contract → buy_event_contract(contract_symbol, quantity, limit_price) — a DAY limit buy. Omit limit_price and pass event_symbol to buy at the current ask, rounded up to a whole cent. Quantities take at most 2 decimals.

  4. wait_for_settlement(event_symbol, contract_symbol=...) — waits up to 120 s per call and reports winner and won; on timeout it returns "status": "pending", so call again.

The two halves take different identifiers, and the API rejects the wrong one:

Tools

Event identifier

Contract symbol

get_event_summary, get_event_details, get_current_event, wait_for_settlement, *buy_event_contract

eventSymbol, e.g. KALSHI.KXBALANCESHEET-EO26

e.g. KALSHI.KXBALANCESHEET-EO26-6.6.Y

get_event_contract_bars

-EVENT id, e.g. KALSHI.KXBALANCESHEET-EO26-EVENT

-EVENTCONTRACT symbol, e.g. KALSHI.KXBALANCESHEET-EO26-6.6.Y-EVENTCONTRACT

EVENTCONTRACT is also accepted as an instrument type by get_quotes, get_price_history, get_instrument, get_all_instruments and search_orders.

Related MCP server: Alpaca MCP Server

Prerequisites

Installation

pip install publicdotcom-mcp-server

Or install from source:

git clone https://github.com/publicdotcom/publicdotcom-mcp-server.git
cd publicdotcom-mcp-server
pip install .

Configuration

Set your API credentials as environment variables:

# Required
export PUBLIC_COM_SECRET=your_api_secret_key

# Optional — sets a default account so you don't need to specify it each time
export PUBLIC_COM_ACCOUNT_ID=your_account_id

Usage

Claude Desktop

Add this to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "public-com": {
      "command": "publicdotcom-mcp-server",
      "env": {
        "PUBLIC_COM_SECRET": "your_api_secret_key",
        "PUBLIC_COM_ACCOUNT_ID": "your_account_id"
      }
    }
  }
}

Claude Desktop (using uvx)

If you prefer using uvx (no pre-install needed):

{
  "mcpServers": {
    "public-com": {
      "command": "uvx",
      "args": ["publicdotcom-mcp-server"],
      "env": {
        "PUBLIC_COM_SECRET": "your_api_secret_key",
        "PUBLIC_COM_ACCOUNT_ID": "your_account_id"
      }
    }
  }
}

Running Directly

# stdio transport (default — for Claude Desktop, Claude Code, etc.)
publicdotcom-mcp-server

# Or run as a Python module
python -m publicdotcom_mcp_server

Hosted / Remote Deployment

For remote deployments (behind a reverse proxy or load balancer), switch to the streamable-HTTP transport:

export MCP_TRANSPORT=streamable-http
export PUBLIC_COM_SECRET=your_api_secret_key
export PORT=8000  # optional, defaults to 8000
export HOST=0.0.0.0  # optional, defaults to 0.0.0.0
publicdotcom-mcp-server

In this mode the server listens for MCP requests at POST /mcp. Clients authenticate per-request via an Authorization: Bearer <key> header, which takes priority over the PUBLIC_COM_SECRET environment variable — useful for multi-tenant deployments.

Testing with MCP Inspector

npx @modelcontextprotocol/inspector publicdotcom-mcp-server

Development

# Clone and install in development mode
git clone https://github.com/publicdotcom/publicdotcom-mcp-server.git
cd publicdotcom-mcp-server
pip install -e ".[dev]"

# Run tests
pytest

# Run the server locally
python -m publicdotcom_mcp_server

CI & Releases

  • CI (.github/workflows/ci.yml) runs the test suite (Python 3.10–3.13) and ruff on every push to main and every pull request.

  • Releases (.github/workflows/release.yml) run on every push to main. When the version in pyproject.toml is one that hasn't been released yet (no matching v<version> tag), the workflow builds the package, publishes to PyPI via Trusted Publishing (OIDC) — no API token is stored — and creates the corresponding GitHub Release. Merges that don't change the version are no-ops.

To cut a release: bump version in pyproject.toml in your PR and merge it to main. The release + PyPI publish + v<version> tag/GitHub Release happen automatically. One-time setup on PyPI (project → Publishing) must register a Trusted Publisher for this repo with workflow release.yml and environment pypi.

How It Works

This server wraps the publicdotcom-py Python SDK, exposing each API operation as an MCP tool. The MCP protocol allows AI clients to discover and call these tools through a standardized interface.

AI Client (Claude, etc.)
    ↕ MCP Protocol (stdio)
Public.com MCP Server
    ↕ HTTPS
Public.com Trading API

All tools include proper MCP tool annotations:

  • Read-only tools are marked with readOnlyHint: true

  • Order-placement tools are marked with readOnlyHint: false (they modify account state)

  • Order cancellation tools (cancel_order, cancel_and_replace_order) are additionally marked with destructiveHint: true

License

Apache 2.0

Available Tools

46 tools
buy_event_contractA

Buy an event contract (a YES or NO side of a prediction market) with a DAY limit order.

⚠️ This executes a real trade. Consider running preflight_buy_event_contract first. For a recurring market such as a 15-minute window, find the window with get_current_event, its contracts with get_event_details, and the result with wait_for_settlement.

Args: contract_symbol: The contract to buy, from get_event_details, e.g. "KALSHI.KXBTC15M-26OCT201200-00.Y" (".Y" = YES, ".N" = NO). Not the "-EVENTCONTRACT" symbol that get_event_contract_bars takes. quantity: Number of contracts (default "1"); at most 2 decimal places. limit_price: Most to pay per contract, in dollars with whole cents between 0.01 and 0.99 (e.g. "0.55"). If omitted, the contract's current ask is looked up via event_symbol and rounded up to a whole cent. event_symbol: The contract's eventSymbol, e.g. "KALSHI.KXBTC15M-26OCT201200". Required when limit_price is omitted. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
quantityNo1
account_idNo
limit_priceNo
event_symbolNo
contract_symbolYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

The description adds substantial context beyond annotations: it flags that a real trade executes, specifies the DAY time-in-force, and discloses the non-obvious fallback behavior (ask lookup via event_symbol, rounded up to a whole cent) when limit_price is omitted. It does not state what happens to an unfilled DAY order or warn that retrying a non-idempotent buy could double-execute, which would be valuable for a money-moving tool.

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

Conciseness4/5

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

Front-loads purpose, then the risk warning, then the workflow, then parameters — the right order for a destructive-adjacent tool. The Args block is lengthy but every line carries non-redundant constraint detail that the 0%-coverage schema lacks.

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

Completeness5/5

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

An output schema exists, so return values need no explanation; given that, the description covers the risk profile, ordering workflow, symbol provenance, and every parameter constraint. Nothing an agent needs to invoke this correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must carry all five parameters — and it does: example symbols for contract_symbol and event_symbol, quantity default and 2-decimal constraint, limit_price as dollars with whole cents bounded 0.01–0.99, the conditional requirement that event_symbol is needed when limit_price is omitted, and account_id's env-var fallback. This adds genuine meaning the bare schema cannot.

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

Purpose5/5

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

States a specific verb (Buy), resource (event contract, defined parenthetically as the YES or NO side of a prediction market), and mechanism (DAY limit order). This clearly separates it from preflight_buy_event_contract and the generic place_order siblings without the agent needing to open any schema.

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

Usage Guidelines5/5

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

Gives an explicit prerequisite ('Consider running preflight_buy_event_contract first') and a concrete end-to-end workflow for the recurring-market case, naming get_current_event, get_event_details, and wait_for_settlement in sequence. It also states the exclusion case for contract_symbol (not the '-EVENTCONTRACT' symbol used by get_event_contract_bars), so the agent knows which sibling takes which symbol form.

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

cancel_and_replace_orderA
Destructive

Atomically cancel an existing order and replace it with new parameters.

⚠️ This modifies an existing order.

Supported for equity, option, and crypto quantity orders.

Args: order_id: UUID of the existing order to cancel and replace. order_type: MARKET, LIMIT, STOP, STOP_LIMIT, MARKET_ON_CLOSE or LIMIT_ON_CLOSE for the replacement. time_in_force: DAY or GTD. Default is DAY. quantity: New quantity for the replacement order. Mutually exclusive with amount. amount: New notional dollar amount for the replacement order. Mutually exclusive with quantity. limit_price: New limit price. Required for LIMIT, STOP_LIMIT and LIMIT_ON_CLOSE replacements. stop_price: New stop price (for STOP/STOP_LIMIT orders). expiration_time: Required when time_in_force is GTD. ISO 8601 format. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
amountNo
order_idYes
quantityNo
account_idNo
order_typeYes
stop_priceNo
limit_priceNo
time_in_forceNoDAY
expiration_timeNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, openWorldHint=true, and idempotentHint=false. The description adds meaningful context beyond annotations: the operation is atomic, modifies an existing order, and is limited to specific asset types. It does not describe failure behavior or permission requirements, but the annotation coverage lowers the burden.

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

Conciseness5/5

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

The description is front-loaded with the atomic cancel-and-replace purpose and a warning that it modifies an existing order. The Args section is structured and each entry earns its place by clarifying a parameter. There is no wasted text.

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

Completeness5/5

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

The tool has an output schema, so return values need not be explained. For a nine-parameter destructive mutation, the description covers purpose, mutation warning, supported asset types, and detailed parameter semantics. Nothing essential for correct invocation is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden of explaining parameters. It documents all nine parameters, including allowed order_type values, time_in_force default, mutual exclusivity of quantity and amount, conditional requirements for limit_price and expiration_time, and the optional account_id fallback. This is a strong compensation for the schema gap.

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

Purpose5/5

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

The description states a specific verb and resource: atomically cancel an existing order and replace it with new parameters. This distinguishes it from the sibling cancel_order and place_order tools by making the combined atomic replacement explicit. An agent can identify the operation without opening the schema.

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

Usage Guidelines4/5

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

The description provides clear usage context: it modifies an existing order and is supported for equity, option, and crypto quantity orders. It does not explicitly name alternatives such as using cancel_order followed by place_order, nor does it state when not to use this tool. The context is clear but exclusions and alternatives are absent.

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

cancel_orderA
DestructiveIdempotent

Cancel an existing order.

Note: While most cancellations are processed immediately during market hours, this is not guaranteed. Use get_order to confirm cancellation.

Args: order_id: The UUID of the order to cancel. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
order_idYes
account_idNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

The description adds behavioral context beyond annotations: cancellations may not be immediate during market hours, and confirmation via get_order is recommended. This complements the destructiveHint and idempotentHint annotations.

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

Conciseness5/5

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

The description is concise with a header, a brief note, and parameter docs. No extraneous text. Front-loaded with the main purpose.

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

Completeness4/5

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

Given output schema exists (though not detailed), the description covers key behavioral aspects (non-immediate cancellation, confirmation). It might lack details on edge cases (already cancelled order), but is sufficient for a simple cancel tool.

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

Parameters4/5

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

With 0% schema description coverage, the description provides essential context: order_id is the UUID, account_id is optional if PUBLIC_COM_ACCOUNT_ID is set. This meaningfully compensates for the lack of schema descriptions.

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

Purpose5/5

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

The description clearly states 'Cancel an existing order.' This is a specific verb and resource, and it distinguishes from siblings like 'cancel_and_replace_order' by implication. The note about non-immediate cancellation adds clarity.

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

Usage Guidelines4/5

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

The description advises using get_order to confirm cancellation, providing a clear after-use action. It does not explicitly list when not to use, but the note about non-guaranteed immediate cancellation sets expectations. Sibling 'cancel_and_replace_order' exists but is not contrasted.

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

check_setupA
Read-only

Verify that the Public.com API credentials are configured correctly.

Checks the PUBLIC_COM_SECRET environment variable and attempts to authenticate. Run this first to confirm connectivity.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

The description adds value beyond annotations by detailing that it checks an environment variable and attempts authentication. Annotations already indicate readOnlyHint=true, but the description gives concrete behavioral context about what is actually verified.

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

Conciseness5/5

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

The description is just two sentences, front-loads the purpose, and contains no fluff. Every sentence is necessary and informative.

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

Completeness5/5

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

Given the tool has no parameters, has an output schema, and annotations are present, the description is complete. It explains what the tool does, what it checks, and when to use it.

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

Parameters4/5

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

The tool has no parameters, and schema description coverage is 100% (trivially). The description does not need to add parameter information, and with zero parameters a baseline of 4 is appropriate.

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

Purpose5/5

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

The description clearly states the tool verifies Public.com API credentials, checks the PUBLIC_COM_SECRET environment variable, and attempts authentication. This is a specific verb-resource pair that clearly distinguishes it from sibling tools, which focus on orders, accounts, and other operations.

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

Usage Guidelines4/5

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

The description explicitly says 'Run this first to confirm connectivity,' providing clear context for when to use the tool as a prerequisite. It does not explicitly list exclusions or alternatives, but the guidance is sufficient for a setup validation tool.

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

flatten_and_go_shortA
Destructive

Sell any existing long position in a symbol, then place a short-sale order.

⚠️ Experimental — this is a two-order workflow, not atomic. Market conditions may change between the flatten fill and the short entry. Both orders execute as real trades.

If no long position exists the flatten step is skipped and only the short order is placed.

Args: symbol: Ticker symbol (e.g. "AAPL"). short_quantity: Number of shares to short after flattening. order_type: MARKET, LIMIT, STOP, STOP_LIMIT, MARKET_ON_CLOSE or LIMIT_ON_CLOSE. Default is MARKET. The on-close types execute at the closing auction. time_in_force: DAY or GTD. Default is DAY. limit_price: Required for LIMIT, STOP_LIMIT and LIMIT_ON_CLOSE orders. stop_price: Required for STOP and STOP_LIMIT orders. expiration_time: Required when time_in_force is GTD. ISO 8601 format. equity_market_session: CORE or EXTENDED. flatten_timeout: Seconds to wait for the flatten order to fill (default 60). account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
symbolYes
account_idNo
order_typeNoMARKET
stop_priceNo
limit_priceNo
time_in_forceNoDAY
short_quantityYes
expiration_timeNo
flatten_timeoutNo
equity_market_sessionNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: it is flagged experimental, non-atomic across two real orders, subject to price movement between fill and entry, and parameterized by a flatten_timeout (default 60s) with described skip semantics. Annotations declare destructive/openWorld/non-idempotent, and the description's warning reinforces rather than contradicts them.

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

Conciseness4/5

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

Front-loads the action and the experimental/non-atomic warning before the Args block, so risk is seen first. The Args list is long but each line earns its place given 0% schema coverage; only minor trimming is possible.

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

Completeness5/5

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

For a 10-parameter destructive trading workflow, the description covers the two-order sequencing, skip behavior, timeout, order-type/price dependencies and account resolution; return values are covered by the output schema, so nothing an agent needs to invoke it safely is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries full burden and does: every one of the 10 parameters is named with meaning, enum values (MARKET, LIMIT, STOP, STOP_LIMIT, MARKET_ON_CLOSE, LIMIT_ON_CLOSE; DAY/GTD; CORE/EXTENDED), defaults, and conditional requirements (limit_price for LIMIT/STOP_LIMIT/LIMIT_ON_CLOSE, stop_price for STOP/STOP_LIMIT, expiration_time for GTD, ISO 8601 format, account_id fallback to PUBLIC_COM_ACCOUNT_ID). This is exactly what the missing schema descriptions need.

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

Purpose5/5

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

States a specific two-step verb sequence (sell existing long, then place short) on a named resource (symbol position). It is clearly distinguishable from sibling place_short_order and place_order because it names the flatten-then-short workflow explicitly.

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

Usage Guidelines4/5

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

Explains the key conditional path: if no long position exists the flatten step is skipped and only the short is placed, so the agent knows the tool is safe to call in both states. It stops short of naming place_short_order or preflight_short_order as the alternatives when a pure short entry (without flattening) is wanted.

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

get_accountsA
Read-only

List all brokerage accounts associated with the API key.

Returns account IDs and types (BROKERAGE, HIGH_YIELD, etc.).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, so description adds value by specifying the return format (account IDs and types). No contradiction, and no additional behavioral details needed.

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

Conciseness5/5

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

Two sentences, front-loaded with the main action, no wasted words. Ideal conciseness.

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

Completeness4/5

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

Given no parameters, presence of output schema, and annotations, the description covers the essential information. Could be slightly more explicit about scope (e.g., 'all accounts for API key'), but it's sufficient.

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

Parameters4/5

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

No parameters, so baseline 4 applies. The description correctly adds no parameter information beyond what schema provides.

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

Purpose5/5

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

The description clearly states the action (list) and resource (brokerage accounts), and mentions the return value (account IDs and types). This distinguishes it from sibling tools like get_portfolio or get_orders.

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

Usage Guidelines3/5

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

No explicit when-to-use or when-not-to-use guidance. However, the purpose is clear and context implies it's for enumerating accounts, which is adequate for a simple list tool.

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

get_all_instrumentsA
Read-only

List all available tradeable instruments with optional filters.

Args: type_filter: Filter by instrument types (e.g. ["EQUITY", "CRYPTO"]). Valid: EQUITY, CRYPTO, OPTION, ALT, BOND, INDEX, TREASURY, EVENTCONTRACT. trading_filter: Filter by trading status (e.g. ["BUY_AND_SELL"]). Valid: BUY_AND_SELL, LIQUIDATION_ONLY, DISABLED. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
account_idNo
type_filterNo
trading_filterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, covering the safety profile. The description adds valid filter values and the account_id environment fallback, but does not disclose pagination, rate limits, or default result size beyond what annotations imply.

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

Conciseness5/5

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

Front-loaded purpose sentence followed by a concise Args block that lists only necessary parameter details. No filler or repetition; the structure is appropriate for a tool with three undocumented parameters.

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

Completeness4/5

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

Given the list/filter complexity and empty schema descriptions, the description covers purpose and all parameters adequately. It omits default behavior when filters are absent (return all instruments) and any pagination details, but the output schema presumably documents the return shape.

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

Parameters5/5

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

Schema coverage is 0%, so the description must document all three parameters, and it does: type_filter and trading_filter include exhaustive valid value lists, and account_id explains its optionality and env fallback. This fully compensates for the empty schema descriptions.

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

Purpose4/5

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

Clearly states the verb 'List' and resource 'all available tradeable instruments', and the scope 'with optional filters'. It implicitly distinguishes from the singular sibling get_instrument by emphasizing 'all', though it does not name the alternative explicitly.

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

Usage Guidelines3/5

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

Provides valid filter values and notes that account_id is optional if PUBLIC_COM_ACCOUNT_ID is set, which is useful setup context. However, it does not say when to choose this tool over get_instrument or how it relates to other listing/search tools, so guidance is incomplete.

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

get_bond_detailsA
Read-only

Get comprehensive details for a single bond.

Returns pricing, ratings, coupon schedule, maturity, and call information for the bond identified by its symbol.

Args: symbol: Bond symbol, typically CUSIP-BOND format (e.g. "912810TM0-BOND"). account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
symbolYes
account_idNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

The annotations already establish read-only behavior via readOnlyHint=true and destructiveHint=false. The description adds behavioral detail by specifying the content domains (pricing, ratings, coupon schedule, maturity, call information) and the symbol format requirement. It does not contradict the annotations and provides context beyond what annotations convey, though it omits edge-case behavior like not-found handling.

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

Conciseness5/5

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

The description is compact and well-structured: a two-sentence overview followed by an Args section. It is front-loaded with purpose and return categories, contains no filler, and every sentence contributes to understanding the tool.

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

Completeness5/5

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

Given only two parameters (one required), a read-only annotation, and an output schema, this description is fully adequate. It explains both parameters, lists the return categories, and fits within the broader tool context. No critical information is missing.

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

Parameters5/5

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

The input schema has zero descriptions (0% coverage), so the description carries the full burden. It explains symbol format with a concrete example ('912810TM0-BOND') and clarifies that account_id is optional if PUBLIC_COM_ACCOUNT_ID is set. This turns otherwise opaque schema properties into actionable parameter guidance.

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

Purpose5/5

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

The description clearly states the verb and resource: 'Get comprehensive details for a single bond.' It also enumerates the specific types of information returned (pricing, ratings, coupon schedule, maturity, call info), which distinguishes it from sibling tools like search_bonds or get_instrument. The scope ('single bond') and identification method ('by its symbol') are explicit.

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

Usage Guidelines4/5

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

The usage context is clear: this tool is for when you already have a bond symbol and need comprehensive details. It mentions the optional account_id and the environment variable fallback, which is practical guidance. However, it does not explicitly name alternative tools or state when not to use this tool, so it stops short of a full 5.

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

get_current_eventA
Read-only

Find the event of a recurring market that is trading right now.

For a 15-minute "Up or Down" series such as "KXBTC15M" this is the current window: the open event of the series that closes soonest. Windows whose resolution time has passed are skipped, even though the API keeps listing them as unresolved for a few minutes after they close. Pass the returned eventSymbol to get_event_details for the YES/NO contracts and their asks, then preflight_buy_event_contract to price a buy.

Args: series: Series ticker, e.g. "KXBTC15M" — the series field of get_event_summary / get_event_details results. frequency: How often the series recurs. Default FIFTEEN_MINUTES; e.g. ONE_HOUR for hourly series. category: Only search this category (from get_event_categories), e.g. "Crypto". Narrowing the search makes it faster. subcategory: Only search this subcategory, e.g. "BTC". wait_seconds: If no event is open yet, keep checking for up to this many seconds (0 to 120; default 0 = check once). Between windows, the next one is typically listed a minute or two after the previous one closes.

NameRequiredDescriptionDefault
seriesYes
categoryNo
frequencyNoFIFTEEN_MINUTES
subcategoryNo
wait_secondsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations establish readOnly/destructive/openWorld, but the description adds non-obvious behavior the annotations cannot: windows whose resolution time has passed are skipped even though the API still lists them as unresolved, and the next window typically appears a minute or two after the prior close. This prevents an agent from grabbing a stale event.

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

Conciseness4/5

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

Purpose and the stale-window caveat are front-loaded, followed by the chaining guidance and a conventional Args block. It runs slightly long and the Args section restates parameter names, but each entry adds semantics absent from the schema, so the length is earned.

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

Completeness5/5

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

An output schema exists, so return-value documentation isn't required, yet the description still names the key output field (eventSymbol) and how to consume it. Combined with the empty schema coverage and the wait/retry semantics, an agent has everything needed to call this correctly.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does: series is tied to the `series` field of get_event_summary/get_event_details, category relates to get_event_categories with a performance hint, frequency's default and use case are explained, and wait_seconds' range (0–120) and default (0 = check once) are spelled out. Every parameter gains meaning beyond the bare schema.

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

Purpose5/5

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

Opens with a specific verb and resource: 'Find the event of a recurring market that is trading right now,' then pins down the exact semantics ('the open event of the series that closes soonest'). This clearly distinguishes it from siblings like get_event_summary, get_event_details, and get_event_categories without requiring schema inspection.

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

Usage Guidelines5/5

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

Explicitly routes the agent through the downstream workflow: pass eventSymbol to get_event_details for contracts and asks, then preflight_buy_event_contract to price a buy. It also states the between-windows condition and how to handle it via wait_seconds, covering the main ambiguity an agent would face.

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

get_event_categoriesA
Read-only

List the categories for browsing event contracts (prediction markets).

Each category carries its subcategories and the frequency filters it supports. Pass a returned category (and optionally subcategory) to get_event_summary to browse the events in it.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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 profile is covered. The description adds real value beyond them by describing the shape of each returned item (subcategories and supported frequency filters) and the intended downstream call, which tells the agent how the result plugs into the workflow.

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

Conciseness5/5

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

Three short sentences with zero padding; the core purpose is front-loaded and the follow-up action is stated last. Every sentence carries information.

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

Completeness5/5

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

For a zero-argument enumeration tool with an output schema present and annotations covering safety, the description supplies everything needed: what it returns, that it is safe/read-only, and where to go next. No material gap remains.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. The description's only parameter-relevant content is describing how values returned here feed get_event_summary's `category`/`subcategory` inputs, which is contextual rather than a gap.

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

Purpose5/5

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

States a specific verb and resource ('List the categories for browsing event contracts'), scopes it to prediction markets, and implicitly separates it from get_event_summary, which handles the events themselves. An agent can tell immediately this is the enumeration/entry-point call.

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

Usage Guidelines4/5

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

Explicitly routes the agent forward: 'Pass a returned `category` (and optionally `subcategory`) to get_event_summary'. That is clear next-step guidance. It does not state when not to use this tool or any prerequisites (e.g. needing setup/auth first), 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.

get_event_contract_barsA
Read-only

Get price-history bars for up to 8 event contracts of one event.

Prices and OHLC values are in dollars (0.00 to 1.00) for the side the symbol names — a ".N" symbol carries the NO prices — and equal the implied probability (multiply by 100 for cents / percent). Bars start at the first period with a price, so charts in one response can start at different timestamps: align them by timestamp, not by index. A symbol is left out of the response when it is unknown or has no price in the period.

This endpoint takes the charting identifiers, not the discovery ones that get_event_summary / get_event_details use.

Args: event_id: The "-EVENT" grouping id the contracts belong to, e.g. "KALSHI.KXBALANCESHEET-EO26-EVENT". The API rejects an id that is not an -EVENT id. period: DAY, WEEK, MONTH, or ALL. Measured back from now, or from the event's close time once it has stopped trading. symbols: 1 to 8 "-EVENTCONTRACT" symbols of that event, e.g. ["KALSHI.KXBALANCESHEET-EO26-6.6.Y-EVENTCONTRACT"].

NameRequiredDescriptionDefault
periodYes
symbolsYes
event_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Adds substantial behavior beyond the readOnlyHint/destructiveHint=false annotations: prices are dollars 0.00-1.00 equal to implied probability, '.N' symbols carry NO prices, bars start at the first priced period so multiple series can start at different timestamps and must be aligned by timestamp not index, and unknown/unpriced symbols are silently dropped. These are exactly the caveats an agent needs to interpret the response.

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

Conciseness4/5

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

Front-loads the highest-value semantics (price units and probability interpretation) before the argument details. Dense but purposeful; only the chart-alignment aside is slightly tangential, so it falls just short of perfectly tight.

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

Completeness5/5

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

With 3 required parameters, 0% schema coverage, and an output schema already present, the description supplies everything else an agent needs: parameter meaning, identifier routing, unit conventions, and dropped-symbol behavior. Return-value explanation is correctly left to the output schema.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does so: event_id format and server-side validation, period's enum meaning including the 'measured back from now or from event close once trading stopped' nuance, and symbols' count range with a concrete example. Every parameter is meaningfully documented beyond the bare schema types.

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

Purpose5/5

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

Opens with a specific verb and resource: 'Get price-history bars for up to 8 event contracts of one event.' It explicitly separates itself from siblings by noting it takes charting identifiers rather than the discovery identifiers used by get_event_summary / get_event_details. An agent can tell what this returns and how it differs from the discovery 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.

Usage Guidelines4/5

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

Gives clear context on which identifiers to pass and warns that the API rejects non '-EVENT' ids, plus the 1-8 symbol bound. It does not explicitly contrast with the sibling get_price_history or state a when-not-to-use condition, but the identifier routing is a solid usage signal.

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

get_event_detailsA
Read-only

Get full details for one event contract (prediction-market event).

Returns the event's outcomes (each with its floorStrike when it has one), the YES/NO contracts for each outcome with current pricing (bid, ask, last, probability, open interest, daily gain), the trading timeline (open, close, expected expiration, settlement), and the CFTC contract terms. Prices are in dollars between 0.00 and 1.00 and equal the implied probability. Outcome ids carry no exchange prefix (e.g. "KXBALANCESHEET-EO26-6.6"); contract symbols do.

Each outcome also carries shortcuts derived by the SDK: tradable (open, in BUY_AND_SELL mode and before its close time — state alone can still read STATE_OPEN after close), secondsLeft until close, and once settled YES or NO, winner (the contract symbol that paid out). The event carries series, its series ticker.

Args: event_symbol: The eventSymbol from get_event_summary, e.g. "KALSHI.KXBALANCESHEET-EO26". Not the "-EVENT" id that get_event_contract_bars takes. An unknown eventSymbol returns an error with code 7004. include_all_outcomes: True (default) returns every outcome; False returns a short list of up to 8. outcomeCount always reports the full total.

NameRequiredDescriptionDefault
event_symbolYes
include_all_outcomesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover read-only/non-destructive, but the description adds substantial context beyond them: prices are dollars 0.00–1.00 equal to implied probability, outcome ids lack exchange prefixes while contract symbols carry them, and unknown eventSymbols return error code 7004. It also discloses SDK-derived fields (tradable, secondsLeft, winner) and the subtlety that raw state can still read STATE_OPEN after close — behavior an agent could not infer from the schema.

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

Conciseness4/5

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

Purpose and the highest-value caveat (which symbol id to pass) are front-loaded, and the Args block is clean. However, a large share of the text enumerates return payload fields even though an output schema exists, which is work the structured data already does; trimming that would sharpen the definition without losing routing information.

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

Completeness5/5

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

An output schema exists, so return values need not be restated; combined with the read-only annotations, the description still supplies the semantic layer (pricing units, id formats, error code, truncation behavior) an agent needs to call this correctly. Nothing material is missing for a two-parameter read tool.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must carry the burden and it does: event_symbol is documented by source (get_event_summary), example format, anti-pattern (not the '-EVENT' id), and failure mode (error 7004). include_all_outcomes is documented with its default (True), the behavior when False (short list of up to 8), and the invariant that outcomeCount always reports the full total.

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

Purpose5/5

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

States a specific verb and resource ('Get full details for one event contract'), with the parenthetical clarifying what a prediction-market event is. It is clearly distinguishable from siblings: it names get_event_summary as the source of the symbol and get_event_contract_bars as the tool that takes a different id, so an agent can route 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.

Usage Guidelines4/5

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

Routing is effectively spelled out through the argument guidance — call get_event_summary first, take its eventSymbol, and do not reuse the '-EVENT' id consumed by get_event_contract_bars. It also explains when to set include_all_outcomes to false. It stops short of an explicit 'use this instead of get_event_summary when…' statement, so it is not a full 5.

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

get_event_summaryA
Read-only

Browse event contracts (prediction-market events), one page at a time.

Returns up to 100 events per page, each with its eventSymbol, title, volume, resolution time, resolved/halted flags, category, related instrument symbols (e.g. BTC-CRYPTO; often empty — these are NOT the event's contracts), and series, the series ticker of a recurring market (e.g. "KXBTC15M"; derived from the eventSymbol, pass it to get_current_event). Pass an eventSymbol to get_event_details for its outcomes, YES/NO contracts and pricing. Results can include resolved and halted events. When the response carries a nextToken, call again with the same arguments plus that next_token to fetch the next page; it is absent on the last page.

eventSymbol (e.g. "KALSHI.KXBALANCESHEET-EO26") is the discovery identifier. It is NOT the "-EVENT" id that get_event_contract_bars takes.

Args: sorting_mode: VOLUME (default), EXPIRATION, or RECENTLY_ADDED. category: Only events in this category (from get_event_categories). subcategory: Only events in this subcategory. event_symbols: Only these events, by eventSymbol. frequencies: Only events recurring at these frequencies. Any of ALL, ONCE, FIFTEEN_MINUTES, ONE_HOUR, ONE_DAY, ONE_WEEK, ONE_MONTH, ONE_YEAR. resolution_time_start: Only events resolving at or after this ISO 8601 timestamp (e.g. 2026-12-31T00:00:00Z). resolution_time_end: Only events resolving at or before this ISO 8601 timestamp. display_resolved_events: Include (true) or exclude (false) resolved events. Omit for the API default. created_within_days: Only events created within the last N days. next_token: The nextToken from the previous page, to fetch the next one.

NameRequiredDescriptionDefault
categoryNo
next_tokenNo
frequenciesNo
subcategoryNo
sorting_modeNoVOLUME
event_symbolsNo
created_within_daysNo
resolution_time_endNo
resolution_time_startNo
display_resolved_eventsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, yet the description adds real behavioral value: 100-item page cap, resolved and halted events being included, the warning that related instrument symbols are often empty and are NOT the event's contracts, and how `series` is derived. The one omission is that it doesn't note whether display_resolved_events interacts with the resolved-events-included note, but overall this is well beyond the annotation bar.

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

Conciseness4/5

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

Front-loaded with purpose and return shape, then pitfalls, then a clean Args block; nearly every line earns its place. Slightly verbose where it restates the eventSymbol identifier warning across multiple sentences, but the redundancy is mild and useful given zero schema descriptions.

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

Completeness5/5

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

For a 10-parameter, paginated discovery tool this covers what an agent needs: what a page contains, how to continue, what the identifiers mean, and which siblings to call next. An output schema exists, so explaining return values in depth isn't required — the description supplies the identifier caveats instead, which is the right thing for it to spend words on.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden — and it does, documenting all ten parameters including acceptable frequency values, ISO 8601 format for the resolution windows, the source of category (get_event_categories), and the pagination contract for next_token.

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

Purpose5/5

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

Opens with a specific verb and resource: "Browse event contracts (prediction-market events), one page at a time." It further disambiguates the identifier space (eventSymbol vs the "-EVENT" id used by get_event_contract_bars) and routes to get_event_details and get_current_event, so an agent can tell it apart from siblings 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.

Usage Guidelines5/5

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

Gives explicit downstream routing ("Pass an eventSymbol to get_event_details for its outcomes, YES/NO contracts and pricing") and complete pagination instructions (call again with the same arguments plus next_token; token absent on the last page). Defaults and enumerated values for sorting_mode and frequencies are stated as well, leaving nothing to inference.

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

get_historyA
Read-only

Retrieve account transaction history.

Returns trades, money movements (deposits, withdrawals, dividends), and position adjustments (splits, mergers).

Args: account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set. start: Start timestamp in ISO 8601 format (e.g. 2025-01-15T09:00:00-05:00). end: End timestamp in ISO 8601 format. page_size: Max number of records to return. next_token: Pagination token for the next page.

NameRequiredDescriptionDefault
endNo
startNo
page_sizeNo
account_idNo
next_tokenNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds value by specifying the types of data returned (trades, money movements, adjustments) and pagination behavior, which goes 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.

Conciseness5/5

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

The description is concise, with a brief introductory sentence, a list of return types, and then parameter documentation in a clean Args block. No unnecessary information, and the most important details are front-loaded.

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

Completeness4/5

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

The description covers the core functionality, return types, and parameter semantics. However, it lacks behavioral details like default date ranges, default page_size, and behavior when parameters are omitted. Output schema exists, which supplements completeness.

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

Parameters5/5

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

With schema description coverage at 0%, the description fully explains each parameter: account_id (optional with env var fallback), start/end (ISO 8601 format), page_size (max records), next_token (pagination). This is excellent for agent understanding.

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

Purpose5/5

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

The description clearly states the tool retrieves account transaction history and lists the types of transactions included (trades, money movements, adjustments). This distinguishes it from sibling tools like get_orders and get_portfolio.

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

Usage Guidelines3/5

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

The description does not explicitly state when to use this tool instead of alternatives, such as get_orders for orders or get_portfolio for positions. The usage is implied by the purpose, but no direct guidance is provided.

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

get_instrumentA
Read-only

Get details about a specific tradeable instrument.

Returns trading status, fractional trading availability, and option trading capabilities.

Args: symbol: Ticker symbol (e.g. "AAPL"). instrument_type: One of EQUITY, CRYPTO, OPTION, INDEX, ALT, BOND, TREASURY, EVENTCONTRACT. Default is EQUITY.

NameRequiredDescriptionDefault
symbolYes
instrument_typeNoEQUITY

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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 reach profile is covered. The description adds the return content (trading status, fractional trading, option capability), but since an output schema exists this is largely redundant rather than genuinely new 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.

Conciseness4/5

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

Purpose and return contents are front-loaded in two sentences, then parameters follow in a clean Args block. Slightly longer than strictly necessary given the output schema, but every line carries usable information.

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

Completeness5/5

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

For a two-parameter read tool, nothing material is missing: both parameters are documented including the enum the schema omits, the return fields are previewed, and safety semantics come from annotations plus the output schema.

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

Parameters5/5

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

Schema description coverage is 0% and the schema declares no enum, so the description carries the full parameter burden — and does so: it gives the symbol format with an example and spells out all eight valid instrument_type values plus the EQUITY default. Without this text the agent could not supply instrument_type correctly.

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

Purpose5/5

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

States a specific verb+resource ('Get details about a specific tradeable instrument') and immediately enumerates what those details are. The singular 'a specific' implicitly contrasts with the sibling get_all_instruments, letting an agent route correctly without opening either schema.

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

Usage Guidelines3/5

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

Usage is implied by 'a specific instrument', but there is no explicit when-to-use, no prerequisites, and no mention of alternatives such as get_all_instruments or get_option_chain. An agent can infer intent but must guess at the boundaries.

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

get_option_chainA
Read-only

Get the full option chain (calls and puts) for a symbol and expiration.

Args: symbol: Underlying ticker symbol (e.g. "AAPL"). expiration_date: Expiration date in YYYY-MM-DD format. instrument_type: EQUITY or UNDERLYING_SECURITY_FOR_INDEX_OPTION. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
symbolYes
account_idNo
expiration_dateYes
instrument_typeNoEQUITY

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true. The description adds that it returns calls and puts but does not elaborate on error handling, authentication needs, or response structure. Adequate but not enhanced.

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

Conciseness5/5

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

Description is concise with a front-loaded purpose and a well-structured argument list. No unnecessary words.

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

Completeness4/5

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

Given the presence of an output schema covering return values, the description is nearly complete. It explains parameters well but could mention that account_id may be required despite being optional. Still, it is sufficient for most use cases.

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

Parameters5/5

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

Despite 0% schema description coverage, the tool description provides clear explanations for all parameters, including format, default, and optionality, compensating fully for the schema's lack of descriptions.

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

Purpose5/5

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

Clearly states the tool gets the full option chain (calls and puts) for a symbol and expiration. Differentiates from siblings like get_option_expirations and get_option_greek by specifying 'full option chain'.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool vs. siblings such as get_option_expirations or get_option_greek. The description lacks context on prerequisites or alternatives.

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

get_option_expirationsA
Read-only

Get available option expiration dates for a symbol.

Args: symbol: Underlying ticker symbol (e.g. "AAPL"). instrument_type: EQUITY or UNDERLYING_SECURITY_FOR_INDEX_OPTION. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
symbolYes
account_idNo
instrument_typeNoEQUITY

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds value by noting that account_id is optional if PUBLIC_COM_ACCOUNT_ID is set, revealing an authentication behavior. However, no further behavioral details are given beyond the annotations.

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

Conciseness4/5

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

The description is concise with a clear front-loaded purpose and parameter explanations in a structured list. Every sentence adds value, though it could be slightly more streamlined.

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

Completeness5/5

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

Given the presence of an output schema, the description does not need to explain return values. It covers the tool's purpose, all parameters with context, and an authentication nuance. The tool is simple and the description is complete for effective use.

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

Parameters4/5

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

Although schema coverage is 0%, the description adds meaning to parameters: symbol is an underlying ticker, instrument_type has two specific values (EQUITY or UNDERLYING_SECURITY_FOR_INDEX_OPTION), and account_id is optional under a specific condition. This provides clarity beyond the schema's type definitions.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Get available option expiration dates for a symbol.' This specific verb and resource distinguish it from siblings like get_option_chain or get_option_greek, which serve different purposes.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives. The description does not mention when not to use it or provide context for tool selection among siblings like get_option_chain.

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

get_option_greekA
Read-only

Get option Greeks (delta, gamma, theta, vega, rho, IV) for a single option symbol.

Args: osi_symbol: OSI-normalized option symbol (e.g. "AAPL260320C00280000"). account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
account_idNo
osi_symbolYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description doesn't need to repeat safety. It adds minimal behavioral context beyond purpose, such as mentioning the specific Greeks returned. No contradictions, and the presence of an output schema reduces the need to describe return values, but no additional traits (e.g., rate limits, caching) are disclosed.

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

Conciseness5/5

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

The description is extremely concise: two sentences and a parameter list. Every sentence adds value, with no redundancy or fluff. It is front-loaded with the main action and then details the parameters.

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

Completeness5/5

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

Given the simple nature of the tool (get greeks for one symbol), the presence of an output schema (reducing need to describe returns), and good parameter coverage, the description is complete. It covers all necessary input details for an agent to invoke the tool correctly.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate. It does so effectively by explaining 'osi_symbol' as an OSI-normalized option symbol with an example ('AAPL260320C00280000') and clarifying that 'account_id' is optional if the environment variable is set. This adds significant meaning beyond the schema's type-only definitions.

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

Purpose5/5

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

The description clearly states the tool retrieves option Greeks (delta, gamma, theta, vega, rho, IV) for a single option symbol. It distinguishes itself from sibling tools like 'get_option_greeks' (likely bulk) and 'get_option_chain' (full chain) by specifying 'single option symbol' and listing specific Greeks.

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

Usage Guidelines4/5

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

The description provides explicit parameter guidance: 'osi_symbol' is required and shown with an example, 'account_id' is optional if PUBLIC_COM_ACCOUNT_ID is set. This indicates when to use the tool (when you have a single OSI symbol). It does not explicitly state when not to use or mention alternatives, but the sibling context makes it clear.

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

get_option_greeksB
Read-only

Get option Greeks (delta, gamma, theta, vega, rho, IV) for option symbols.

Args: osi_symbols: List of OSI-normalized option symbols (e.g. ["AAPL260320C00280000"]). account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
account_idNo
osi_symbolsYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description does not need to repeat safety traits. It adds no behavioral details beyond stating that it retrieves Greeks, which is consistent with the annotations. No contradictions.

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

Conciseness4/5

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

The description is concise with a one-line purpose statement followed by a structured Args section. It is front-loaded with the main action. Every sentence provides useful information, though the Args formatting is slightly more verbose than necessary.

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

Completeness3/5

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

Given the tool has an output schema (not shown), the description need not detail return values. It covers input parameters adequately but omits information about error handling, rate limits, or behavior for invalid symbols. The description is adequate for a simple 2-parameter tool but not fully complete.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It provides a meaningful explanation of 'osi_symbols' with an example format ('OSI-normalized option symbols') and clarifies that 'account_id' is optional if the environment variable is set. This adds significant value over the bare schema.

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

Purpose4/5

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

The description clearly states the tool returns option Greeks (delta, gamma, theta, vega, rho, IV) for option symbols. It uses specific verb 'Get' and resource 'option Greeks.' However, it does not explicitly differentiate from its sibling 'get_option_greek' (singular), though the plural name and array parameter imply batch usage.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives, such as the singular 'get_option_greek' or other option-related tools. There is no discussion of prerequisites, scenarios, or exclusions.

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

get_orderA
Read-only

Get the status and details of a specific order, including its fills.

Returns the order with trades (each fill's tradeId, quantity, price, side, timestamp and, when reported, marketIdentificationCode — the ISO 10383 MIC of the execution venue, e.g. XNAS), filledAt, replacedAt, lastModified and equityMarketSession. equityMarketSession reports the session as REGULAR, REST_OF_DAY or TWENTY_FOUR_HOURS.

Only orders created within the last 30 days can be looked up; older orders return a not-found error. Order placement is asynchronous, so this may also return an error for an order that was just placed and has not yet been indexed.

An order that belongs to a bracket carries a bracketId — the order ID of the bracket's entry order. Pass that ID to get_orders to find the sibling legs.

Args: order_id: The UUID of the order to look up. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
order_idYes
account_idNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already flag readOnly/openWorld/non-destructive, and the description adds real behavioral context beyond them: the 30-day retention window with a not-found error, the async indexing failure mode, and the exact response shape including equityMarketSession enum values and MIC semantics.

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

Conciseness4/5

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

Front-loaded with the core purpose and well organized in short paragraphs, but the detailed enumeration of return fields (tradeId, quantity, price, side, timestamp, MIC explanation) partly duplicates the output schema and lengthens the definition.

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

Completeness5/5

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

Given two params, an output schema, and read-only annotations, everything an agent needs is present: lookup limits, error conditions, bracket handling, and optional-account behavior. No material gaps.

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

Parameters4/5

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

Schema coverage is 0%, so the Args section carries the burden: order_id is documented as a UUID and account_id as optional when PUBLIC_COM_ACCOUNT_ID is set. That resolves the key ambiguity (when account_id can be omitted), though identifier format/validation detail is modest.

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

Purpose5/5

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

States a specific verb and resource (get status/details of a specific order, including fills) and implicitly distinguishes itself from the plural get_orders / search_orders siblings by emphasizing one order via its UUID. The bracketId note further clarifies the single-order scope.

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

Usage Guidelines4/5

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

Gives concrete usage context: only orders from the last 30 days are retrievable, and just-placed orders may not yet be indexed due to async placement. It also routes the agent to get_orders for bracket sibling legs. No explicit exclusion versus search_orders, so not a 5.

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

get_ordersA
Read-only

Get all open/active orders on the account.

Fetches the account portfolio and returns only the orders list. Returns order details including symbol, side, type, status, quantity, and prices.

Orders that belong to a bracket carry a bracketId — the order ID of the bracket's entry order — which groups the entry and its exit legs together.

Args: account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
account_idNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=true), so the bar is lower. The description still adds real behavioral context: the underlying portfolio fetch happens but only the orders list is returned, and bracket orders carry a bracketId linking entry and exit legs. Pagination and result limits remain unstated.

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

Conciseness4/5

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

Front-loaded with the primary action, then outcomes, then a genuinely useful bracketId note, then the arg. The bracket explanation is a bit long for one field, but every sentence carries information.

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

Completeness4/5

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

Covers the single optional parameter, the filtering scope, and the key return-shape nuance (bracketId grouping). An output schema exists, so the extra field enumeration is bonus rather than required; the only gap is pagination/ordering behavior.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does: it explains that account_id is optional when the PUBLIC_COM_ACCOUNT_ID environment/config value is present, which the schema (bare 'Account Id', default null) does not convey.

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

Purpose4/5

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

Specific verb ('Get') plus resource ('open/active orders on the account') and it states the scope is the full account portfolio. It does not explicitly differentiate from the singular sibling 'get_order', so an agent must infer the distinction from the plural naming.

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

Usage Guidelines3/5

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

'Get all open/active orders' implies the collection-level use case versus the singular 'get_order', and 'Optional if PUBLIC_COM_ACCOUNT_ID is set' implies the config prerequisite. However, no explicit when-to-use/when-not-to-use statement or named alternative is given.

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

get_portfolioA
Read-only

Get a snapshot of the account portfolio.

Returns positions, equity breakdown, buying power, open orders, and cash/withdrawal figures (including cash, totalAccountValue, and availableToWithdraw). Only non-IRA accounts are supported.

buyingPower includes dayTradeBuyingPower, the buying power available for day trading. It equals buyingPower when the account is not enabled for day-trade buying power, and is omitted when the API does not report it.

Args: account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
account_idNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds value beyond that by disclosing the non-IRA account restriction and explaining how dayTradeBuyingPower behaves (equals buyingPower when not enabled, omitted when unreported).

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

Conciseness4/5

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

The purpose and return contents are front-loaded, and the account-type restriction appears early. The paragraph on dayTradeBuyingPower is slightly deep for a tool description, but it is scoped and relevant to interpreting the output.

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

Completeness5/5

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

Given an output schema already exists, the description needn't explain return formatting. It covers the key restriction, the optional-parameter fallback, and the one non-obvious field behavior, leaving no material gap for an agent to call it correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate, and it does: it labels account_id as an Account ID and explains that it is optional when PUBLIC_COM_ACCOUNT_ID is set. That resolves the practical ambiguity of a nullable, non-required parameter.

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

Purpose5/5

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

The description gives a specific verb and resource ('Get a snapshot of the account portfolio') and enumerates the contents (positions, equity breakdown, buying power, open orders, cash figures). This makes it clearly distinguishable from siblings such as get_accounts or get_orders, which do not return a consolidated snapshot.

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

Usage Guidelines4/5

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

It states an important gating constraint ('Only non-IRA accounts are supported') and explains the optional-account_id fallback via PUBLIC_COM_ACCOUNT_ID. It does not explicitly route the agent away from alternatives, but the context is clear enough for correct selection.

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

get_price_historyA
Read-only

Get historical OHLCV price bars for a symbol over a time period.

Returns open/high/low/close/volume bars split into pre-market, regular, and after-hours sessions, plus previous close and total gain/loss. Use this for trend analysis and historical prices — get_quotes returns the current price only, and get_history is account activity, not prices.

Args: symbol: Ticker symbol (e.g. "AAPL"). period: Time window to retrieve (e.g. "YEAR", "TEN_YEARS", "ALL"). instrument_type: EQUITY, CRYPTO, OPTION, INDEX, or EVENTCONTRACT. Default EQUITY. To chart several contracts of one event side by side, get_event_contract_bars is usually the better fit. aggregation: Optional bar size. Prefer omitting it — the server then picks an appropriate size for the period. Only a subset of sizes is valid per period (finer/coarser sizes are rejected); if you set an invalid one, the error lists the valid options. purchase_date: Required only when period is "SINCE_PURCHASE". Format "YYYY-MM-DD". trading_session_toggle: Which sessions to include on the DAY equity chart. Omit for the default (REGULAR_AND_EXTENDED_HOURS, 04:00–20:00 ET). REGULAR_HOURS limits to 09:30–16:00. ALL_SESSIONS returns a full midnight-to-midnight chart including the overnight ATS sessions, adding preMarketOvernight (00:00–04:00) and postMarketOvernight (20:00–24:00) to the response. ipo_date: Optional IPO / first-trade date of the asset. Format "YYYY-MM-DD". When the asset is younger than the requested period, the server fetches a finer aggregation over the available post-IPO history (so the chart isn't a straight diagonal) and adds a leadingFill object to the response describing the flat lead-in to draw for the pre-IPO portion (startTimestamp, endTimestamp, value, count, includedInTotalExpectedBars). Omit for unchanged behavior. Ignored for the DAY chart; leadingFill is also never emitted for the ALL / SINCE_PURCHASE periods.

NameRequiredDescriptionDefault
periodYes
symbolYes
ipo_dateNo
aggregationNo
purchase_dateNo
instrument_typeNoEQUITY
trading_session_toggleNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare read-only/no-destructive, so the bar is lower, yet the description adds substantial behavioral context beyond them: the response structure (bars split into pre-market/regular/after-hours, previous close, total gain/loss), aggregation rejection behavior that lists valid options on error, the leadingFill object semantics, and the DAY-chart session toggle boundaries. This is rich disclosure not captured by structured fields.

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

Conciseness4/5

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

Purpose and routing are front-loaded before the Args block, and each parameter entry earns its place given 7 params and 0% schema coverage. It is long, but the length is largely warranted by the complexity; a few sentences (e.g. the full leadingFill key list) could be trimmed.

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

Completeness5/5

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

For a 7-parameter tool with 0% schema coverage but an existing output schema, the description covers every parameter, the routing decision, and the non-obvious server-side behaviors. 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.

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does: it documents every parameter's meaning, formats (symbol, date 'YYYY-MM-DD'), defaults, conditional requirements (purchase_date only for SINCE_PURCHASE), and non-obvious edge behavior (invalid aggregation error, ipo_date fetch strategy, trading_session_toggle session windows).

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

Purpose5/5

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

States a specific verb+resource+scope: 'Get historical OHLCV price bars for a symbol over a time period.' It explicitly distinguishes itself from get_quotes ('current price only') and get_history ('account activity, not prices'), so an agent can route correctly without opening any schema.

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

Usage Guidelines5/5

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

Explicitly gives when-to-use ('trend analysis and historical prices') and names two sibling tools to avoid, plus a third alternative for a sub-case ('to chart several contracts of one event side by side, get_event_contract_bars is usually the better fit'). This is exactly the when/when-not/alternatives pattern.

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

get_quotesA
Read-only

Get real-time quotes for one or more symbols.

Returns last price, bid, ask, volume, and other market data.

Args: symbols: List of ticker symbols (e.g. ["AAPL", "GOOGL"]). instrument_type: Type for all symbols. One of EQUITY, CRYPTO, OPTION, INDEX, ALT, BOND, TREASURY, EVENTCONTRACT. Default is EQUITY. For mixed types, call this tool multiple times. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
symbolsYes
account_idNo
instrument_typeNoEQUITY

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context (env-var fallback for account_id, and the multi-call pattern for mixed types) but says nothing about rate limits, staleness, or failure behavior for a real-time quote source.

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

Conciseness4/5

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

Front-loaded with the purpose and return fields, then an Args block. The Args block largely mirrors the schema, but with 0% coverage that repetition is justified rather than wasteful.

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

Completeness5/5

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

An output schema exists, so return values need not be detailed further, and the description already compensates for the zero schema coverage on all three parameters. Annotations cover safety, leaving no gap an agent needs to call this correctly.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does so well: symbols is defined as a list of tickers with an example, instrument_type lists all eight valid values plus default, and account_id explains its optionality and fallback source.

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

Purpose5/5

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

States a specific verb (Get) and resource (real-time quotes) with scope (one or more symbols) and enumerates the returned fields. This clearly distinguishes it from siblings like get_price_history and get_strategy_quote.

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

Usage Guidelines4/5

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

Provides concrete usage context: instrument_type defaults to EQUITY, mixed instrument types require calling the tool multiple times, and account_id is optional when the env var is set. It stops short of naming sibling alternatives such as get_price_history for historical data.

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

get_strategy_quoteA
Read-only

Get a consolidated quote for a multi-leg option strategy.

Prices the strategy as a whole (debit/credit, bid/ask/mark, net price) from its option legs and optional equity leg. This is a read-only quote — it does NOT place or preflight an order.

Args: base_symbol: Underlying ticker for the strategy (e.g. "SPY"). option_legs: List of option leg objects. Each leg must have: - symbol (str): The option OCC symbol (e.g. "SPY260313P00670000") - side (str): BUY or SELL - open_close_indicator (str, optional): OPEN or CLOSE - ratio_quantity (int, optional): Ratio between legs (default 1) Example: [{"symbol": "SPY260313P00670000", "side": "SELL", "open_close_indicator": "OPEN", "ratio_quantity": 1}, {"symbol": "SPY260313P00665000", "side": "BUY", "open_close_indicator": "OPEN", "ratio_quantity": 1}] equity_leg: Optional equity leg (same shape as an option leg, with an equity ticker as the symbol) for strategies that pair options with stock (e.g. a covered call or collar). account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
account_idNo
equity_legNo
base_symbolYes
option_legsYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description reinforces this by stating it is 'a read-only quote — it does NOT place or preflight an order,' adding behavioral context beyond annotations.

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

Conciseness4/5

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

The description is well-structured with a clear opening and parameter breakdown. While comprehensive, it is slightly lengthy; some details could be tightened without losing clarity.

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

Completeness5/5

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

Given the complexity of multi-leg options, the description covers all necessary aspects: parameters, optional fields, leg structure, and the read-only nature. An output schema exists, so return values need not be explained.

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

Parameters5/5

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

Schema coverage is 0%, but the description fully documents all parameters, including the complex option_legs structure with required fields, optional fields, and an example. It explains each parameter's role clearly.

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

Purpose5/5

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

The description states a specific verb and resource: 'Get a consolidated quote for a multi-leg option strategy.' It distinguishes itself from siblings by clarifying it is a read-only quote and does not place or preflight orders.

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

Usage Guidelines4/5

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

The description indicates when to use (for pricing strategies) and explicitly states what it does not do (place/preflight order). However, it does not provide explicit when-not-to-use guidance or list alternative tools.

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

get_tax_lotsA
Read-only

Get the unrealized tax-lot summary for the account.

Returns per-lot unrealized gain/loss, holding term (short/long/60-40), cost basis, and the aggregate totals across all lots. Requires the API key to have the trading.read scope.

Args: account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
account_idNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

While annotations already declare readOnlyHint=true and destructiveHint=false, the description adds valuable behavioral context by specifying the return contents (per-lot unrealized gain/loss, holding term, cost basis, aggregate totals) and the authentication requirement (API key must have 'trading.read' scope). This goes beyond what annotations provide, without contradicting them.

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

Conciseness5/5

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

The description is concise and front-loaded: the first sentence states the primary purpose, the second details the return contents, and the Args section efficiently covers the one parameter. There is no superfluous text; every sentence earns its place.

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

Completeness4/5

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

Given the tool's simple one-parameter interface and the presence of an output schema, the description adequately covers what it returns, the auth requirement, and parameter optionality. It doesn't need to explain return values in depth because an output schema exists, but it could have benefited from a brief note on when to choose this over the symbol-specific or CSV variants. Still, it is largely complete for its complexity.

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

Parameters5/5

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

The schema provides only a default null and anyOf type for account_id, with 0% description coverage. The description fully compensates by explaining that account_id is 'Optional if PUBLIC_COM_ACCOUNT_ID is set,' thereby providing essential context about when it can be omitted and how the environment variable factor works. This is complete and clear for the sole parameter.

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

Purpose5/5

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

The description clearly states the tool's function with a specific verb ('Get') and a precise resource: 'unrealized tax-lot summary for the account.' It further details what the summary includes (per-lot gains/losses, holding term, cost basis, aggregate totals), making its purpose unambiguous and distinguishing it from siblings like get_tax_lots_for_symbol and get_tax_lots_csv.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus its alternatives. The description does not mention the sibling get_tax_lots_for_symbol for symbol-specific queries or get_tax_lots_csv for CSV export, nor does it provide context about typical use cases. It only mentions the required scope, which is a prerequisite, not a usage guideline.

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

get_tax_lots_csvA
Read-only

Export the unrealized tax lots as a CSV file.

Returns a file object with fileName and base64Data. The CSV contents are Base64-encoded in the base64Data field — decode it to recover the raw CSV text. Requires the API key to have the trading.read scope.

Args: account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
account_idNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses that the return is a file object with fileName and base64Data, that the CSV is Base64-encoded, and that the API key must have trading.read scope. This adds significant behavioral context beyond the readOnlyHint and destructiveHint annotations and does not contradict them.

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

Conciseness5/5

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

The description is tight and front-loaded: purpose, return format, encoding, auth requirement, and parameter fallback are each covered in a few clear sentences with no filler. It earn its place.

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

Completeness5/5

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

For a one-parameter export tool, the description fully covers purpose, output shape, encoding, auth, and optional parameter resolution. The output schema exists, but the return-format detail is still beneficial and does not leave gaps.

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

Parameters4/5

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

The schema has one parameter with no description, and schema description coverage is 0%. The description's Args section compensates by noting account_id is optional and falls back to PUBLIC_COM_ACCOUNT_ID when set, adding operational meaning beyond the schema's default:null.

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

Purpose5/5

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

The description begins with 'Export the unrealized tax lots as a CSV file', using a specific verb and resource. The 'CSV' format clearly distinguishes it from sibling tools like get_tax_lots and get_tax_lots_for_symbol.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool: to export unrealized tax lots as a CSV file. It also states the required trading.read scope. However, it does not explicitly name alternatives 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.

get_tax_lots_for_symbolA
Read-only

Get the unrealized tax-lot detail for a single symbol.

Returns each open lot for the symbol with its unrealized gain/loss, holding term, and cost basis. Requires the API key to have the trading.read scope.

Args: symbol: Ticker symbol (e.g. "AAPL"). price: Optional price (as a numeric string) to value the lots against. Omit to use the current market price. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
priceNo
symbolYes
account_idNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds meaningful context beyond annotations: it states the required API scope, explains that price is optional and defaults to current market price, and describes what fields are returned. No contradictions with annotations.

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

Conciseness5/5

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

The description is well-structured: a one-sentence summary, a return-detail line, a scope requirement, then a concise Args list. Every sentence earns its place with no wasted words.

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

Completeness5/5

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

Given an output schema exists, return values are already partially documented. The description adds sufficient context: what lots are returned (gain/loss, term, cost basis), scope requirement, and parameter behavior. It is complete for a read-only single-symbol lookup tool.

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

Parameters5/5

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

Schema coverage is 0%, but the description fully compensates with an Args section. It explains symbol with an example, price as an optional numeric string with omission behavior, and account_id as optional if a default is set. This goes well beyond the basic schema types.

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

Purpose5/5

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

The description starts with a specific verb+resource: 'Get the unrealized tax-lot detail for a single symbol.' It clearly distinguishes from sibling tools like get_tax_lots (all lots) and get_tax_lots_csv (export) by emphasizing the single-symbol scope.

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

Usage Guidelines4/5

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

Provides clear context: it returns open lots with cost basis, can accept an optional price, and requires trading.read scope. It does not explicitly mention alternatives or when-not-to-use, but the single-symbol restriction is implied. Lacks explicit exclusion guidance for a 5.

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

place_call_credit_spreadA

Place a Bear Call Spread (call credit spread).

Sell a lower-strike call, buy a higher-strike call. Receives a net credit. ⚠️ This executes a real trade. Consider running preflight_call_credit_spread first.

Args: sell_contract_osi: OSI symbol of the call to sell (lower strike). buy_contract_osi: OSI symbol of the call to buy (higher strike). quantity: Number of spreads. limit_price: Minimum net credit to receive per spread. time_in_force: DAY or GTD. Default is DAY. expiration_time: Required when time_in_force is GTD. ISO 8601 format. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
quantityYes
account_idNo
limit_priceYes
time_in_forceNoDAY
expiration_timeNo
buy_contract_osiYes
sell_contract_osiYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Warns that the tool executes a real trade, which is critical behavioral context beyond annotations (which only indicate not read-only or destructive). Additional details like net credit are helpful; could elaborate on trade irreversibility but sufficient.

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

Conciseness5/5

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

Concise and well-structured: title, strategy explanation, warning, then parameter list. No wasted words; each sentence serves a purpose.

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

Completeness4/5

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

Covers the essential aspects: what it does, how to use it, and when to use preflight. Could mention that this is a bearish strategy, but the title implies it. Output schema exists, so return values are covered. Complete for the task.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by explaining each parameter's meaning, constraints (e.g., 'lower strike' for sell, 'minimum net credit' for limit_price), and optionality, adding significant value.

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

Purpose5/5

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

Explicitly states it places a Bear Call Spread, describes the mechanics (sell lower strike, buy higher strike, net credit), and is distinct from sibling tools like call debit spreads or put spreads.

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

Usage Guidelines5/5

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

Clearly warns that this executes a real trade and recommends running preflight_call_credit_spread first, providing explicit when-to-use and alternative guidance.

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

place_call_debit_spreadA

Place a Bull Call Spread (call debit spread).

Buy a lower-strike call, sell a higher-strike call. Pays a net debit. ⚠️ This executes a real trade. Consider running preflight_call_debit_spread first.

Args: sell_contract_osi: OSI symbol of the call to sell (higher strike). buy_contract_osi: OSI symbol of the call to buy (lower strike). quantity: Number of spreads. limit_price: Maximum net debit to pay per spread. time_in_force: DAY or GTD. Default is DAY. expiration_time: Required when time_in_force is GTD. ISO 8601 format. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
quantityYes
account_idNo
limit_priceYes
time_in_forceNoDAY
expiration_timeNo
buy_contract_osiYes
sell_contract_osiYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations indicate non-read-only, non-destructive, non-idempotent, open world. The description adds critical context: 'executes a real trade', which goes beyond the annotations by alerting about real financial risk. No contradictions.

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

Conciseness5/5

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

The description is concise (under 100 words), uses bullet points for args, and front-loads the purpose. Every sentence adds value, and the structure is clear.

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

Completeness5/5

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

Given the complexity (7 parameters, real trade execution) and that output schema exists, the description covers behavior, all parameters, and critical usage warnings. No gaps were identified.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must explain parameters. It explains each parameter's role (e.g., sell_contract_osi: call to sell, higher strike; quantity: number of spreads) and provides defaults for time_in_force and expiration_time, effectively compensating for the lack of schema descriptions.

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

Purpose5/5

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

The description clearly identifies the tool as placing a Bull Call Spread, specifying the action (buy lower strike, sell higher strike) and distinguishing it from credit spreads. The title also reinforces this.

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

Usage Guidelines5/5

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

It warns that this executes a real trade and explicitly suggests using preflight_call_debit_spread first for testing, providing clear when-to-use and when-not-to-use guidance. Sibling tools are listed for context.

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

place_multileg_orderA

Place a multi-leg order (options strategies: spreads, straddles, etc.).

⚠️ This executes a real trade. Consider running preflight_multileg_order first.

Args: legs: List of leg objects. Each leg must have: - symbol (str): The option/equity symbol (e.g. "SPY260313P00670000") - type (str): EQUITY or OPTION - side (str): BUY or SELL - open_close_indicator (str, optional): OPEN or CLOSE (required for options) - ratio_quantity (int, optional): Ratio between legs (default 1) Example: [{"symbol": "SPY260313P00670000", "type": "OPTION", "side": "SELL", "open_close_indicator": "OPEN", "ratio_quantity": 1}, {"symbol": "SPY260313P00665000", "type": "OPTION", "side": "BUY", "open_close_indicator": "OPEN", "ratio_quantity": 1}] quantity: Number of spreads. Must be > 0. limit_price: Limit price. Positive for debit, negative for credit. time_in_force: DAY or GTD. Default is DAY. expiration_time: Required when time_in_force is GTD. ISO 8601 format. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
legsYes
quantityYes
account_idNo
limit_priceYes
time_in_forceNoDAY
expiration_timeNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false; description adds 'executes a real trade' warning and references preflight, providing useful behavioral context beyond annotations.

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

Conciseness5/5

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

Front-loaded with purpose and warning, then clear parameter breakdown with example; every sentence earns its place with no redundancy.

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

Completeness5/5

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

Covers all parameters with explanations and example, references relevant sibling tool (preflight_multileg_order), and output schema exists so return format is not required.

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

Parameters4/5

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

Despite 0% schema description coverage, the description extensively documents each parameter (e.g., limit_price meaning, leg structure with example), adding significant value beyond the schema.

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

Purpose5/5

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

Clearly states 'Place a multi-leg order (options strategies: spreads, straddles, etc.)' – specific verb and resource, and distinguishes from siblings like place_order and specific spread tools.

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

Usage Guidelines4/5

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

Explicitly warns about real trade execution and recommends running preflight_multileg_order first, providing clear context for when to use this tool vs. the preflight alternative.

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

place_orderA

Place a single-leg order (buy/sell stocks, crypto, or options).

⚠️ This executes a real trade. Consider running preflight_order first.

Args: symbol: Ticker symbol (e.g. "AAPL"). instrument_type: EQUITY, OPTION, or CRYPTO. order_side: BUY or SELL. order_type: MARKET, LIMIT, STOP, STOP_LIMIT, MARKET_ON_CLOSE or LIMIT_ON_CLOSE. The on-close types execute at the closing auction. time_in_force: DAY or GTD. Default is DAY. quantity: Number of shares/contracts (mutually exclusive with amount). amount: Dollar amount (mutually exclusive with quantity). limit_price: Required for LIMIT, STOP_LIMIT and LIMIT_ON_CLOSE orders. stop_price: Required for STOP and STOP_LIMIT orders. open_close_indicator: For options only — OPEN or CLOSE. expiration_time: Required when time_in_force is GTD. ISO 8601 format. equity_market_session: CORE or EXTENDED. For equity orders only. Not the REGULAR / REST_OF_DAY / TWENTY_FOUR_HOURS values that get_order and search_orders report in equityMarketSession; never feed those back here. tax_lot_matching_instructions: Optional list of specific tax lots to sell, each a dict {"tax_lot_id": str, "quantity": str}. Constraints enforced by the API: at most 8 per request; only for a SELL equity order with open_close_indicator=CLOSE; every lot must be the same symbol as the order; only MARKET or good-for-day LIMIT orders; the quantities must sum to the order quantity; and the account's tax-lot information must have been updated today. Omit to let the broker apply its default lot-matching. order_class: SIMPLE (default) places a standalone order. BRACKET, OCO or OTO place a bracket order, where the exit legs below are submitted automatically once this entry order fills. Bracket orders are for EQUITY and OPTION only, need a whole-share quantity (not amount), must use the CORE market session, and the entry order_type must be LIMIT or MARKET — LIMIT only for OCO. Every leg of the bracket, entry included, reports the entry's order ID as its bracketId. preflight_order cannot check the exit legs — it validates the entry order only. take_profit_limit_price: Limit price of the take-profit exit leg, placed on the opposite side of the entry. Requires a bracket order_class. stop_loss_stop_price: Stop price of the stop-loss exit leg, placed on the opposite side of the entry. Requires a bracket order_class. Placed as a STOP order unless stop_loss_limit_price is given too. stop_loss_limit_price: Limit price that makes the stop-loss leg a STOP_LIMIT order instead of a STOP order. Requires stop_loss_stop_price. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
amountNo
symbolYes
quantityNo
account_idNo
order_sideYes
order_typeYes
stop_priceNo
limit_priceNo
order_classNo
time_in_forceNoDAY
expiration_timeNo
instrument_typeYes
open_close_indicatorNo
stop_loss_stop_priceNo
equity_market_sessionNo
stop_loss_limit_priceNo
take_profit_limit_priceNo
tax_lot_matching_instructionsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), the description adds the critical warning that this executes a real trade and lays out API-enforced constraints (max 8 tax lots, same symbol, quantities must sum, tax-lot data freshness, bracket-order restrictions). This is exactly the behavior an agent cannot infer from structured fields.

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

Conciseness4/5

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

Front-loaded with the one-line purpose and the real-trade warning, then an Args list where every entry carries substantive information. The example values and some parenthetical detail add length, but nothing is truly redundant for an 18-parameter tool.

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

Completeness5/5

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

With an output schema present, return values need no explanation, and the description covers all 18 parameters, their conditional dependencies, and the bracket/tax-lot edge cases. An agent has everything needed to construct a valid call.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden — and it does: every parameter gets meaning plus conditional requirements (limit_price required for LIMIT/STOP_LIMIT/LIMIT_ON_CLOSE, expiration_time for GTD, open_close_indicator for options), mutual exclusions (quantity vs amount), and even a warning about the equity_market_session enum mismatch with other tools.

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

Purpose5/5

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

States a specific verb (place) and resource (single-leg order) with the instrument scope (stocks, crypto, options), which cleanly separates it from siblings like place_multileg_order and place_short_order 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.

Usage Guidelines4/5

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

Explicitly recommends running preflight_order first for validation, and repeatedly notes what preflight_order cannot cover (exit legs), which is clear usage context. It never spells out when to prefer a sibling such as place_multileg_order, so it stops short of the 5 tier.

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

place_put_credit_spreadA

Place a Bull Put Spread (put credit spread).

Sell a higher-strike put, buy a lower-strike put. Receives a net credit. ⚠️ This executes a real trade. Consider running preflight_put_credit_spread first.

Args: sell_contract_osi: OSI symbol of the put to sell (higher strike). buy_contract_osi: OSI symbol of the put to buy (lower strike). quantity: Number of spreads. limit_price: Minimum net credit to receive per spread. time_in_force: DAY or GTD. Default is DAY. expiration_time: Required when time_in_force is GTD. ISO 8601 format. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
quantityYes
account_idNo
limit_priceYes
time_in_forceNoDAY
expiration_timeNo
buy_contract_osiYes
sell_contract_osiYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Description adds key behavioral disclosure: 'executes a real trade' and 'Receive a net credit'. Annotations are minimal (destructiveHint=false, readOnlyHint=false) but description warns of trade execution, adding context beyond annotations.

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

Conciseness4/5

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

Description is concise with a clear structure: purpose, warning, then args list. Every sentence adds value. Minor room for tighter phrasing but highly effective.

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

Completeness5/5

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

Covers all 7 parameters with context, provides a warning and prerequisite, mentions net credit. Output schema exists but unnecessary to describe return values. Complete for an execution tool.

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

Parameters5/5

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

Schema has 0% description coverage; the description compensates fully by explaining each parameter: sell_contract_osi (higher strike), buy_contract_osi (lower strike), quantity, limit_price (minimum net credit), time_in_force, expiration_time, account_id. This adds significant meaning.

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

Purpose5/5

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

The description clearly states the tool places a Bull Put Spread, explains the mechanics (sell higher-strike put, buy lower-strike put, net credit), and distinguishes it from siblings like place_put_debit_spread and place_call_credit_spread.

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

Usage Guidelines4/5

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

Explicitly recommends running preflight_put_credit_spread first, guiding when to use this execution tool versus a simulation. Lacks explicit when-not-to-use but the preflight suggestion provides clear context.

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

place_put_debit_spreadA

Place a Bear Put Spread (put debit spread).

Buy a higher-strike put, sell a lower-strike put. Pays a net debit. ⚠️ This executes a real trade. Consider running preflight_put_debit_spread first.

Args: sell_contract_osi: OSI symbol of the put to sell (lower strike). buy_contract_osi: OSI symbol of the put to buy (higher strike). quantity: Number of spreads. limit_price: Maximum net debit to pay per spread. time_in_force: DAY or GTD. Default is DAY. expiration_time: Required when time_in_force is GTD. ISO 8601 format. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
quantityYes
account_idNo
limit_priceYes
time_in_forceNoDAY
expiration_timeNo
buy_contract_osiYes
sell_contract_osiYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, but description adds the explicit warning '⚠️ This executes a real trade.' which is critical for a trade execution tool. No contradictions.

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

Conciseness4/5

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

Description is well-structured with a brief intro, a warning, and a bulleted Args list. It is clear and informative without being verbose. Could potentially trim minor redundancy, but overall effective.

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

Completeness5/5

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

Given 7 parameters and 4 required, the description covers all parameters and provides crucial context (real trade, preflight suggestion). An output schema exists (though not shown), so return behavior is likely documented elsewhere. The description is complete for the agent's needs.

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

Parameters5/5

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

Schema coverage is 0%, requiring the description to explain all 7 parameters. The Args section provides clear semantics: sell_contract_osi (lower strike), buy_contract_osi (higher strike), quantity, limit_price (max net debit), time_in_force (DAY or GTD), expiration_time (ISO 8601), account_id (optional with env var). Adds significant value beyond schema.

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

Purpose5/5

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

Clear verb 'Place' with specific resource 'Put Debit Spread'. Explains strategy (buy high strike, sell low strike) and net debit nature. Distinct from sibling tools like place_call_credit_spread, place_put_credit_spread, etc.

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

Usage Guidelines4/5

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

Explicitly recommends running preflight_put_debit_spread first. Warns that it executes a real trade. Does not specify when NOT to use, but the preflight suggestion and context imply careful consideration.

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

place_short_orderA

Place an equity short-sale order.

⚠️ This executes a real trade. Consider running preflight_short_order first.

Args: symbol: Ticker symbol to short (e.g. "AAPL"). quantity: Number of shares to short. order_type: MARKET, LIMIT, STOP, STOP_LIMIT, MARKET_ON_CLOSE or LIMIT_ON_CLOSE. Default is MARKET. The on-close types execute at the closing auction. time_in_force: DAY or GTD. Default is DAY. limit_price: Required for LIMIT, STOP_LIMIT and LIMIT_ON_CLOSE orders. stop_price: Required for STOP and STOP_LIMIT orders. expiration_time: Required when time_in_force is GTD. ISO 8601 format. equity_market_session: CORE or EXTENDED. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
symbolYes
quantityYes
account_idNo
order_typeNoMARKET
stop_priceNo
limit_priceNo
time_in_forceNoDAY
expiration_timeNo
equity_market_sessionNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly=false, openWorld=true and non-idempotent, but the description adds the crucial operational warning that this executes a real trade and recommends a preflight step. It doesn't disclose retry/duplicate-order risk even though idempotentHint=false, which would be valuable for an agent deciding whether to retry after a timeout.

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

Conciseness5/5

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

Purpose and the real-trade warning are front-loaded, followed by a tight Args block where every line supplies information not present elsewhere. No redundant restatement of the tool name or filler.

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

Completeness4/5

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

An output schema exists, so return values need not be explained, and all nine parameters are documented despite zero schema coverage. Remaining gap: equity_market_session lists CORE/EXTENDED without explaining the behavioral difference, and there is no note on rejection/partial-fill behavior after submission.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must carry the full load and does: it enumerates allowed values for order_type and time_in_force, states defaults, and specifies the conditional requirements (limit_price for LIMIT/STOP_LIMIT/LIMIT_ON_CLOSE, stop_price for STOP/STOP_LIMIT, expiration_time when GTD). It also adds format details (ISO 8601) and clarifies account_id is optional when PUBLIC_COM_ACCOUNT_ID is set.

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

Purpose5/5

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

The first sentence names a specific verb and resource ('Place an equity short-sale order'), which cleanly separates it from the sibling place_order and the various preflight_* tools. An agent can pick this 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.

Usage Guidelines4/5

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

It explicitly directs the agent to run preflight_short_order first, which is a concrete when-to-use hint tied to a real sibling. It doesn't state when-not to use it (e.g. cover/locate failures, account restrictions), 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.

preflight_buy_event_contractA
Read-only

Price a buy of an event contract (a YES or NO side) without placing it.

Prices a DAY limit buy of the contract. The response holds the limit price used and the preflight estimate, whose estimatedCost includes the commission and exchange fee. Does NOT place an order.

Args: contract_symbol: The contract to buy, from get_event_details, e.g. "KALSHI.KXBTC15M-26OCT201200-00.Y" (".Y" = YES, ".N" = NO). Not the "-EVENTCONTRACT" symbol that get_event_contract_bars takes. quantity: Number of contracts (default "1"); at most 2 decimal places. limit_price: Most to pay per contract, in dollars with whole cents between 0.01 and 0.99 (e.g. "0.55"). If omitted, the contract's current ask is looked up via event_symbol and rounded up to a whole cent. event_symbol: The contract's eventSymbol, e.g. "KALSHI.KXBTC15M-26OCT201200". Required when limit_price is omitted. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
quantityNo1
account_idNo
limit_priceNo
event_symbolNo
contract_symbolYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds meaningful behavior beyond that: it is a DAY limit buy, the response contains the limit price used and a preflight estimate including commission and exchange fee, and no order is placed. The fallback lookup behavior for limit_price is also disclosed.

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

Conciseness5/5

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

The description is front-loaded with the core purpose and the no-order guarantee, then provides a compact Args section. Despite being somewhat long, every sentence adds necessary detail given zero schema parameter descriptions.

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

Completeness5/5

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

It is complete for a preflight pricing tool: it explains the operation, the limit-order semantics, the response contents, the no-order guarantee, and every parameter despite the schema having no descriptions. The existence of an output schema means it need not fully detail the return object.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does so well. It documents all five parameters: contract symbol format and side convention, quantity precision and default, limit price range and fallback behavior, event_symbol dependency when limit_price is omitted, and account_id environment fallback.

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

Purpose5/5

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

The description states a specific verb and resource: price a buy of an event contract on the YES or NO side without placing it. It distinguishes itself from order-placement siblings by explicitly saying it does NOT place an order, and even warns against using the '-EVENTCONTRACT' symbol used by get_event_contract_bars.

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

Usage Guidelines4/5

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

It clearly establishes the preflight use case and says no order is placed, which implicitly positions buy_event_contract as the execution alternative. However, it does not explicitly name buy_event_contract or explain exclusions such as when to use preflight_order instead.

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

preflight_call_credit_spreadA
Read-only

Estimate costs for a Bear Call Spread (call credit spread) before placing it.

Sell a lower-strike call, buy a higher-strike call. Receives a net credit. Does NOT place an order.

Args: sell_contract_osi: OSI symbol of the call to sell (lower strike). buy_contract_osi: OSI symbol of the call to buy (higher strike). quantity: Number of spreads. limit_price: Net credit to receive per spread (positive = credit received). time_in_force: DAY or GTD. Default is DAY. expiration_time: Required when time_in_force is GTD. ISO 8601 format. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
quantityYes
account_idNo
limit_priceYes
time_in_forceNoDAY
expiration_timeNo
buy_contract_osiYes
sell_contract_osiYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. Description adds that it estimates costs and does not place an order, reinforcing safety. No contradictions.

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

Conciseness4/5

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

Description is well-structured with a brief overview followed by parameter list. Every sentence adds value. Could potentially shorten the parameter descriptions slightly, but overall efficient.

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

Completeness5/5

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

Given output schema exists, description doesn't need to explain return values. All parameters are documented with semantics, usage guidance clear, and no behavioral gaps. Completely adequate for a 7-param tool with rich annotations.

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

Parameters5/5

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

All 7 parameters are described with meaning beyond schema: sell_contract_osi is lower strike, buy_contract_osi higher strike, limit_price is net credit (positive), time_in_force defaults to DAY, expiration_time required for GTD, account_id optional. Schema coverage 0% but description fully compensates.

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

Purpose5/5

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

Clearly states it estimates costs for a Bear Call Spread (call credit spread) before placing. Specifies sell lower-strike, buy higher-strike, net credit. Distinct from siblings like preflight_call_debit_spread and place_call_credit_spread.

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

Usage Guidelines5/5

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

Explicitly says 'before placing it' and 'Does NOT place an order.' This distinguishes it from place_call_credit_spread. Also indicates when to use: to estimate costs, not to execute. No confusion with other preflight tools.

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

preflight_call_debit_spreadA
Read-only

Estimate costs for a Bull Call Spread (call debit spread) before placing it.

Buy a lower-strike call, sell a higher-strike call. Pays a net debit. Does NOT place an order.

Args: sell_contract_osi: OSI symbol of the call to sell (higher strike). buy_contract_osi: OSI symbol of the call to buy (lower strike). quantity: Number of spreads. limit_price: Net debit to pay per spread (positive = debit paid). time_in_force: DAY or GTD. Default is DAY. expiration_time: Required when time_in_force is GTD. ISO 8601 format. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
quantityYes
account_idNo
limit_priceYes
time_in_forceNoDAY
expiration_timeNo
buy_contract_osiYes
sell_contract_osiYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. Description reinforces non-destructive nature and adds context about the spread strategy. No contradictions.

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

Conciseness5/5

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

Concise and well-structured: a short purpose paragraph followed by a clear args list. Front-loaded with essential information.

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

Completeness4/5

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

Covers purpose, strategy, and all parameters. Lacks details about the output format, but an output schema exists to provide that information.

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

Parameters5/5

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

With 0% schema description coverage, the description provides meaningful explanations for all 7 parameters, including defaults and conditional requirements.

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

Purpose5/5

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

Clearly states it estimates costs for a Bull Call Spread (call debit spread), with specific verb+resource. Distinguishes from sibling preflight tools for other spread types.

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

Usage Guidelines4/5

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

Explains it is for estimating costs before placing an order and explicitly says 'Does NOT place an order.' Implicitly contrasts with order placement tools, but could be more explicit about when to use vs. other preflight tools.

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

preflight_multileg_orderA
Read-only

Estimate costs for a multi-leg (options strategy) trade before placing it.

Does NOT place an order.

Args: legs: List of leg objects. Each leg must have: - symbol (str): The option/equity symbol (e.g. "SPY260313P00670000") - type (str): EQUITY or OPTION - side (str): BUY or SELL - open_close_indicator (str, optional): OPEN or CLOSE (required for options) - ratio_quantity (int, optional): Ratio between legs (default 1) Example: [{"symbol": "SPY260313P00670000", "type": "OPTION", "side": "SELL", "open_close_indicator": "OPEN", "ratio_quantity": 1}, {"symbol": "SPY260313P00665000", "type": "OPTION", "side": "BUY", "open_close_indicator": "OPEN", "ratio_quantity": 1}] limit_price: The limit price for the spread. time_in_force: DAY or GTD. Default is DAY. quantity: Number of spreads. Must be > 0. expiration_time: Required when time_in_force is GTD. ISO 8601 format. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
legsYes
quantityNo
account_idNo
limit_priceYes
time_in_forceNoDAY
expiration_timeNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds that it estimates costs and does not place an order, but provides no additional behavioral context (e.g., authentication, rate limits, or error behavior). The added value over annotations is minimal.

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

Conciseness4/5

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

The description is front-loaded with purpose and a clear disclaimer. The argument list is structured but duplicates some schema information. It is slightly verbose but efficiently communicates essential details.

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

Completeness4/5

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

For a multi-leg options tool, the description covers the input parameters well and the presence of an output schema compensates for lack of return value explanation. It lacks edge case or error handling details, but overall is sufficiently complete for an AI agent.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It gives a detailed example and structure for the 'legs' parameter, including required fields and optional fields with defaults. Other parameters like 'limit_price' and 'time_in_force' receive only brief explanations. Overall adds meaningful context beyond the schema, but could be more thorough for all parameters.

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

Purpose5/5

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

Description clearly states 'Estimate costs for a multi-leg (options strategy) trade before placing it.' and explicitly notes 'Does NOT place an order.' This distinguishes it from sibling tools like place_multileg_order and specific preflight functions.

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

Usage Guidelines4/5

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

Provides clear context for when to use (before placing a multi-leg order to estimate costs) and what it does not do (place the order). However, it lacks explicit guidance on when to use this tool versus the more specific preflight call/put spread tools.

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

preflight_orderA
Read-only

Estimate costs and impact of a potential single-leg trade before placing it.

Returns estimated commission, regulatory fees, order value, buying power requirements, and margin impact. Does NOT place an order.

Args: symbol: Ticker symbol (e.g. "AAPL"). instrument_type: EQUITY, OPTION, or CRYPTO. order_side: BUY or SELL. order_type: MARKET, LIMIT, STOP, STOP_LIMIT, MARKET_ON_CLOSE or LIMIT_ON_CLOSE. The on-close types execute at the closing auction. time_in_force: DAY or GTD. Default is DAY. quantity: Number of shares/contracts (mutually exclusive with amount). amount: Dollar amount (mutually exclusive with quantity). limit_price: Required for LIMIT, STOP_LIMIT and LIMIT_ON_CLOSE orders. stop_price: Required for STOP and STOP_LIMIT orders. open_close_indicator: For options only — OPEN or CLOSE. expiration_time: Required when time_in_force is GTD. ISO 8601 format. equity_market_session: CORE or EXTENDED. For equity orders only. tax_lot_matching_instructions: Optional list of specific tax lots to sell, each a dict {"tax_lot_id": str, "quantity": str}. Constraints enforced by the API: at most 8 per request; only for a SELL equity order with open_close_indicator=CLOSE; every lot must be the same symbol as the order; only MARKET or good-for-day LIMIT orders; the quantities must sum to the order quantity; and the account's tax-lot information must have been updated today. Omit to let the broker apply its default lot-matching. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
amountNo
symbolYes
quantityNo
account_idNo
order_sideYes
order_typeYes
stop_priceNo
limit_priceNo
time_in_forceNoDAY
expiration_timeNo
instrument_typeYes
open_close_indicatorNo
equity_market_sessionNo
tax_lot_matching_instructionsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the read-only, non-destructive, open-world profile, and the description reinforces it while adding real domain context: what the estimate contains, and hard API-enforced constraints on tax_lot_matching_instructions (max 8 lots, SELL equity + CLOSE only, same symbol, quantity must sum, tax-lot data must be refreshed today). It omits latency/refresh characteristics of the estimate, 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.

Conciseness5/5

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

Front-loaded: purpose, then returned values, then the not-a-write disclaimer, before the Args block. The length is proportionate to 14 parameters and every line adds information — even the aside about on-close types executing at the closing auction earns its space.

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

Completeness4/5

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

An output schema exists and the description names the main returned figures (commission, fees, order value, buying power, margin impact), so nothing critical is missing for a read-only estimation tool. Only gap is no note on whether the estimate is a point-in-time snapshot that can go stale before placement.

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

Parameters5/5

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

Schema coverage is 0% across 14 parameters, so the description carries the full burden and does so thoroughly: value domains for instrument_type, order_side and order_type, conditional requirements for limit_price/stop_price/expiration_time, the quantity-vs-amount mutual exclusion, defaults, and the account_id fallback to PUBLIC_COM_ACCOUNT_ID. This is meaning an agent cannot get from the bare schema.

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

Purpose5/5

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

States a specific verb ('Estimate') plus resource ('costs and impact of a potential single-leg trade'), and 'single-leg' scopes it away from the multileg and spread-preflight siblings. The explicit negative 'Does NOT place an order' separates it from place_order at a glance.

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

Usage Guidelines3/5

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

Timing is clear — run it before placing the trade — and the 'does NOT place an order' sentence implicitly routes the actual execution to place_order. However, none of the specialized siblings (preflight_multileg_order, preflight_short_order, preflight_buy_event_contract, the spread preflights) are named, so an agent must infer from the input shape which preflight variant applies.

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

preflight_put_credit_spreadA
Read-only

Estimate costs for a Bull Put Spread (put credit spread) before placing it.

Sell a higher-strike put, buy a lower-strike put. Receives a net credit. Does NOT place an order.

Args: sell_contract_osi: OSI symbol of the put to sell (higher strike). buy_contract_osi: OSI symbol of the put to buy (lower strike). quantity: Number of spreads. limit_price: Net credit to receive per spread (positive = credit received). time_in_force: DAY or GTD. Default is DAY. expiration_time: Required when time_in_force is GTD. ISO 8601 format. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
quantityYes
account_idNo
limit_priceYes
time_in_forceNoDAY
expiration_timeNo
buy_contract_osiYes
sell_contract_osiYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true. The description reinforces that it is a side-effect-free estimation tool and adds that it 'Does NOT place an order.' It also explains the credit received nature. No contradictions exist, and the description adds context beyond annotations.

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

Conciseness5/5

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

The description is well-structured: a clear one-line purpose, a brief strategy explanation, a key behavioral note, and a bulleted list of parameters. It is concise with no unnecessary text. The critical information is front-loaded, and the format is easy to parse.

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

Completeness5/5

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

All 7 parameters are described, with 4 required parameters clearly noted. The tool's read-only nature, credit computation, and order prevention are covered. An output schema exists (as per context signals), so the return value is handled externally. The description is complete for an agent to use the tool correctly.

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

Parameters5/5

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

Schema description coverage is 0%, but the description compensates fully. It provides detailed explanations for each parameter in the Args section, including the role of sell_contract_osi (higher strike) and buy_contract_osi (lower strike), limit_price semantics (positive = credit received), time_in_force options (DAY or GTD), and conditional requirements for expiration_time. This adds substantial meaning beyond the raw schema.

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

Purpose5/5

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

The description states 'Estimate costs for a Bull Put Spread (put credit spread) before placing it.' It clearly identifies the action (estimate), the resource (put credit spread), and the context (before placing). The title 'Preflight Put Credit Spread' aligns with the purpose, and the sibling set distinguishes it from other preflight and placement tools.

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

Usage Guidelines4/5

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

The description explicitly says 'Does NOT place an order,' guiding when not to use this tool. It explains the mechanics (sell higher-strike, buy lower-strike) and mentions receiving a net credit. While it does not explicitly compare to other preflight tools, the pair structure and type are clearly defined, making the usage context reasonably clear.

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

preflight_put_debit_spreadA
Read-only

Estimate costs for a Bear Put Spread (put debit spread) before placing it.

Buy a higher-strike put, sell a lower-strike put. Pays a net debit. Does NOT place an order.

Args: sell_contract_osi: OSI symbol of the put to sell (lower strike). buy_contract_osi: OSI symbol of the put to buy (higher strike). quantity: Number of spreads. limit_price: Net debit to pay per spread (positive = debit paid). time_in_force: DAY or GTD. Default is DAY. expiration_time: Required when time_in_force is GTD. ISO 8601 format. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
quantityYes
account_idNo
limit_priceYes
time_in_forceNoDAY
expiration_timeNo
buy_contract_osiYes
sell_contract_osiYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true. Description adds that no order is placed, which is consistent and slightly reinforces the behavior. No additional details on auth, rate limits, or side effects, but adequate for a read-only estimation tool.

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

Conciseness5/5

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

Description is brief but complete: a clear opening sentence, a concise strategy explanation, and a well-structured bullet list of parameters. No wasted words; front-loaded with purpose.

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

Completeness4/5

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

With 7 parameters, an output schema (presumably describing cost estimate), and sibling tools, the description covers purpose, parameters, and key behavior. It meets the needs for a preflight check tool, though it does not detail what the output contains (but output schema handles that). Minor gap: no mention of prerequisites like market data availability.

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

Parameters5/5

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

Schema has 0% description coverage, but the description provides clear explanations for all 7 parameters, including OSI symbols, quantity, limit price as net debit, time_in_force options, expiration_time format, and account_id optionality. Adds significant value beyond schema titles.

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

Purpose5/5

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

Description clearly states the tool estimates costs for a Bear Put Spread, explains the strategy (buy higher strike, sell lower strike), and explicitly says it does not place an order. Distinguishes well from sibling preflight and order placement tools.

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

Usage Guidelines4/5

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

Explicitly says 'Estimate costs before placing it' and 'Does NOT place an order', implying use before order placement. Sibling tools include 'place_put_debit_spread' for actual order placement, making usage context clear. No explicit when-not-to-use but sufficient.

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

preflight_short_orderA
Read-only

Estimate costs for a short-sale equity order before placing it.

Returns estimated commission, fees, and buying power impact. Does NOT place an order.

Args: symbol: Ticker symbol to short (e.g. "AAPL"). quantity: Number of shares to short. order_type: MARKET, LIMIT, STOP, STOP_LIMIT, MARKET_ON_CLOSE or LIMIT_ON_CLOSE. Default is MARKET. The on-close types execute at the closing auction. time_in_force: DAY or GTD. Default is DAY. limit_price: Required for LIMIT, STOP_LIMIT and LIMIT_ON_CLOSE orders. stop_price: Required for STOP and STOP_LIMIT orders. expiration_time: Required when time_in_force is GTD. ISO 8601 format. equity_market_session: CORE or EXTENDED. account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set.

NameRequiredDescriptionDefault
symbolYes
quantityYes
account_idNo
order_typeNoMARKET
stop_priceNo
limit_priceNo
time_in_forceNoDAY
expiration_timeNo
equity_market_sessionNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true. The description adds substantive context beyond that: what is estimated (commission, fees, buying-power impact) and the crucial assurance that no order is placed. It does not cover error conditions or account prerequisites beyond the env-var fallback.

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

Conciseness4/5

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

Front-loaded with purpose and the no-placement warning, then a compact Args block. Each argument line carries information, though the format is closer to a docstring dump than tightly integrated prose.

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

Completeness5/5

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

For a 9-parameter tool with zero schema coverage and an existing output schema, the definition supplies everything an agent needs: the conditional parameter rules, order-type semantics, default values, and the account_id fallback. Return values are already covered by the output schema.

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

Parameters5/5

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

Schema description coverage is 0%, so the description bears the full burden, and it delivers: it documents every parameter and the conditional requirements (limit_price for LIMIT/STOP_LIMIT/LIMIT_ON_CLOSE, stop_price for STOP/STOP_LIMIT, expiration_time for GTD, account_id optional when the env var is set). It also explains on-close execution at the closing auction, which is not in the schema.

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

Purpose5/5

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

States a specific verb and resource ('Estimate costs for a short-sale equity order') and explicitly contrasts with the sibling that places orders ('Does NOT place an order', 'before placing it'). An agent can distinguish it from place_short_order without opening any schema.

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

Usage Guidelines4/5

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

The description says the tool is to be used before placing, which implies pairing with place_short_order, and explicitly excludes placement. It stops short of naming the alternative tool or stating when not to preflight at all.

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

search_bondsA
Read-only

Filtered, paged search for fixed income (bond) instruments.

All filters are optional; combine them to narrow down results. Returns a page object with content (the bonds), totalElements, and totalPages.

Args: page_number: Page number, zero-based. Default 0. page_size: Items per page. Default 20. sort_property: Property to sort by (e.g. "maturityDate"). sort_direction: ASC or DESC. Default DESC. issuer: Filter by issuer name. issuer_symbol: Filter by issuer symbol(s), e.g. ["AAPL"]. bond_status: e.g. ["OUTSTANDING"]. Valid: LIQUIDATED, CONVERTED, FUNGED, REPAID, RESTRUCTURED, CALLED, DEFAULTED, MATURED, OUTSTANDING, PUT, TENDERED, REPURCHASED, PRE_ISSUANCE, UNKNOWN. bond_type: e.g. ["TREASURY", "CORPORATE"]. Valid: AGENCY, CD, CORPORATE, GOVERNMENT, MUNICIPAL, TREASURY. treasury_subtype: Valid: BOND, BILL, NOTE, STRIPS, TIPS, FLOATING. rating: S&P rating(s), e.g. ["AAA", "AA+"]. From AAA through D, NR for not rated (short-term ratings like A-1+/SP-1 also valid). rating_category: INVESTMENT_GRADE or SPECULATIVE_GRADE. sp_outlook: Valid: POSITIVE, NEGATIVE, DEVELOPING, STABLE, NOT_RATED, NOT_MEANINGFUL. sp_creditwatch: Valid: POSITIVE, NEGATIVE, DEVELOPING, NOT_MEANINGFUL. coupon_frequency: Valid: AT_MATURITY, ZERO, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL. min_coupon: Minimum coupon rate (numeric string). max_coupon: Maximum coupon rate (numeric string). min_maturity_date: yyyy-MM-dd. Defaults server-side to today + 14 days. max_maturity_date: yyyy-MM-dd. min_current_yield: Minimum current yield (numeric string). max_current_yield: Maximum current yield (numeric string). min_par_value: Minimum par value (numeric string). max_par_value: Maximum par value (numeric string). min_liquidity_rating: Minimum liquidity score, 1 (low) to 5 (high). max_liquidity_rating: Maximum liquidity score, 1 (low) to 5 (high). liquidity_rating: Specific liquidity score(s), 1–5. callable: Filter by callable status. perpetual: Filter by perpetual bond status. partial_par: Filter by partial par status.

NameRequiredDescriptionDefault
issuerNo
ratingNo
callableNo
bond_typeNo
page_sizeNo
perpetualNo
max_couponNo
min_couponNo
sp_outlookNo
bond_statusNo
page_numberNo
partial_parNo
issuer_symbolNo
max_par_valueNo
min_par_valueNo
sort_propertyNo
sort_directionNo
sp_creditwatchNo
rating_categoryNo
coupon_frequencyNo
liquidity_ratingNo
treasury_subtypeNo
max_current_yieldNo
max_maturity_dateNo
min_current_yieldNo
min_maturity_dateNo
max_liquidity_ratingNo
min_liquidity_ratingNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Beyond the readOnlyHint and destructiveHint annotations, the description adds useful behavioral details: it returns a page object with content, totalElements, and totalPages, notes that min_maturity_date defaults server-side to today + 14 days, and specifies default page_number, page_size, and sort_direction. This provides context beyond annotations, though it does not mention rate limits or max page size.

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

Conciseness5/5

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

The description opens with a one-sentence summary, then a brief note on filter combination and return object, followed by a well-structured list of all 28 parameters with one-line explanations. It is long but every line adds value, and the formatting is consistent and front-loaded with the summary.

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

Completeness5/5

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

Given 28 parameters, no schema descriptions, and an output schema, the description is complete: it covers all parameters, valid values, defaults, return shape, and the fact that all filters are optional. The output schema exists, so the return structure need not be detailed further. No significant gaps remain.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by explaining every parameter with examples (e.g., issuer_symbol ['AAPL']), valid enum values (e.g., bond_status list), defaults (page_number, page_size, sort_direction, min_maturity_date), and type constraints (numeric string). This is essential for correct invocation and is exemplary given the schema's lack of descriptions.

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

Purpose5/5

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

The description states 'Filtered, paged search for fixed income (bond) instruments' with a specific verb and resource, making it clear this tool searches bonds with filtering and pagination. This distinguishes it from siblings like get_bond_details (which likely fetches a single bond) and get_all_instruments (which may list all instruments).

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

Usage Guidelines4/5

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

The description says 'All filters are optional; combine them to narrow down results' and describes pagination, giving clear context on when to use this tool for finding bonds that meet certain criteria. However, it does not explicitly name alternative tools or state when not to use this tool, which could improve clarity.

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

search_ordersA
Read-only

Search the account's order history — orders in ANY status, created in the last 30 days.

This is the order-history tool. It differs from get_orders, which returns only the open/active orders embedded in the portfolio snapshot: search_orders queries the order-history endpoint and also returns filled, cancelled, rejected, expired and replaced orders, narrowed by the filters below. All filters are optional and combine with AND; call it with no filters to list every order in the window.

Limits (enforced by the API): only orders created within the last 30 days are searchable, and at most 500 orders are returned — narrow with created_after / created_before or the other filters if a search could exceed that.

Each result has the same shape as get_order: the order plus trades (the individual fills: tradeId, quantity, price, side, timestamp and, when reported, marketIdentificationCode — the MIC of the execution venue), filledAt, replacedAt, lastModified and equityMarketSession. equityMarketSession reports the session an equity order was placed for as REGULAR, REST_OF_DAY or TWENTY_FOUR_HOURS.

Args: account_id: Account ID. Optional if PUBLIC_COM_ACCOUNT_ID is set. status: Only orders currently in this status. One of NEW, PARTIALLY_FILLED, FILLED, CANCELLED, QUEUED_CANCELLED, PENDING_CANCEL, PENDING_REPLACE, REPLACED, REJECTED, EXPIRED. side: BUY or SELL. symbols: Only orders for these instruments, each as "SYMBOL" or "SYMBOL:TYPE" (type defaults to EQUITY), e.g. ["AAPL", "BTC:CRYPTO", "SPY260313P00670000:OPTION"]. security_type: Only orders of this instrument type. One of EQUITY, OPTION, MULTI_LEG_INSTRUMENT, CRYPTO, ALT, TREASURY, BOND, INDEX, EVENTCONTRACT. open_close_indicator: OPEN or CLOSE (set on option and shorting orders only). created_after: Only orders created at or after this ISO 8601 timestamp (e.g. 2026-09-01T00:00:00Z). Cannot reach back more than 30 days. created_before: Only orders created before this ISO 8601 timestamp.

NameRequiredDescriptionDefault
sideNo
statusNo
symbolsNo
account_idNo
created_afterNo
security_typeNo
created_beforeNo
open_close_indicatorNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations (readOnlyHint, openWorldHint, destructiveHint=false) already cover the safety profile, and the description adds real context beyond them: two API-enforced limits (30-day searchable window, 500-result cap), AND semantics across all optional filters, and the fact that created_after cannot reach back past the window. No contradiction with annotations.

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

Conciseness4/5

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

Front-loaded with purpose, then differentiation, then limits, then result shape, then args — a sensible order and nothing is filler. It is somewhat long, and the detailed enumeration of `trades` fields and `equityMarketSession` values is arguably redundant given an output schema exists, but the density is justified for an 8-param search tool.

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

Completeness5/5

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

For a filter-heavy search tool with zero schema descriptions, the definition covers scoping, limits, default behavior, filter combination semantics, parameter enums/formats and result shape. Nothing an agent needs in order 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.

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does: it documents all eight parameters with enumerated values (status list, BUY/SELL, nine security types, OPEN/CLOSE), symbol syntax with concrete examples including crypto and option formats, ISO 8601 timestamp format with an example, and the account_id fallback to PUBLIC_COM_ACCOUNT_ID. It adds far more meaning than the bare schema.

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

Purpose5/5

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

States a specific verb and resource ('Search the account's order history') plus the scope (any status, last 30 days), and explicitly contrasts itself with the sibling get_orders, which only returns open/active orders. An agent can pick 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.

Usage Guidelines5/5

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

Explicitly says when to use this vs. get_orders ('order-history endpoint' vs. 'portfolio snapshot'), states all filters are optional and AND-combined, tells the agent that calling with no filters lists everything, and instructs how to narrow when a result set could exceed the 500-order cap. When-to-use, defaults and the alternative are all covered.

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

wait_for_settlementA
Read-only

Wait for an event's outcome to settle and report which side won.

A 15-minute window settles a few minutes after it closes, which can be longer than one call waits: on a timeout the response has status "pending" and the outcome's current state — call again to keep waiting.

Once settled, the response carries the outcome (with settledOutcome, e.g. SETTLED_OUTCOME_YES), winner (the contract symbol that paid out, absent for any settlement other than YES/NO), and, if contract_symbol was given, won.

Args: event_symbol: The eventSymbol, e.g. "KALSHI.KXBTC15M-26OCT201200". outcome_id: The outcome to watch (outcomeId from get_event_details). May be omitted for an event with a single outcome, such as a 15-minute "Up or Down" window. contract_symbol: Optional contract you hold or bought, e.g. "KALSHI.KXBTC15M-26OCT201200-00.Y", to report whether it won. timeout_seconds: How long to wait in this call (0 to 120; default 60). 0 checks once.

NameRequiredDescriptionDefault
outcome_idNo
event_symbolYes
contract_symbolNo
timeout_secondsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses the long-poll timing model, the exact pending/timeout behavior, and the shape of the settled response including that `winner` is absent for non-YES/NO settlements. That conditional-absence detail is behavior an agent could not infer from annotations or schema.

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

Conciseness5/5

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

It is front-loaded with the purpose, then behavioral nuances, then per-argument notes. Every sentence adds information — the polling note and the response-field enumeration both directly affect how an agent calls and interprets the tool.

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

Completeness5/5

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

An output schema exists, so return values need not be spelled out, yet the description still clarifies the conditionally-present `winner`/`won` fields, which is the part most likely to be misread. Combined with complete parameter documentation and timeout semantics, nothing needed for correct invocation is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does: event_symbol with a concrete example, outcome_id's provenance and when it may be omitted, contract_symbol's format and purpose, and timeout_seconds' bounds (0–120), default (60), and the special meaning of 0.

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

Purpose5/5

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

The first sentence gives a specific verb (wait for) and resource (an event's outcome settlement) plus the returned information (which side won). It is distinguishable from siblings like get_event_details or get_event_summary by its blocking/polling semantics, and the conditional-response language reinforces that.

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

Usage Guidelines4/5

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

It clearly explains the polling contract: a 15-minute window may outlast one call, a timeout returns status "pending", and you should call again — plus timeout_seconds=0 means a single check. It also names get_event_details as the source of outcome_id. It stops short of explicitly ruling out alternatives (e.g. 'use get_event_summary for a one-shot read'), so not a 5.

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

Tool Schema Changelog

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

  1. 4 tool updatesv0.9.0
    • Addedbuy_event_contract
    • Addedget_current_event
    • Addedpreflight_buy_event_contract
    • Addedwait_for_settlement
  2. 6 tool updatesv0.8.0
    • Addedget_event_categories
    • Addedget_event_contract_bars
    • Addedget_event_details
    • Addedget_event_summary
    • Changedget_price_history1 field changed
      • changedInput schema / properties / instrument_type / enum
        Previous value: -[
        -  "EQUITY",
        -  "CRYPTO",
        -  "OPTION",
        -  "INDEX"
        -]New value: +[
        +  "EQUITY",
        +  "CRYPTO",
        +  "OPTION",
        +  "INDEX",
        +  "EVENTCONTRACT"
        +]
    • Addedsearch_orders
  3. 1 tool updatev0.7.0
    • Changedplace_order4 fields changed
      • addedInput schema / properties / order_class
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Order Class"
        +}
      • addedInput schema / properties / stop_loss_limit_price
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Stop Loss Limit Price"
        +}
      • addedInput schema / properties / stop_loss_stop_price
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Stop Loss Stop Price"
        +}
      • addedInput schema / properties / take_profit_limit_price
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Take Profit Limit Price"
        +}
  4. 4 tool updatesv0.6.1
    • Changedcancel_and_replace_order1 field changed
      • addedInput schema / properties / amount
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Amount"
        +}
    • Addedget_bond_details
    • Changedget_price_history1 field changed
      • addedInput schema / properties / ipo_date
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ipo Date"
        +}
    • Addedsearch_bonds
  5. 6 tool updatesv0.5.0
    • Addedget_strategy_quote
    • Addedget_tax_lots
    • Addedget_tax_lots_csv
    • Addedget_tax_lots_for_symbol
    • Changedplace_order1 field changed
      • addedInput schema / properties / tax_lot_matching_instructions
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Tax Lot Matching Instructions"
        +}
    • Changedpreflight_order1 field changed
      • addedInput schema / properties / tax_lot_matching_instructions
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Tax Lot Matching Instructions"
        +}
  6. 4 tool updatesv0.4.0
    • Removedget_historic_bars
    • Addedget_price_history
    • Changedplace_multileg_order4 fields changed
      • addedInput schema / $defs
        Added value: +{
        +  "OrderLeg": {
        +    "description": "One leg of a multi-leg options/equity order.",
        +    "properties": {
        +      "open_close_indicator": {
        +        "anyOf": [
        +          {
        +            "enum": [
        +              "OPEN",
        +              "CLOSE"
        +            ],
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "OPEN for new positions, CLOSE to close existing. Required for option legs.",
        +        "title": "Open Close Indicator"
        +      },
        +      "ratio_quantity": {
        +        "default": 1,
        +        "description": "Ratio between legs in the spread (default 1).",
        +        "title": "Ratio Quantity",
        +        "type": "integer"
        +      },
        +      "side": {
        +        "description": "Order side.",
        +        "enum": [
        +          "BUY",
        +          "SELL"
        +        ],
        +        "title": "Side",
        +        "type": "string"
        +      },
        +      "symbol": {
        +        "description": "Option OCC symbol (e.g. 'SPY260313P00670000') for options, or ticker (e.g. 'AAPL') for equity.",
        +        "title": "Symbol",
        +        "type": "string"
        +      },
        +      "type": {
        +        "description": "Instrument type.",
        +        "enum": [
        +          "EQUITY",
        +          "OPTION"
        +        ],
        +        "title": "Type",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "symbol",
        +      "type",
        +      "side"
        +    ],
        +    "title": "OrderLeg",
        +    "type": "object"
        +  }
        +}
      • addedInput schema / properties / legs / items / $ref
        Added value: +"#/$defs/OrderLeg"
      • removedInput schema / properties / legs / items / additionalProperties
        Removed value: -true
      • removedInput schema / properties / legs / items / type
        Removed value: -"object"
    • Changedpreflight_multileg_order4 fields changed
      • addedInput schema / $defs
        Added value: +{
        +  "OrderLeg": {
        +    "description": "One leg of a multi-leg options/equity order.",
        +    "properties": {
        +      "open_close_indicator": {
        +        "anyOf": [
        +          {
        +            "enum": [
        +              "OPEN",
        +              "CLOSE"
        +            ],
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "OPEN for new positions, CLOSE to close existing. Required for option legs.",
        +        "title": "Open Close Indicator"
        +      },
        +      "ratio_quantity": {
        +        "default": 1,
        +        "description": "Ratio between legs in the spread (default 1).",
        +        "title": "Ratio Quantity",
        +        "type": "integer"
        +      },
        +      "side": {
        +        "description": "Order side.",
        +        "enum": [
        +          "BUY",
        +          "SELL"
        +        ],
        +        "title": "Side",
        +        "type": "string"
        +      },
        +      "symbol": {
        +        "description": "Option OCC symbol (e.g. 'SPY260313P00670000') for options, or ticker (e.g. 'AAPL') for equity.",
        +        "title": "Symbol",
        +        "type": "string"
        +      },
        +      "type": {
        +        "description": "Instrument type.",
        +        "enum": [
        +          "EQUITY",
        +          "OPTION"
        +        ],
        +        "title": "Type",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "symbol",
        +      "type",
        +      "side"
        +    ],
        +    "title": "OrderLeg",
        +    "type": "object"
        +  }
        +}
      • addedInput schema / properties / legs / items / $ref
        Added value: +"#/$defs/OrderLeg"
      • removedInput schema / properties / legs / items / additionalProperties
        Removed value: -true
      • removedInput schema / properties / legs / items / type
        Removed value: -"object"
  7. 31 tool updatesv0.3.1
    • First observedcancel_and_replace_order
    • First observedcancel_order
    • First observedcheck_setup
    • First observedflatten_and_go_short
    • First observedget_accounts
    • First observedget_all_instruments
    • First observedget_historic_bars
    • First observedget_history
    • First observedget_instrument
    • First observedget_option_chain
    • First observedget_option_expirations
    • First observedget_option_greek
    • First observedget_option_greeks
    • First observedget_order
    • First observedget_orders
    • First observedget_portfolio
    • First observedget_quotes
    • First observedplace_call_credit_spread
    • First observedplace_call_debit_spread
    • First observedplace_multileg_order
    • First observedplace_order
    • First observedplace_put_credit_spread
    • First observedplace_put_debit_spread
    • First observedplace_short_order
    • First observedpreflight_call_credit_spread
    • First observedpreflight_call_debit_spread
    • First observedpreflight_multileg_order
    • First observedpreflight_order
    • First observedpreflight_put_credit_spread
    • First observedpreflight_put_debit_spread
    • First observedpreflight_short_order

TDQS

A3.8/5.0

Scored across 46 tools

Disambiguation3/5

The descriptions are unusually thorough and explicitly cross-reference sibling tools (get_orders vs search_orders, get_quotes vs get_price_history, preflight vs place), which resolves most boundary questions. However, several near-duplicate pairs remain: get_option_greek vs get_option_greeks, get_tax_lots vs get_tax_lots_for_symbol vs get_tax_lots_csv, and four preflight_*_spread tools whose names (call_credit/call_debit/put_credit/put_debit) map to bull/bear semantics only via the description. An agent can still misselect among the many order-placement variants.

Naming Consistency4/5

Strong verb_noun snake_case convention throughout: get_*, place_*, preflight_*, search_*, cancel_*, wait_for_*. Minor deviations like check_setup, flatten_and_go_short, and cancel_and_replace_order break the strict two-token pattern but remain readable and verb-first.

Tool Count2/5

46 tools is heavy for a single server, well above the 25-tool comfort threshold. Much of the bulk is redundant surface: eight spread tools (four preflight + four place) that could be one parameterized tool, plus a singular/plural Greeks pair. The domain is genuinely broad (equities, options, crypto, bonds, prediction markets), so some size is justified, but the set is over-expanded.

Completeness4/5

Coverage is impressive: accounts, instruments, quotes, price history, full order lifecycle (place, preflight, cancel, replace, search, get), portfolio, tax lots, option chains/Greeks, bonds, and event contracts. Minor gaps: prediction markets support buying event contracts but no sell/close path, and there is no dedicated position-lookup or close-position tool beyond the portfolio snapshot.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    F
    maintenance
    This MCP server interacts with the Interactive Brokers API to fetch portfolio details, enabling portfolio management through natural language.
    65
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server implementation for Alpaca's Trading API that enables LLMs to interact with Alpaca's trading infrastructure using natural language, supporting stock, options, and crypto trading, portfolio management, watchlists, and market data.
    4
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that lets you talk to your AI trading assistant in plain English to research stocks, generate trade recommendations, manage a portfolio, and execute trades through natural language.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that wraps the Trading 212 Public API, enabling AI agents to interact with your Trading 212 brokerage account through natural language.
    16
    MIT