Multi-Agents LLM Financial Trading Framework with MCP protocol support for financial analysis and trading decisions
This MCP server has fundamental quality gaps across naming, descriptions, schema completeness, and error handling. While 12 tools are defined with action verbs, most lack adequate documentation for LLM reasoning. Tool descriptions average ~90 characters (baseline: 194), falling below the 10-1024 character range for effective LLM guidance. Input schemas are present but inconsistently documented, many parameters lack descriptions or type constraints. Output schemas are not documented. No error handling guidance, no permission gates, and critical composite tools (e.g., generate_investment_decision) lack output structure documentation. The server appears purpose-built for a research project rather than production deployment; tool interfaces assume human-readable trading domain knowledge rather than explicit LLM-friendly parameter contracts.
Analyze market breadth indicators (advance/decline ratio, new highs/lows)
Analyze overall market sentiment and key indicators
Analyze sector rotation patterns and opportunities
Calculate risk metrics including VaR, Sharpe ratio, maximum drawdown for portfolio
Generate investment decision (BUY/HOLD/SELL) based on analysis from all agents
Get fundamental financial data including P/E ratio, revenue, earnings, debt levels
Fetch recent news and sentiment analysis for a stock
Analyze social media sentiment from Reddit and other social platforms
Output schemas not documented. Tools like analyze_market_overview, analyze_sector_rotation, analyze_market_breadth return results but LLMs cannot predict structure. This violates pattern:tool-description and pattern:response-shaper.
generate_investment_decision accepts 4 string parameters describing analyst reports but provides no guidance on expected format, length, or structure. LLMs cannot reason about multi-analyst input aggregation without clear field definitions. Violates pattern:tool-description and pattern:constrained-input.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 45 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 43 | - | v1 |
Get historical stock price data for technical analysis
Get real-time stock price data for a given symbol
Calculate technical indicators including RSI, MACD, Bollinger Bands, moving averages
Search for stocks by symbol, name, or sector
Tool descriptions are too brief (avg ~90 chars vs baseline 194). Descriptions like 'Analyze overall market sentiment and key indicators' lack WHEN-to-use context, dependencies, or expected output. Cannot differentiate analyze_market_overview from analyze_sector_rotation without diving into source code.
Parameter descriptions missing or minimal. 'market_analysis', 'fundamentals_analysis', 'news_analysis', 'social_analysis' in generate_investment_decision have no descriptions. 'period' in get_stock_history lacks constraint details (valid values, format, default behavior). Violates pattern:constrained-input.
analyze_* tools (market_overview, sector_rotation, market_breadth) accept zero parameters but provide no guidance on data sources, scope, or market assumptions. Cannot determine if they analyze US, CN, HK, or global markets.
No error handling documentation. No guidance on retryable vs fatal errors, missing data handling, or API failure modes. Tools calling akshare (Chinese market data) may fail for US-only agents but provide no recovery hints.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Risk field marks generate_investment_decision as WRITE but no corresponding idempotence guarantees or confirmation workflow documented.
calculate_portfolio_risk accepts 'portfolio' as array of objects but no validation documented. Missing constraints: min/max portfolio size, numeric precision for prices, valid quantity ranges. Violates pattern:constrained-input.
No pagination documented for tools returning lists (get_news_sentiment, get_social_sentiment accept 'limit' but no offset/cursor, total_count, or next_page guidance). Violates pattern:paginated-result.