A FastAPI-based MCP server that provides market data tools for stock prices, cryptocurrency prices, and stock statistics, backed by a PostgreSQL database for price ingestion and historical queries.
Three tools with clear naming (verb_noun pattern: get_stock_price, get_crypto_price, get_stock_stats) and well-structured Pydantic schemas. Descriptions are concise and actionable (43-94 chars, within the 10-1024 range). All parameters have type definitions and descriptions. Input schemas are fully documented via Pydantic models. Output schemas explicitly defined with typed response classes. However, parameter descriptions are minimal (single phrases without usage guidance), and no error guidance for common failure modes (invalid ticker, API failures, rate limits). Missing per-parameter constraints (e.g., ticker format, symbol enums) and no documentation of error recovery paths. Respects READ_ONLY risk classification.
Return the current USD price for a cryptocurrency symbol.
Return the latest price for a stock ticker.
Return today's open/high/low/close and percentage change for a stock ticker.
Parameter descriptions are minimal and lack usage context. 'Stock ticker symbol, e.g., AAPL' is present but does not explain format constraints, valid ranges, or when to use this tool vs alternatives.
No input validation constraints documented. Parameters accept free-form strings without specifying format (e.g., ticker must be 1-5 uppercase letters, symbol must match known exchanges). LLMs may pass invalid values like 'AAPL1' or 'btc-usd' without guidance.
Error responses are defined (SymbolNotFoundError, RateLimitError, UpstreamServiceError, MarketDataError observed in code) but the HTTP error responses do not include recovery guidance. 'Symbol not found' should suggest 'Try a different ticker' or list available symbols.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 61 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Output schemas do not document when data was last updated or include a 'source' field. For financial data, LLMs need to know data freshness and whether the price is real-time, delayed, or cached.