MCP server for the Questrade trading API — portfolio, quotes, and market data for AI assistants
Server has 8 well-named tools with consistent verb_noun patterns (get*, lookup*). All tools have descriptions (avg 95 chars, within 10-1024 baseline). Input schemas are present with type definitions and parameter descriptions. However, output schemas are not documented in the source code, LLMs cannot see what fields to expect from responses. Error handling is centralized via wrapToolErrorHandling() but lacks recovery guidance (e.g., 'try search_users first'). No tool annotations (readOnlyHint, destructiveHint) despite all tools being READ_ONLY. Parameter descriptions are adequate but could be more prescriptive about formats and constraints.
Get a combined timeline of account activities (dividends, deposits, trades) and trade executions for a date range
Get cash balances and buying power for a specific Questrade account
Get order history for a Questrade account with optional state and date filters
Get a full portfolio overview — all accounts with their positions and balances in a single call
Get all positions held in a specific Questrade account
Get historical OHLCV candlestick data for a symbol. Returns up to 2000 candles per request.
Output schemas not documented. LLMs cannot see what fields responses contain, forcing them to guess downstream field names and risk broken tool chains.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All 8 tools are READ_ONLY but this is not declared in the tool definition, forcing LLMs to infer safety from descriptions.
Error messages lack recovery guidance. wrapToolErrorHandling() returns generic error text but does not suggest next steps (e.g., 'try search_users first' or 'check your refresh token').
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | <=2025-11-25 | v2 |
Get live Level 1 market quotes for one or more symbols. Accepts ticker names (resolved automatically) or Questrade symbol IDs.
Search for a stock/ETF by ticker or name and return symbol details with a live quote
Parameter descriptions lack format constraints. 'accountId' and 'ticker' accept strings but do not specify length, pattern, or valid character set. LLMs may pass invalid values.
No pagination or result limits documented. Tools like getPortfolio and getOrders may return large result sets; no limit, offset, or cursor parameters visible.