Skip to main content
Glama

Stocklake — AI Stock Intelligence

Server Details

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

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.3/5.0

Scored across 19 tools

Disambiguation4/5

Most tools target a distinct resource and action (stock snapshot vs. batch vs. financials vs. history vs. news; market pulse vs. AI assessment vs. movers vs. sector intelligence). A few pairs overlap in scope — get_earnings_intelligence is a superset of get_earnings_calendar, and get_stock_research bundles what several other tools provide individually — but the descriptions draw clear boundaries, so an agent can usually pick correctly.

Naming Consistency5/5

All 19 tools follow the same get_<noun> pattern with snake_case (get_stock, get_stock_research, get_market_pulse, get_earnings_intelligence). The verb is always 'get' and the noun is a clear domain resource, making the family predictable and easy to scan.

Tool Count4/5

19 tools is on the high side of the ideal range, but the server covers a broad domain — market-wide intelligence, sector/screener, per-stock research, news, financials, and watchlist — and each tool earns its place with distinct data. It feels slightly heavy but not bloated for a full-featured stock intelligence API.

Completeness5/5

The surface comprehensively covers a read-only intelligence domain: market overview, sector analysis, screening, per-stock fundamentals/technicals/research/news/insider activity, earnings, economic calendar, and watchlist. There are no obvious dead ends — every major workflow (screen, drill into a stock, check market regime, monitor news) has the tools needed to complete it.

Available Tools

19 tools
get_earnings_calendarGet Earnings CalendarA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLook-ahead window in days (default 7, max 30).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering safety. The description adds behavioral value beyond that by noting that dates from market data are approximate when is_estimate is true, and that results are sorted by earnings_date ascending. This helps the agent interpret the data reliability, which annotations do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: the first line states the core purpose. The remaining bullet points succinctly list parameter and return fields without fluff. Every sentence contributes useful information, and the format is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers what an agent needs to call the tool correctly: the parameter and its constraints, the exact return shape with fields, sorting behavior, data reliability caveat, and tier access. The presence of an output schema further reduces the need to explain return values, and nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'days' is already fully described in the schema (look-ahead window, default 7, max 30). The tool description repeats this information without adding new nuance. Since schema coverage is 100%, the baseline of 3 applies; the description does not improve parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists upcoming earnings dates for stocks in the Stocklake universe, with a specific verb and resource. It does not explicitly differentiate from the sibling get_earnings_intelligence, which could plausibly overlap, so the purpose is clear but not sharply distinguished.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives. It does not mention sibling tools like get_earnings_intelligence or any conditions that would favor one over the other. The only operational detail is the look-ahead window default and max, which is parameter guidance, not usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_earnings_intelligenceGet Earnings IntelligenceA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results to return (default 25, max 25). Each returned ticker counts as one call toward your daily limit.
sectorNoFilter to one sector, e.g. "Technology".
days_aheadNoLook-ahead window in days (default 14, max 30).
min_ai_scoreNoOnly 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. Applied server-side before limit truncates the result, so a qualifying stock always counts against limit ahead of one without.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, but the description goes well beyond that: it discloses the 'Pro tier only — AI pipeline cost attached', states the informational purpose, explains the server-side filtering order relative to limit, details the nullability of ai_score (absence of ai_summary doc), and traces the field provenance to stock_ai_summary.py. This adds rich behavioral context that the annotations do not cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is fairly long but well-structured with sections for purpose, parameters, return fields, and caveats. It front-loads the core purpose in the first sentence, and all sentences carry substantive information. While it could be tightened, the organization and lack of filler make it efficient for its complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (4 optional parameters, a rich output schema, and multiple caveats), the description covers all essential aspects: what it does, what data it returns, parameter semantics, cost implications, and informational limitations. The return field list and the note about sorting and nullability make it complete for an agent to call correctly without external documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents each parameter. The description adds value by explaining the min_ai_score renaming history and the ordering effect with limit, and clarifies that all parameters are optional. It provides extra nuance beyond the schema's literal descriptions, earning above the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Upcoming earnings with AI context — AI scores, verdicts, and risk factors per stock') and clearly distinguishes it from plain earnings calendars by emphasizing the AI pipeline integration. The phrase 'Combines the earnings calendar with AI pipeline data' makes the unique value explicit, differentiating it from the sibling get_earnings_calendar.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool (when you need AI context on earnings), but it does not explicitly state when NOT to use it or recommend a sibling alternative like get_earnings_calendar for calendar-only needs. While it clarifies parameters and return behavior, it lacks explicit routing guidance, leaving the choice to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_economic_calendarGet Economic CalendarA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLook-ahead window in days for upcoming events (default 3, max 14).
limitNoMax results per bucket, released_recent and upcoming each capped independently (default 20, max 50).
major_onlyNoRestrict to the 8 largest economies (United States, Euro Area, United Kingdom, Japan, China, Germany, France, Canada). Default false returns all countries.
lookback_daysNoLook-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 2+ to reliably see them.
key_events_onlyNoRestrict 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 the broader base filter (also includes PMI, unemployment, other payrolls components, retail sales, ADP, inflation).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only/idempotent annotations, the description discloses important behavior: released items always have actual values, upcoming items never do, diff is a plain arithmetic difference with no consensus judgment, key_event is only an event-type flag, and sorting is major-economy-first. It also flags Yahoo's reporting lag and source-exposure caveats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, source rationale, bucket invariants, filter semantics, sorting behavior, and tier restrictions are all covered without repetition. The front-loaded opening gives immediate clarity, and the structured sections make it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists and all 5 parameters are documented in the schema, the description covers the remaining contextual ground fully: bucket semantics, value guarantees, filtering options, sorting behavior, reporting lag, and source caveats. Nothing an agent needs to safely invoke this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is a 3, but the description adds meaningful semantics beyond the schema: days defines the upcoming window, lookback_days defines the released window with a reporting-lag rationale, limit applies per bucket, and key_events_only/major_only map to described filtering behavior. This helps an agent use the parameters correctly in context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('get') and resource: upcoming and recently-released macroeconomic events, listing concrete event types like CPI, GDP, PMI, and payrolls. It clearly distinguishes itself from earnings-calendar and other financial-data siblings by focusing on macro/economic events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the intended use explicit: retrieving macro/economic event calendars, with filters like key_events_only and major_only for narrower use cases. It also gives clear context about the data source and Pro-tier restriction, though it does not explicitly name when to use a sibling tool instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_indicator_historyGet Indicator HistoryA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoNumber of days of historical daily indicator snapshots to return (max 730, default 90). Returns {} if fewer than 3 snapshots are found in the window.
fullNoFalse (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_fix_value, williams_ad_trend, td_signal, td_phase) plus analyst_rating/analyst_target, which barely change day to day and roughly double response size over a long window.
symbolYesStock ticker symbol. Also accepts a company name as a fallback when it uniquely resolves to one symbol.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnly, idempotent, and non-destructive; the description adds substantial behavioral detail beyond that: source collection, daily population, max/default days, empty-response edge case ('Returns {} if fewer than 3 snapshots found'), full-mode behavior, and access restriction ('Pro tier only'). This is rich transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well organized with a front-loaded purpose statement followed by scannable field bullets. Minor redundancies like 'daily' appearing multiple times are acceptable given the valuable field-level semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the essential operational details: parameter behavior, defaults and limits, edge-case return, access tier, and full vs. base mode. With an output schema present for return structure, the description is complete for an agent to call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds meaning beyond the schema by interpreting indicator values ('positive = bullish momentum', '0 = at lower, 100 = at upper band'), explaining the difference between base and full mode, and noting that full mode 'roughly double[s] response size' while some fields 'barely change day to day.'

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Historical daily indicator snapshots for a stock — ideal for charting and trend detection.' The focus on indicator snapshots clearly distinguishes it from sibling price-history or market tools like get_stock_history, even without naming them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: 'ideal for charting and trend detection' and notes 'Pro tier only.' It does not explicitly name alternatives or state when not to use this tool, but the intended use case is explicit enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_insider_activityGet Insider ActivityA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesStock ticker symbol to fetch insider (SEC Form 4) and institutional-holdings activity for.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description builds on this with rich behavioral detail: AI-synthesized data with gap-fill from Yahoo, a separately-generated summary on a different refresh cadence that may disagree with live counts, the holder_count_divergence caveat about systemic multipliers, and false-merge detection guidance. This goes well beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every sentence adds operational value: signal_score equivalence, per-source breakdown, data-source caveats, summary lag warning, and Pro-tier cost. It is front-loaded with the core purpose and uses structured clauses to separate return fields from caveats. Slightly dense but appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description still thoroughly explains return semantics: signal_score band, per-source breakdown, insider_buys/sells, transactions, top_holders merge behavior, holder_count_divergence, inst_ownership, total_holders, and caveats. It also covers access constraints (Pro tier) and data-source behavior. Nothing an agent needs to correctly call and interpret this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter symbol has full schema coverage (100%), describing it as a stock ticker symbol for insider and institutional activity. The description adds no new meaning beyond the schema, which is the baseline case for complete coverage. The description's mention of SEC Form 4 is already in the schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get AI-synthesized insider + institutional activity for a stock.' It clearly distinguishes this tool from siblings by naming get_signals and emphasizing the combined insider/institutional scope, so an agent can confidently select it over get_stock, get_stock_research, or get_signals.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: it is for insider and institutional activity, is Pro-tier only, and is informational. It does not explicitly say 'use X instead when...', but it references get_signals's signal_score equivalence and implies the tool is the source for insider/institutional data. A small gap remains in not stating when to prefer get_stock_research or get_signals for a related use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_market_assessmentGet Market AssessmentA
Read-onlyIdempotent
Inspect

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/deteriorating/stable over the trailing 7/30 days, computed automatically (no history_count needed). A bare 33 doesn't tell you whether the environment is getting worse or just stabilized after a worse reading; this does. Either leg is null without enough history yet.

  • regime_stale / outlook_stale: true if that assessment is >72h old (the pipeline runs weekdays only, so a normal Fri→Mon gap does not trip this — only a genuinely broken/stuck pipeline does). null if the timestamp itself is missing.

  • indicators.macro_data: FRED macro data (yield curve, Fed funds, cpi_index, unemployment, M2)

  • indicators.volatility_term_structure: VIX spot/3M/6M term structure + contango signal

  • indicators.market_sentiment: CNN Fear & Greed value and label

  • market_context: price/RSI/SMA200/perf snapshot of SPY/QQQ/IWM/TLT/GLD/VIX/TNX + sectors NOTE: point-in-time snapshot recorded when AI ran — not live prices (use get_market_pulse for live)

  • outlook_*: directional fields — outlook, outlook_conviction, equity_view, preferred_sectors, avoided_sectors, catalyst, outlook_key_risk, outlook_rationale, outlook_updated_at, outlook_stale

