Streamlined financial analysis platform with 8 essential optimized MCP tools across 6 servers for company search, stock prices, calculations, portfolio optimization, news analysis, and ML predictions
This server has 11 tools with basic descriptions and parameter schemas, but significant quality gaps prevent a higher score. Descriptions are present but generic (averaging ~100 chars, below the 194-char baseline for A+ tools). Most tools lack parameter-level detail explaining what values are expected, valid ranges, or how parameters interact. Output schemas are not documented in the visible code. Error handling guidance is absent. The server mixes read-only and write operations without clear idempotency or safety indicators (no destructiveHint/idempotentHint annotations). Tool composition shows some good patterns (search_companies → get_historical_stock_prices chaining) but lacks the rigor expected for production use. Three tools, calculate_portfolio_risk_metrics, optimize_portfolio_allocation, and predict_stock_price, have complex inputs with implicit constraints (weights must sum to 1.0, risk_level enum) that are documented only in descriptions, not in enforced schema constraints.
Trend analysis for stocks using historical data patterns and technical indicators
Comprehensive technical analysis with RSI, MACD, Bollinger Bands, support/resistance levels, and enhanced null value handling
Calculate financial performance ratios including P/E, dividend yield, earnings growth with enhanced null value handling
Calculate portfolio risk metrics including volatility, Value at Risk (VaR), Sharpe ratio, and correlation analysis
Financial news aggregation with full article transparency for market insights
Historical price data retrieval with simplified days parameter and robust null value handling
Output schemas are not documented. No visible schema definitions for return types; LLMs cannot determine what fields to expect or plan downstream tool chaining.
Missing parameter-level constraints. 'days' and 'period' parameters have no documented min/max ranges (e.g., is 365 days allowed? 1000?). 'limit' has no documented bounds. 'weights' in optimize_portfolio_allocation must sum to 1.0 but this is described only in natural language, not enforced via schema enum or format.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 66 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 46 | - | v1 |
Market sentiment analysis with full news article details for transparency including sentiment scores and article lists
Portfolio optimization with recommended allocation rates based on Modern Portfolio Theory risk-return analysis
Machine learning predictions for stock price movements using ensemble models with feature engineering
Enhanced company search with substring matching and symbol discovery
Enhanced stock price update tool with robust error handling for price data conversion
Descriptions lack LLM-optimized structure. Baselines show A+ tools average 194 chars; most of these average ~90 - 110 chars and omit WHEN to use the tool. E.g., 'Market sentiment analysis with full news article details' (54 chars) does not explain when an LLM should pick this over get_financial_news, or what 'sentiment' means (bullish? numeric score?).
No tool annotations for safety/idempotency. update_stock_prices is marked as WRITE but has no destructiveHint. predict_stock_price and analyze_stock_trends are read-only but lack idempotentHint. No mechanism to warn agents about retry behavior or side effects.
Error handling is not documented. No guidance on recovery paths. If calculate_portfolio_risk_metrics fails due to insufficient historical data, what should the agent do? If get_historical_stock_prices returns empty, is that retryable or a user error?
Parameter 'risk_level' in optimize_portfolio_allocation is documented as 'conservative, moderate, or aggressive' but is not declared as an enum in the visible schema. Free-form strings invite hallucinated values like 'very_conservative'.
Pagination not documented. get_financial_news accepts a 'limit' but no offset/page parameter or next_cursor. Without pagination, large result sets blow context windows. Unclear if limit caps results server-side or if LLM is expected to handle truncation.