live market data for any MCP client via yfinance
Five tools with clear verb-noun naming (get_*, compare_*) and present descriptions. However, descriptions are terse (avg 95 chars, below 194-char baseline), lack WHEN/WHY context, and omit output schema documentation. Parameter descriptions exist but are minimal. No error recovery guidance. Tools return JSON strings rather than structured objects, forcing LLM parsing. No pagination support despite tools returning potentially large datasets (e.g., options chains, news). Missing idempotency and confirmation patterns for data-heavy operations.
Side-by-side performance comparison of comma-separated tickers over a period. Example: compare_tickers('AAPL,MSFT,NVDA', '1y')
OHLCV history. period: 1d,5d,1mo,3mo,6mo,1y,2y,5y,max. interval: 1m,5m,1h,1d,1wk,1mo.
Recent news headlines for a ticker with links.
Options chain for one expiration. Omit expiration to list available dates first. Returns calls and puts with strike, last, bid/ask, IV, open interest, volume.
Real-time-ish quote snapshot: last price, day range, volume, market cap, 52w range.
Output schemas not documented. Tools return JSON strings; LLM must parse unstructured text. No field descriptions for returned objects (e.g., what does 'oi' mean in options chain? What fields does news contain?).
No pagination or result limits documented. get_history returns up to 250 bars; get_options_chain returns up to 60 calls/puts; get_news returns up to 'count' items. Large results risk context window exhaustion. No next_cursor or total_count fields.
Descriptions lack WHEN/WHY context and are below 194-char baseline (avg 95 chars). E.g., 'Recent news headlines for a ticker with links' does not explain when to call this vs get_quote, or what the LLM should do with the results.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
No error recovery guidance. Tools return JSON with 'error' field (e.g., 'no data for AAPL 1d/5m') but do not suggest next steps. LLM cannot determine if error is retryable, user-fixable, or fatal.
Parameter 'expiration' in get_options_chain has default=null but description says 'Omit expiration to list available dates first.' Null is not the same as omitting; LLM may pass null explicitly instead of omitting the param.