MCP server exposing Signal Fusion Engine (SFE) capabilities: sentiment, quantitative, and enrichment analysis engines; portfolio management tools; and signal tracking/scoring. Provides multi-signal fusion for daily pre-market briefing and portfolio decision-making.
19 tools with mostly complete schemas and descriptions, but significant gaps in parameter documentation and error handling. Tool names follow verb_noun convention well (get_, open_, close_, run_). Descriptions average ~150 chars, meeting baseline. However, 8 tools lack parameter descriptions for optional fields (e.g., earnings_calendar 'on_date' has no description; list_recent_signals 'ticker' filter undocumented). No output schemas documented. Error recovery guidance absent. Composition is reasonable, tools are single-purpose, but chaining IDs not always returned (e.g., run_signals persists but doesn't return signal IDs for downstream scoring). Security: no secrets exposed as params (good), but no audit trail or permission gates visible.
Close an existing position entirely. All shares are sold at the current market price.
List upcoming earnings across the watchlist within the next 14 days.
Run the enrichment engine live for one ticker (insider trades, analyst activity, upcoming earnings).
Get enrichment data (insider trades, analyst activity, earnings) for a ticker. Default returns cached daily data. With depth=full, fetches live data with full insider trade details and analyst revision timeline.
Get the most recent earnings outcome row for one ticker.
Get the current portfolio state: cash, equity, total return, and all open positions with unrealized P&L.
Missing output schemas for all 19 tools. LLMs cannot plan downstream calls or extract required fields without knowing response structure.
8 tools have optional parameters with missing or incomplete descriptions (earnings_calendar.on_date, list_recent_signals.ticker, get_trade_history.limit). LLMs cannot infer when to use optional params.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Get quantitative/technical analysis for a ticker. Default returns cached daily data. With depth=full, fetches live price data and computes fresh technicals, sector-relative performance, and a 20-day price table.
Get the latest engine outputs (sentiment, quant, enrichment) for all watchlist tickers. This is your primary source of market data.
Get a detailed view of a single ticker: all engine data, current position (if any), and recent trades.
Read-only quick-look for a single ticker: latest stored sentiment, quant, enrichment, and most recent earnings outcome. No live API calls.
Get the history of your recent trades — what you bought, sold, resized, and why. Use this to review your past decisions.
Investigate sentiment for a ticker. In summary mode, returns the cached daily sentiment data. In deep mode, launches a sentiment analyst sub-agent that can fetch live news, SEC filings, and score text to answer your specific question.
Return the most recent SignalDaily rows across all tickers.
Open a new position. Specify the ticker, direction (long/short), and size as a percentage of total portfolio equity. Cannot open a position in a ticker you already hold — use resize_position instead.
Run the quantitative engine live for one ticker as of a given date. Returns OHLCV-derived metrics (RSI, MAs, health score, sector-relative).
Resize an existing position to a new allocation percentage of total equity. Use this to increase or decrease position size.
Run all three engines (sentiment, quant, enrichment) for the full watchlist on the given date and persist results. No LLM call.
Score open SFE signals against realized prices and return per-signal outcomes plus aggregate stats.
Run the sentiment engine live for one ticker on a given date. Returns the aggregated sentiment payload (score, source breakdown, history-adjusted score).
No error handling guidance. Tools like open_position (cannot open if position exists) and close_position lack recovery instructions. LLMs will not know what to do on failure.
run_signals persists results but does not return signal IDs or references. Downstream score_signals cannot chain without a discovery call.
No pagination or result limits documented for list_recent_signals (default 20, max 200). Large watchlists could return unbounded results, exhausting context.