Skip to main content
Glama
johnamcruz

projectx-mcp

by johnamcruz

projectx-mcp

An MCP server that gives a reasoning model (Claude, ChatGPT, or any MCP client) access to TopstepX so it can trade futures for you.

The model connects through the ProjectX Gateway API, which powers TopstepX. It can read market data, place and manage orders, and track its positions and P&L. It also keeps a trading journal, so it can review its own trades and learn across sessions.

WARNING

This software lets an AI place real orders on your account. Futures trading involves substantial risk of loss. AI models make mistakes: they misread data, hallucinate prices, and ignore instructions. Start with trading disabled, then use a practice or evaluation account, micro contracts, and tight guardrails. Watch the model trade before you trust it. You are responsible for every order it places.

What the model gets

Area

Tools

Session

get_server_config: is trading enabled, and what are the guardrails

Accounts

list_accounts, get_account_snapshot (balance, positions, working orders, today's P&L vs. the loss limit)

Market data

search_contracts, get_contract, list_available_contracts, get_bars (historical OHLCV), get_quote (real-time over SignalR)

Trading

place_order (market, limit, stop, trailing stop, join bid/ask, with optional brackets), modify_order, cancel_order, close_position, partial_close_position

History

list_open_orders, search_orders, list_open_positions, search_trades

Learning

get_performance (win rate, expectancy, profit factor, by contract), journal_add, journal_read

The server also sends the model an operating guide: the projectx://guide resource (AGENTS.md), the MCP server instructions, and a trading_session prompt. The guide covers the session loop (plan → trade → review → lesson), risk rules, and API details that commonly cause mistakes (for example, trailPrice is a price level, not a distance).

How the model learns

Every place_order call requires a rationale, which is saved to a local journal (~/.projectx-mcp/journal.jsonl) with the result. The model is told to:

  1. read its past lesson and review entries at the start of each session,

  2. write a plan before trading,

  3. write a review after each exit, graded against the plan and get_performance,

  4. record short, evidence-based lesson entries for future sessions.

The model's weights don't change. It improves because it reads its own track record back each session.

Guardrails the model cannot override

These are enforced in the server, before any request reaches TopstepX:

Setting

Default

Effect

PROJECTX_TRADING_ENABLED

false

Order tools are refused unless this is true. Read-only tools always work.

PROJECTX_ALLOWED_ACCOUNT_IDS

any

Only these accounts can be traded.

PROJECTX_ALLOWED_SYMBOLS

any

Contract roots as they appear in contract IDs, e.g. MNQ,MES (CON.F.US.MNQ.Z25 → MNQ; note that E-mini NQ is ENQ and ES is EP).

PROJECTX_MAX_ORDER_SIZE

1

Maximum contracts per order.

PROJECTX_MAX_POSITION_SIZE

2

Maximum absolute net position per contract, counting resting same-side limit orders. Orders that reduce the position are always allowed.

PROJECTX_MAX_DAILY_LOSS

500

Once realized P&L after fees for the trading day (from 17:00 CT) reaches −this amount, only orders that reduce the position are allowed. 0 turns it off. Set it below your Topstep daily loss limit.

Blocked orders are journaled as order_blocked so the model can review them.

Related MCP server: XBTFX MCP Trading Server

Setup

Requires Node.js 20.12 or later.

git clone <this repo> projectx-mcp && cd projectx-mcp
npm install
npm run build
cp .env.example .env    # then edit .env

Credentials

  1. Sign in to TopstepX and open Settings → API (topstepx.com/settings?tab=api). Create an API key. The API needs an active ProjectX API subscription.

  2. Set PROJECTX_USERNAME to your platform login username. Don't use your email or an account name.

  3. Set PROJECTX_API_KEY to the key.

Put these in .env (git-ignored), or in the env block of your MCP client config as shown below. Variables in the client config take precedence over .env. Set PROJECTX_ENV_FILE to load a .env from somewhere else. The server logs in, stores the session token, and refreshes it before the 24-hour expiry. It never shows the key or token to the model.

For another ProjectX-powered firm, set PROJECTX_API_URL and PROJECTX_MARKET_HUB_URL to that firm's connection URLs.

See .env.example for every option.

Use with Claude

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "projectx": {
      "command": "node",
      "args": ["/absolute/path/to/projectx-mcp/dist/index.js"],
      "env": {
        "PROJECTX_USERNAME": "your-username",
        "PROJECTX_API_KEY": "your-api-key",
        "PROJECTX_TRADING_ENABLED": "false",
        "PROJECTX_ALLOWED_SYMBOLS": "MNQ,MES",
        "PROJECTX_MAX_ORDER_SIZE": "1",
        "PROJECTX_MAX_POSITION_SIZE": "1",
        "PROJECTX_MAX_DAILY_LOSS": "300"
      }
    }
  }
}

Restart Claude Desktop. projectx appears in the tools menu. To start, pick the trading_session prompt from the + menu, or ask: "Read projectx://guide, then check my TopstepX accounts and plan a session on MNQ."

Claude Desktop asks before each tool call by default. Keep that on until you trust the setup; it lets you approve every order.

Claude Code

claude mcp add projectx \
  --env PROJECTX_USERNAME=your-username \
  --env PROJECTX_API_KEY=your-api-key \
  --env PROJECTX_TRADING_ENABLED=false \
  -- node /absolute/path/to/projectx-mcp/dist/index.js

