An MCP server that gives AI agents (Claude Code, Codex, etc.) stock analysis capabilities
Stock Analysis MCP demonstrates solid fundamentals with 18 well-named tools, all equipped with descriptions and visible input schemas. Naming conventions are strong (verb-first, clear intent). However, several gaps limit it from reaching 70+: (1) parameter descriptions lack detail on constraints, ranges, and format requirements, most are minimal 1-3 word statements; (2) output schemas are undocumented in the tool definitions themselves; (3) error handling is basic, no recovery guidance, no actionable error messages; (4) some parameters accept free-form strings where enums would prevent hallucination. The tools follow a reasonable composition pattern (search → analyze → compare) but lack comprehensive error categorization and validation guidance. Prompts and resources are present (templates, analysis guide), signaling sophistication in agent enablement. Schemas are present but sparse on constraints.
Comprehensive single-stock analysis with optional sizing inputs.
Sell/hold analysis for an existing position with cost basis and purchase date.
Swing-trade setup card for a single stock (days-to-weeks horizon, long-only). Detects pullback_in_uptrend / breakout / oversold_mean_reversion setups and returns an action (trade_now, enter_on_trigger, watch, no_setup, avoid, wait_for_data) with entry trigger, stop, targets, reward/risk, time stop, R-based sizing, and blockers. trade_now requires fresh regular-session data. Informational only — not financial advice.
Compare multiple stocks side-by-side with key metrics and relative valuations.
Generate a data quality and completeness report for a stock.
Get upcoming events and historical earnings for a stock. Includes next earnings date, earnings history with beat/miss, dividend information, and recent stock splits.
Parameter descriptions are minimal and lack constraint documentation. Most are 1 - 5 words (e.g., 'Stock ticker symbol' for 'symbol'). No ranges, enums, format constraints, or validation rules are stated.
Output schemas are not documented in tool definitions. Callers cannot see what fields are returned or plan downstream tool chains.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 43 | - | v1 |
Get fundamental financial metrics for a stock. Includes valuation ratios (P/E, P/B, PEG), growth rates, profitability margins, financial health metrics, and cash flow.
Get recent news and earnings for a stock. Fetches news from the past week by default. Also includes recent earnings report if one occurred within the lookback period.
Get options market signals and implied volatility data for a stock.
Get institutional ownership and short interest data for a stock.
Analyze portfolio sector and factor exposure given a list of holdings.
Fetch historical price data with summary statistics.
Get basic stock information including name, sector, price, and market cap.
Calculate technical indicators for a stock. Includes moving averages (SMA 20/50/200, EMA 12/26), RSI, MACD, ATR, 52-week position, multi-period returns, and a `short_term` block (prior-day/5d/20d levels, swing pivots, gap, RVOL, compression). timeframe="swing" adds an `intraday` block (session VWAP, time-adjusted RVOL, hourly trend, daily/hourly alignment) with a freshness sub-block. Intraday freshness is disclosure, not gating: failures null the dependent fields and add warnings instead of blocking the response.
Create, update, or delete a named watchlist.
Scan a watchlist for stocks matching specific criteria (technicals, valuations, etc.).
Search for stock symbols by company name or ticker.
Identify what has changed in a stock's fundamentals, technicals, or news since last analysis.
Free-form string parameters should use enums where options are known. Examples: 'period' in get_price_history accepts a fixed set (1d, 5d, 1mo, etc.) but is not declared as an enum, LLMs may hallucinate invalid values like '2d' or 'monthly'. 'interval' has the same issue. 'timeframe' in get_technicals (position vs swing) should be an enum.
Error handling lacks recovery guidance and categorization. Tools return JSON but do not tell the LLM whether errors are retryable, user-fixable, or fatal, or what to do next. No distinction between 'symbol not found' (lookup alternative) and 'API timeout' (retry).
manage_watchlist is the only write tool but has no confirmation/dry-run safety pattern. Destructive actions (delete watchlist) should support a confirm_before_execute pattern or at least warn the LLM of irreversibility.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present. Per MCP spec (current as of 2026-07-28), tools should be annotated to help clients understand resource impact at a glance.
Parameters like 'account_size' and 'risk_per_trade_pct' in analyze and analyze_trade_setup lack numeric ranges, default behavior, and validation rules. E.g., should account_size be > 0? Should risk_per_trade_pct be in (0, 100]? What if both are null?
Tool descriptions do not explain WHEN to use each tool vs. alternatives. E.g., when should an LLM call analyze vs. analyze_trade_setup vs. analyze_my_position? The distinctions are not documented.
The 'previous_analysis' parameter in what_changed is typed as 'object' with no schema or structure definition. LLMs cannot infer what fields or format are expected.
The 'criteria' parameter in scan_watchlist is typed as 'object' with minimal description ('Scan criteria (technical signals, valuation ranges, etc.)'). LLMs cannot construct valid criteria without an example or schema.