TopstepX MCP server with bracket orders and SignalR WebSocket support
TopstepX MCP has 15 well-named tools with consistent verb_noun patterns (get_, search_, place_, modify_, cancel_, close_). All tools have descriptions (avg ~100 chars, within baseline 34-392). Input schemas are present and use Zod validation with type declarations. However, parameter descriptions are sparse, many lack detail on constraints, ranges, or format expectations. Output schemas are not documented; responses are JSON-stringified but structure is opaque to the LLM. Error handling is minimal: risk checks block orders but lack recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Composition is strong: tools chain well (e.g., get_accounts → place_order), and bracket order support is sophisticated. Security: API credentials are not visible in params (good), but no audit logging or permission gates evident.
Cancel an existing order
Check daily P&L, trade count, and drawdown against limits
Close ALL open positions (flatten)
Close an entire position for a contract
Get all active trading accounts with balances
Retrieve historical OHLCV bars (rate limited: 50/30s)
Output schemas not documented. Tools return JSON.stringify(result) but LLM cannot infer field structure, types, or required fields for downstream chaining. Breaks pattern:tool-chain and pattern:response-shaper.
Parameter descriptions lack constraint details. E.g., 'unit' in topstepx_get_bars accepts 1-6 but description only lists enum values without explaining what each means. 'size' in topstepx_place_order has no min/max bounds. Violates pattern:constrained-input.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools have explicit risk levels (READ_ONLY, WRITE, DESTRUCTIVE) but these are not exposed via MCP tool annotations. LLM cannot distinguish safe reads from destructive writes without parsing descriptions.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | <=2025-11-25 | v2 |
Get all currently open/working orders
Search for orders in a time range
Get all open positions
Search trade history for an account
Modify an existing open order (size, limitPrice, stopPrice)
Partially close a position by reducing size
Ping the TopstepX API to check connectivity
Place an order with optional SL/TP brackets. Accepts friendly params: symbol, side, size, price, stop_loss, take_profit
Search for tradeable contracts by name (e.g., MGC, MNQ, MES)
Error handling lacks recovery guidance. topstepx_place_order blocks on risk check but returns only {blocked: true, reason, risk}. No actionable next steps (e.g., 'Reduce position size and retry' or 'Wait until next trading day'). Violates pattern:recovery-guide.
topstepx_close_position accepts both contractId and symbol but description does not clarify mutual exclusivity or resolution order. LLM may pass both or neither, causing silent failures. Violates pattern:tool-description.