Then run /mcp in Claude Code to confirm it's connected. Add --scope user to make it available in every project.

Claude.ai (web or mobile)

Claude.ai connects to remote servers only. Run the HTTP transport (see Remote access), then add a custom connector under Settings → Connectors with the URL https://<your-host>/mcp/<MCP_HTTP_AUTH_TOKEN>.

Use with ChatGPT

ChatGPT connects to remote MCP servers over HTTPS only, so this takes two steps.

1. Run the server over HTTP and expose it with a tunnel.

# in .env: credentials plus
MCP_HTTP_AUTH_TOKEN=$(openssl rand -hex 32)   # paste the generated value

npm run start:http                              # listens on http://127.0.0.1:8787/mcp
cloudflared tunnel --url http://127.0.0.1:8787  # or: ngrok http 8787

The tunnel prints a public https://… URL.

2. Add it to ChatGPT. Turn on Developer mode (Settings → Apps & Connectors → Advanced settings), then create a connector:

  • MCP server URL: https://<tunnel-host>/mcp/<MCP_HTTP_AUTH_TOKEN>

  • Authentication: No authentication. The token in the URL is the credential.

Start a chat, enable the connector, and use a reasoning model. Ask it to "Read the projectx guide resource and follow its session loop." ChatGPT asks you to confirm write actions (place_order and similar), because those tools are annotated as destructive.

ChatGPT's menu names change from time to time. If these steps don't match what you see, check OpenAI's current documentation for connecting MCP servers or apps.

Remote access (HTTP)

  • npm run start:http (or MCP_TRANSPORT=http) serves Streamable HTTP at /mcp and a health check at /healthz.

  • MCP_HTTP_AUTH_TOKEN is required (16+ characters). Clients send Authorization: Bearer <token>, or put the token in the path (/mcp/<token>) if they can't set headers. Anyone with the token can trade your account. Treat the URL as a password and rotate the token if it leaks.

  • HOST and PORT default to 127.0.0.1:8787. Keep the loopback bind and expose it through a tunnel instead of binding to 0.0.0.0.

  1. Read-only. PROJECTX_TRADING_ENABLED=false. Let the model analyze, plan, and journal hypothetical trades.

  2. Practice account. Enable trading, set PROJECTX_ALLOWED_ACCOUNT_IDS to a practice or combine account, micros only, size 1, and approve each order by hand.

  3. Supervised autonomy. Loosen approvals only after the journal and get_performance show consistent, rule-following behavior over many trades.

Development

npm run dev        # run from source with tsx (stdio)
npm test           # unit tests (Vitest)
npm run coverage   # tests + coverage report (thresholds enforced)
npm run typecheck

Every module in src/ has unit tests in test/, except index.ts, which only wires dependencies together. Each MCP tool is exercised through an in-memory MCP client against a fake ProjectX API, so the tests never touch the real API. See AGENTS.md for code layout and conventions.

Postman

postman/ProjectX.postman_collection.json has example ProjectX requests. Import it, set the collection variables username, apiKey, and accountId, and run Authenticate first. It saves the token to {{token}} for the other requests.

References

License

Apache-2.0. See LICENSE.

Available Tools

20 tools
cancel_orderCancel orderA
Destructive

Cancel a working order. Simulated (non-follower) accounts only.

ParametersJSON Schema
NameRequiredDescriptionDefault
orderIdYes
accountIdYesTrading account ID from list_accounts.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the description need not restate mutation/destruction. The description adds the account-type restriction, which is a usage constraint rather than behavioral disclosure. With annotations covering the destructive nature, the description's contribution is minimal but not misleading, so a 3 is appropriate.

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

Conciseness5/5

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

The description is a single, front-loaded sentence that states the action and the critical constraint with zero filler. Every word earns its place, making it efficient and easy to parse.

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 simple two-parameter tool with annotations and no output schema, the description covers the essential context: the operation and the simulated-accounts restriction. It does not explain 'working order' or the exact meaning of orderId, but these are likely implicit given the domain. Minor gaps remain, but overall it is adequate.

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

Parameters2/5

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

Schema coverage is 50%: accountId has a useful description ('Trading account ID from list_accounts'), but orderId has none. The tool description provides no parameter-specific information and does not compensate for the missing orderId description. An agent would have to infer orderId's meaning from the tool name, which is not explicit.

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 ('Cancel a working order') with a specific verb and resource, distinguishing it from siblings like modify_order and close_position. The explicit constraint 'Simulated (non-follower) accounts only' further sharpens the purpose and differentiates it from any follower-account order 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 provides an explicit condition for use: 'Simulated (non-follower) accounts only.' This tells the agent when the tool is applicable, but it does not mention alternatives or when not to use it beyond that condition. Still, it gives clear context that narrows the selection among siblings.

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

close_positionClose positionA
Destructive

Flatten the whole position in a contract at market. Does NOT cancel resting stop/target orders; check list_open_orders and cancel leftovers.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoWhy; saved to the journal.
accountIdYesTrading account ID from list_accounts.
contractIdYesContract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already signal mutation/destruction, but the description adds crucial behavior beyond that: the close executes at market and does NOT cancel resting stop/target orders. It also instructs the agent to check and cancel leftovers, which materially changes how the tool should be used.

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 short sentences with no filler: the main action comes first, and the critical caveat and follow-up action are second. Every sentence adds operational value.

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

