Trading 212 MCP demonstrates solid fundamentals: all 12 tools have descriptions (avg 156 chars, within 10-1024 baseline), proper verb-noun naming (get_, list_, place_, cancel_, search_, request_), and input schemas with types. However, critical gaps prevent a higher score: (1) output schemas are completely undocumented, no tool declares what fields it returns, forcing LLMs to infer structure; (2) parameter descriptions are sparse or missing for many tools (e.g., 'report' object in request_report lacks field documentation); (3) error handling is absent, no guidance on retryability, user-fixable vs fatal errors, or recovery paths; (4) destructive tools (place_order, cancel_order) lack confirmation/dry-run patterns despite high risk. Pagination is well-designed (limit/offset with clear semantics), and risk annotations are present. Naming is clear and action-oriented throughout.
Combine account summary, positions and pending orders. Returns independent section timestamps and partial errors; not an atomic snapshot.
Request cancellation of one pending order after user approval. Acceptance is not proof of cancellation; inspect pending orders and history.
Verify account-summary access and report the selected environment and configured trading access. This does not verify every API permission.
Get cached exchange metadata and working schedules, optionally for a single exchange ID.
Get one history page (maximum 50 items). Continue with the returned nextPagePath and the same kind, without limit/ticker. Ticker applies only to orders/dividends.
Get one pending order by ID. Not found does not prove rejection or cancellation; inspect history for completed orders.
Output schemas completely undocumented. No tool declares return type, field names, or structure. LLMs cannot plan downstream calls or extract required data (e.g., does get_positions return position_id, ticker, quantity, price?). Violates pattern:tool and pattern:response-shaper.
Destructive tools (place_order, cancel_order) lack confirmation/dry-run pattern. No mention of user approval flow, despite descriptions claiming 'after user approval'. No tool supports dry-run or confirmation_required response. Violates pattern:confirmation-request.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Get open positions, optionally filtered by exact Trading 212 ticker. Offset pagination applies to the current response, not a frozen snapshot.
List currently pending orders. Filled/cancelled orders belong in get_history. Offset pagination is not a frozen snapshot.
List CSV report status and available download links. Rate limited to once per minute. Links may contain sensitive access tokens; do not share them.
Place a REAL-MONEY or demo order after user approval through the host. Specify an exact ticker, positive share quantity and explicit buy/sell side. Price fields use the instrument's price denomination. No automatic retries: an unknown outcome may already have placed an order.
Request asynchronous CSV generation for a date range and categories. Returns a report ID; use list_reports later. Does not place trades; available with trading disabled.
Search instrument metadata by ticker, name or ISIN. Cached for ten minutes; returns a bounded list and its original fetch time. Not a live price feed.
Parameter documentation incomplete. 'request_report' accepts 'report' object with no field descriptions. 'place_order' accepts 'order' object with no schema detail. LLMs cannot construct valid payloads. Violates pattern:tool-description and pattern:constrained-input.
No error handling guidance. Tools provide no recovery hints, retryability classification, or actionable error messages. E.g., 'get_pending_order' states 'Not found does not prove rejection' but offers no guidance on what to do next. Violates pattern:recovery-guide and pattern:error-classification.
Pagination semantics unclear for non-frozen snapshots. 'get_positions' and 'list_pending_orders' warn 'Offset pagination applies to the current response, not a frozen snapshot' but do not explain implications or offer cursor-based alternative. Violates pattern:paginated-result.