Black-Litterman portfolio optimization MCP server for AI-assisted portfolio construction and risk analysis
Server has 5 tools with complete input schemas and descriptions, but quality is uneven. Tool names follow verb_noun convention (optimize_, upload_, get_, backtest_, compare_). Descriptions are present (194 - 250 chars avg) and explain WHAT and WHEN, meeting baseline. However, parameter descriptions lack actionable constraints (ranges, formats, enums for non-enum fields). Output schemas are not documented, LLMs cannot plan downstream calls. Error handling is absent from descriptions. Security concerns: upload_price_data accepts file_path without validation, risking path traversal. No mention of rate limits or retry guidance. Composition is reasonable (5 distinct concerns), but tools lack chaining metadata (e.g., optimize_portfolio_bl should return ticker list for backtest_portfolio).
Backtest portfolio performance with various strategies. Supports buy-and-hold, passive rebalancing, and risk-managed strategies with optional stop-loss and drawdown limits.
Compare multiple portfolios side-by-side. Analyzes returns, volatility, Sharpe ratio, correlation, and provides performance comparison.
Get statistical summary of assets (returns, volatility, Sharpe ratio, correlation matrix). Use for analysis only, not portfolio optimization.
Optimize portfolio using Black-Litterman model. Use for portfolio weight allocation. Supports absolute and relative views with confidence levels. Returns portfolio weights, expected returns, volatility, and Sharpe ratio.
Upload custom price data for assets not available in pre-loaded datasets. Supports international stocks, alternative assets, custom indices. Data saved as Parquet file for immediate use with optimize_portfolio_bl.
Output schemas not documented. LLMs cannot infer what fields optimize_portfolio_bl, backtest_portfolio, or compare_portfolios return, forcing guesswork on downstream tool chaining.
Parameter constraints lack actionable detail. 'confidence' accepts 0.0 - 1.0 but description does not state range. 'sensitivity_range' lacks min/max array length. 'period' accepts '1Y', '3M', '6M' but no enum constraint or format pattern provided.
upload_price_data accepts file_path parameter without validation. No mention of path traversal guards, file size limits, or allowed directories. Poses security risk if agent is compromised.
No error handling guidance in tool descriptions. If optimize_portfolio_bl fails due to insufficient data or singular covariance matrix, LLM has no recovery path. No mention of retryable vs fatal errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Tool chaining metadata missing. optimize_portfolio_bl returns weights but does not document that backtest_portfolio needs those weights. No cross-tool reference IDs or dependency hints.