Completeness5/5

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

For a destructive market-close tool with rich schema descriptions and safety annotations, the description covers what the tool does, what it does not do, and what to do next. No output schema exists, but an agent has enough to invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents accountId, contractId, and reason. The description reinforces that contractId refers to the contract whose whole position is flattened, but it does not add substantial parameter-level meaning beyond the schema.

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

Purpose5/5

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

States a specific verb and resource: flatten the whole position in a contract at market. 'Whole' and 'at market' clearly distinguish this from partial_close_position and other order-related siblings.

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 it (flatten whole position) and an explicit behavioral warning with follow-up routing to list_open_orders and cancel_order. It does not explicitly name partial_close_position as the alternative for partial closes, but 'whole position' makes that boundary clear.

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

get_account_snapshotAccount snapshotA
Read-only

One-call view of an account: balance, open positions, working orders, and today's realized P&L (trading day starts 17:00 America/Chicago) versus the daily loss limit. Use this to monitor between decisions.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesTrading account ID from list_accounts.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the description does not need to restate safety. It adds valuable context by specifying the included fields and defining the trading day boundary (17:00 America/Chicago), which affects how realized P&L and the loss limit should be interpreted.

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 with no filler: the first packs the full content list plus the timezone qualifier, and the second states the intended use. The most decision-relevant information is front-loaded.

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

Completeness5/5

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

For a single-parameter read-only snapshot, the description adequately covers inputs, output contents, and usage context. The lack of an output schema is mitigated by the explicit enumeration of the snapshot's components.

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

Parameters3/5

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

The only parameter, accountId, already has a descriptive schema entry ('Trading account ID from list_accounts'), and schema description coverage is 100%. The description adds no extra parameter-level detail, so the baseline 3 applies.

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

Purpose5/5

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

The description opens with 'One-call view of an account' and enumerates the exact contents: balance, open positions, working orders, today's realized P&L, and daily loss limit. This clearly distinguishes it from narrower siblings like list_open_positions or get_performance by emphasizing the composite snapshot nature.

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 closing instruction, 'Use this to monitor between decisions,' gives a clear usage context for a monitoring tool. It does not explicitly name alternatives or state when not to use it, but the intended context is unambiguous enough for an agent.

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

get_barsHistorical barsB
Read-only

OHLCV bars for a contract, returned oldest→newest. t=bar open time (UTC), o/h/l/c=prices, v=volume. Defaults: endTime=now, startTime chosen to cover limit bars. Max 20,000 bars; rate limit 50 requests / 30s.

ParametersJSON Schema
NameRequiredDescriptionDefault
liveNo
unitNominute
limitNo
endTimeNo
startTimeNo
contractIdYesContract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts.
unitNumberNoBar size in units, e.g. unit=minute unitNumber=5 → 5-minute bars.
includePartialBarNo

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already mark the operation as read-only, and the description adds genuinely useful behavioral context: max 20,000 bars, rate limit 50 requests per 30 seconds, default endTime=now, default startTime covering limit bars, and UTC timestamps. This goes well beyond the annotations and helps an agent predict limits and side effects.

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 information-dense sentences with no repetition or filler. The core purpose is front-loaded, followed by field meanings and then limits/defaults.

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

Completeness2/5

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

This is an 8-parameter tool with no output schema, and the description is not complete enough. live and includePartialBar are never explained, and the output structure is only partially covered via field labels. The defaults and limits are useful, but an agent cannot fully reason about live bars or partial-bar behavior.

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

Parameters2/5

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

Schema description coverage is only 25%, so the description carries extra responsibility. It explains endTime/startTime defaults and the limit cap, but it leaves live, includePartialBar, and unit semantics essentially unexplained in both the description and the 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 identifies the operation as retrieving OHLCV bars for a contract and adds ordering ('oldest→newest'), so an agent can tell it apart from quote or contract tools. It does not explicitly contrast itself with get_quote, but the historical-bars framing is strong enough.

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 implies this tool is for historical OHLCV data, but it provides no explicit when-to-use or when-not-to-use guidance versus siblings like get_quote or search_contracts. Defaults and limits are operational details, not selection criteria.

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

get_contractGet contractA
Read-only

Look up one contract by ID (tick size, tick value, whether it is the active month).

ParametersJSON Schema
NameRequiredDescriptionDefault
contractIdYesContract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so safety is covered. The description adds cardinality ('one contract') and specific returned fields, but does not disclose error behavior or what happens for an invalid ID. This is acceptable but not rich behavioral context.

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

Conciseness5/5

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

A single, tight sentence that front-loads the action and resource while packing the relevant returned attributes into a parenthetical. There is no filler or repeated title text.

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 simple one-parameter lookup with read-only annotations, the description and schema provide enough for correct invocation. The absence of an output schema is partially mitigated by listing the returned fields, though the full return shape is not disclosed.

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

Parameters4/5

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

Schema coverage is 100%, so the parameter is fully documented in the schema. The parameter description adds real value beyond the schema by providing a concrete example ID and telling the agent to source it from search_contracts.

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 ('Look up'), a specific resource ('one contract by ID'), and the key returned attributes (tick size, tick value, active month). This clearly differentiates it from list/search contract tools and leaves no ambiguity about what the tool does.

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

Usage Guidelines4/5

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

The parameter description gives explicit workflow guidance: contractId should be obtained from search_contracts. The phrase 'by ID' makes it clear this is for resolving a known contract rather than discovering contracts, though it does not explicitly name alternatives or exclusions.

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

get_performancePerformance statisticsA
Read-only

Win rate, net P&L after fees, average win/loss, profit factor, expectancy, overall and per contract, for a time window (default: current trading day). Use it to grade your own trading.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesTrading account ID from list_accounts.
endTimestampNo
startTimestampNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, reducing the burden on the description. The description adds useful behavioral context: metrics are net of fees, and the time window defaults to the current trading day. 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 a single, tight sentence that front-loads the key metrics and ends with a clear usage cue. No filler, no repetition of schema details, and every phrase contributes value.

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 no output schema, the description compensates by listing the returned performance metrics. It also notes the default time window and fee adjustment. Minor gaps remain around timestamp interpretation and per-contract grouping semantics, but for a read-only statistics tool this is reasonably complete.

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

Parameters3/5

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

Only accountId has a schema description (33% coverage), so the description must compensate for the undocumented startTimestamp and endTimestamp. It does add meaning by explaining the 'time window' concept and the default (current trading day), but it omits details like timezone handling or inclusivity. Partial compensation.

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 enumerates specific performance metrics—win rate, net P&L after fees, average win/loss, profit factor, expectancy—and clarifies scope as 'overall and per contract' over a time window. This clearly identifies the resource and distinguishes it from siblings like get_quote or get_bars, even without an explicit verb.

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?

'Use it to grade your own trading' provides clear contextual intent for when the tool is appropriate. It does not explicitly name alternatives or exclusions, but the performance-statistics framing is distinct enough among the sibling tools to guide selection.

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

get_quoteLive quoteA
Read-only

Latest real-time quote (lastPrice, bestBid, bestAsk, session open/high/low, volume) from the market hub. Returns null quote if none arrives within the timeout (e.g. market closed).

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutMsNo
contractIdYesContract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts.

TDQS

A4.1/5.0
Behavior4/5

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

The annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds meaningful behavioral detail beyond the annotations by specifying that a null quote is returned when no quote arrives within the timeout (e.g., market closed), which is important for handling non-responsive markets.

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 with no filler: the first states exactly what is returned and the field list, the second handles the edge case. The most important information is front-loaded, and every sentence earns 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?

With no output schema, the description compensates by listing the returned quote fields and the null-quote behavior. Combined with the schema's contractId guidance and timeoutMs bounds, an agent has enough information to call the tool correctly and interpret its result in a realistic failure case.

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

Parameters3/5

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

Schema description coverage is only 50%; contractId is well documented in the schema, but timeoutMs is only given type/default/min/max. The description indirectly clarifies timeoutMs by mentioning 'within the timeout', but it does not explicitly state that timeoutMs is the maximum wait time in milliseconds, leaving the agent to infer that from context.

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

Purpose5/5

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

The description names a specific verb and resource ('Latest real-time quote ... from the market hub') and enumerates the returned fields (lastPrice, bestBid, bestAsk, session open/high/low, volume), which clearly distinguishes it from siblings like get_bars or get_contract. No ambiguity remains about what the tool does.

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

Usage Guidelines3/5

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

The description makes the intended use case clear — fetching the latest real-time quote — and implies this is the right tool for that purpose. However, it does not explicitly contrast itself with alternatives such as get_bars for historical data or get_contract for contract details, nor 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_server_configServer config and guardrailsA
Read-only

Show whether trading is enabled and the risk guardrails this server enforces (max order size, max position, daily loss limit, allowed accounts/symbols). Call this first in every session.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 openWorldHint=true, so the safety profile is covered. The description adds value by specifying the exact guardrail fields returned, which gives the agent concrete expectations 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 a single, dense sentence that packs all relevant information without filler. It is front-loaded with the main purpose and then lists specifics, making it efficient and 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?

With no output schema, the description compensates by explicitly listing all key output fields (trading enabled, guardrails, allowed accounts/symbols). For a zero-parameter config tool, this is complete and sufficient for an agent to understand what it will receive.

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

Parameters4/5

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

There are 0 parameters, and schema coverage is 100% vacuously. Per the rubric, 0 params baseline is 4. No parameter info is needed, and the description correctly focuses on output.

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 uses a specific verb ('show') and resource ('server config and guardrails'), and explicitly lists the fields returned (trading enabled, max order size, max position, daily loss limit, allowed accounts/symbols). This clearly distinguishes it from trading tools like get_quote or place_order.

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 instructs 'Call this first in every session', which is a clear when-to-use directive. It doesn't mention alternatives or when not to use, but the instruction is strong and contextually sufficient.

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

journal_addWrite to trading journalA

Persist your reasoning so future sessions can learn from it. kinds: plan (pre-session thesis), entry, exit, review (post-trade grading: what happened vs. plan), lesson (a durable rule you want future-you to follow), note.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes
tagsNoFree-form, e.g. ["breakout", "MNQ", "mistake:chased"].
textYes
orderIdNo
accountIdNoTrading account ID from list_accounts.
contractIdNoContract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already establish that this is a non-destructive write (readOnlyHint=false, destructiveHint=false). The description adds the useful behavioral context that entries persist for future sessions. No contradiction with annotations. However, it does not disclose what the tool returns after persisting (there is no output schema), and says nothing about appending versus overwriting behavior.

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 is front-loaded in a single opening clause, followed by a compact and efficient taxonomy. Every element earns its place and there is no filler. The dense kind list is slightly less scannable than a bulleted form would be, but it remains appropriately sized.

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 kind ordering implies a full trading workflow (plan → entry → exit → review → lesson), which provides strong context for when entries get written. Since no output schema exists, the lack of any statement about the return value is a modest gap, as is the absence of guidance on linking entries to trades via orderId/contractId/accountId.

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 schema coverage at 50%, the description compensates by richly explaining the most important required parameter, kind, which the schema lists only as bare enum values. The parenthetical definitions ("review (post-trade grading...)") add real semantic value. The remaining parameters are mostly covered by schema descriptions referencing list_accounts and search_contracts, though text and orderId get no added meaning.

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

Purpose4/5

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

The description states a specific verb and resource: "Persist your reasoning so future sessions can learn from it." The kind taxonomy (plan, entry, exit, review, lesson, note) further sharpens what the tool is for. It reads clearly as the write counterpart to journal_read and is distinct from trade-execution tools, though it never explicitly names its siblings.

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 per-kind definitions give meaningful when-to-write guidance (e.g., "pre-session thesis," "post-trade grading: what happened vs. plan"), which helps an agent decide what to log. However, there is no explicit statement of when not to use this tool or when to prefer an alternative such as journal_read or place_order; the differentiation is implied rather than stated.

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

journal_readRead trading journalA
Read-only

Read past journal entries (newest last). Start each session with journal_read({kind:"lesson"}) and recent reviews so you do not repeat mistakes.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNo
kindNo
limitNo
sinceNo
contractIdNoContract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful behavioral detail about ordering and a recommended workflow, but it does not disclose return format, pagination behavior, or what happens when no entries match. 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.

Conciseness5/5

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

Two sentences with no filler. The core action and ordering are front-loaded, and the second sentence provides actionable workflow guidance. Every word earns its place.

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

Completeness2/5

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

There is no output schema, so the description should explain what the tool returns, but it does not. It also omits most parameter semantics and filtering behavior, leaving the agent to infer how tag, limit, since, and contractId affect results. The workflow tip is helpful but not sufficient for a 5-parameter tool.

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

Parameters2/5

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

Schema description coverage is only 20% (only contractId is described). The description mentions kind values 'lesson' and 'review' but leaves tag, limit, and since largely unexplained. With such low schema coverage, the description needed to compensate and did not.

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 ('Read'), a clear resource ('past journal entries'), and an ordering guarantee ('newest last'). It also distinguishes itself from the sibling journal_add by framing this as the read counterpart.

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 gives explicit guidance to start each session with journal_read({kind:'lesson'}) and recent reviews, which is a concrete when-to-use instruction. It does not mention exclusions or alternatives, but there is no other read-journal sibling, so the context is sufficient.

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

list_accountsList accountsC
Read-only

List trading accounts on this login with balance and canTrade flag.

ParametersJSON Schema
NameRequiredDescriptionDefault
onlyActiveAccountsNo

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is known. The description adds useful context about scope ('on this login') and the return fields, but it does not disclose effects of the onlyActiveAccounts default or any other behavioral details. 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.

Conciseness5/5

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

A single sentence with no filler, front-loaded with the verb and resource. Every word adds meaning, and the structure is immediately scannable.

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

Completeness2/5

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

The tool has no output schema and one undocumented parameter. The description partially covers return values (balance, canTrade flag) but omits how onlyActiveAccounts affects results and any other response structure. For an agent to invoke this confidently, additional context is needed.

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

Parameters1/5

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

Schema description coverage is 0%, and the description does not mention the onlyActiveAccounts parameter at all. With only a name, type, and default in the schema, the agent receives no explanation of what the parameter controls.

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 a specific verb ('List'), a resource ('trading accounts on this login'), and the included fields ('balance and canTrade flag'). This differentiates it from account-detail tools like get_account_snapshot, but it does not explicitly name or contrast any sibling tool.

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?

The description provides no guidance on when to use this tool versus alternatives such as get_account_snapshot or list_open_positions. There is no context about prerequisites, exclusions, or when another tool would be more appropriate.

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

list_available_contractsList available contractsA
Read-only

List every contract available to trade. Large output; prefer search_contracts when you know the symbol.

ParametersJSON Schema
NameRequiredDescriptionDefault
liveNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true, so the read-only nature is known. The description adds a useful operational detail: 'Large output' warns about performance/response size. It also implies an exhaustive listing behavior, which goes beyond the structured annotations.

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

Conciseness5/5

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

Two concise sentences with no filler. The core behavior is stated first, and the alternative-tool guidance is delivered efficiently. Every sentence earns its place.

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?

The tool is simple and low-complexity, but the 'live' parameter is unexplained and there is no output schema. The description gives enough to understand the basic purpose, but an agent cannot confidently know how the live flag changes results or what exactly the large output will contain.

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

Parameters2/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 for the undocumented 'live' parameter. It does not mention the parameter at all, leaving its meaning and effect ambiguous. The schema only provides type/default, which is insufficient for confident invocation.

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: 'List every contract available to trade.' It clearly distinguishes itself from search_contracts by emphasizing exhaustive scope ('every contract') versus a targeted lookup, so an agent can tell tools apart.

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?

The description gives an explicit routing rule: 'prefer search_contracts when you know the symbol.' It also implies this tool is for broad exploration, not targeted lookups, which is exactly the guidance needed for tool selection.

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

list_open_ordersOpen ordersA
Read-only

Working orders on an account (includes bracket stop/target legs).

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesTrading account ID from list_accounts.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only nature is known. The description adds the useful nuance that bracket stop/target legs are included, but it does not disclose other behavioral aspects like rate limits, error conditions, or output format 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?

A single sentence with a parenthetical nuance. It is concise, front-loaded with the core purpose, and contains no filler.

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?

For a simple read-only query tool, the description is adequate but minimal. Without an output schema, it does not mention return fields, ordering, or pagination, leaving an agent to infer the response shape from the tool name and the 'working orders' phrase.

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

Parameters3/5

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

Schema coverage is 100% and the parameter description clearly explains accountId as the trading account ID from list_accounts. The tool description merely reinforces that the scope is an account, adding no new semantic detail beyond the 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 indicates the tool provides working/open orders for an account, including bracket stop/target legs. It distinguishes from sibling actions like cancel_order and place_order by focusing on a listing operation, though it does not explicitly name search_orders as an alternative.

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: it is for viewing working orders on a specific account. However, there is no explicit guidance on when to choose this over search_orders (which may cover broader order queries) or 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.

list_open_positionsOpen positionsB
Read-only

Open positions on an account. direction is long/short; averagePrice is the entry.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesTrading account ID from list_accounts.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not need to restate safety. The description adds a small behavioral detail by defining direction and averagePrice, which clarifies the returned data. It does not disclose pagination, ordering, or whether only currently open positions are returned, but for a simple read-only list tool this is acceptable.

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 two short sentences and front-loads the core purpose. The second sentence adds useful field definitions without bloat. It is concise and every sentence earns its place.

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?

For a simple read-only list tool with one parameter and no output schema, the description is mostly complete. It lacks explicit return-value details, but the field definitions hint at the output shape. The absence of pagination or filtering details is a minor gap given the tool's simplicity.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents accountId. The description adds no additional parameter semantics beyond the schema, but the baseline of 3 applies because the schema carries the full burden.

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

Purpose4/5

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

The description states a clear verb and resource: 'Open positions on an account.' It also clarifies the meaning of two fields (direction, averagePrice), which helps distinguish this from related tools like list_open_orders or close_position. However, it does not explicitly differentiate from siblings such as get_account_snapshot, which may also include position data.

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 implies usage by naming the account context and the required accountId parameter, and the schema notes the accountId comes from list_accounts. There is no explicit when-to-use guidance or mention of alternatives, but the tool's purpose is straightforward enough that an agent can infer when to call it.

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

modify_orderModify orderA
Destructive

Change size or price of a working order (e.g. move a stop to breakeven). trailPrice is an absolute price level; unlike place_order there is no max-distance check, so double-check it.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNo
reasonNoWhy; saved to the journal.
orderIdYes
accountIdYesTrading account ID from list_accounts.
stopPriceNo
limitPriceNo
trailPriceNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already signal mutation and destructiveness, so the description adds value by warning about the lack of a max-distance check and clarifying that trailPrice is an absolute price level. This goes beyond what readOnlyHint/destructiveHint provide.

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 concise sentences, front-loaded with the core purpose and followed by a targeted warning. Every sentence earns its place with no filler.

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

Completeness2/5

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

With seven parameters, low schema description coverage, no output schema, and a destructive action, the description is too sparse to fully guide correct invocation. It omits important context such as how partial updates work, which fields may conflict, and what errors or side effects to expect.

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

Parameters3/5

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

Schema description coverage is low at 29%, and the description partially compensates by explaining trailPrice and grouping size/price intent. However, stopPrice, limitPrice, orderId, and optional-field semantics remain undocumented in both schema and description, so coverage is incomplete.

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 ('Change') and resource ('size or price of a working order'), with a concrete example ('move a stop to breakeven'). It also distinguishes itself from place_order, which helps disambiguate from the closest sibling.

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 makes clear this tool is for modifying an existing working order and explicitly contrasts it with place_order by calling out the missing max-distance check. It does not enumerate exclusions like canceling or closing orders, but the usage context is clear.

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

partial_close_positionPartially close positionA
Destructive

Close part of a position at market (scale out).

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeYes
reasonNo
accountIdYesTrading account ID from list_accounts.
contractIdYesContract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already convey that this is destructive and not read-only, and the description adds that execution happens at market rather than as a limit order. It does not contradict the annotations, but it does not disclose additional behavioral details such as partial-fill risk, impact on remaining position, or requirements like an existing position.

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 a single, efficient sentence with no filler. Key qualifiers ('part', 'at market', 'scale out') are front-loaded and every word adds value.

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

Completeness2/5

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

For a destructive trading action with no output schema, the description is too thin: it does not state expected response behavior, size limits, or prerequisites such as an existing open position. The schema covers param sources but not the semantics of the size and reason fields, leaving an agent under-equipped to call this correctly.

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

Parameters2/5

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

