Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Stocklake — AI Stock Intelligence

REMOTE · API.STOCKLAKE.DEV · SCANNED SEP 21

AI stock intelligence: prices, fundamentals, technicals, news, macro regime, and sector signals.

0 this week 84 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security80
Transport & Reachability100
Schema Quality & AI Usability58
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 11557 tokens (~608/item across 19 items; 19 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 19 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 20 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the Stocklake — AI Stock Intelligence MCP server?

Stocklake — AI Stock Intelligence is a hosted endpoint at https://api.stocklake.dev/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · api.stocklake.dev

# add to Claude Code
claude mcp add --transport http dev-stocklake-stocklake 'https://api.stocklake.dev/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "dev-stocklake-stocklake": {
      "url": "https://api.stocklake.dev/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "dev-stocklake-stocklake": {
      "type": "http",
      "url": "https://api.stocklake.dev/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.dev-stocklake-stocklake]
url = "https://api.stocklake.dev/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "dev-stocklake-stocklake": {
      "type": "remote",
      "url": "https://api.stocklake.dev/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add dev-stocklake-stocklake --url 'https://api.stocklake.dev/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  dev-stocklake-stocklake:
    url: "https://api.stocklake.dev/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "dev-stocklake-stocklake": {
      "Transport": "http",
      "Url": "https://api.stocklake.dev/mcp"
    }
  }
}
# add to Vellum
assistant mcp add dev-stocklake-stocklake -t streamable-http -u 'https://api.stocklake.dev/mcp'
// mcp.json
{
  "mcpServers": {
    "dev-stocklake-stocklake": {
      "type": "http",
      "url": "https://api.stocklake.dev/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 17 Sept 26 0
    • Tool “get_market_assessment” rewrote its description, which is the text the model reads security
    • Tool “get_sector_intelligence” rewrote its description, which is the text the model reads security
    • Tool “get_signals” rewrote its description, which is the text the model reads security
    • “get_signals” reworded the description of “source” cosmetic
  • 7 Sept 26 0
    • Tool “get_stock_research” rewrote its description, which is the text the model reads security
    • New tool “get_stock_financials” functional
  • 5 Sept 26 0
    • Tool “get_market_assessment” rewrote its description, which is the text the model reads security
    • Tool “get_sector_intelligence” rewrote its description, which is the text the model reads security
  • 4 Sept 26 0
    • Tool “get_indicator_history” rewrote its description, which is the text the model reads security
    • Tool “get_signals” rewrote its description, which is the text the model reads security
    • Tool “get_stock” rewrote its description, which is the text the model reads security
    • Schema quality: 9278 → 10230 functional
    • New tool “get_economic_calendar” functional
    • “get_indicator_history” added an optional parameter “full” cosmetic
    • “get_signals” reworded the description of “limit” cosmetic
  • 1 Sept 26 −1
    • Tool “get_insider_activity” rewrote its description, which is the text the model reads security
  • 29 Aug 26 0
    • Tool “get_stock” rewrote its description, which is the text the model reads security
  • 27 Aug 26 0
    • Tool “get_insider_activity” rewrote its description, which is the text the model reads security
    • Tool “get_news_feed” rewrote its description, which is the text the model reads security
    • Tool “get_signals” rewrote its description, which is the text the model reads security
    • Tool “get_stock_news” rewrote its description, which is the text the model reads security
    • Tool “get_stock_research” rewrote its description, which is the text the model reads security
    • “get_news_feed” reworded the description of “min_signal_score” cosmetic
    • “get_signals” reworded the description of “direction” cosmetic
  • 26 Aug 26 +4
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Probed https://api.stocklake.dev/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=api.stocklake.dev CN=YE2,O=Let's Encrypt,C=US 6 Sept 2026 5 Dec 2026 ECDSA 256 ECDSA-SHA384 570a96664588ff37bf5cf5e8a15f7f16a92
SANs: api.stocklake.dev
CN=YE2,O=Let's Encrypt,C=US (CA) CN=Root YE,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 ECDSA 384 ECDSA-SHA384 4df3b15dd6c0784c507cd37b58e6f115
CN=Root YE,O=ISRG,C=US (CA) CN=ISRG Root X2,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 ECDSA-SHA384 872165fc34b6e5fba8add5b3705fb53a
CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 SHA256-RSA 6c8f1dc727c7117f7baf853ac980f9cd

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of api.stocklake.dev. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
dev. present 60074 8 Verified
stocklake.dev. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=31536000
x-content-type-options nosniff
x-frame-options SAMEORIGIN
referrer-policy strict-origin-when-cross-origin
permissions-policy camera=(), microphone=(), geolocation=(), payment=()

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://api.stocklake.dev/mcp Verified 200
http (plaintext) http://api.stocklake.dev/mcp HTTPS enforced 308 https://api.stocklake.dev/mcp
MCP tools · 19 exposed · ~11,480 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
get_earnings_calendar ~143

Upcoming earnings dates for stocks in the Stocklake universe. - days: look-ahead window in days (default 7, max 30) - Returns: { window_days, from_date, to_date, count, results[] } - Each result: symbol, name, sector, market_cap, price, rsi, earnings_date (ISO UTC), is_estimate, eps_trailing, eps_forward - Sorted by earnings_date ascending. - Dates sourced from market data — treat is_estimate=true dates as approximate. Available to all tiers.

NameTypeReqDescription
daysintegerLook-ahead window in days (default 7, max 30).

Structured output declared, but exposes no named fields.

No examples provided.

get_earnings_intelligence ~594

Upcoming earnings with AI context — AI scores, verdicts, and risk factors per stock. Combines the earnings calendar with AI pipeline data to surface which upcoming earnings events are worth monitoring. Parameters: - days_ahead: look-ahead window in days (default 14, max 30) - sector: filter to one sector (e.g. "Technology") - min_ai_score: only return stocks with AI score >= this value, 0-100 (optional). Renamed 2026-08-24 from the retired 0-10 min_flag_score — gates on the same stock_ai_summary.py ai_score field the response already returns, rather than the raw legacy flag_score field, which is no longer part of this fleet's public vocabulary at all. Applied server-side before `limit` truncates the result — a stock with a qualifying score always counts against `limit` ahead of one without, rather than being cut off first for reporting later in the earnings window. - limit: max results to return (default 25, max 25). Each returned ticker counts as one call toward your daily limit — see the docs' rate-limit section. Returns per stock (sorted by earnings_date ascending): - earnings_date: ISO UTC timestamp · is_estimate: whether date is estimated - symbol, name, sector, price, rsi, market_cap - eps_trailing, eps_forward (earnings expectations context) - ai_verdict (positive/neutral/negative, from nightly AI pipeline) - ai_score (0-100) / ai_score_band (Weak/Moderate/Strong/Very Strong) — stock_ai_summary.py's own composite score, same 0-100 scale/band convention as signals.signal_score but a distinct field/pipeline; null if this stock has no ai_summary doc yet. - ai_risks: top 2 AI-identified risk factors - analyst_rating, analyst_target Pro tier only — AI pipeline cost attached. For informational purposes only. Not financial advice.

NameTypeReqDescription
days_aheadintegerLook-ahead window in days (default 14, max 30).
limitintegerMax results to return (default 25, max 25). Each returned ticker counts as one call toward your daily limit.
min_ai_scoreOnly return stocks with AI score >= this value, 0-100 (optional). Renamed 2026-08-24 from the retired 0-10 min_flag_score — gates on the same stock_ai_summary.py ai_score field the response already r…
sectorFilter to one sector, e.g. "Technology".

Structured output declared, but exposes no named fields.

No examples provided.

get_economic_calendar ~571

Upcoming and recently-released macro/economic events -- interest rate decisions, CPI, GDP, PMI, unemployment, payrolls, retail sales, and more -- sourced from Yahoo Finance, the one calendar source confirmed safe for external exposure (a second internal-only source, Trading Economics, carries a ToS caveat and is not exposed here). Two buckets: - released_recent: events with a real reported value, within the last `lookback_days` days. Every item here carries a real `actual` value (never blank) plus `diff` (actual minus previous -- a plain arithmetic difference, never a beat/miss or consensus judgment; Yahoo doesn't provide point-in-time consensus data). - upcoming: not-yet-released events within `days`. No item here ever carries an `actual` value. Every item in both buckets carries `key_event`: true for the handful of event types that reliably move markets on their own (rate decisions, CPI, GDP, headline Non-Farm Payrolls) -- an event-TYPE flag only, never a beat/miss or directional judgment on the number itself. Set `key_events_only=true` to filter to just these, or `major_only=true` to restrict to the 8 largest economies. Both buckets sort major-economy-first, then by recency -- truncating to `limit` should never lose a US/EU/UK/JP/CN/DE/FR/CA print to an older or thinner-economy one. Pro tier only. For informational purposes only. Not financial advice.

NameTypeReqDescription
daysintegerLook-ahead window in days for upcoming events (default 3, max 14).
key_events_onlybooleanRestrict to the small subset of event types that reliably move markets on their own: interest rate/rate decisions, CPI, GDP, and headline Non-Farm Payrolls. Default false returns every event matching…
limitintegerMax results per bucket, released_recent and upcoming each capped independently (default 20, max 50).
lookback_daysintegerLook-back window in days for recently-released events (default 2, max 7). Yahoo's own actual value has a confirmed ~1-day reporting lag, so a same-day-only window misses real releases -- keep this at…
major_onlybooleanRestrict to the 8 largest economies (United States, Euro Area, United Kingdom, Japan, China, Germany, France, Canada). Default false returns all countries.

Structured output declared, but exposes no named fields.

No examples provided.

get_indicator_history ~513

Historical daily indicator snapshots for a stock — ideal for charting and trend detection. Returns up to `days` days of data (max 730, default 90) from the stock_indicator_snapshots collection which is populated daily by the indicator pipeline. Every snapshot row contains: - recorded_at: ISO date string - price: closing price at snapshot time - rsi: RSI(14) value (0-100) - macd_histogram: MACD histogram value (positive = bullish momentum) - bb_pct: Bollinger Band % position (0 = at lower, 100 = at upper band) - sma20 / sma200: 20-day and 200-day simple moving averages With full=true, each row also gets: - williams_r: Williams %R (0 to -100; >-20 overbought, <-80 oversold) - ultimate_osc: Ultimate Oscillator (0-100; >70 overbought, <30 oversold) - vix_fix_value: Williams VIX Fix synthetic fear gauge (higher = more fear) - williams_ad_trend: Accumulation/Distribution trend (rising/falling/flat) - td_signal: DeMark TD Sequential signal (BUY_SETUP/SELL_SETUP/BUY_COUNTDOWN/SELL_COUNTDOWN/null) - td_phase: DeMark phase (setup_active/setup_complete/countdown_active/countdown_done/null) - analyst_rating: analyst consensus (buy/outperform/hold/underperform/sell or null) - analyst_target: mean analyst price target or null Returns {} if fewer than 3 snapshots found. Pro tier only. For informational purposes only. Not financial advice.

NameTypeReqDescription
daysintegerNumber of days of historical daily indicator snapshots to return (max 730, default 90). Returns {} if fewer than 3 snapshots are found in the window.
fullbooleanFalse (default) returns only recorded_at/price/rsi/macd_histogram/bb_pct/sma20/sma200 per day — enough for most charting/trend use. True adds the specialized indicators (williams_r, ultimate_osc, vix…
symbolstringyesStock ticker symbol. Also accepts a company name as a fallback when it uniquely resolves to one symbol.

Structured output declared, but exposes no named fields.

No examples provided.

get_insider_activity ~440

Get AI-synthesized insider + institutional activity for a stock. Returns combined signal (POSITIVE/NEGATIVE/NEUTRAL etc.), signal_score (0-100, higher = stronger/more notable — the exact same field, formula, scale and bands as get_signals()'s signal_score, no separate name) with signal_score_band, per-source breakdown, and a human-readable summary. Data covers insider transactions (SEC Form 4/BaFin/AFM/CNMV, with a gap-fill from Yahoo where the regulatory source has nothing) and institutional holdings — insider_buys/insider_sells, transactions (the individual rows behind those counts, newest first, up to 50, each with date/name/role/type/shares/price/value), top_holders (a union of multiple data sources, up to 15, each with name/shares/pct_held/sources/ share_counts_by_source — the last two show which source(s) contributed to a merged row and each one's own reported share count, useful for spotting a false merge: two genuinely different holders should never collide, but if they did, their per-source counts would diverge wildly), holder_count_divergence (null unless every matched holder disagrees by the same systemic multiplier across sources — e.g. an unrecorded reverse split — a signal top_holders.shares may be unreliable for this symbol; distinct from an ordinary two-holder mismatch, which is normal data lag and stays unflagged), inst_ownership (0-100%), and total_holders. Note: `summary` is a separately-generated narrative on its own refresh cadence and may not always match the live insider_buys/insider_sells/transactions counts — trust the counts/transactions over the prose if they disagree. Pro tier only — AI pipeline cost attached. For informational purposes only. Not financial advice.

NameTypeReqDescription
symbolstringyesStock ticker symbol to fetch insider (SEC Form 4) and institutional-holdings activity for.

Structured output declared, but exposes no named fields.

No examples provided.

get_market_assessment ~840

Combined AI market assessment: macro regime + market outlook in a single call. Refreshed ~4x/day, weekdays only, during market hours (~2h apart) — dead overnight and on weekends, not a continuous 4-hourly cadence. Check regime_stale/outlook_stale below (which already account for the weekend gap) before treating either as current, especially on a Monday morning. Two distinct perspectives returned together: - REGIME (RISK_OFF/CAUTIOUS/NEUTRAL/AGGRESSIVE): answers "how much equity risk to take" → use for position sizing and asset allocation decisions - OUTLOOK (POSITIVE/NEUTRAL/NEGATIVE): answers "which direction and sectors to trade" → use for sector preference and directional bias Both share the same pipeline run so they are always in sync. - history_count: include last N prior assessments for each (0-3, default 0) - regime_*: risk posture fields — regime, risk_appetite_score (0-100 re-expression of regime, higher = current conditions support more risk-taking), regime_bias, regime_bias_note (plain sentence on whether current conditions favor long or short setups, or neither), regime_confidence, regime_rationale, key_risks, watch_for, vix_at_assessment, regime_updated_at, regime_stale - macro_score / regime_strength: macro_score is a real, continuous 0-100 read on how much risk the current environment supports (0=RISK_OFF/capital preservation, 100=AGGRESSIVE/risk-on) — the same underlying number `regime` buckets into 4 discrete categories, blending arithmetic inputs (VIX level, breadth oversold/overbought skew, SKEW-vs-VIX divergence, TD-exhaustion ratio) with regime_strength, the AI's own 1-10 read of regime conviction. Distinct from risk_appetite_score (a coarse 4-value lookup on `regime` alone) — macro_score is the real underlying number. Null on a pre-2026-08-26 assessment that predates this field. Not a call on any one stock. - macro_score_trend: {change_7d, change_30d, direction} — whether macro_score itself is improving/deterio…

NameTypeReqDescription
history_countintegerInclude the last N prior assessments for each of regime and outlook (0-3, default 0).

Structured output declared, but exposes no named fields.

No examples provided.

get_market_movers ~414

Top market movers from the Stocklake universe — gainers, losers, most active. - category: "gainers" | "losers" | "most_active" | "all" (default "all" = all 3 categories) - limit: results per category (default 10, max 20). Each returned stock counts as one call toward your daily limit — a symbol appearing in more than one category (e.g. both "gainers" and "most_active") counts once per category it appears in. - min_market_cap_b: filter to stocks above this market cap in billions (e.g. 1.0 = $1B+) Returns per stock: symbol, name, sector, price, change_pct, volume, rsi, market_cap, analyst_rating, atr_pct (atr_pct omitted when the underlying volatility reading is missing or corrupted). Available to all tiers. Pro tier adds the minimum AI-narrative slice (ai_verdict, ai_headline, ai_score 0-100, ai_score_band) — precomputed, no extra AI cost. A big mover's price/volume/RSI alone doesn't say whether the move matters; the one-line headline does. For the full research bundle on any one mover, call get_stock_research(symbol).

NameTypeReqDescription
categorystringWhich movers category to return: "gainers" | "losers" | "most_active" | "all" (default "all" = all 3 categories).
limitintegerResults per category (default 10, max 20). Each returned stock counts as one call toward your daily limit — a symbol appearing in more than one category (e.g. both "gainers" and "most_active") counts…
min_market_cap_bFilter to stocks above this market cap in billions of dollars, e.g. 1.0 = $1B+.

Structured output declared, but exposes no named fields.

No examples provided.

get_market_pulse ~171

Live market health snapshot in a single call. Aggregates key market indicators without requiring multiple tool calls. No AI cost — reads live data directly from the market data feed. Returns: - vix: VIX level and change_pct (from live stocks data) - fear_greed: value (0-100) and label (e.g. "neutral", "greed", "fear") - breadth: market-wide RSI distribution — oversold_pct, overbought_pct, neutral_pct, universe_size - indices: SPY, QQQ, IWM prices + RSI + 1-week performance - bonds_commodities: TLT (long-duration bonds), GLD (gold) - updated_at: when the breadth/fear_greed snapshot was last recorded Available to all tiers.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

get_news_feed ~582

Top AI-flagged news across all tracked stocks — the market-wide news briefing. Unlike get_stock_news (per-symbol), this scans the entire universe and returns the most notable articles ranked by signal_score, newest first within each score tier. Use this for: - Morning briefing: "what happened in the market this week?" - Catalyst scanning: "what news is driving moves right now?" - Event monitoring: "which stocks have high-impact news today?" - min_signal_score: minimum signal_score (0-100, default 60) used to SELECT articles server-side. Resolved per-article (stored/computed magnitude preferred over an unfiltered Mongo `$gte`, since a formal live signal doesn't exist for every article — see signal_score below), then filtered/sorted in Python. - days: look-back window in days (default 3, max 10) - limit: max articles returned (default 10, max 25) - Per article: symbol, title, published_at, ai_sentiment, ai_summary (full text), signal_score (0-100), signal_score_band (Weak/Moderate/Strong/ Very Strong) signal_score/signal_score_band: this symbol's LIVE signal score if a news-sourced signal was raised for it in the last 90 days (same number get_stock_news()/get_signals() report, kept in sync as that signal is re-scored — one $in query per distinct symbol in the result, not per article, so two articles about the same stock always show the same value); otherwise a per-article magnitude computed from THIS article's own sentiment/confidence/flag_score, so every article still gets a real, rankable number. Always a single number — for a symbol whose live signal is genuinely two-sided (real opposing bull/bear theses), this is the STRONGER of the two sides, same as get_signals()/get_stock_news(). There is deliberately no separate "news_score" field — one name for "how strong is this idea," whether it's backed by a formal signal or just this article's own classification. Pro tier only — AI pipeline cost attached. For informational purposes only. Not financial ad…

NameTypeReqDescription
daysintegerLook-back window in days (default 3, max 10).
limitintegerMax articles returned (default 10, max 25).
min_signal_scoreintegerMinimum signal_score used to SELECT articles server-side, 0-100 (default 60). Resolved per-article (this symbol's live signal_score if one exists, else a per-article magnitude computed from sentiment…

Structured output declared, but exposes no named fields.

No examples provided.

get_screener ~1,348

Filter and rank stocks from the Stocklake universe — fundamentals, technicals, and AI signals in one tool. Parameters: - sector: e.g. "Technology", "Healthcare", "Financial Services" - country: e.g. "United States", "Germany" - min_rsi / max_rsi: exact RSI bounds (e.g. max_rsi=30 = oversold, min_rsi=70 = overbought) - sma_trend: "above_200" (price above 200-day MA) | "below_200" - macd_signal: "positive" (MACD line above signal) | "negative" - min_perf_1d / max_perf_1d: 1-day performance % (e.g. min_perf_1d=2.0 = up 2%+ today) - min_volume: minimum daily volume (e.g. 1000000) - min_market_cap_b / max_market_cap_b: market cap in billions - max_pe_forward: maximum forward P/E (e.g. 20 = value screen) - analyst_rating: "strong_buy" | "buy" | "hold" | "sell" | "strong_sell" - min_ai_score: minimum AI score 0-100 (pro tier only — silently ignored for free). Gates on stock_ai_summary.py's own composite ai_score — same 0-100 scale/band convention as signals.signal_score, but a distinct field/pipeline (per-stock AI summary confidence, not a directional trade idea). Renamed 2026-08-24 from the retired 0-10 min_flag_score — the raw flag_score field it used to gate on is no longer part of this fleet's public vocabulary at all (see ai_score below). - preset: "oversold" | "overbought" | "momentum" | "high_conviction" (pro only) oversold = RSI≤35 + above SMA200 · overbought = RSI≥65 momentum = RSI 50-70, above SMA200, up 0.5%+ today · high_conviction = ai_score≥70 - sort_by: "market_cap" | "rsi" | "perf_1d" | "volume" | "analyst_rating" | "rating" | "ai_score" (pro). Defaults to "market_cap", except the "high_conviction" preset defaults to "ai_score" (the dimension it's filtering by) unless you explicitly pass a different sort_by. - sort_dir: "asc" | "desc" (default "desc") - limit: 1–25 (default 20). Each returned stock counts as one call toward your daily limit. Returns: { count, preset, filters, results[] } — each result includes symbol, name, sector, indu…

NameTypeReqDescription
analyst_ratingFilter by analyst consensus rating: "strong_buy" | "buy" | "hold" | "sell" | "strong_sell".
countryFilter by country, e.g. "United States", "Germany".
limitintegerMax results to return, 1-25 (default 20). Each returned stock counts as one call toward your daily limit.
macd_signal"positive" (MACD line above signal) | "negative".
max_market_cap_bMaximum market cap in billions of dollars.
max_pe_forwardMaximum forward P/E, e.g. 20 for a value screen.
max_perf_1dMaximum 1-day performance %.
max_rsiMaximum RSI bound (e.g. max_rsi=30 = oversold).
min_ai_scoreMinimum AI score, 0-100 — pro tier only (silently ignored for free). Gates on stock_ai_summary.py's own composite ai_score, same 0-100 scale/band convention as signals.signal_score but a distinct fie…
min_market_cap_bMinimum market cap in billions of dollars.
min_perf_1dMinimum 1-day performance %, e.g. min_perf_1d=2.0 = up 2%+ today.
min_rsiMinimum RSI bound (e.g. min_rsi=70 = overbought).
min_volumeMinimum daily volume, e.g. 1000000.
preset"oversold" | "overbought" | "momentum" | "high_conviction" (pro only). oversold = RSI<=35 + above SMA200; overbought = RSI>=65; momentum = RSI 50-70, above SMA200, up 0.5%+ today; high_conviction = a…
sectorFilter by sector, e.g. "Technology", "Healthcare", "Financial Services".
sma_trend"above_200" (price above 200-day MA) | "below_200".
sort_by"market_cap" | "rsi" | "perf_1d" | "volume" | "analyst_rating" | "rating" | "ai_score" (pro). Defaults to "market_cap", except the "high_conviction" preset defaults to "ai_score" (the dimension it's…
sort_dirstringSort direction: "asc" | "desc" (default "desc").

Structured output declared, but exposes no named fields.

No examples provided.

get_sector_intelligence ~649

AI-assessed sector intelligence: signal, cycle stage, rotation signal, drivers, alerts, and computed statistics per sector (RSI distribution, breadth, performance 1W/1M, top/bottom movers, historical percentiles). Pass a sector name for a single sector, or omit the parameter (or pass None) to get the latest assessment for all 11 sectors — the all-sectors call doubles as the rotation view: use sort_by_strength to rank LEADING-first for finding leading vs lagging sectors, and history_count for prior signal states per sector. - sort_by_strength: sort all-sectors output LEADING→LAGGING instead of alphabetical (all-sectors call only; ignored when a single sector is requested) - history_count: include last N prior signal states per sector, 0-3 (default 0; all-sectors call only) - sector_score / strength_score: sector_score is a real, continuous 0-100 read on this sector's relative strength/leadership (0=LAGGING, 100=LEADING) — the same underlying number `signal` buckets into 5 discrete categories, blending arithmetic inputs (RSI/perf percentiles, top-5 concentration, SMA200 breadth) with strength_score, the AI's own 1-10 read. Comparable across all 11 sectors on one absolute scale (not per-sector-relative). Null on a pre-2026-08-26 assessment that predates this field. Not a buy/sell call. - sector_score_trend: {change_7d, change_30d, direction} — whether this sector's score is improving/deteriorating/stable over the trailing 7/30 days, computed automatically. Single-sector calls only — this is the only trend view available for one sector at all (history_count only applies to the all-sectors call). Two sectors both reading STRONG/68 can be in opposite motion; this tells them apart. Either leg is null without enough history yet. Refreshed ~4x/day, weekdays only, during market hours (~2h apart) — dead overnight and on weekends, not a continuous 4-hourly cadence. Check the returned updated_at before treating this as current, especially on a Monday…

NameTypeReqDescription
history_countintegerInclude the last N prior signal states per sector, 0-3 (default 0). Only applies to the all-sectors call.
sectorPass a sector name for a single sector's assessment, or omit (None) to get the latest assessment for all 11 sectors at once — the all-sectors call doubles as the rotation view.
sort_by_strengthbooleanSort all-sectors output LEADING→LAGGING instead of alphabetical, for finding leading vs lagging sectors. Only applies to the all-sectors call; ignored when a single sector is requested.

Structured output declared, but exposes no named fields.

No examples provided.

get_signals ~876

AI-screened stock signals recently surfaced by the Stocklake pipeline — sourced from news analysis, sector screening, and sentiment signals. Shows what the pipeline noticed in the last 24 hours (falling back to the most recent signals regardless of age if nothing has fired in that window — see `window` in the response). This reflects what the AI pipeline found, not whether Stocklake's own internal trading engine still holds it live — a signal it later dropped or let expire is still shown here, since that's a fact about our own trading state, not about the signal's informational value. Parameters: - direction: "POSITIVE" | "NEGATIVE" | "NEUTRAL" (default: all). NEUTRAL covers both a flat/undecided read AND a genuinely two-sided idea (real opposing bull/bear theses on the same symbol) — in the latter case signal_score is the STRONGER of the two sides (see signal_score below), so a high score alongside NEUTRAL means "real conviction here, just no directional consensus," not "nothing going on." The two-sided detail is in `rationale`. - min_signal_score: minimum composite signal score 0-100 (default 60) — a blend of conviction/confidence/flag_score, source track record, and real technical factors. This is the field to filter on. Always compared against a single number, including for NEUTRAL/two-sided ideas — a result is never returned below your threshold on both sides. - min_conviction, min_flag_score: DEPRECATED, ignored for filtering — kept in the signature only so existing callers don't hard-fail; ai.stocklake.dev's internal scoring retired the raw conviction/confidence/flag_score triad in favor of signal_score. Passing a non-default value here has no effect and is logged for a planned removal. - source: filter by signal source — "news" | "screener" | "sentiment" (default: all) - limit: max results to return (default 25, max 50). Each returned signal counts as one call toward your daily limit. Returns: - count: number of signals retu…

NameTypeReqDescription
directionFilter by direction: "POSITIVE" | "NEGATIVE" | "NEUTRAL" (default: all). NEUTRAL covers both a flat/undecided read and a genuinely two-sided idea (see signal_score below).
limitintegerMax results to return (default 25, max 50). Each returned signal counts as one call toward your daily limit.
min_convictionintegerDEPRECATED, ignored for filtering — kept in the signature only so existing callers don't hard-fail; internal scoring retired the raw conviction/confidence/flag_score triad in favor of signal_score. P…
min_flag_scoreintegerDEPRECATED, ignored for filtering — kept in the signature only so existing callers don't hard-fail; internal scoring retired the raw conviction/confidence/flag_score triad in favor of signal_score. P…
min_signal_scoreintegerMinimum composite signal score, 0-100 (default 60) — a blend of conviction/confidence/flag_score, source track record, and real technical factors. This is the field to filter on.
sourceFilter by signal source: "news" | "screener" | "sentiment" (default: all).

Structured output declared, but exposes no named fields.

No examples provided.

get_stock ~1,494

Price, fundamentals, technical indicators, and company profile for a stock. Returns all data needed to understand a stock in a single call. Key fields: - price, change_pct, prev_close, week52_high/low, volume, avg_volume - market_cap, enterprise_value, beta - pe_trailing, pe_forward, price_to_book, dividend_yield, dividend_rate - debt_to_equity, profit_margins, return_on_equity, free_cashflow - revenue_growth, earnings_growth, revenue_ttm, gross_profit_ttm - analyst_rating: "strong_buy"|"buy"|"hold"|"sell"|"strong_sell" (analyst consensus) - analyst_rating_score: 1.0–5.0 mean analyst recommendation (1=strong_buy, 5=strong_sell) - analyst_target: mean analyst price target - analyst_count: number of analyst opinions - indicators: raw RSI, MACD, Bollinger Bands, SMA20/SMA200 (the canonical 50/200-day averages -- no separate top-level ma_50/ma_200 field), EMA20/EMA200, ATR - description: company business description - website, employees, officers (top 5: name, title, total_pay) - updated_at: last data sync timestamp Available to all tiers (raw indicator numbers, no interpretation). This basic six (RSI/MACD/Bollinger/SMA/EMA/ATR) is standard, widely-available technical analysis. Pro tier also unlocks 6 more specialized indicators inside the SAME `indicators` block (williams_r, ultimate_osc, vix_fix, williams_ad, td_sequential, elliott_wave -- the Larry Williams family, DeMark TD Sequential, and Elliott Wave) -- these are omitted entirely from the free/guest response (tier-gating sweep, 2026-08-28), not merely unlabeled; free/guest calls get indicators with only the basic six populated. Pro tier adds four interpreted blocks computed from the same indicators, no extra AI cost, plus a minimum AI-narrative slice — all five below are precomputed, none cost a live AI call: - ai_verdict / ai_headline / ai_score / ai_score_band: the minimum useful AI-narrative slice, shared by every pro-tier stock-returning tool. A bare verdict alone isn't actionable (e.g. bearish whil…

NameTypeReqDescription
symbolstringyesStock ticker symbol. Also accepts a company name as a fallback (e.g. "Apple") when it uniquely resolves to one symbol.

Structured output declared, but exposes no named fields.

No examples provided.

get_stock_financials ~541

Full raw financial statements — balance sheet, income statement, and cash flow line items over multiple periods. This is the underlying statement data itself, not a derived summary — for the forensic-accounting scores computed FROM these statements (Altman Z / Piotroski F / Beneish M), see get_stock()'s forensic_scores block instead. Each returned statement is shaped {line_item_name: {period_end_iso: value}} — e.g. balance_sheet["Total Revenue"]["2025-12-31"] — so a caller gets every available period per line item and can compute its own trends/ deltas/CAGRs, not just read the latest value. period="annual" (default) returns up to 5 fiscal years — Yahoo's own real ceiling, some symbols return fewer. period="quarterly" returns up to roughly 7-8 of the most recent quarters. period="both" returns both blocks in one call. ~50-60 curated line items per statement (not a raw dump of every row Yahoo reports): balance sheet structure (assets/liabilities/equity/debt/ working capital), income statement (revenue through EPS), and cash flow (operating/investing/financing, free cash flow, buybacks, stock-based comp). Coverage genuinely varies by symbol and sector — a bank has no "Inventory" line, a company with no buyback program has no "Repurchase Of Capital Stock" entry. A missing line item means Yahoo doesn't report it for this company, not a fetch error. quarterly can come back null (with a quarterly_note) for a symbol whose real quarterly data isn't available — rare in practice; live coverage testing found real quarterly statements even for semi-annual-reporting Hong Kong names. annual/quarterly can both be entirely absent if this symbol hasn't yet been through the financials sync, or if it's not an equity (this tool has no data for ETFs/crypto/forex/indices). Pro tier only. For informational purposes only. Not financial advice.

NameTypeReqDescription
periodstring'annual' (up to 5 fiscal years, default), 'quarterly' (up to ~7-8 most recent quarters), or 'both'.
statementstring'all' (default), 'balance_sheet', 'income_stmt', or 'cash_flow' — restricts which statement(s) are returned.
symbolstringyesStock ticker symbol. Also accepts a company name as a fallback when it uniquely resolves to one symbol.

Structured output declared, but exposes no named fields.

No examples provided.

get_stock_history ~158

Daily OHLCV price history for a stock. - days: number of trading days to return (default 90, max 365) - Returns: { symbol, days_requested, days_returned, count, history[] } — days_returned/count can be less than days_requested if less history exists - Per bar: date, open, high, low, close, volume

NameTypeReqDescription
daysintegerNumber of trading days of daily OHLCV history to return (default 90, max 365). days_returned/count in the response can be less than this if less history exists.
symbolstringyesStock ticker symbol. Also accepts a company name as a fallback when it uniquely resolves to one symbol.

Structured output declared, but exposes no named fields.

No examples provided.

get_stock_news ~768

AI-analysed news for a stock, newest first. Only returns articles processed by our AI pipeline (sentiment, signal_score, summary). - days: look-back window in days. Requesting more than your tier's cap is silently clamped down to it: 30 free/guest, 90 pro. - limit: max articles returned. The `limit=10` default is a Pro-tier-shaped value — on free/guest it's silently clamped down to that tier's cap (5), so a free caller passing no `limit` effectively gets 5, not 10. Requesting more than your tier's cap (5 free/guest, 50 pro) is likewise clamped down. - status: "ok" = articles returned | "empty" = no news in window - Per article: title, published_at, ai_sentiment, ai_summary (full text) — Pro only, see below - signal_score (Pro only, 0-100 or null) / signal_score_band (Pro only, string or null — "Weak"/"Moderate"/"Strong"/"Very Strong"): if this symbol has a live news-sourced signal (raised in the last 90 days), every article shows that SAME number — the same one get_signals()/get_stock_research() report for this symbol (all three read the same underlying signal, via the same shared resolver), staying live/synced: if the signal is later re-scored, this reflects the update on your next call, not a frozen snapshot from classification time. Always a single number (never a two-sided split) — for a genuinely contested (two opposing theses) signal, this is the STRONGER of the two sides. NOT gated on whether Stocklake's own internal trading engine still considers the signal live — a dropped/expired signal is still a real, useful fact about what the pipeline found. When there's no live signal for this symbol at all, each article instead gets its OWN per-article score (computed from that article's sentiment/confidence/flag_score) — the same fallback get_stock_research()'s news[] block uses, so a symbol with no active thesis doesn't just go null across the board; different articles for the same symbol can then legitimately show differe…

NameTypeReqDescription
daysintegerLook-back window in days. Requesting more than your tier's cap is silently clamped down to it: 30 free/guest, 90 pro.
limitintegerMax articles returned. Default 10 is a Pro-tier-shaped value — on free/guest it's silently clamped down to that tier's cap (5), so a free caller passing no limit effectively gets 5, not 10. Requestin…
symbolstringyesStock ticker symbol. Also accepts a company name as a fallback when it uniquely resolves to one symbol.

Structured output declared, but exposes no named fields.

No examples provided.

get_stock_research ~805

Full AI research bundle for a stock in one call — fundamentals, AI-generated summary, recent AI-classified news, insider/institutional signal, and recent trade signal history. Replaces 4 separate calls: get_stock + get_stock_news + get_insider_activity + get_signals (for one symbol). Returns: - stock: price, name, sector, rsi, pe_forward, market_cap, 52-week range, analyst data - ai_summary: verdict, ai_score (0-100)/ai_score_band (Weak/Moderate/Strong/ Very Strong — stock_ai_summary.py's own composite, same scale/band convention as signal_score but a distinct field/pipeline), full summary, key_points, risks, price_at_generation, generated_at, headline (one-sentence plain-language take), near_term (stance/confidence over <4 weeks — technicals/momentum-weighted), longer_term (stance/confidence over a multi-month horizon — fundamentals/analyst/institutional-flow-weighted). headline/near_term/longer_term are null on summaries generated before this schema shipped — until that symbol's next regeneration, fall back to verdict/ai_score. - news: last 3 high-relevance articles (title, published_at, ai_sentiment, ai_summary, signal_score [0-100]/signal_score_band — this symbol's LIVE news-sourced signal score if one exists in the last 90 days [same number as the `signals` list below and get_signals()/get_stock_news(), kept in sync as it's re-scored], else a per-article magnitude computed from that article's own classification. One name, no separate "news_score" field.) - sentiment: signal, signal_score (0-100)/signal_score_band — one name, no separate "insider_score" field, same as the news block above — insider_trend (buying/selling/neutral, or null with no transactions in the window), institutional_pct - signals[]: up to the 5 most recent trade signals for this symbol in the last 90 days (direction, rationale, signal_score [0-100], signal_score_band [human-readable label — "Weak"/"Moderate"/"Strong"/"Very Strong" — or null alongside a nul…

NameTypeReqDescription
symbolstringyesStock ticker symbol to fetch the full AI research bundle for.

Structured output declared, but exposes no named fields.

No examples provided.

get_stocks ~423

Batch stock data for up to 25 symbols in a single call — the same fields get_stock returns for the same key/symbol, so this is a true batch version, not a thinned-down scan. Returns a dict keyed by symbol. Missing symbols are omitted from the result. Each symbol in the batch counts as one call toward the daily limit. A request over 25 symbols is rejected outright (error: batch_too_large) rather than silently served on just the first 25 — split a larger list into multiple calls. Available to all tiers (fundamentals/indicators/company profile, free). Pro tier adds, per symbol, the same precomputed blocks get_stock adds — rating {score, direction, signals}, signals (per-indicator breakdown), relative_strength, market_risk {beta_spy_1y, corr_spy_1y}, and the minimum AI-narrative slice (ai_verdict, ai_headline, ai_score, ai_score_band). None of this costs a live AI call — it's all precomputed and just needs projecting. NOT included, even on pro — call get_stock(symbol) for stance_signals, or get_stock_research(symbol) for the full ai_summary text (summary/key_points/ risks/near_term/longer_term) plus cross-source news/insider/signal context. Response also carries `duplicates_collapsed`: how many input symbols normalized (case-folding, share-class aliasing e.g. "BRK.B"->"BRK-B") or literally repeated onto a symbol already counted elsewhere in this batch. requested - len(missing or []) - duplicates_collapsed == count always holds.

NameTypeReqDescription
symbolsarrayyesList of stock ticker symbols, up to 25 per call. Each symbol counts as one call toward the daily limit. A request over 25 symbols is rejected outright (error: batch_too_large) rather than silently se…

Structured output declared, but exposes no named fields.

No examples provided.

get_watchlist ~150

The caller's Stocklake watchlist (starred symbols from the web dashboard), enriched with live price, technicals, and AI verdict. Returns: - count: number of symbols on the watchlist - items[]: each with symbol, name, sector, price, change_pct, rsi, market_cap, analyst_rating, atr_pct, ai_verdict, ai_headline, ai_score (0-100), ai_score_band (Weak/Moderate/Strong/Very Strong), added_at, price_at_add - empty items[] if nothing is starred yet — star symbols at stocklake.dev/dashboard Pro tier only. For informational purposes only. Not financial advice.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

Common questions

What is the Stocklake — AI Stock Intelligence MCP server?

Stocklake — AI Stock Intelligence is an MCP server listed in the public MCP registry as dev.stocklake/stocklake. AI stock intelligence: prices, fundamentals, technicals, news, macro regime, and sector signals. This page covers its hosted endpoint (https://api.stocklake.dev/mcp).

Is the Stocklake — AI Stock Intelligence MCP server safe to use?

Stocklake — AI Stock Intelligence scores 84 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Stocklake — AI Stock Intelligence MCP server expose?

Stocklake — AI Stock Intelligence exposes 19 tools: get_stock, get_stock_news, get_stock_history, get_earnings_calendar, get_market_assessment, and 14 more. Their descriptions and schemas cost roughly 11,480 tokens of context every time the server is loaded.

Does the Stocklake — AI Stock Intelligence MCP server require authentication?

No. We connected to Stocklake — AI Stock Intelligence without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the Stocklake — AI Stock Intelligence MCP server still maintained?

Stocklake — AI Stock Intelligence is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.