Unofficial Model Context Protocol server for the Capital.com Open API (built on capitalcom-cli)
Capital.com MCP has a comprehensive 40-tool suite with explicit schema definitions, type annotations, and descriptions. However, description quality is inconsistent: many tools (e.g., cap_session_status, cap_market_search) have adequate descriptions (60-150 chars), but several lack domain-specific context or usage guidance. Descriptions occasionally reference implementation details (e.g., 'limit truncates results client-side') rather than business intent. Parameter descriptions are present but often terse. Error handling and recovery guidance are minimal, tools do not explain what to do when auth fails, previews expire, or trades are rejected. No tool annotations (readOnlyHint, destructiveHint) visible despite clear risk stratification. Streaming tools (cap_stream_*) lack specifics about WebSocket behavior, reconnection, or data format. Output schemas are not explicitly documented in the tool descriptions, forcing LLMs to infer structure. The server correctly identifies write/irreversible risks but does not embed this into tool metadata or descriptions where agents can see it.
Top up the demo account balance (DEMO ONLY). The SDK enforces demo + confirm.
Get account activity history (deals, orders, updates). detailed adds fields; deal_id filters.
Get transaction history (deposits, withdrawals, P&L). Optional type filter.
List all trading accounts (balance, currency, type). Requires authentication.
Get account preferences (hedging mode, per-asset-class leverage).
Set account preferences (TRADE-GATED). Requires confirm=true when configured.
Streaming tools (cap_stream_*) lack documentation of WebSocket behavior, reconnection semantics, data format, and error handling. Descriptions are terse (50-58 chars) and do not explain what the agent receives or when to call each stream.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) visible in schema, despite clear risk stratification (READ_ONLY, WRITE, IRREVERSIBLE, REVERSIBLE, DESTRUCTIVE). Agents cannot infer safety from tool metadata.
Output schemas not documented in tool descriptions. Tools return structured data but agents must infer field names, types, and availability. E.g., cap_trade_execute_position returns a deal_id and confirmation_id, but this is not stated in the description.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Get full market details and dealing rules for an EPIC.
Get child nodes/markets under a navigation node.
Get the root market-navigation tree (categories).
Get historical OHLC candles. resolution e.g. MINUTE_15, HOUR, DAY.
Search markets by term or EPIC list. limit truncates results client-side.
Get client sentiment (long vs short %) for a market.
Create or verify a session. force=true re-logs in; account_id switches account.
End the session and clear tokens. Requires authentication.
Keep the session alive (extends timeout). Requires authentication.
Get current session status (login state, account, token expiry). No auth required.
Switch the active trading account by ID. Requires authentication.
Stream price-level alerts for a market (WebSocket). Triggers on bid/offer crossing levels. Requires CAP_WS_ENABLED and authentication.
Stream live OHLC candles for a market (WebSocket). Requires CAP_WS_ENABLED and authentication.
Stream live P&L and position updates for the active account (WebSocket). Requires CAP_WS_ENABLED and authentication.
Stream live tick prices for a market (WebSocket). Requires CAP_WS_ENABLED and authentication.
Get a single confirmation by confirmation_id (one-shot poll). Useful after async execute/close/cancel.
Poll a confirmation until ACCEPTED/REJECTED (with timeout). Use after async execute/close/cancel to wait for the broker decision.
Execute a market order from a preview. Requires preview_id from cap_trade_preview_position and confirm=true.
Execute a pending order from a preview. Requires preview_id from cap_trade_preview_working_order and confirm=true.
Amend a pending working order (change level/stops/limits). Requires confirm=true.
Cancel a pending working order. Requires confirm=true.
List all pending working orders. Requires authentication.
Amend an open position (change stops/limits/level). Requires confirm=true.
Close an open position (market order to exit). Requires confirm=true.
Get a single position by deal_id. Requires authentication.
List all open positions. Requires authentication.
Preview a market order (no side effects). Returns preview_id, checks, and estimated outcomes. Use for validation before execute.
Preview a pending order (LIMIT/STOP). Returns preview_id, checks, and estimated outcomes.
Add a market (by EPIC) to a watchlist. Requires authentication.
Create a new watchlist with a name. Requires authentication.
Delete a watchlist by watchlist_id. Requires authentication.
Get a single watchlist by watchlist_id. Requires authentication.
List all watchlists for the account. Requires authentication.
Remove a market (by EPIC) from a watchlist. Requires authentication.
Error handling and recovery guidance missing. Tools do not explain what to do when authentication fails, previews expire (~120s), trade confirmations time out, or API limits are hit. INSTRUCTIONS mention preview expiry but tools themselves do not.
Parameter descriptions are often terse (e.g., 'The deal identifier' for deal_id) and do not explain domain context or valid formats. No mention of what characters/length are accepted, or how to obtain a deal_id if the agent doesn't have one.
cap_market_search description mentions 'limit truncates results client-side', implementation detail that should be hidden. Description should explain when to use search vs navigation, and what search returns (top N matches, relevance ranked).
Many account/position/order read tools lack context about dependencies. E.g., cap_trade_positions_list should note 'Call before cap_trade_positions_get or cap_trade_positions_amend to see available deals', agents need discovery hints.
Confirmation workflow (cap_trade_confirm_get vs cap_trade_confirm_wait) not clearly differentiated. Descriptions do not explain when to use polling (get) vs blocking (wait), or the timeout/retry semantics.
No enum constraints for string parameters that have known values. E.g., cap_market_prices 'resolution' parameter description lists examples ('MINUTE_15, HOUR, DAY') but is not formally constrained as an enum in schema.
Authentication requirements stated inconsistently. Some descriptions say 'Requires authentication', others do not. cap_session_status explicitly states 'No auth required' (good), but others force agents to infer. Should be uniform and explicit on every tool.