Schema descriptions cover only accountId and contractId, leaving size and reason undocumented, and the tool description does not compensate. 'Part of a position' hints that size is the partial quantity, but the description does not clarify size units, constraints relative to the open position, or the purpose of reason.

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 uses a specific verb ('Close'), resource ('position'), and qualifiers ('part', 'at market', 'scale out'), making the purpose immediately clear. It also distinguishes itself from the sibling close_position by explicitly limiting the action to a partial close.

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 phrase 'Close part of a position' implies the use case of scaling out versus fully closing, but it does not explicitly name close_position or state when not to use this tool. The guidance is present only by implication rather than as an explicit routing rule.

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

place_orderPlace orderA
Destructive

Submit an order. side: buy|sell. type: market | limit (needs limitPrice) | stop (needs stopPrice) | trailing_stop (needs trailPrice = absolute price level, NOT a distance) | join_bid | join_ask. Brackets (stopLossBracket/takeProfitBracket, in ticks) only work if the account uses Auto OCO Brackets; otherwise place a separate stop order after the fill. Server guardrails may block the order. rationale is required and saved to the journal so you can learn from the outcome.

ParametersJSON Schema
NameRequiredDescriptionDefault
sideYes
sizeYes
typeYes
accountIdYesTrading account ID from list_accounts.
customTagNoMust be unique across the account.
rationaleYesWhy this trade: setup, invalidation (where the stop is and why), target, and expected risk in $.
stopPriceNo
contractIdYesContract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts.
limitPriceNo
trailPriceNo
stopLossBracketNo
takeProfitBracketNo

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already mark the call as non-read-only and destructive, and the description adds meaningful behavior beyond that: guardrails may reject the order, bracket support depends on the account configuration, trailPrice is an absolute level rather than a distance, and rationale is persisted to the journal. No contradiction with the annotations.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: order types, price prerequisites, bracket caveat, guardrail warning, and rationale side effect. It is front-loaded with the verb and uses compact notation to avoid unnecessary prose.

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 12-parameter, 6-required, no-output-schema trading tool with destructive annotations, this description is largely complete for invocation: it covers conditional requirements, an important account-level dependency, and an execution guardrail. The main gap is that it does not describe the expected return value after a successful submission.

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 only 33% schema description coverage, the description carries important parameter meaning: it maps each order type to its required price field, clarifies trailPrice semantics, and confirms brackets are measured in ticks. It does not discuss every parameter, but the schema already handles accountId, contractId, customTag, and rationale.

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 opens with 'Submit an order' and then enumerates every supported order type with its conditions, making it clear this is the create-new-order tool rather than modify_order, cancel_order, or close_position. It does not explicitly name those siblings, but the semantic contrast and order-type detail make the purpose unambiguous.

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 provides explicit conditional guidance: brackets only work when Auto OCO Brackets is enabled, and otherwise the agent should place a separate stop order after the fill. It also warns that server guardrails may block the order. Broader selection rules against modify/cancel/close siblings are not stated, so it stops short of full when/when-not coverage.

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

search_contractsSearch contractsA
Read-only

Find tradable contracts by text, e.g. "MNQ", "ES", "CL". Returns up to 20 with id, tickSize, tickValue (USD per tick per contract) and activeContract. Trade the activeContract=true front month.

ParametersJSON Schema
NameRequiredDescriptionDefault
liveNoUse the live data subscription instead of sim. Usually false.
searchTextYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark this as read-only and open-world, so the description only needs to add behavioral context beyond that. It does: returns up to 20 results, exposes id/tickSize/tickValue/activeContract, and specifies tickValue units. 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.

Conciseness5/5

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

Two dense sentences with no fluff. The core search behavior and examples come first, followed by the result cap, fields, and a practical trading note. Every sentence earns 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 simple two-parameter, read-only search tool without an output schema, the description is complete: it explains how to search, what is returned, the result limit, and which returned contract is actionable. Nothing critical is missing.

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

Parameters4/5

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

Schema coverage is only 50% because searchText lacks a description, but the description compensates by explaining searchText through examples. The live parameter is already described in the schema. Together, both parameters receive enough meaning for correct invocation.

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: 'Find tradable contracts by text'. It gives concrete examples (MNQ, ES, CL) and describes the result fields, which clearly distinguishes it from siblings like list_available_contracts and get_contract.

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 intended use case is clear: search for contracts by text symbol. However, it never explicitly contrasts this with alternatives such as list_available_contracts or get_contract, nor does it say when not to use this tool. Some guidance is implied by the 'Trade the activeContract=true front month' note, but exclusions are absent.

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

search_ordersOrder historyB
Read-only

Orders created in a time window (any status). For trailing stops, trailPrice here is the trail distance in price, not a level.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesTrading account ID from list_accounts.
endTimestampNo
startTimestampYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral detail beyond annotations: results include all statuses, and trailPrice is defined as a trail distance rather than a level. This prevents misinterpretation of returned data.

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 short sentences front-load the primary function and then add a single targeted caveat. There is no filler, and every sentence earns its place.

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?

The description covers the core query semantics and one important output nuance, but with no output schema it leaves the return shape, ordering, and pagination unspecified. It also does not clarify the behavior of the optional endTimestamp parameter. These are noticeable gaps for an agent invoking the tool.

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

Parameters2/5

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