Pro tier only — AI pipeline cost attached. For informational purposes only. Not financial advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
history_countNoInclude the last N prior assessments for each of regime and outlook (0-3, default 0).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=false, idempotentHint=true, destructiveHint=false, and the description is fully consistent with them. Beyond annotations it adds rich behavioral context: the ~4x/day weekday-only refresh cadence with an explicit 'dead overnight and on weekends, not a continuous 4-hourly cadence' correction, the >72h stale threshold that deliberately tolerates a normal Fri→Mon gap, the shared-pipeline sync guarantee, macro_score being null on pre-2026-08-26 assessments, and the point-in-time snapshot vs live distinction. This is exactly the kind of context structured fields cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The key usage guidance and staleness caveats are front-loaded before the field reference, and the two-perspective framing is clearly sectioned with bolded bullet groups. However, it is long — effectively a mini API reference covering every field. Given the tool's genuine complexity (two perspectives, many subtly distinct fields like macro_score vs risk_appetite_score), most sentences earn their place, but it could be tightened without losing value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-complexity tool, this is complete. It covers refresh cadence, staleness semantics with the weekend exception, Monday-morning handling, field-by-field meaning, the macro_score/risk_appetite_score distinction, the trend-field rationale, the point-in-time vs live caveat, and the cost tier. An agent has everything needed to call it correctly and interpret results accurately — the output schema handles return structure while the description handles semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage on the single history_count parameter, the baseline is 3. The description adds genuine value beyond the schema: it clarifies 'last N prior assessments for each' (matching the schema's per-assessment semantics) and explains that macro_score_trend is 'computed automatically (no history_count needed)' — resolving a likely confusion about whether history must be requested. That marginal but real clarification justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'Combined AI market assessment: macro regime + market outlook in a single call.' It explicitly defines the two perspectives returned (REGIME answering 'how much equity risk to take' and OUTLOOK answering 'which direction and sectors to trade'), and later distinguishes itself from get_market_pulse ('not live prices (use get_market_pulse for live)'). An agent cannot confuse this with any of the 18 siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit decision guidance per perspective: use REGIME 'for position sizing and asset allocation decisions' and OUTLOOK 'for sector preference and directional bias.' It states when NOT to treat results as current (stale flags, Monday morning caveat), names the live-prices alternative (get_market_pulse), and flags the Pro-tier/cost constraint. This is actionable routing, not just a tagline.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_market_moversGet Market MoversA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults 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.
categoryNoWhich movers category to return: "gainers" | "losers" | "most_active" | "all" (default "all" = all 3 categories).all
min_market_cap_bNoFilter to stocks above this market cap in billions of dollars, e.g. 1.0 = $1B+.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool read-only/idempotent/non-destructive. The description adds valuable behavioral detail: daily-limit counting per category, atr_pct omissions when data is missing/corrupted, and Pro-tier AI fields being precomputed with no extra AI cost. These go well beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description opens with a one-line purpose summary, then uses bullets for parameters and a terse return-field list. The AI-narrative justification is slightly promotional but remains short and relevant. Overall well-structured with minimal waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description doesn't need to explain return values, yet it still covers edge cases (atr_pct omitted), quota accounting, and tier differences. It also points to get_stock_research for follow-up. Nothing needed for a correct call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for all three parameters. The description simply restates the same defaults and formats (category values, limit max 20, min_market_cap_b in billions) without adding new semantic information. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states 'Top market movers from the Stocklake universe — gainers, losers, most active.' This clearly identifies the resource and categories, distinguishing it from data-retrieval siblings. It also names get_stock_research as the alternative for deeper research, reinforcing the scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit routing: 'For the full research bundle on any one mover, call get_stock_research(symbol).' It also explains tier availability, category modes, and daily-limit implications, giving clear context for when the tool is appropriate. It doesn't enumerate all sibling distinctions, but the named alternative is strong evidence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_market_pulseGet Market PulseA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and idempotent. The description adds 'No AI cost — reads live data directly from the market data feed', which is meaningful cost/data-source context beyond annotations. It also details return fields, adding practical transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a bullet list of return fields, making it readable. It is somewhat lengthy but each element adds useful context (e.g., explanations of indicators).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, comprehensive annotations, and an output schema, the description fills remaining gaps: it explains the nature of the data, cost implications, and tier availability. It is complete for a simple read-only snapshot tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing for the description to explain. The baseline for 0 params is 4, and the description appropriately focuses on the output rather than inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a 'live market health snapshot' that aggregates key indicators, making the purpose specific. It does not explicitly name sibling tools like get_market_assessment, so it slightly misses full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for when to use ('without requiring multiple tool calls', 'No AI cost') but does not explicitly state when not to use or name alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_news_feedGet Market News FeedA
Read-onlyIdempotent
Inspect

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 advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLook-back window in days (default 3, max 10).
limitNoMax articles returned (default 10, max 25).
min_signal_scoreNoMinimum 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/confidence/flag_score) since a live signal doesn't exist for every article.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive. The description goes well beyond by explaining how signal_score is computed (live signal vs per-article magnitude), the per-article resolution, the 'stronger of two sides' behavior, and the cost attached to the AI pipeline. It also clarifies that there is deliberately no separate news_score field, a nuance an agent needs to interpret results correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: purpose first, then use cases, then parameters, then deep signal_score explanation. It is verbose but every paragraph adds necessary context (cost, pro-tier, behavioral details). The use of bullet points and section headers aids scanning. It could be tightened, but it is not padded; complexity justifies the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema (which presumably lists fields), the description explicitly enumerates per-article fields (symbol, title, published_at, ai_sentiment, ai_summary, signal_score, band) and explains all behavioral aspects an agent would need to call it correctly: selection logic, ordering, cost implications, and constraints. Nothing important is omitted; the tool is fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful depth for min_signal_score, explaining that it is resolved per-article (live signal preferred) and that the server-side selection uses Python filtering rather than a naive $gte. This helps an agent understand the exact ranking and filtering semantics beyond the schema's terse wording. Days and limit are straightforward but still given bounded defaults in the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and scope: "Top AI-flagged news across all tracked stocks — the market-wide news briefing." It immediately contrasts with get_stock_news (per-symbol), making the distinction explicit. No ambiguity about what this tool does or how it differs from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Lists exact use cases (morning briefing, catalyst scanning, event monitoring) and explicitly contrasts with get_stock_news. It also states the tool is Pro-tier only and for informational purposes — clear constraints on when to use it. No exclusions are left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_screenerScreen StocksA
Read-onlyIdempotent
Inspect

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, industry, country, price, change_pct, volume, market_cap, pe_forward, rsi, macd_signal, sma200_trend, analyst_rating. Pro tier adds rating (0-10 composite score) + ai_verdict + ai_headline + ai_score (0-100) + ai_score_band to every result row (the headline is the "why" — a bare verdict alone isn't enough to act on), enables min_ai_score filter, high_conviction preset, and sorting by rating/ai_score (sort_by silently falls back to market_cap on free/guest for both). All other filters available to all tiers. For the full research bundle on any one result, call get_stock_research(symbol).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results to return, 1-25 (default 20). Each returned stock counts as one call toward your daily limit.
presetNo"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.
sectorNoFilter by sector, e.g. "Technology", "Healthcare", "Financial Services".
countryNoFilter by country, e.g. "United States", "Germany".
max_rsiNoMaximum RSI bound (e.g. max_rsi=30 = oversold).
min_rsiNoMinimum RSI bound (e.g. min_rsi=70 = overbought).
sort_byNo"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. Sorting by rating/ai_score silently falls back to market_cap on free/guest.
sort_dirNoSort direction: "asc" | "desc" (default "desc").desc
sma_trendNo"above_200" (price above 200-day MA) | "below_200".
min_volumeNoMinimum daily volume, e.g. 1000000.
macd_signalNo"positive" (MACD line above signal) | "negative".
max_perf_1dNoMaximum 1-day performance %.
min_perf_1dNoMinimum 1-day performance %, e.g. min_perf_1d=2.0 = up 2%+ today.
min_ai_scoreNoMinimum 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.
analyst_ratingNoFilter by analyst consensus rating: "strong_buy" | "buy" | "hold" | "sell" | "strong_sell".
max_pe_forwardNoMaximum forward P/E, e.g. 20 for a value screen.
max_market_cap_bNoMaximum market cap in billions of dollars.
min_market_cap_bNoMinimum market cap in billions of dollars.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only and idempotent annotations, the description discloses meaningful behavioral details: each returned stock counts toward the daily limit, pro-tier parameters are 'silently ignored' or 'silently fall back' for free/guest tiers, and the high_conviction preset changes the default sort. It also traces the history of the renamed min_ai_score parameter, which is valuable context that annotations cannot provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but the complexity of an 18-parameter screener with tiering and presets justifies the length. It is front-loaded with a clear one-line purpose, and parameters are grouped readably. A few passages, such as the min_ai_score provenance note, are dense but earn their place by preventing confusion with a similarly named field.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description is remarkably complete: it covers all filters, preset behaviors, tiered availability, silent fallbacks, return shape, quota semantics, and the recommended follow-up tool. The presence of an output schema means return values need not be restated, and the description fills the behavioral gaps around tiers and counting.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already documents 100% of parameters, the description adds substantial semantics: concrete examples for RSI bounds, performance percentages, volume, market cap, and P/E; preset definitions; tier-gated behavior; and the note that high_conviction defaults sort_by to ai_score. This goes well beyond the baseline set by schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Filter and rank stocks from the Stocklake universe' and immediately distinguishes this as a multi-factor screening tool covering 'fundamentals, technicals, and AI signals'. This clearly separates it from siblings like get_stock (single stock), get_market_movers, or get_signals.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool — for filtering and ranking across the universe — and explicitly directs users to a specific sibling: 'For the full research bundle on any one result, call get_stock_research(symbol).' It does not comprehensively compare against all possible sibling tools, but the guidance is concrete and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sector_intelligenceGet Sector IntelligenceA
Read-onlyIdempotent
Inspect

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 morning or after a holiday. Available to pro tier only (AI pipeline costs). For informational purposes only. Not financial advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectorNoPass 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.
history_countNoInclude the last N prior signal states per sector, 0-3 (default 0). Only applies to the all-sectors call.
sort_by_strengthNoSort 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.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds substantial behavioral context: refresh cadence (~4x/day weekdays during market hours, not continuous), staleness risk overnight/weekends, pro-tier gating, sector_score semantics (continuous 0-100, comparable across sectors, null pre-2026-08-26), and the explicit 'Not a buy/sell call' disclaimer. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but information-dense and front-loaded: the core purpose and the single-vs-all decision come first, then parameter semantics, then refresh/availability caveats. Every sentence earns its place; the bulleted parameter explanations are scannable. Slightly verbose in the sector_score explanation, but justified given the semantic subtlety.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only intelligence tool with an output schema, the description covers the key operational facts an agent needs: how to request single vs all sectors, how to rank by strength, how to get trend context, refresh cadence, staleness caveats, and access restrictions. The output schema handles return-value details, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds real value beyond the schema: it explains that sector_score is a continuous 0-100 read underlying the 5 discrete signal buckets, that sector_score_trend is single-sector-only and distinguishes two sectors with the same score, and that history_count/sort_by_strength are all-sectors-only. It doesn't exhaustively document every output field, but the schema already does that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb+resource statement: 'AI-assessed sector intelligence' enumerating signal, cycle stage, rotation signal, drivers, alerts, and computed statistics. It clearly distinguishes the single-sector call from the all-sectors rotation view, and the sibling list shows no overlapping tool that does sector intelligence, so an agent can select it confidently.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to pass a sector name vs omit it, and frames the all-sectors call as the rotation view with sort_by_strength for LEADING-first ranking. It also states refresh cadence, weekday/market-hours limitations, pro-tier availability, and the caveat to check updated_at — all concrete usage guidance beyond the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_signalsGet SignalsA
Read-onlyIdempotent
Inspect

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 returned

  • window: "24h" (fresh activity found) or a fallback note when the last 24h had nothing and the response instead shows the most recent signals overall

  • signals[]: each with symbol, direction, signal_score (0-100), signal_score_band (human-readable label — "Weak"/"Moderate"/"Strong"/"Very Strong"), source, rationale, expires, flagged_at

Pro tier only — AI pipeline cost attached. For informational purposes only. Not financial advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results to return (default 25, max 50). Each returned signal counts as one call toward your daily limit.
sourceNoFilter by signal source: "news" | "screener" | "sentiment" (default: all).
directionNoFilter by direction: "POSITIVE" | "NEGATIVE" | "NEUTRAL" (default: all). NEUTRAL covers both a flat/undecided read and a genuinely two-sided idea (see signal_score below).
min_convictionNoDEPRECATED, 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. Passing a non-default value here has no effect and is logged for a planned removal.
min_flag_scoreNoDEPRECATED, 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. Passing a non-default value here has no effect and is logged for a planned removal.
min_signal_scoreNoMinimum 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.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only, idempotent, and non-destructive; the description adds substantial behavioral detail: the 24h window with fallback, retention of dropped/expired signals, deprecated parameters ignored and logged, and daily-limit counting. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then organized into clear parameter and return sections. The length is justified by genuinely complex semantics, and every sentence serves a purpose with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all six parameters, output fields, fallback/window semantics, access constraints, deprecation behavior, and disclaimers. With an output schema present and annotations carrying the safety profile, nothing needed to invoke correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even with 100% schema coverage, the description adds real meaning: the NEUTRAL two-sided interpretation, signal_score as the single filter number even for two-sided ideas, deprecation behavior of min_conviction/min_flag_score, and limit's per-call counting. This significantly improves parameter understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: returns AI-screened stock signals surfaced by the Stocklake pipeline, sourced from news analysis, sector screening, and sentiment. The 'last 24 hours' and 'AI pipeline found' framing clearly distinguishes it from sibling tools like get_screener, get_news_feed, and get_market_movers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: read-only, Pro-tier, 24-hour recency with fallback, and signals shown even if the internal engine dropped them. It stops short of a 5 by never explicitly naming sibling alternatives or stating when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stockGet StockA
Read-onlyIdempotent
Inspect

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 while up 8% on the day with a strong_buy analyst rating is genuinely ambiguous) — the one-line headline is the "why", ai_score is the 0-100 composite (same scale/band convention as get_signals' signal_score, distinct pipeline). For the full text (summary/key_points/risks/near_term/longer_term) and cross-source news/insider context, call get_stock_research(symbol) instead — that's the only tool with the complete bundle.

  • ai_score (0-100) / ai_score_band (Weak/Moderate/Strong/Very Strong): stock_ai_summary.py's own composite score, on the same 0-100 scale and band boundaries as get_signals()'s signal_score — but a different pipeline/collection, never the same number for the same symbol by coincidence alone.

  • rating: {score 0-10, direction POSITIVE/NEUTRAL/NEGATIVE, signals per-indicator breakdown} — composite technical score

  • signals: flat labeled signals (rsi/macd/bollinger/sma200/sma50/williams_r/ultimate_osc/ vix_fix/williams_ad/td_sequential/elliott_wave, each with a value + plain-English label) — same indicators as 'indicators', pre-interpreted for programmatic use without parsing raw numbers

  • stance_signals: unified list of per-source directional calls (technical rating, AI summary near_term/longer_term, insider/institutional sentiment, analyst consensus, active screener signals) — each entry {stance POSITIVE/NEGATIVE/NEUTRAL, conviction 0-10, horizon INTRADAY/SWING/POSITION/LONG_TERM, edge_quality PROVEN/OBSERVATION/UNKNOWN (per-source signal_backtest track record), source, raw_label, as_of}. Same canonical shape used on the stock detail page — a source with missing/stale data is simply omitted, not nulled out.

  • relative_strength: {windows: {5d/20d/60d/120d/12m -> {stock_return_pct, rs_vs_spy, rs_vs_qqq, rs_vs_sector}}, verdict: one-line plain-language read (e.g. "Laggard — weak near- and long-term")} — stock's own return minus each benchmark's return (percentage points, not a ratio) per window. rs_vs_sector uses the stock's GICS sector SPDR ETF (Vanguard backup if the primary lacks history); omitted for stocks with no resolvable sector (crypto, FX, indices). Windows/ benchmarks with insufficient history are omitted rather than null. null if not precomputed yet.

  • market_risk: {beta_spy_1y, corr_spy_1y} — 1-year daily-return beta and correlation vs SPY. Distinct from quote.beta (Yahoo's own longer-window beta calculation) — this is computed fleet-wide from the same daily bars as relative_strength. Both fields null if not yet precomputed for this symbol (populates on the next scheduled indicators run).

  • forensic_scores: {altman_z, piotroski_f, beneish_m, computed_at} — three classic forensic- accounting formulas (Altman 1968 bankruptcy-risk, Piotroski 2000 fundamental-strength, Beneish 1999 earnings-manipulation-likelihood), computed from balance sheet/income statement/cash flow data, refreshed on each company's own filing cadence (roughly annual). Each sub-block is {score, note, ...} — altman_z adds zone (safe/grey/distress), piotroski_f adds strength (strong/moderate/weak, 0-9 scale), beneish_m adds likely_manipulator (bool, score > -1.78). note explains what the score measures and its known caveats (e.g. Altman Z is not meaningful for banks/insurers and can flag REITs/ client-float businesses as "distress" by design) — always read alongside the score, not in isolation. score: null means genuinely not computable for this company (common for financial-sector names), not an error. No trading signal is derived from these scores anywhere in this API today — treat as raw accounting-model output for your own research.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesStock ticker symbol. Also accepts a company name as a fallback (e.g. "Apple") when it uniquely resolves to one symbol.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the readOnly/idempotent annotations by disclosing tier-gating behavior, omission semantics ('these are omitted entirely from the free/guest response... not merely unlabeled'), null conventions ('score: null means genuinely not computable'), and the fact that forensic scores are raw accounting-model output with no trading signal derived. It also distinguishes its computed beta from Yahoo's beta, which prevents misinterpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely long and contains some redundant or implementation-specific details, such as duplicating the ai_score explanation and including the 'tier-gating sweep, 2026-08-28' note. It is well organized with bullet lists and front-loaded key fields, but it could be trimmed without losing essential guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description is remarkably complete. It enumerates return fields, distinguishes free vs Pro response shapes, explains omission/null behavior, names the alternative research tool, and clarifies which values are computed differently from other sources. With an output schema reported present, nothing essential is missing for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the only parameter, symbol, is already well described in the schema with ticker and company-name fallback behavior. The description adds no additional parameter-level semantics beyond framing the call as a single-snapshot request, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Price, fundamentals, technical indicators, and company profile for a stock' and says it 'Returns all data needed to understand a stock in a single call.' It also distinguishes itself from the sibling get_stock_research by explicitly naming that tool as the only one with the complete research bundle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit routing guidance: for full AI narrative and cross-source news/insider context, call get_stock_research(symbol) instead. It also clarifies tier availability, noting that free/guest responses get only the basic six indicators while Pro unlocks additional blocks, and it stresses that all five Pro blocks are precomputed with no live AI cost.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stock_financialsGet Stock FinancialsA
Read-onlyIdempotent
Inspect

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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only and idempotent, and the description adds substantial behavioral context: the exact output shape, Yahoo's real period ceilings, missing-line-item semantics (absence means not reported, not an error), and the possibility of quarterly returning null or the entire financials block being absent. This goes well beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and differentiator, then uses compact paragraphs for shape, period behavior, and caveats. Despite its length, nearly every sentence carries essential operational information, and the structure is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is complex, but the description covers output shape, period limits, per-line-item organization, data-availability caveats, non-equity symbols, and Pro-tier restriction. An agent has all the context needed to decide whether and how to call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description further enriches parameter meaning by explaining what 'annual' and 'quarterly' actually return, including real-world ceiling caveats and the behavior of missing periods, which the schema alone does not state.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Full raw financial statements — balance sheet, income statement, and cash flow line items over multiple periods.' It further differentiates itself from get_stock()'s forensic_scores block, making the tool's unique purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names get_stock() as the alternative when derived forensic scores are needed, and clearly states this tool returns the underlying statement data instead. It also provides concrete exclusions: no data for ETFs/crypto/forex/indices, and quarterly may be null for some symbols.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stock_historyGet Stock Price HistoryA
Read-onlyIdempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoNumber 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.
symbolYesStock ticker symbol. Also accepts a company name as a fallback when it uniquely resolves to one symbol.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, destructiveHint, and idempotentHint, so safety traits are covered structurally. The description adds meaningful behavioral detail beyond those annotations: it explicitly warns that days_returned/count may be less than requested due to insufficient history, describes the exact response shape (including per-bar fields), and notes the default and max days. This transparency about partial results is valuable and not inferable from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely efficient: a single opening sentence identifies the purpose, followed by three short bullet lines that add parameter details and return structure. Every sentence earns its place—no filler, no repetition of the title or annotations. The critical caveat (days_returned may be less) is given prominence. Structure is front-loaded and logical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool is a straightforward historical data retriever with an output schema, the description covers nearly everything an agent needs to call it correctly: purpose, parameter details, response shape, and the partial-data caveat. The only significant omission is usage guidance versus siblings, which is a separate dimension. The output schema covers the return types, so the description doesn't need to explain those further. Overall, it's complete for the mechanics, but missing selection context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (both parameters are described in the schema), so the baseline is 3. The description enhances semantics beyond the schema: for the 'symbol' parameter it adds 'Also accepts a company name as a fallback when it uniquely resolves to one symbol,' which is not in the schema description. It also re-emphasizes the max days and the potential for a shorter response. This extra meaning justifies a score above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'Daily OHLCV price history for a stock.' It's distinct from siblings like get_stock or get_indicator_history in that it focuses on historical price bars, but it doesn't explicitly name sibling alternatives or differentiate itself. For example, it doesn't say 'for technical indicators use get_indicator_history.' Thus, clarity is high but differentiation is implicit at best.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus the 16 siblings. It doesn't mention typical use cases, nor does it exclude variants like intraday or adjusted prices. There's no 'use this when you need historical daily bars' or 'for earnings use get_earnings_calendar.' The context signals and sibling list are present but not leveraged in the description. This is a clear gap for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stock_newsGet Stock NewsA
Read-onlyIdempotent
Inspect

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 different numbers. Null only when neither path can produce a value (article has no AI sentiment/confidence/ flag_score at all). There is deliberately no separate "news_score" field — one name, kept in sync with the signal when one exists, computed per-article when it doesn't. Free tier: up to 5 articles, title + published_at only (no AI fields), 30-day window. Pro tier: up to 50 articles with full AI fields, 90-day window. For informational purposes only. Not financial advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLook-back window in days. Requesting more than your tier's cap is silently clamped down to it: 30 free/guest, 90 pro.
limitNoMax 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. Requesting more than your tier's cap (5 free/guest, 50 pro) is likewise clamped down.
symbolYesStock ticker symbol. Also accepts a company name as a fallback when it uniquely resolves to one symbol.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/destructiveHint, and the description adds substantial behavior beyond them: silent clamping of days/limit to tier caps, tier-gated field availability, the live/synced (not frozen snapshot) signal semantics, the no-gating on Stocklake's internal trading engine, the per-article fallback score path, and the deliberate absence of a separate news_score field. No contradiction with annotations; 'For informational purposes only' reinforces the read-only profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is efficiently front-loaded, but the signal_score block is one dense, run-on paragraph with heavy nested parentheticals (last-90-days, shared resolver, internal-engine caveat, fallback path), making it hard to parse. Clamping and tier facts are also restated three times — in the days/limit text and again in the closing 'Free tier/Pro tier' summary — adding redundancy to an already long definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a genuinely complex tool (tier-dependent clamping, shared-signal freshness semantics, per-article fallback), nothing an agent needs to call it correctly is missing — edge cases like null-when-neither-path-produces-value are explicitly handled. Since an output schema exists, the extensive per-article field explanation is a bonus, though slightly over-explains what the schema could carry. Slight over-reach rather than under-specification.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — the days/limit descriptions in the schema already carry the exact clamping and tier-cap text the description repeats verbatim. The description adds the status enum ('ok'/'empty') and per-article field narrative, but those concern the return shape, which an output schema exists to cover. On parameters themselves the description is essentially duplicative, placing it at baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line 'AI-analysed news for a stock, newest first' states a specific verb, resource, and distinctive qualifier. The qualifier 'AI-analysed' plus 'Only returns articles processed by our AI pipeline' cleanly separates it from a raw feed like get_news_feed, so an agent can disambiguate without opening other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through the 'AI-analysed' framing and explains that signal_score/signal_score_band are the same values get_signals()/get_stock_research() report via a shared resolver, which orients the agent to data relationships. However, there is no explicit when/when-not routing — it never says 'use get_news_feed for raw articles' or 'use get_signals for standalone signal data.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stock_researchGet Stock ResearchA
Read-onlyIdempotent
Inspect

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 null signal_score], source, expires, flagged_at). Empty if nothing in that window. Recency-gated, not gated on whether Stocklake's own trading engine still holds the signal live — a signal it dropped or let expire is still a real, useful fact about what the pipeline found, so it stays in this list rather than disappearing the moment our own paper trader moves on.

  • forensic_scores: {altman_z, piotroski_f, beneish_m, computed_at} — three classic forensic-accounting formulas (Z-Score bankruptcy risk / F-Score fundamental quality / M-Score earnings-manipulation risk), computed from stocks.financials (GH #107). Omitted entirely if this symbol has no forensic_scores doc yet — not every symbol qualifies (financial-sector companies mostly return null on all three by construction, see the field's own note text). A withheld individual score always surfaces as {"score": null, "note": ""} — never a bare 0, never silently dropped from its own sub-block. Same shape get_stock()/get_stocks() already return.

All data is pre-computed by the Stocklake AI pipeline — no live AI calls on request. Pro tier only. For informational purposes only. Not financial advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesStock ticker symbol to fetch the full AI research bundle for.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only and idempotent, but the description adds substantial behavioral detail beyond annotations: data is pre-computed with no live AI calls, null and fallback behavior is documented, signals are recency-gated rather than live-position-gated, and specific field semantics are clarified. No contradictions with annotations exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with a front-loaded summary and clearly delineated return blocks. Most sentences carry meaningful caveats or semantics that would otherwise be missing, though some asides could be tightened without losing value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex bundle tool with one parameter and an existing output schema, the description is exceptionally complete: it explains return-field semantics, null behavior, score conventions, recency gating, legacy data fallbacks, and access restrictions. An agent has all the context needed to invoke it correctly and interpret its results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully documents the only parameter, symbol, at 100% coverage. The description refers to fetching for 'a stock' and 'one symbol' but does not add new parameter-level meaning beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description immediately identifies the tool as a comprehensive one-call research bundle for a stock, with a clear verb ('get') and resource ('full AI research bundle'). It explicitly names the four sibling tools it replaces, making differentiation trivial.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states this tool replaces get_stock, get_stock_news, get_insider_activity, and get_signals for one symbol, so an agent knows when to prefer it over these alternatives. It does not explicitly state exclusions like 'use the individual tools if you only need one data type,' but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stocksGet Multiple StocksA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolsYesList 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 served on just the first 25 — split a larger list into multiple calls.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent/destructive hints, the description reveals important behaviors: missing symbols are omitted, duplicates are collapsed, each symbol counts toward a daily limit, requests over 25 are rejected (error: batch_too_large), and tier-dependent fields. The duplicate normalization details and invariant equation add depth. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured and every sentence earns its place. It front-loads the core purpose, then details tier differences, what is excluded, and response behavior — all essential information without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (batching, normalization, tier differences, error handling, response shape), the description is remarkably complete. It covers the return dict keyed by symbol, missing/duplicate handling, per-symbol quota, and explicitly mentions what is not included and where to get it. The invariant equation is a definitive check.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already describes the symbols parameter at 100% coverage, the description adds substantial semantics: normalization rules, duplicate collapsing, omission of missing symbols, and the invariant involving requested, missing, and duplicates_collapsed. These details are not in the schema and greatly clarify how the parameter is processed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Batch stock data for up to 25 symbols in a single call' — a specific verb, resource, and scope. It explicitly states this is the same as get_stock but batched, not a thinned-down scan, clearly distinguishing it from siblings like get_stock and get_stock_research.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when NOT to use this tool: for stance_signals call get_stock, for full AI summary call get_stock_research. It also provides guidance on splitting large lists into multiple calls, leaving no ambiguity about batch limits.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_watchlistGet WatchlistA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds the 'Pro tier only' restriction and the 'For informational purposes only. Not financial advice' disclaimer, plus the personalization to the caller. It also describes the return payload. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but well-structured: a purpose sentence, a 'Returns:' list, an empty-case note, and a tier/disclaimer. No wasted words, though the disclaimer could be considered boilerplate. It is appropriately front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there are no parameters, the description fully covers what an agent needs: the data source (caller's watchlist), the fields returned, the empty-case behavior, the Pro tier requirement, and the disclaimer. The output schema exists separately, so no need to detail return values further. It is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the input schema is empty, so there is nothing to explain. Per rubric, 0 parameters warrants a baseline of 4. The description compensates by detailing the output structure, which is highly relevant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource ('the caller's Stocklake watchlist') and the enrichment ('live price, technicals, and AI verdict'). It is distinct from all 16 siblings, none of which relate to watchlists. The purpose is unambiguous and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context is clear: it returns the caller's personal watchlist, which implies use when the user's own watchlist is needed. It notes 'Pro tier only' as a prerequisite but does not explicitly state when not to use or alternatives. Since no sibling offers watchlist data, explicit exclusions are unnecessary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedget_signals1 field changed
      • changedInput schema / properties / source / description
        Previous value: -"Filter by signal source: \"news\" | \"screener\" | \"sentiment\" | \"social\" (default: all)."New value: +"Filter by signal source: \"news\" | \"screener\" | \"sentiment\" (default: all)."
  2. 1 tool update
    • Addedget_stock_financials
  3. 3 tool updates
    • Addedget_economic_calendar
    • Changedget_indicator_history1 field changed
      • addedInput schema / properties / full
        Added value: +{
        +  "default": false,
        +  "description": "False (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_fix_value, williams_ad_trend, td_signal, td_phase) plus analyst_rating/analyst_target, which barely change day to day and roughly double response size over a long window.",
        +  "type": "boolean"
        +}
    • Changedget_signals2 fields changed
      • changedInput schema / properties / limit / default
        Previous value: -50New value: +25
      • changedInput schema / properties / limit / description
        Previous value: -"Max results to return (default 50, max 50). Each returned signal counts as one call toward your daily limit."New value: +"Max results to return (default 25, max 50). Each returned signal counts as one call toward your daily limit."
  4. 2 tool updates
    • Changedget_news_feed1 field changed
      • changedInput schema / properties / min_signal_score / description
        Previous value: -"Minimum news_score used to SELECT articles server-side, 0-100 (default 60) — same 0-100 scale/bands as signal_score. Resolved per-article (stored value preferred, computed via the sentiment/confidence/flag_score fallback formula otherwise) since news_score is stored on only a fraction of articles today."New value: +"Minimum 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/confidence/flag_score) since a live signal doesn't exist for every article."
    • Changedget_signals1 field changed
      • changedInput schema / properties / direction / description
        Previous value: -"Filter by direction: \"POSITIVE\" | \"NEGATIVE\" | \"MIXED\" (default: all)."New value: +"Filter by direction: \"POSITIVE\" | \"NEGATIVE\" | \"NEUTRAL\" (default: all). NEUTRAL covers both a flat/undecided read and a genuinely two-sided idea (see signal_score below)."
  5. 15 tool updates
    • Changedget_earnings_calendar1 field changed
      • addedInput schema / properties / days / description
        Added value: +"Look-ahead window in days (default 7, max 30)."
    • Changedget_earnings_intelligence4 fields changed
      • addedInput schema / properties / days_ahead / description
        Added value: +"Look-ahead window in days (default 14, max 30)."
      • addedInput schema / properties / limit / description
        Added value: +"Max results to return (default 25, max 25). Each returned ticker counts as one call toward your daily limit."
      • addedInput schema / properties / min_ai_score / description
        Added value: +"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. Applied server-side before limit truncates the result, so a qualifying stock always counts against limit ahead of one without."
      • addedInput schema / properties / sector / description
        Added value: +"Filter to one sector, e.g. \"Technology\"."
    • Changedget_indicator_history2 fields changed
      • addedInput schema / properties / days / description
        Added value: +"Number of days of historical daily indicator snapshots to return (max 730, default 90). Returns {} if fewer than 3 snapshots are found in the window."
      • addedInput schema / properties / symbol / description
        Added value: +"Stock ticker symbol. Also accepts a company name as a fallback when it uniquely resolves to one symbol."
    • Changedget_insider_activity1 field changed
      • addedInput schema / properties / symbol / description
        Added value: +"Stock ticker symbol to fetch insider (SEC Form 4) and institutional-holdings activity for."
    • Changedget_market_assessment1 field changed
      • addedInput schema / properties / history_count / description
        Added value: +"Include the last N prior assessments for each of regime and outlook (0-3, default 0)."
    • Changedget_market_movers3 fields changed
      • addedInput schema / properties / category / description
        Added value: +"Which movers category to return: \"gainers\" | \"losers\" | \"most_active\" | \"all\" (default \"all\" = all 3 categories)."
      • addedInput schema / properties / limit / description
        Added value: +"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."
      • addedInput schema / properties / min_market_cap_b / description
        Added value: +"Filter to stocks above this market cap in billions of dollars, e.g. 1.0 = $1B+."
    • Changedget_news_feed3 fields changed
      • addedInput schema / properties / days / description
        Added value: +"Look-back window in days (default 3, max 10)."
      • addedInput schema / properties / limit / description
        Added value: +"Max articles returned (default 10, max 25)."
      • addedInput schema / properties / min_signal_score / description
        Added value: +"Minimum news_score used to SELECT articles server-side, 0-100 (default 60) — same 0-100 scale/bands as signal_score. Resolved per-article (stored value preferred, computed via the sentiment/confidence/flag_score fallback formula otherwise) since news_score is stored on only a fraction of articles today."
    • Changedget_screener18 fields changed
      • addedInput schema / properties / analyst_rating / description
        Added value: +"Filter by analyst consensus rating: \"strong_buy\" | \"buy\" | \"hold\" | \"sell\" | \"strong_sell\"."
      • addedInput schema / properties / country / description
        Added value: +"Filter by country, e.g. \"United States\", \"Germany\"."
      • addedInput schema / properties / limit / description
        Added value: +"Max results to return, 1-25 (default 20). Each returned stock counts as one call toward your daily limit."
      • addedInput schema / properties / macd_signal / description
        Added value: +"\"positive\" (MACD line above signal) | \"negative\"."
      • addedInput schema / properties / max_market_cap_b / description
        Added value: +"Maximum market cap in billions of dollars."
      • addedInput schema / properties / max_pe_forward / description
        Added value: +"Maximum forward P/E, e.g. 20 for a value screen."
      • addedInput schema / properties / max_perf_1d / description
        Added value: +"Maximum 1-day performance %."
      • addedInput schema / properties / max_rsi / description
        Added value: +"Maximum RSI bound (e.g. max_rsi=30 = oversold)."
      • addedInput schema / properties / min_ai_score / description
        Added value: +"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."
      • addedInput schema / properties / min_market_cap_b / description
        Added value: +"Minimum market cap in billions of dollars."
      • addedInput schema / properties / min_perf_1d / description
        Added value: +"Minimum 1-day performance %, e.g. min_perf_1d=2.0 = up 2%+ today."
      • addedInput schema / properties / min_rsi / description
        Added value: +"Minimum RSI bound (e.g. min_rsi=70 = overbought)."
      • addedInput schema / properties / min_volume / description
        Added value: +"Minimum daily volume, e.g. 1000000."
      • addedInput schema / properties / preset / description
        Added value: +"\"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."
      • addedInput schema / properties / sector / description
        Added value: +"Filter by sector, e.g. \"Technology\", \"Healthcare\", \"Financial Services\"."
      • addedInput schema / properties / sma_trend / description
        Added value: +"\"above_200\" (price above 200-day MA) | \"below_200\"."
      • addedInput schema / properties / sort_by / description
        Added value: +"\"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. Sorting by rating/ai_score silently falls back to market_cap on free/guest."
      • addedInput schema / properties / sort_dir / description
        Added value: +"Sort direction: \"asc\" | \"desc\" (default \"desc\")."
    • Changedget_sector_intelligence3 fields changed
      • addedInput schema / properties / history_count / description
        Added value: +"Include the last N prior signal states per sector, 0-3 (default 0). Only applies to the all-sectors call."
      • addedInput schema / properties / sector / description
        Added value: +"Pass 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."
      • addedInput schema / properties / sort_by_strength / description
        Added value: +"Sort 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."
    • Changedget_signals6 fields changed
      • addedInput schema / properties / direction / description
        Added value: +"Filter by direction: \"POSITIVE\" | \"NEGATIVE\" | \"MIXED\" (default: all)."
      • addedInput schema / properties / limit / description
        Added value: +"Max results to return (default 50, max 50). Each returned signal counts as one call toward your daily limit."
      • addedInput schema / properties / min_conviction / description
        Added value: +"DEPRECATED, 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. Passing a non-default value here has no effect and is logged for a planned removal."
      • addedInput schema / properties / min_flag_score / description
        Added value: +"DEPRECATED, 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. Passing a non-default value here has no effect and is logged for a planned removal."
      • addedInput schema / properties / min_signal_score / description
        Added value: +"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."
      • addedInput schema / properties / source / description
        Added value: +"Filter by signal source: \"news\" | \"screener\" | \"sentiment\" | \"social\" (default: all)."
    • Changedget_stock1 field changed
      • addedInput schema / properties / symbol / description
        Added value: +"Stock ticker symbol. Also accepts a company name as a fallback (e.g. \"Apple\") when it uniquely resolves to one symbol."
    • Changedget_stock_history2 fields changed
      • addedInput schema / properties / days / description
        Added value: +"Number 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."
      • addedInput schema / properties / symbol / description
        Added value: +"Stock ticker symbol. Also accepts a company name as a fallback when it uniquely resolves to one symbol."
    • Changedget_stock_news3 fields changed
      • addedInput schema / properties / days / description
        Added value: +"Look-back window in days. Requesting more than your tier's cap is silently clamped down to it: 30 free/guest, 90 pro."
      • addedInput schema / properties / limit / description
        Added value: +"Max 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. Requesting more than your tier's cap (5 free/guest, 50 pro) is likewise clamped down."
      • addedInput schema / properties / symbol / description
        Added value: +"Stock ticker symbol. Also accepts a company name as a fallback when it uniquely resolves to one symbol."
    • Changedget_stock_research1 field changed
      • addedInput schema / properties / symbol / description
        Added value: +"Stock ticker symbol to fetch the full AI research bundle for."
    • Changedget_stocks1 field changed
      • addedInput schema / properties / symbols / description
        Added value: +"List 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 served on just the first 25 — split a larger list into multiple calls."
  6. 4 tool updates
    • Changedget_earnings_intelligence2 fields changed
      • addedInput schema / properties / min_ai_score
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • removedInput schema / properties / min_flag_score
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "integer"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
    • Changedget_news_feed2 fields changed
      • removedInput schema / properties / min_flag_score
        Removed value: -{
        -  "default": 8,
        -  "type": "integer"
        -}
      • addedInput schema / properties / min_signal_score
        Added value: +{
        +  "default": 60,
        +  "type": "integer"
        +}
    • Changedget_screener2 fields changed
      • addedInput schema / properties / min_ai_score
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • removedInput schema / properties / min_flag_score
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "integer"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
    • Changedget_signals2 fields changed
      • changedInput schema / properties / limit / default
        Previous value: -25New value: +50
      • addedInput schema / properties / min_signal_score
        Added value: +{
        +  "default": 60,
        +  "type": "integer"
        +}
  7. 1 tool update
    • Changedget_screener3 fields changed
      • addedInput schema / properties / sort_by / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / sort_by / default
        Previous value: -"market_cap"New value: +null
      • removedInput schema / properties / sort_by / type
        Removed value: -"string"
  8. 1 tool update
    • Changedget_earnings_intelligence1 field changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 25,
        +  "type": "integer"
        +}

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources