projectx-mcp
projectx-mcp is an MCP server that lets a reasoning model read TopstepX/ProjectX futures market data, place and manage trades with server-enforced guardrails, and journal its learning across sessions.
Check server config: whether trading is enabled and current guardrails (max order/position size, daily loss limit, allowed accounts/symbols).
List accounts and get account snapshots: balance, open positions, working orders, and today's realized P&L versus the loss limit.
Search and list contracts, and get contract details such as tick size, tick value, and active month.
Fetch market data: historical OHLCV bars (up to 20,000, rate-limited) and real-time quotes via SignalR.
Place orders: market, limit, stop, trailing stop, join bid/ask, with optional stop-loss/take-profit brackets; a rationale is required and saved to the journal.
Modify or cancel working orders, and close or partially close positions at market.
Review trading history: open orders, open positions, order history, fill history, and performance statistics like win rate, expectancy, and profit factor.
Keep a local trading journal: write plan, entry, exit, review, lesson, and note entries, and read past entries so future sessions can learn.
Rely on enforced guardrails: trading is disabled by default, and allowed accounts/symbols, max order size, max position size, and daily loss limit are checked before requests reach TopstepX.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@projectx-mcpCheck my open positions and today's P&L on TopstepX."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
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 |
|
Accounts |
|
Market data |
|
Order flow |
|
Trading |
|
History |
|
Learning |
|
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:
read its past
lessonandreviewentries at the start of each session,write a
planbefore trading,write a
reviewafter each exit, graded against the plan andget_performance,record short, evidence-based
lessonentries 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 |
|
| Order tools are refused unless this is |
| any | Only these accounts can be traded. |
| any | Contract roots as they appear in contract IDs, e.g. |
|
| Maximum contracts per order. |
|
| Maximum absolute net position per contract, counting resting same-side limit orders. Orders that reduce the position are always allowed, except when the position's direction can't be read: then an order can't be told apart from an add, so it is checked like one, and you exit with |
|
| 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 (with the same exception for a position whose direction can't be read). |
Blocked orders are journaled as order_blocked so the model can review them.
Two more protections run without the model asking:
Tick rounding. TopstepX rejects off-grid prices, so
place_orderandmodify_orderround prices onto the contract's tick grid, always away from the market or a worse fill:Stops round down for a sell and up for a buy; limits round down for a buy and up for a sell.
A stop-limit's limit rounds the same way as its stop, so it never moves past the trigger.
modify_orderreads the working order for its side and type. It passestrailPricethrough unchanged, because a working trailing stop may read it back as a distance.A changed price is reported as
snapped: { <field>: { from, to } }and journaled. If the tick size or the order can't be read, the price is sent unchanged.
Protection check (reconcile). With trading enabled, the server checks its own trades over REST every
PROJECTX_RECONCILE_SECONDS.Scope: the account + contract pairs it sent an order on within the window: since the trading day started (17:00 CT) or the last 24 hours, whichever reaches further back, so an overnight hold stays in scope after a restart. It reads them from the tail of the journal (never the whole file):
place_orderandmodify_orderwrite anorder_sententry before each send (waiting at most 200 ms for the write), so copies of the server sharing a journal see each other's orders. A position on an account + contract pair it hasn't traded in the window is never touched. A manual position on a pair it did trade is in scope.When it closes: a position of yours without a covering stop gets closed. That is one not covered, for its whole size, by working stop or trailing-stop orders on the opposite side (a stop-limit doesn't count). It must be seen that way on two checks at least
PROJECTX_RECONCILE_GRACE_SECONDSapart, with no order on that contract within the grace period, and a fresh read right before the close must confirm it.How it closes: the same flatten as
close_position, after one last look at the journal tail for an order on that pair within the grace period.A successful close journals an
exittaggedreconcile/unprotectedand logs a warning.Flat with working orders left over: a
note("flat; legs left: "). Those orders (only ones whose cancel failed, never a new order) are cancelled again on later checks while the contract stays flat.A failed close journals a
note("close failed: …"). If the broker refused it, that contract waits 5 minutes. If there was no reply or it wasn't flat in time, it waits 1, then 2, then 5 minutes.
What it never does: cancel orders on an open position, or touch orders when you're flat.
More than one copy: if you run several copies against the same journal directory, only the copy holding
reconcile.lock(next to the journal; taken over when stale or its process is gone) reads and closes positions.
Setting | Default | Effect |
|
| Seconds between protection checks (at least 5; smaller values are raised to 5). |
|
| How long a position must stay uncovered (two checks this far apart), and how long after the last order on the contract (from any copy sharing the journal), before it is closed. |
list_accounts returns an error, not an empty list, when the login has no accounts: "No accounts returned for this login (onlyActiveAccounts=…, API ). Check that the account is active at the firm and that PROJECTX_API_URL is the firm's gateway."
Related MCP server: XBTFX MCP Trading Server
Order flow
The order-flow tools read ProjectX's SignalR market hub (trades, depth and quotes), which has no REST equivalent. The server runs in one of two modes.
MCP mode (stdio or HTTP, the usual one): live snapshots. The server subscribes to a contract on the first order-flow call for it, never at startup, so its data starts then. It checks the contract id first (an unknown one is refused and never takes a slot) and uses one SignalR connection, never a second one while it reconnects. It keeps the last 24 hours of minute rows, 5000 prints, 10,000 L1 changes and 20,000 L2 changes per contract, for at most 6 contracts. It never writes flow files. If PROJECTX_FLOW_DIR is set, get_order_flow and get_footprint also read the recorder's complete minutes from there (the tail of each file, never the whole file) and mark each row source: "recorded" or "live"; a recorded complete minute replaces a live one that isn't complete. Those reads are asynchronous and bounded: the JSONL only for the requested window, the small CSV rows back to the session start for the cumulative delta.
Recorder mode: projectx-mcp --record-flow. A long-running process that serves no MCP. It subscribes the active contract of each symbol in PROJECTX_FLOW_SYMBOLS on one SignalR connection, re-resolves them at each trading-day start (17:00 CT, so a roll switches contracts), and appends every complete minute to PROJECTX_FLOW_DIR:
<contractId>.csv:ISO-time,buy_volume,sell_volume, no header, one row per complete minute (characters outsideA-Za-z0-9._-in the id become_);<contractId>.jsonl: the full minute row, including volume at price.
Each minute is written once: on restart it reads the last complete line of each file and skips what is already there. A last line without its newline (a write cut short) is truncated away, never kept as data. Disconnects, silences and clock jumps are gaps, so a minute that touches one is never written. Only one recorder runs per directory (recorder.lock, taken over when its process is gone or its heartbeat is stale); a second one exits with a message. It needs both variables and exits with an error without them. It logs to stderr and stops cleanly on SIGINT/SIGTERM.
PROJECTX_FLOW_SYMBOLS=MNQ,MES PROJECTX_FLOW_DIR=~/.projectx-mcp/flow node dist/index.js --record-flowdocs/FLOW-RECORDER.md has a launchd example for running it as a background service on macOS.
Setting | Default | Effect |
| none | Root symbols the recorder subscribes, e.g. |
| none | Where the recorder writes; MCP servers read recorded minutes from here. |
|
| Large-print threshold in contracts ( |
|
| Most contracts subscribed at once per process. |
|
|
|
| none |
|
A minute is complete only when:
the trade subscription was confirmed before it started and stayed connected through its end;
the minute has settled: a trade message arrived after its end plus 2 s (extended by the measured print delay, up to 10 s more), or else 10 s passed (
RECORDER_GRACE_MS, plus the delay, at most 20 s). The recorder and the live tools use the same rule;hub messages for the contract kept arriving after the settle point, and no silence over 10 s (
SILENCE_LIMIT_MS) touches the minute. A sleep or stall of the machine counts as a disconnect from the last message;the trade feed agrees with the quote feed: the quote's session
volumedid not rise by more than the printed volume plus max(2 contracts, 2 %), and a minute with no prints needs that volume known and flat and an unchangedlastPrice. Quote volume is counted by arrival time and prints by exchange time, so the previous minute's shortfall may explain quote volume received within the lag window after the boundary (max(1 s, the median delay), at most 5 s; one minute back, one live interval only), and alastPricemove to the previous minute's last print price within that window is accepted. A minute with no prints must stay flat after the window. This catches a trade subscription that died while quotes keep flowing (counted intradeFeedMismatch);the subscription started at least 2 s before the minute, measured in exchange time when this machine's clock is behind (warned once);
every print in it had a timestamp with an explicit offset within 60 s of its arrival, and a known aggressor side.
Prints that arrive after their minute is final, or that are replayed after a reconnect, are counted and never applied. Minutes while the market is closed are incomplete (nothing arrives), so the recorder writes no rows for them. Consumers should use a bar only when all its minutes are complete.
Order flow on bars. get_bars with includeOrderFlow: true (default PROJECTX_BARS_ORDER_FLOW, false unless set) adds flow to each minute or hour bar: bv, sv, delta, trades, volume, vwap, ofiTrade, ofiQuote, imbalance, largeBuy, largeSell, complete, and windows (ofiTrade and delta over the last n bars for each n in flowWindows, e.g. [5], default PROJECTX_BARS_FLOW_WINDOWS). They are summed from the same minute rows get_order_flow returns (live merged with recorded), and every value is null unless all the bar's minutes are complete. MNQ and MES bars carry NQ's and ES's flow (the same-expiry full-size contract, roots ENQ and EP, unverified), so their recorded flow comes from the recorder only when PROJECTX_FLOW_SYMBOLS includes ENQ and EP. The first such call subscribes the contract; the flow part adds at most 3 s, then the bars come back with empty flow and a note (the bars fetch keeps its own timeouts). The two settings let a caller that passes no order-flow options (such as a trading harness calling every broker the same way) get flow on bars by this server's configuration; get_server_config shows them under flow.barsOrderFlow and flow.barsFlowWindows.
docs/ORDER-FLOW-DESIGN.md is the live field contract: the exact definition of every order-flow field, the timestamps, completeness and null rules, and what historical data lacks. vectors/*.json are golden vectors (hub event streams with the exact tool results) that a historical implementation can run to check it reproduces these fields.
Unverified against the live hub. These come from the ProjectX docs and haven't been checked against real pushes yet:
the
GatewayTradetypemapping: 0 = buy (aggressor lifted the ask), 1 = sell (TRADE_SIDE_BY_TYPEinsrc/orderflow.ts);the DomType enum of
GatewayDepth: 0 Unknown, 1 Ask, 2 Bid, 3 BestAsk, 4 BestBid, 5 Trade, 6 Reset, 7 Low, 8 High, 9 NewBestBid, 10 NewBestAsk, 11 Fill (DOM_TYPE);the payload fields: trades
{symbolId, price, timestamp, type, volume}, depth{timestamp, type, price, volume, currentVolume}, with the level size taken fromvolume;that GatewayQuote's
volumeis the session cumulative volume;that timestamps carry an explicit offset (
Zor±hh:mm); one without is counted as bad;the
Unsubscribe*hub method names, and thatGatewayTrade/GatewayDeptharrive as(contractId, data).
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 .envCredentials
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.
Set
PROJECTX_USERNAMEto your platform login username. Don't use your email or an account name.Set
PROJECTX_API_KEYto 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.jsThen 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
NGROK_AUTHTOKEN=<your ngrok authtoken> # optional: built-in ngrok tunnel
NGROK_DOMAIN=<name>.ngrok.app # optional: reserved domain for a stable URL
npm run start:http # listens on http://127.0.0.1:8787/mcpWith NGROK_AUTHTOKEN set, the server opens the tunnel itself and logs ngrok tunnel established: https://…/mcp/<MCP_HTTP_AUTH_TOKEN>. Without it, run any tunnel yourself (cloudflared tunnel --url http://127.0.0.1:8787 or ngrok http 8787). Either way you get a public https://… URL. Without NGROK_DOMAIN, ngrok assigns a new URL on every start, so you'd have to update the connector each time.
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(orMCP_TRANSPORT=http) serves Streamable HTTP at/mcpand a health check at/healthz.MCP_HTTP_AUTH_TOKENis required (16+ characters). Clients sendAuthorization: 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.HOSTandPORTdefault to127.0.0.1:8787. Keep the loopback bind and expose it through a tunnel instead of binding to0.0.0.0.NGROK_AUTHTOKEN(optional) starts a built-in ngrok tunnel to that address;NGROK_DOMAINpins it to a reserved domain. It uses the optional@ngrok/ngrokdependency, so no separate ngrok binary is needed.
Recommended rollout
Read-only.
PROJECTX_TRADING_ENABLED=false. Let the model analyze, plan, and journal hypothetical trades.Practice account. Enable trading, set
PROJECTX_ALLOWED_ACCOUNT_IDSto a practice or combine account, micros only, size 1, and approve each order by hand.Supervised autonomy. Loosen approvals only after the journal and
get_performanceshow 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 typecheckEvery 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
ProjectX Gateway API docs: https://gateway.docs.projectx.com/docs/intro
Rate limits: 50 requests / 30 s for
retrieveBars, 200 requests / 60 s for everything else. Every request has a timeout. The client retries reads on timeouts, network errors and 5xx (1, 2, 4 s), waits forRetry-Afteron HTTP 429, and never re-sends an order write that may have reached the broker.Model Context Protocol: https://modelcontextprotocol.io
License
Apache-2.0. See LICENSE.
Available Tools
20 toolscancel_orderCancel orderADestructive
Cancel a working order. Simulated (non-follower) accounts only.
| Name | Required | Description | Default |
|---|---|---|---|
| orderId | Yes | ||
| accountId | Yes | Trading account ID from list_accounts. |
TDQS
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.
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.
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.
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.
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.
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 positionADestructive
Flatten the whole position in a contract at market. Does NOT cancel resting stop/target orders; check list_open_orders and cancel leftovers.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Why; saved to the journal. | |
| accountId | Yes | Trading account ID from list_accounts. | |
| contractId | Yes | Contract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts. |
TDQS
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.
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.
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.
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.
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.
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 snapshotARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Trading account ID from list_accounts. |
TDQS
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.
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.
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.
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.
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.
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 barsBRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| live | No | ||
| unit | No | minute | |
| limit | No | ||
| endTime | No | ||
| startTime | No | ||
| contractId | Yes | Contract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts. | |
| unitNumber | No | Bar size in units, e.g. unit=minute unitNumber=5 → 5-minute bars. | |
| includePartialBar | No |
TDQS
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.
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.
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.
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.
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.
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 contractARead-only
Look up one contract by ID (tick size, tick value, whether it is the active month).
| Name | Required | Description | Default |
|---|---|---|---|
| contractId | Yes | Contract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts. |
TDQS
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.
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.
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.
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.
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.
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 statisticsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Trading account ID from list_accounts. | |
| endTimestamp | No | ||
| startTimestamp | No |
TDQS
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.
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.
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.
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.
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.
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 quoteARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| timeoutMs | No | ||
| contractId | Yes | Contract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts. |
TDQS
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.
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.
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.
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.
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.
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 guardrailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| tags | No | Free-form, e.g. ["breakout", "MNQ", "mistake:chased"]. | |
| text | Yes | ||
| orderId | No | ||
| accountId | No | Trading account ID from list_accounts. | |
| contractId | No | Contract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts. |
TDQS
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.
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.
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.
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.
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.
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 journalARead-only
Read past journal entries (newest last). Start each session with journal_read({kind:"lesson"}) and recent reviews so you do not repeat mistakes.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| kind | No | ||
| limit | No | ||
| since | No | ||
| contractId | No | Contract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts. |
TDQS
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.
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.
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.
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.
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.
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 accountsCRead-only
List trading accounts on this login with balance and canTrade flag.
| Name | Required | Description | Default |
|---|---|---|---|
| onlyActiveAccounts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is 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.
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.
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.
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.
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.
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 contractsARead-only
List every contract available to trade. Large output; prefer search_contracts when you know the symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| live | No |
TDQS
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.
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.
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.
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.
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.
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 ordersARead-only
Working orders on an account (includes bracket stop/target legs).
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Trading account ID from list_accounts. |
TDQS
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.
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.
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.
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.
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.
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 positionsBRead-only
Open positions on an account. direction is long/short; averagePrice is the entry.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Trading account ID from list_accounts. |
TDQS
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.
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.
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.
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.
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.
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 orderADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| reason | No | Why; saved to the journal. | |
| orderId | Yes | ||
| accountId | Yes | Trading account ID from list_accounts. | |
| stopPrice | No | ||
| limitPrice | No | ||
| trailPrice | No |
TDQS
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.
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.
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.
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.
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.
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 positionADestructive
Close part of a position at market (scale out).
| Name | Required | Description | Default |
|---|---|---|---|
| size | Yes | ||
| reason | No | ||
| accountId | Yes | Trading account ID from list_accounts. | |
| contractId | Yes | Contract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts. |
TDQS
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.
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.
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.
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.
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.
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 orderADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| side | Yes | ||
| size | Yes | ||
| type | Yes | ||
| accountId | Yes | Trading account ID from list_accounts. | |
| customTag | No | Must be unique across the account. | |
| rationale | Yes | Why this trade: setup, invalidation (where the stop is and why), target, and expected risk in $. | |
| stopPrice | No | ||
| contractId | Yes | Contract ID, e.g. "CON.F.US.MNQ.Z25". Get it from search_contracts. | |
| limitPrice | No | ||
| trailPrice | No | ||
| stopLossBracket | No | ||
| takeProfitBracket | No |
TDQS
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.
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.
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.
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.
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.
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 contractsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| live | No | Use the live data subscription instead of sim. Usually false. | |
| searchText | Yes |
TDQS
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.
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.
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.
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.
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.
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 historyBRead-only
Orders created in a time window (any status). For trailing stops, trailPrice here is the trail distance in price, not a level.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Trading account ID from list_accounts. | |
| endTimestamp | No | ||
| startTimestamp | Yes |
TDQS
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.
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.
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.
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.
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.
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 historyCRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Trading account ID from list_accounts. | |
| endTimestamp | No | ||
| startTimestamp | No |
TDQS
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.
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.
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.
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.
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.
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.
20 tool updates
v0.1.0- First observed
cancel_order - First observed
close_position - First observed
get_account_snapshot - First observed
get_bars - First observed
get_contract - First observed
get_performance - First observed
get_quote - First observed
get_server_config - First observed
journal_add - First observed
journal_read - First observed
list_accounts - First observed
list_available_contracts - First observed
list_open_orders - First observed
list_open_positions - First observed
modify_order - First observed
partial_close_position - First observed
place_order - First observed
search_contracts - First observed
search_orders - First observed
search_trades
TDQS
Scored across 20 tools
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.
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.
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.
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
Related MCP Connectors
Connect your AI to a funded trading account. Read & trade a simulated funded challenge.
- FensoryOAuthcom.fensory
Trading MCP server for AI agents, with live market data, account reads and controlled execution.
AI-powered Pine Script v6 strategy generator built for prop-firm futures traders.
Unified financial infrastructure connecting AI agents directly to trade live/demo brokerage accounts, Web3 non-custodial wallets, real-time market data across equities, ETFs, crypto, forex, options, DeFi swaps, and prediction markets, institutional research feeds, and algorithmic strategy backtesters.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables 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.7MIT
- AlicenseAqualityCmaintenanceEnables 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.158 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to securely trade on Hyperliquid perpetual exchange, including order placement, position management, market data retrieval, and vault operations via natural language.16 PyPI23MIT
- AlicenseBqualityBmaintenanceEnables AI assistants to trade on Kalshi through natural language, including placing orders, market data access, portfolio management, and paper trading with safety guardrails.602 npm3MIT