Schema description coverage is only 33%, with only accountId described. The description mentions a time window, which loosely maps to startTimestamp/endTimestamp, but it does not explain how the window is bounded, whether endTimestamp is optional or defaults to a value, or any parameter-specific semantics. The trailPrice note concerns output data, not input parameters, so it does not compensate for the schema gap.

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 identifies the resource (orders), the scope (created in a time window), and the status coverage (any status). The title 'Order history' reinforces this. However, it does not explicitly distinguish itself from sibling tools like list_open_orders or search_trades beyond the time-window phrasing.

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 alternatives. The phrase 'Orders created in a time window' implies a historical query, but it never tells the agent when to prefer search_orders over list_open_orders or search_trades, nor does it mention any exclusions.

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

search_tradesFill historyC
Read-only

Fills in a time window. profitAndLoss is null on the opening half of a round turn (halfTurn=true) and set on the closing fill. Defaults to the current trading day.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesTrading account ID from list_accounts.
endTimestampNo
startTimestampNo

TDQS

C2.3/5.0
Behavior3/5

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

The description adds useful behavioral details beyond the readOnlyHint annotation: it notes that profitAndLoss is null on the opening half of a round turn and set on the closing fill, and that it defaults to the current trading day. This helps an agent interpret the returned data. However, it does not cover other aspects like pagination, ordering, or what happens when no fills exist. Since annotations already declare read-only safety, the added context is valuable but not comprehensive.

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

Conciseness3/5

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

The description is short (two sentences) but the first sentence is vague and poorly structured. It does not front-load the key purpose. The second sentence provides a specific behavioral detail, but overall it reads like a cryptic hint rather than a clear, organized explanation. It could be more concise and clear if it stated the purpose directly.

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

Completeness2/5

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

For a tool with three parameters and no output schema, the description is insufficient. It does not mention that the tool returns a list of fill records, nor does it describe the response structure, pagination, or ordering. It also does not explain that accountId is required or how the time window is applied. The description leaves out many details an agent would need to call the tool correctly and interpret results.

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

Parameters3/5

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

Schema description coverage is only 33% (only accountId has a description). The description compensates slightly by stating 'Defaults to the current trading day,' which implies that startTimestamp and endTimestamp are optional and default to the current day. However, it does not clarify the time range semantics (inclusive/exclusive), timezone handling, or format expectations beyond what the schema pattern provides. It adds some meaning but not enough to fully cover the undocumented parameters.

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

Purpose2/5

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

The description says 'Fills in a time window' which is ambiguous – it could be interpreted as a verb (filling something) rather than the noun (trade fills). It does not explicitly state that the tool returns a list of trade fills (execution history) for a given account. While 'profitAndLoss' and 'halfTurn' hint at fill data, an agent would have to infer the primary function. It lacks a clear verb+resource statement like 'Returns trade fill history for an account.'

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

Usage Guidelines1/5

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

No guidance is given on when to use this tool versus its siblings (e.g., search_orders, get_bars). The only contextual note is 'Defaults to the current trading day,' which describes a default behavior but not selection criteria. There is no mention of alternatives, prerequisites, or typical scenarios.

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. 20 tool updatesv0.1.0
    • First observedcancel_order
    • First observedclose_position
    • First observedget_account_snapshot
    • First observedget_bars
    • First observedget_contract
    • First observedget_performance
    • First observedget_quote
    • First observedget_server_config
    • First observedjournal_add
    • First observedjournal_read
    • First observedlist_accounts
    • First observedlist_available_contracts
    • First observedlist_open_orders
    • First observedlist_open_positions
    • First observedmodify_order
    • First observedpartial_close_position
    • First observedplace_order
    • First observedsearch_contracts
    • First observedsearch_orders
    • First observedsearch_trades

TDQS

A3.7/5.0

Scored across 20 tools

Disambiguation5/5

Each tool maps to a distinct resource-action pair: contracts, orders, positions, accounts, market data, journal, and performance. The only close pair (list_available_contracts vs search_contracts) is explicitly disambiguated in the descriptions, and get_account_snapshot is clearly positioned as the one-call superset of list_accounts.

Naming Consistency5/5

All 20 tools follow a consistent verb_noun snake_case pattern: get_, list_, search_, place_, cancel_, modify_, close_, journal_add/journal_read. There are no mixed conventions or vague single-word names.

Tool Count4/5

20 tools is above the typical 3-15 range, but the trading domain has several distinct resource types (contracts, market data, accounts, orders, positions, performance, journal) that justify the breadth. Each tool maps to a concrete workflow step, so it feels slightly heavy rather than bloated.

Completeness5/5

The server covers the full trading lifecycle: contract discovery, market data, account monitoring, order placement/modification/cancellation, position management, trade/performance review, and persistent journaling. No obvious dead ends or missing core operations are apparent for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to perform cryptocurrency trading analysis and execution with 38+ tools including real-time market data, technical indicators, risk management, and support for both paper trading and live execution on Hyperliquid.
    7
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to trade forex, metals, indices, and cryptocurrencies via the Model Context Protocol using the XBTFX Trading API. It provides comprehensive tools for managing account balances, retrieving market data, and executing trade operations like opening, modifying, or closing positions.
    15
    5 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to securely trade on Hyperliquid perpetual exchange, including order placement, position management, market data retrieval, and vault operations via natural language.
    31 PyPI
    21
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables AI assistants to trade on Kalshi through natural language, including placing orders, market data access, portfolio management, and paper trading with safety guardrails.
    60
    6 npm
    3
    MIT