Skip to main content
Glama

Server Details

Scores for the 600 largest stocks with no account. Sign in for analysis, screening and a watchlist.

Ownership verified
Status
Healthy
Uptime
99.9% over 77 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
StockLens
Claude
–

TDQS

A4.3/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct resource-and-action: single vs batch watchlist writes, single-company snapshot vs cross-company screening, and analysis initiation vs polling are explicitly delimited in the descriptions. The descriptions even tell the agent which sibling tool to use for adjacent requests (e.g. discover_stocks instead of building a ranking from get_market_summary), leaving little room for misselection.

Naming Consistency5/5

All tools follow a predictable verb_noun snake_case pattern (add_to_watchlist, get_market_summary, initiate_analysis, fetch_analysis_result, remove_from_watchlist), with the _batch suffix used consistently for the bulk variant. 'ping' is the only non-verb_noun name, but it is an idiomatic health-check convention rather than an inconsistency.

Tool Count5/5

Nine tools is well within the 3-15 sweet spot and every tool maps to a real user workflow: score lookup, screening, watchlist management, portfolio review, and asynchronous analysis. Nothing feels redundant or missing at the count level.

Completeness4/5

The surface covers the core lifecycle: discover, score, watch/unwatch (single and batch), review portfolios, and run plus retrieve a deeper analysis. Gaps remain around portfolio administration (no create/rename/delete portfolio) and no batch removal or standalone portfolio-listing tool, though get_portfolio_insights partially compensates and agents can work around these.

Available Tools

9 tools
add_to_watchlistAdd to PortfolioAInspect

Add one company to one of the person's StockLens portfolios as a company they follow, so its score stays readable here. Call it only when the person has asked for it or agreed to an offer. Without portfolio_id or portfolio_name it adds to the default portfolio, and the result names the portfolio that received it. Relay the result's message, which says where the company went. A status other than added is an answer, not an error: relay its message and act on next_step. After an add the person accepted from a get_market_summary offer, call get_market_summary again to answer their question. One ticker per call; for a list of companies, use add_to_watchlist_batch. It does not trade, record a holding or move money.

NameRequiredDescriptionDefault
tickerYesStock ticker symbol (e.g. AAPL). Exactly one ticker per call.
exchangeNoExchange code (e.g. NASDAQ). Optional. Resolved automatically if omitted.
portfolio_idNoThe id of the portfolio to add to, as get_portfolio_insights lists it. Optional: without it or portfolio_name the company goes to the default portfolio.
portfolio_nameNoThe name of the portfolio to add to, as the person names it (exact, case does not matter). Optional.

Output Schema

NameRequiredDescription
modeNo
scopeYes
statusYes
tickerNo
messageYes
exchangeNo
next_stepNo
candidatesNo
is_defaultNo
plan_limitNo
portfoliosNo
company_nameNo
portfolio_idNo
company_countNo
portfolio_nameNo
portfolio_countNo

TDQS

A4.6/5.0
Behavior5/5

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

Goes well past the annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false): it discloses the write is gated on user consent, that the result names the portfolio that received the company, that a status other than 'added' is an answer rather than an error (with next_step to act on), and that a follow-up get_market_summary is needed to answer an accepted offer. That is meaningful behavioral context an agent cannot derive from the structured fields.

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?

Front-loads the core action and constraint, and each sentence carries operational content. Slight redundancy between 'the result names the portfolio that received it' and the following 'Relay the result's message, which says where the company went', which is the only real 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 needn't explain return shape, yet it usefully explains how to interpret non-success statuses and the follow-up call. Safety profile is covered by annotations and consent gating is covered by the description, leaving nothing an agent needs to call this 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 schema already documents the default-portfolio fallback for omitted portfolio_id/portfolio_name and the ticker cardinality. The description largely restates these ('Without portfolio_id or portfolio_name it adds to the default portfolio'), adding little beyond the schema, so the 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?

States a specific verb and resource ('Add one company to one of the person's StockLens portfolios as a company they follow') and explicitly distinguishes itself from the sibling add_to_watchlist_batch ('One ticker per call'). It also rules out misreading by declaring 'It does not trade, record a holding or move money', which separates it from any trading-adjacent sibling.

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 an explicit precondition ('Call it only when the person has asked for it or agreed to an offer'), names the alternative for lists (add_to_watchlist_batch), and states the follow-up call pattern after a get_market_summary offer. The default-portfolio case for omitting portfolio_id/portfolio_name is also covered, so the agent knows when each parameter variant applies.

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

add_to_watchlist_batchAdd Several to PortfolioAInspect

Add a list of companies the person gave you, up to 100 rows, to one of their StockLens portfolios, in two calls. First call with confirm false: nothing is added and every row returns its outcome. Relay summary_line and message, then every row that is not a plain add, grouped by outcome, and name the plain adds in one line; name the portfolio only when portfolio_count is above 1. Ask which rows to add. Then call with confirm true, the preview_id, the same rows, the same portfolio and the confirmed_indexes the person approved. Send only rows the person gave you. For an ambiguous row, ask which listing using its candidates; never pick one. Add a not_covered row only if the person asks for it. A changed list or a different portfolio needs a new preview; preview_mismatch means the preview expired or no longer matches, so preview again. Without portfolio_id or portfolio_name it uses the default portfolio. It does not trade, record holdings or move money.

NameRequiredDescriptionDefault
rowsYesThe companies the person gave you, one per row, in their order. Never add a row they did not name.
confirmYesfalse previews the list and adds nothing. true adds the rows of confirmed_indexes from the preview that preview_id names.
preview_idNoThe preview_id the preview returned. Required when confirm is true.
portfolio_idNoThe id of the portfolio to add to, as get_portfolio_insights lists it. Optional: without it or portfolio_name the list goes to the default portfolio.
portfolio_nameNoThe name of the portfolio to add to, as the person names it (exact, case does not matter). Optional.
confirmed_indexesNoThe index of every row the person approved, from the preview. Required when confirm is true.

Output Schema

NameRequiredDescription
rowsNo
scopeYes
reasonNo
statusYes
messageNo
summaryNo
capacityNo
next_stepNo
is_defaultNo
portfoliosNo
preview_idNo
portfolio_idNo
summary_lineNo
company_countNo
portfolio_nameNo
portfolio_countNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare the generic profile (not read-only, not idempotent, closed-world), while the description supplies the operationally important behavior: the preview writes nothing, preview_mismatch semantics, default-portfolio fallback, ambiguity handling, and a scope boundary ('does not trade, record holdings or move money'). That is substantial context 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.

Conciseness4/5

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

The purpose and the preview-then-confirm rule are front-loaded and every sentence carries an operational rule. It is dense, however: the mid-paragraph instruction about relaying summary_line, message, grouped outcomes and portfolio_count is presentation scripting that makes the description longer than the invocation contract strictly requires.

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 two-phase, stateful, partially irreversible batch write, the description covers gating, error recovery, defaults, ambiguity policy and scope exclusions, and an output schema exists so return values need not be re-explained. An agent has everything needed to drive both calls 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 description coverage is 100%, so the baseline is 3, but the description adds workflow meaning: how confirm, preview_id and confirmed_indexes interlock across the two calls, and what happens when portfolio_id/portfolio_name are omitted. Some of this (default portfolio, preview_id required when confirm=true) duplicates the schema, so it falls short of fully additive.

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 sentence states a specific verb and resource with explicit scope: add up to 100 company rows to one StockLens portfolio via a two-call preview/confirm flow. The batch scope plus the 'up to 100 rows' limit inherently separates it from the single-entry sibling add_to_watchlist, so an agent can select it correctly without opening the schema.

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 prescribes exactly when to call with confirm=false (preview only, nothing added) versus confirm=true (adds confirmed_indexes from preview_id), and how to recover from failure states ('a changed list or a different portfolio needs a new preview; preview_mismatch means the preview expired'). It also gives exclusion rules — never pick an ambiguous listing for the user, only add a not_covered row if asked — leaving almost nothing to inference.

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

discover_stocksDiscover StocksA
Read-only
Inspect

Screen the companies StockLens scores nightly by region, exchange, sector, industry, market-cap band and trading volume, sorted by one of the six StockLens scores or by market cap, volume or ticker, and return the top or bottom N. Popularity ordering is unavailable: analysis_volume and user_volume are retired and return VALIDATION_ERROR without running a screen. For a popularity request, ask the person to choose a supported ordering. Use it for any top N, best, worst, highest, lowest or filtered request across the companies StockLens scores, and never build such a list from get_market_summary or general knowledge; to compare only companies the person names, call get_market_summary for each instead. It has no valuation, price-target or growth filter; say so rather than calling a score sort one. status ranked means the requested order was used. When a ranked result carries message, relay it; it states what the ranking covers, so never present the rows as a ranking of more than that. browse_substituted means a score order was asked for and market-cap order with scores hidden was returned, so never describe those rows as ranked by score. locked means no companies are named; relay message verbatim. What the caller can sort and how far it reaches is in access_tier and reach_capped_at; signed_in_as names the account they belong to. Report only the rows returned. It does not trade and gives no personal recommendations.

NameRequiredDescriptionDefault
pageNo0-based page of results, 0 to 500. Default 0.
limitNoNumber of matches to return (the N in top/bottom N), 1 to 100. Default 10.
sort_byNoOne of the 6 StockLens scores, market_cap, volume or ticker. Default composite_score. Popularity ordering is unavailable.
macro_inNoRestrict to these macro regions. Omitted = no restriction.
directionNotop = highest first, bottom = lowest first. Default top.
sector_inNoRestrict to these GICS sectors. Omitted = no restriction.
exchange_inNoRestrict to these exchanges. Omitted = no restriction.
industry_inNoRestrict to these GICS industries. Omitted = no restriction.
search_textNoFree-text company name/ticker search, up to 80 characters.
volume_floorNoMinimum average trading volume. Omitted = no floor.
market_cap_bandNoRestrict to this market-cap band. Omitted = no cap restriction.

Output Schema

NameRequiredDescription
rowsYes
scopeYes
statusYes
messageNo
next_stepNo
as_of_dateNo
access_tierYes
data_sourceYes
hard_lockedYes
signed_in_asNo
rows_returnedYes
scores_lockedYes
total_matchesNo
config_contextYes
effective_sortYes
reach_capped_atNo
sort_substitutedNo
effective_directionYes
quota_remaining_todayNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare the safety profile (readOnly, non-destructive, non-idempotent, closed-world), so the description carries the operational burden and does so richly: popularity ordering returns VALIDATION_ERROR without running a screen, and the status values ranked, browse_substituted and locked each carry distinct semantics and required agent behavior. It also flags the absence of valuation/price-target/growth filters and warns against mislabeling a score sort.

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?

Purpose, filters, sort and return shape are front-loaded before the operational caveats, and nearly every sentence earns its place by changing agent behavior. It is nonetheless long and dense, and the popularity-unavailable point is restated in the sort_by schema, so it falls just short of fully tight.

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?

An output schema exists, so return values need not be spelled out, yet the description still supplies the status/message/access_tier/reach_capped_at interpretation an agent needs to relay results faithfully. Combined with the usage and error guidance, nothing required to call or report this tool correctly 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%, so the schema already documents all 11 parameters including enums and defaults. The description reinforces the sort and filter semantics and the popularity exclusion, but adds no syntax or format detail beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.

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 sentence gives a specific verb (screen), a precise resource (the companies StockLens scores nightly), the full filter surface (region, exchange, sector, industry, cap band, volume), the sort options, and the return shape (top/bottom N). It explicitly differentiates from get_market_summary, which is the closest sibling. An agent can pick this tool without opening the schema.

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 states when to use it ('any top N, best, worst, highest, lowest or filtered request'), when not to (never build such a list from get_market_summary or general knowledge), and names the alternative for the named-company case ('call get_market_summary for each instead'). It also handles the popularity edge case by instructing the agent to ask the person to pick a supported ordering.

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

fetch_analysis_resultFetch Analysis ResultA
Read-onlyIdempotent
Inspect

Return the progress or result of an analysis started with initiate_analysis, by its analysis_id. Each call returns the current state once and does not wait. While status is in_progress, or narrative.status is pending or running, check again only when the person asks, and no sooner than retry_after_seconds. A failed status is an answer; relay error_message. A complete result is the saved report: the composite score and rating word, the evidence word (Full, Core or Low), each domain's score, grade word and contribution (cornerstone, major, supporting or contextual), its key_drivers (up to three, each with its evidence), lens and domain_coverage, and its written summaries (domain conclusions, synthesis, key strengths and challenges) at either depth once narrative.status is ready. Until then relay message: pending or running means they are still being written, and you may briefly summarize the scores and evidence supplied but never write a summary, cause or reason the result does not contain; failed means they could not be completed, and the scores and evidence stand. It omits the web reader's factor cards, charts and per-anchor Explain views. Offer report_url as Open saved report to inspect factor values, peer context and ranked contributors where supplied; sign in to the owning StockLens account. It can open before the written summaries finish, and opening it does not start another run. Say how much a domain counts only with its contribution word, never as a number or share. It does not accept a ticker and does not rank companies.

NameRequiredDescriptionDefault
analysis_idYesThe analysis_id returned by initiate_analysis

Output Schema

NameRequiredDescription
scopeYes
resultNo
statusYes
messageNoA sentence to relay as given, present when the written summaries of a complete result are not ready: they are still being written, or could not be completed.
narrativeNoThe state of the written summaries (the domain conclusions, the synthesis, and the key strengths and challenges) of a complete result.
report_urlNoOpen this saved report for factor values, peer context and ranked contributors through Explain where supplied. Sign in to the owning StockLens account. Reading it does not start another analysis. Present with every complete result, which has passed ownership checks; the report can open before its written summaries finish.
analysis_idYes
base_digestNoIdentifies the saved scores and evidence of a complete result. It stays the same when the written summaries arrive.
progress_pctNo
error_messageNo
retry_after_secondsNo
deterministic_ready_atNoWhen the scores and evidence were saved, ahead of the written summaries (ISO 8601). Absent when the report was saved together with its summaries.

TDQS

A4.6/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, idempotent and non-destructive, but the description adds critical behavior: non-blocking polling semantics, status-dependent interpretation, error_message relay, saved-report completeness, partial narrative behavior, report_url sign-in requirements, and explicit limits on what it omits and does not do.

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?

It is front-loaded with the core behavior and every section is operationally relevant, but it is a very long single paragraph for a one-parameter tool. The density is justified by the agent guidance, though some phrasing could be tightened.

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 a single required parameter, rich annotations, and an output schema, the description is more than complete. It explains how to interpret status transitions, how to relay incomplete results, what report_url means, and what the tool does not cover.

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 coverage is 100% and the single analysis_id parameter is already documented as the value returned by initiate_analysis. The description reinforces its origin but adds no additional format, constraints, or edge-case meaning 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?

The description states a specific verb and resource: return the progress or result of an analysis started with initiate_analysis, by analysis_id. It also distinguishes scope by saying it does not accept a ticker and does not rank companies, separating it from sibling discovery/ranking tools.

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 gives explicit usage conditions: each call returns current state once and does not wait, check again only when the person asks and no sooner than retry_after_seconds, and a failed status is an answer. It also names the originating sibling, initiate_analysis, making the start-then-poll workflow clear.

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

get_market_summaryGet Company ScoreA
Read-onlyIdempotent
Inspect

One company's latest nightly StockLens score: the composite score (0 to 100) and its rating word, the domain scores with their grade words, the named signals that most shaped the reading (up to three, each with its evidence), the business-model lens where one applies, and any domain that was not scored in it. Use the rating word for the company and grade words only for a domain. A higher Risk score means a stronger risk posture and less downside concern. Without an account, scores answer for the 600 largest companies by market value; a signed-in account also reaches any company in its own portfolios. A result with a status other than scored is an answer, not an error; do not retry it unchanged. Relay its message; not_in_surface means the company is scored and outside the caller's reach, never that StockLens has no analysis. Then act on next_step: for ask_user, ask the person and call the named tool only if they agree; mention an offer on a scored result at most once per conversation. Every result carries freshness; a stale result is StockLens's last computed reading for that listing, not last night's, and should be quoted with its date. When freshness.requested_ticker is present, say which listing was served and what was asked. If the person asks for factor values, peer context or ranked contributors beyond this snapshot, explain that a fresh analysis provides a saved web report with that evidence where available. It requires sign-in and may use an Analysis credit; ask whether they want one before calling initiate_analysis. A snapshot request alone is never permission to start a run. One ticker per call. To compare companies the person names, call it once for each. For any other top, best, worst or filtered request call discover_stocks, and never choose the companies for a ranking yourself.

NameRequiredDescriptionDefault
tickerYesStock ticker symbol (e.g. AAPL MSFT TSLA). Exactly one ticker per call.
exchangeNoExchange code (e.g. NASDAQ NYSE). Optional. Resolved automatically if omitted.

Output Schema

NameRequiredDescription
lensNo
scopeYes
ratingNo
sectorNo
statusYes
tickerYes
messageNo
exchangeNo
industryNo
freshnessNo
next_stepNo
candidatesNo
key_driversNo
company_nameNo
analysis_dateNo
domain_scoresNo
config_contextNo
composite_scoreNo
domain_coverageNo
analysis_offeredNo
watchlist_offeredNo

TDQS

A4.5/5.0
Behavior5/5

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

Goes far beyond the readOnly/idempotent annotations: non-scored statuses are answers not errors and must not be retried unchanged, not_in_surface means out of the caller's reach rather than no analysis, next_step drives follow-up, freshness must be quoted with its date, and stale readings are last-computed not last-night. It also discloses the account-scope boundary (600 largest companies anonymous vs. own portfolios when signed in).

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?

Purpose is correctly front-loaded in the first sentence, but the remainder is a dense ~300-word block mixing payload description, status-handling policy, consent rules, and conversational etiquette ('mention an offer at most once per conversation') for a two-parameter read tool. Most sentences carry real information, but the volume makes the critical call instructions hard 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?

For a single-ticker snapshot tool with an output schema and safety annotations already in place, nothing an agent needs is missing: account scope, non-error status semantics, freshness handling, follow-up consent, and the boundary against ranking use are all covered. Remaining verbosity is a style cost, not a completeness gap.

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%, so the schema already documents both parameters, and the description's 'one ticker per call' merely repeats the ticker description. The optional exchange parameter and the auto-resolution behavior are never mentioned in the description, so it adds no meaning over 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?

The opening sentence names a specific resource (one company's latest nightly StockLens score) and enumerates the exact payload: composite score and rating word, domain scores with grades, up to three named signals with evidence, business-model lens, and unscored domains. It also distinguishes itself from siblings by directing ranking/filtered needs to discover_stocks and deeper evidence to initiate_analysis, so an agent can place it without opening any schema.

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?

Explicit routing rules: one ticker per call, call once per company to compare named companies, use discover_stocks for any top/best/worst/filtered request, and never pick ranking constituents yourself. It also states the exact precondition for initiate_analysis (sign-in, possible Analysis credit, ask first) and that a snapshot request is never permission to start a run.

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

get_portfolio_insightsGet PortfolioA
Read-onlyIdempotent
Inspect

Read one of the person's StockLens portfolios: every company in it, each marked holding or watching with its score and rating word, and the portfolio's average score and rating word, its change over 7 and 30 nights, its largest sector share and its biggest movers over 7 nights, each with a driver of its latest reading that points the same way. Without portfolio_id or portfolio_name it reads the default portfolio. portfolios lists every portfolio the person owns and appears only when there is more than one: then name the portfolio you read once and offer the others by name. With one portfolio, never name it. A portfolio the person does not own returns portfolio_not_found with the choices; never guess. Relay message, caption, trust and concentration as written. If a window says insufficient_data, say so; do not estimate a change. config_changed marks a window in which StockLens changed how it scores, so part of that change is the method, not the market. The scores are the ones get_market_summary serves, as of as_of. It does not rank or screen companies outside the portfolio; call discover_stocks for that. It holds no money figures and gives no personal advice.

NameRequiredDescriptionDefault
portfolio_idNoThe id of the portfolio to read, as a portfolios list gives it. Optional: without it or portfolio_name the default portfolio is read.
portfolio_nameNoThe name of the portfolio to read, as the person names it (exact, case does not matter). Optional.

Output Schema

NameRequiredDescription
as_ofNo
scopeYes
trustNo
ratingNo
statusYes
captionNo
messageNo
companiesNo
next_stepNo
fund_countNo
is_defaultNo
populationNo
portfoliosNo
top_moversNo
portfolio_idNo
tier_limitedNo
company_countNo
concentrationNo
movers_windowNo
window_changeNo
holdings_countNo
portfolio_nameNo
portfolio_countNo
scored_company_countNo
scored_holdings_countNo
average_composite_scoreNo

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/non-destructive, and the description adds substantial context beyond them: the portfolio_not_found error contract with choices, the config_changed method-change caveat, insufficient_data handling, and instructions to relay message/caption/trust/concentration verbatim. These are genuine behavioral caveats an agent would otherwise only discover at call time.

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?

Front-loaded with purpose and return contents before the conditional rules, and every clause carries operational weight. It is dense and runs long, with the scoring-provenance and 'holds no money figures' lines bordering on redundant given the output schema, but nothing is truly wasted.

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 two-param tool with an output schema, the description covers everything needed: defaulting behavior, error handling, data-quality flags, and what fields to relay verbatim. Even though the output schema exists, the description supplies the interpretive guidance that makes the returned values actionable.

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 baseline is 3, but the description adds precedence/default semantics not in the schema: with neither param the default portfolio is read, and the portfolid reference should come from a portfolios list. It does not resolve what happens if both id and name are supplied, leaving a small gap.

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 ('Read one of the person's StockLens portfolios') and enumerates exactly what is returned. It explicitly distinguishes itself from discover_stocks ('does not rank or screen companies outside the portfolio') and references get_market_summary for score provenance, so an agent can separate it from siblings without opening schemas.

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 when-to-use rules (default portfolio when neither id nor name is given; name the portfolio once only when more than one exists; never name it when there is only one) and a named alternative for screening (discover_stocks). Also prescribes behavior on error ('never guess') and on partial data (insufficient_data, config_changed).

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

initiate_analysisInitiate AnalysisA
Destructive
Inspect

Start a fresh StockLens analysis of one company, only when the person asks for one or agrees to an offer of one in a get_market_summary result. A new run may use one Analysis credit, or one Plus Analysis credit when depth is plus; the result says if the person's plan does not include it. Use it for a requested evidence gap beyond the nightly snapshot, such as factor values, peer context or ranked contributors. Both depths include written domain summaries and synthesis when produced; Plus adds deeper synthesis and extra web cards where available. The assistant result is condensed; the saved web report has the factor cards and Explain views. It returns an analysis_id at once and finishes asynchronously; fetch the result with fetch_analysis_result when the person asks for it. new_run_started and reused_existing say whether a recent matching analysis was reused. One ticker per call. It does not rank or compare companies, and does not trade or move money.

NameRequiredDescriptionDefault
depthNoAnalysis depth: standard or plus. Both include written domain summaries and synthesis when produced. Plus uses deeper synthesis and adds extra cards in the web report where available. Standard uses an Analysis credit (LENS_AI); Plus uses a Plus Analysis credit (LENS_AI_PLUS). Default standard.
tickerYesStock ticker symbol (e.g. AAPL). Exactly one ticker per call.
exchangeNoExchange code (e.g. NASDAQ). Optional. Resolved automatically if omitted.
time_rangeNoTime horizon. It shapes which signals the analysis weighs most (shorter horizons favor price action, momentum and news; longer favor fundamentals and quality). Not a price forecast. One window per calibrated band: short_2_wk (Short-term), medium_1_mo (Medium-term), long_1_yr (Long-term). Default medium_1_mo. The legacy medium_2_mo and long_2_yr aliases are still accepted and resolve to medium_1_mo and long_1_yr respectively.
risk_toleranceNoAnalysis focus. It reweights how much the analysis weighs downside/quality risk vs. growth/fundamentals. NOT a personal risk or suitability assessment, and it never changes the company's underlying facts. low=Defensive, medium=Balanced, high=Growth. Default medium.
analysis_emphasisNoOptional. RISK_EMPHASIS | BALANCED | FUNDAMENTAL_GROWTH_EMPHASIS. Must agree with the emphasis implied by risk_tolerance (low->RISK_EMPHASIS, medium->BALANCED, high->FUNDAMENTAL_GROWTH_EMPHASIS); a mismatch is rejected as a validation error before any credit is consumed.
evidence_history_familyNoOptional. SHORT_HISTORY | MEDIUM_HISTORY | LONG_HISTORY. Must agree with the family implied by time_range (short_2_wk->SHORT_HISTORY, medium_1_mo/medium_2_mo->MEDIUM_HISTORY, long_1_yr/long_2_yr->LONG_HISTORY); a mismatch is rejected as a validation error before any credit is consumed. Does not select a representative range on its own.

Output Schema

NameRequiredDescription
depthYes
scopeYes
statusYes
analysis_idYes
credit_typeYes
new_run_startedYes
reused_existingYes
estimated_secondsYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only flag it as non-read-only, non-idempotent and destructive; the description explains why — it consumes one Analysis or Plus Analysis credit, is plan-gated ('the result says if the person's plan does not include it'), and is asynchronous (returns analysis_id at once, completes in background). It further discloses reuse semantics via new_run_started/reused_existing and the condensed assistant result vs. the fuller saved web report.

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?

Front-loaded with the trigger condition and use case before the credit/async mechanics, and almost every sentence carries operational value. Minor redundancy: the depth tiers and 'one ticker per call' are restated from the schema, and the credit/plan sentences could be tightened.

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?

An output schema exists, yet the description still supplies the workflow-level context an agent needs: asynchronous execution, the analysis_id handoff to fetch_analysis_result, the reuse fields, and the difference between the condensed assistant payload and the saved report. Nothing needed to call this correctly against a 7-parameter 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?

Schema description coverage is 100% and the parameter docs are already rich (depth, exchange resolution, time_range bands, risk_tolerance reweighting, cross-field agreement rules), so the baseline is 3. The description restates the credit implication of depth and the 'one ticker per call' constraint but adds little parameter meaning 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?

Opens with a specific verb+resource and scope: 'Start a fresh StockLens analysis of one company,' immediately narrowing to a single-ticker, single-company operation. It explicitly disambiguates from siblings by naming fetch_analysis_result for retrieval and by stating it 'does not rank or compare companies' (discover_stocks/get_market_summary territory).

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 an explicit precondition ('only when the person asks for one or agrees to an offer of one in a get_market_summary result') plus a positive use case (requested evidence gap beyond the nightly snapshot: factor values, peer context, ranked contributors). It also routes the follow-up step to fetch_analysis_result 'when the person asks for it' and names exclusions (no ranking/comparison, no trading).

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

pingPingA
Read-onlyIdempotent
Inspect

Health check. Returns pong.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
statusYesConnectivity status: "ok" when the MCP server is reachable

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint, so the description does not need to repeat these. It adds 'Returns pong,' which is a simple behavioral disclosure. However, it does not mention any potential response structure or error behavior, though the output schema exists. The description is adequate but minimal.

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 two short sentences, front-loaded with the primary purpose ('Health check') and the expected result. There is zero waste, and it is appropriately sized for a tool of this simplicity.

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 tool with no parameters and an output schema, the description is complete. It clearly states what it does and what it returns, which is all an agent needs to know to call it correctly. No additional context is necessary.

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?

There are zero parameters, so per calibration the baseline is 4. The description does not need to explain parameter semantics since none exist. The schema confirms no parameters.

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 the tool performs a health check and returns pong, which is clear and distinguishes it from stock-related siblings. It could be more specific about what 'health check' entails (e.g., connectivity), but it is not a tautology and conveys the core purpose.

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?

No guidance on when to use this tool versus alternatives. It does not mention that it is for verifying API connectivity or that it should be used before other operations. Given the sibling tools are all domain-specific, the purpose is implied, but explicit usage context is missing.

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

remove_from_watchlistRemove from PortfolioA
DestructiveIdempotent
Inspect

Remove one company from one of the person's StockLens portfolios. Call it only when the person has asked for it. Without portfolio_id or portfolio_name it removes from the default portfolio, and the result names the portfolio. Relay the result's message. A status other than removed is an answer, not an error. A holding with recorded transactions is not removed here; the result says where to do it. One ticker per call. It does not trade or delete transactions.

NameRequiredDescriptionDefault
tickerYesStock ticker symbol (e.g. AAPL). Exactly one ticker per call.
exchangeNoExchange code (e.g. NASDAQ). Optional. When omitted, the ticker is matched against the portfolio; if it is there on more than one exchange you will be asked which.
portfolio_idNoThe id of the portfolio to remove from, as get_portfolio_insights lists it. Optional: without it or portfolio_name the default portfolio is used.
portfolio_nameNoThe name of the portfolio to remove from, as the person names it (exact, case does not matter). Optional.

Output Schema

NameRequiredDescription
modeNo
scopeYes
statusYes
tickerNo
messageYes
exchangeNo
next_stepNo
is_defaultNo
portfoliosNo
portfolio_idNo
company_countNo
portfolio_nameNo
portfolio_countNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare destructiveHint=true, readOnlyHint=false and idempotentHint=true, but the description adds real operational context: the fallback to the default portfolio, that the result names the affected portfolio, that a non-'removed' status is an answer rather than an error, and that transaction-bearing holdings are out of scope. These are behaviors an agent could not infer from the 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?

Short, front-loaded sentences with the core action first and edge cases after; nothing is padding. Slightly choppy and a touch repetitive on the 'one ticker / no transactions' boundaries, but efficient overall.

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 destructive, non-idempotent-looking mutation, the description covers trigger conditions, parameter defaulting, failure/status interpretation, and scope exclusions. An output schema exists, so return-shape detail is correctly left out.

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%, so the schema already documents ticker, exchange, portfolio_id and portfolio_name, including the multi-exchange disambiguation prompt and the default-portfolio fallback. The description restates rather than extends those semantics, so 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?

States a specific verb and resource with explicit scope: 'Remove one company from one of the person's StockLens portfolios' plus 'One ticker per call.' The negative boundary ('It does not trade or delete transactions') separates it from the add_to_watchlist family and from any transaction-editing tool.

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 an explicit gating condition ('Call it only when the person has asked for it') and an explicit exclusion with a redirect ('A holding with recorded transactions is not removed here; the result says where to do it'). Default-portfolio behavior when portfolio_id/portfolio_name are omitted is also stated.

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. 3 tool updates
    • Changedfetch_analysis_result1 field changed
      • addedOutput schema / properties / result / properties / key_drivers / items / properties / peer_group
        Added value: +{
        +  "type": [
        +    "null",
        +    "string"
        +  ]
        +}
    • Changedget_market_summary1 field changed
      • addedOutput schema / properties / key_drivers / items / properties / peer_group
        Added value: +{
        +  "type": [
        +    "null",
        +    "string"
        +  ]
        +}
    • Changedget_portfolio_insights1 field changed
      • addedOutput schema / properties / top_movers / items / properties / driver / properties / peer_group
        Added value: +{
        +  "type": [
        +    "null",
        +    "string"
        +  ]
        +}
  2. 1 tool update
    • Changedfetch_analysis_result11 fields changed
      • addedOutput schema / properties / base_digest
        Added value: +{
        +  "description": "Identifies the saved scores and evidence of a complete result. It stays the same when the written summaries arrive.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / deterministic_ready_at
        Added value: +{
        +  "description": "When the scores and evidence were saved, ahead of the written summaries (ISO 8601). Absent when the report was saved together with its summaries.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / message
        Added value: +{
        +  "description": "A sentence to relay as given, present when the written summaries of a complete result are not ready: they are still being written, or could not be completed.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / narrative
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The state of the written summaries (the domain conclusions, the synthesis, and the key strengths and challenges) of a complete result.",
        +  "properties": {
        +    "error_code": {
        +      "description": "Why the written summaries failed, as a diagnostic code.",
        +      "enum": [
        +        "DEADLINE_EXCEEDED",
        +        "DELIVERY_BUDGET_EXHAUSTED",
        +        "PROVIDER_UNAVAILABLE",
        +        "PROVIDER_REJECTED",
        +        "INVALID_NARRATIVE",
        +        "UNSUPPORTED_CONSUMER",
        +        "CORRUPT_PAYLOAD",
        +        "INTERNAL_FAILURE"
        +      ],
        +      "type": "string"
        +    },
        +    "failed_at": {
        +      "description": "When the written summaries failed (ISO 8601).",
        +      "type": "string"
        +    },
        +    "ready_at": {
        +      "description": "When the written summaries became ready (ISO 8601).",
        +      "type": "string"
        +    },
        +    "revision": {
        +      "description": "Rises with every change of the summaries' state; a higher revision is the newer answer.",
        +      "type": "integer"
        +    },
        +    "status": {
        +      "description": "pending or running: still being written, and not in this result. ready: in this result. failed: could not be completed; the scores and evidence are unaffected.",
        +      "enum": [
        +        "pending",
        +        "running",
        +        "ready",
        +        "failed"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "revision"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • changedOutput schema / properties / report_url / description
        Previous value: -"Open this saved report for factor values, peer context and ranked contributors through Explain where supplied. Sign in to the owning StockLens account. Reading it does not start another analysis. Only present after the completed result passes ownership checks."New value: +"Open this saved report for factor values, peer context and ranked contributors through Explain where supplied. Sign in to the owning StockLens account. Reading it does not start another analysis. Present with every complete result, which has passed ownership checks; the report can open before its written summaries finish."
      • addedOutput schema / properties / result / properties / currency
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / result / properties / domain_coverage
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "not_scored": {
        +      "items": {
        +        "enum": [
        +          "Fundamental",
        +          "Technical",
        +          "Risk",
        +          "Sentiment",
        +          "Macro"
        +        ],
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "sentiment_sources_note": {
        +      "description": "The Sentiment evidence this reading did not use and why, as one sentence to relay as given, for example: Evidence not read in this analysis: earnings calls (none found recently).",
        +      "type": "string"
        +    }
        +  },
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • changedOutput schema / properties / result / properties / domains / items / properties / analysis / type
        Previous value: -"string"New value: +[
        +  "null",
        +  "string"
        +]
      • changedOutput schema / properties / result / properties / domains / items / required
        Previous value: -[
        -  "domain",
        -  "score",
        -  "grade",
        -  "analysis"
        -]New value: +[
        +  "domain",
        +  "score",
        +  "grade"
        +]
      • addedOutput schema / properties / result / properties / key_drivers
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "context": {
        +        "type": [
        +          "null",
        +          "string"
        +        ]
        +      },
        +      "domain": {
        +        "type": [
        +          "null",
        +          "string"
        +        ]
        +      },
        +      "kind": {
        +        "enum": [
        +          "SUPPORTIVE",
        +          "HEADWIND",
        +          "MIXED",
        +          "COVERAGE_GAP",
        +          "NEUTRAL_NOT_MATERIAL"
        +        ],
        +        "type": "string"
        +      },
        +      "label": {
        +        "type": "string"
        +      },
        +      "metric": {
        +        "type": [
        +          "null",
        +          "string"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "label"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / result / properties / lens
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "label": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "label"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
  3. 2 tool updates
    • Changedadd_to_watchlist1 field changed
      • addedOutput schema / properties / candidates / items / properties / scored
        Added value: +{
        +  "type": [
        +    "null",
        +    "boolean"
        +  ]
        +}
    • Changedget_market_summary1 field changed
      • addedOutput schema / properties / candidates / items / properties / scored
        Added value: +{
        +  "type": [
        +    "null",
        +    "boolean"
        +  ]
        +}
  4. 4 tool updates
    • Changedadd_to_watchlist15 fields changed
      • addedInput schema / properties / portfolio_id
        Added value: +{
        +  "description": "The id of the portfolio to add to, as get_portfolio_insights lists it. Optional: without it or portfolio_name the company goes to the default portfolio.",
        +  "type": "string"
        +}
      • addedInput schema / properties / portfolio_name
        Added value: +{
        +  "description": "The name of the portfolio to add to, as the person names it (exact, case does not matter). Optional.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / candidates
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "company_name": {
        +        "type": "string"
        +      },
        +      "exchange": {
        +        "type": "string"
        +      },
        +      "ticker": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "ticker",
        +      "exchange",
        +      "company_name"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / company_count
        Added value: +{
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • addedOutput schema / properties / is_default
        Added value: +{
        +  "type": [
        +    "null",
        +    "boolean"
        +  ]
        +}
      • addedOutput schema / properties / message
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / mode
        Added value: +{
        +  "enum": [
        +    "holding",
        +    "watching"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "arguments": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "exchange": {
        +          "type": "string"
        +        },
        +        "ticker": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "ticker"
        +      ],
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "call_tool",
        +        "ask_user",
        +        "human_action"
        +      ],
        +      "type": "string"
        +    },
        +    "options": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "tool": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • addedOutput schema / properties / portfolio_count
        Added value: +{
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • addedOutput schema / properties / portfolio_id
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / portfolio_name
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / portfolios
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "company_count": {
        +        "type": "integer"
        +      },
        +      "is_default": {
        +        "type": "boolean"
        +      },
        +      "portfolio_id": {
        +        "type": "string"
        +      },
        +      "portfolio_name": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "portfolio_id",
        +      "portfolio_name",
        +      "is_default",
        +      "company_count"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / status
        Added value: +{
        +  "enum": [
        +    "added",
        +    "already_in_portfolio",
        +    "over_capacity",
        +    "ambiguous",
        +    "not_found",
        +    "portfolio_not_found"
        +  ],
        +  "type": "string"
        +}
      • removedOutput schema / properties / total_holdings
        Removed value: -{
        -  "type": "integer"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "ticker",
        -  "exchange",
        -  "total_holdings",
        -  "plan_limit",
        -  "scope"
        -]New value: +[
        +  "status",
        +  "message",
        +  "scope"
        +]
    • Addedadd_to_watchlist_batch
    • Changedget_portfolio_insights30 fields changed
      • addedInput schema / properties
        Added value: +{
        +  "portfolio_id": {
        +    "description": "The id of the portfolio to read, as a portfolios list gives it. Optional: without it or portfolio_name the default portfolio is read.",
        +    "type": "string"
        +  },
        +  "portfolio_name": {
        +    "description": "The name of the portfolio to read, as the person names it (exact, case does not matter). Optional.",
        +    "type": "string"
        +  }
        +}
      • removedOutput schema / properties / aggregate_signal
        Removed value: -{
        -  "type": [
        -    "null",
        -    "string"
        -  ]
        -}
      • addedOutput schema / properties / as_of
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / average_composite_score
        Added value: +{
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • addedOutput schema / properties / caption
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / companies
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "company_name": {
        +        "type": "string"
        +      },
        +      "composite_score": {
        +        "type": [
        +          "null",
        +          "number"
        +        ]
        +      },
        +      "exchange": {
        +        "type": "string"
        +      },
        +      "freshness": {
        +        "enum": [
        +          "aging",
        +          "stale"
        +        ],
        +        "type": "string"
        +      },
        +      "instrument": {
        +        "enum": [
        +          "fund"
        +        ],
        +        "type": "string"
        +      },
        +      "last_scored": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "enum": [
        +          "holding",
        +          "watching"
        +        ],
        +        "type": "string"
        +      },
        +      "rating": {
        +        "type": "string"
        +      },
        +      "ticker": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "ticker",
        +      "exchange",
        +      "mode"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / company_count
        Added value: +{
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • addedOutput schema / properties / concentration
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "lead": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "sectors": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "companies": {
        +            "type": "integer"
        +          },
        +          "sector": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "sector",
        +          "companies"
        +        ],
        +        "type": "object"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    }
        +  },
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • addedOutput schema / properties / fund_count
        Added value: +{
        +  "type": "integer"
        +}
      • addedOutput schema / properties / holdings_count
        Added value: +{
        +  "type": "integer"
        +}
      • addedOutput schema / properties / is_default
        Added value: +{
        +  "type": [
        +    "null",
        +    "boolean"
        +  ]
        +}
      • addedOutput schema / properties / message
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / movers_window
        Added value: +{
        +  "enum": [
        +    "7_nights"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "arguments": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "exchange": {
        +          "type": "string"
        +        },
        +        "ticker": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "ticker"
        +      ],
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "call_tool",
        +        "ask_user",
        +        "human_action"
        +      ],
        +      "type": "string"
        +    },
        +    "options": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "tool": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • addedOutput schema / properties / population
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / portfolio_count
        Added value: +{
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • addedOutput schema / properties / portfolio_id
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / portfolio_name
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / portfolios
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "company_count": {
        +        "type": "integer"
        +      },
        +      "is_default": {
        +        "type": "boolean"
        +      },
        +      "portfolio_id": {
        +        "type": "string"
        +      },
        +      "portfolio_name": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "portfolio_id",
        +      "portfolio_name",
        +      "is_default",
        +      "company_count"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / rating
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / scored_company_count
        Added value: +{
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • addedOutput schema / properties / scored_holdings_count
        Added value: +{
        +  "type": "integer"
        +}
      • addedOutput schema / properties / status
        Added value: +{
        +  "enum": [
        +    "ok",
        +    "empty",
        +    "portfolio_not_found"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / tier_limited / type
        Previous value: -"boolean"New value: +[
        +  "null",
        +  "boolean"
        +]
      • addedOutput schema / properties / top_movers
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "change": {
        +        "type": "number"
        +      },
        +      "composite_score": {
        +        "type": "number"
        +      },
        +      "driver": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "context": {
        +            "type": [
        +              "null",
        +              "string"
        +            ]
        +          },
        +          "domain": {
        +            "type": [
        +              "null",
        +              "string"
        +            ]
        +          },
        +          "kind": {
        +            "enum": [
        +              "SUPPORTIVE",
        +              "HEADWIND",
        +              "MIXED",
        +              "COVERAGE_GAP",
        +              "NEUTRAL_NOT_MATERIAL"
        +            ],
        +            "type": "string"
        +          },
        +          "label": {
        +            "type": "string"
        +          },
        +          "metric": {
        +            "type": [
        +              "null",
        +              "string"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "kind",
        +          "label"
        +        ],
        +        "type": [
        +          "null",
        +          "object"
        +        ]
        +      },
        +      "mode": {
        +        "enum": [
        +          "holding",
        +          "watching"
        +        ],
        +        "type": "string"
        +      },
        +      "rating": {
        +        "type": "string"
        +      },
        +      "ticker": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "ticker",
        +      "mode",
        +      "change",
        +      "composite_score",
        +      "rating"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • removedOutput schema / properties / total_holdings
        Removed value: -{
        -  "type": "integer"
        -}
      • addedOutput schema / properties / trust
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • removedOutput schema / properties / watchlist
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "analysis_date": {
        -        "type": [
        -          "null",
        -          "string"
        -        ]
        -      },
        -      "company_name": {
        -        "type": "string"
        -      },
        -      "composite_grade": {
        -        "type": [
        -          "null",
        -          "string"
        -        ]
        -      },
        -      "composite_score": {
        -        "type": [
        -          "null",
        -          "number"
        -        ]
        -      },
        -      "exchange": {
        -        "type": "string"
        -      },
        -      "ticker": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "ticker",
        -      "company_name",
        -      "exchange"
        -    ],
        -    "type": "object"
        -  },
        -  "type": [
        -    "null",
        -    "array"
        -  ]
        -}
      • addedOutput schema / properties / window_change
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "1m": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "change": {
        +          "type": [
        +            "null",
        +            "number"
        +          ]
        +        },
        +        "config_changed": {
        +          "type": "boolean"
        +        },
        +        "insufficient_data": {
        +          "type": "boolean"
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "1w": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "change": {
        +          "type": [
        +            "null",
        +            "number"
        +          ]
        +        },
        +        "config_changed": {
        +          "type": "boolean"
        +        },
        +        "insufficient_data": {
        +          "type": "boolean"
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    }
        +  },
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "watchlist",
        -  "total_holdings",
        -  "tier_limited",
        -  "scope"
        -]New value: +[
        +  "status",
        +  "scope"
        +]
    • Changedremove_from_watchlist15 fields changed
      • addedInput schema / properties / portfolio_id
        Added value: +{
        +  "description": "The id of the portfolio to remove from, as get_portfolio_insights lists it. Optional: without it or portfolio_name the default portfolio is used.",
        +  "type": "string"
        +}
      • addedInput schema / properties / portfolio_name
        Added value: +{
        +  "description": "The name of the portfolio to remove from, as the person names it (exact, case does not matter). Optional.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / company_count
        Added value: +{
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • addedOutput schema / properties / is_default
        Added value: +{
        +  "type": [
        +    "null",
        +    "boolean"
        +  ]
        +}
      • addedOutput schema / properties / message
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / mode
        Added value: +{
        +  "enum": [
        +    "holding",
        +    "watching"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "arguments": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "exchange": {
        +          "type": "string"
        +        },
        +        "ticker": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "ticker"
        +      ],
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "call_tool",
        +        "ask_user",
        +        "human_action"
        +      ],
        +      "type": "string"
        +    },
        +    "options": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "tool": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • addedOutput schema / properties / portfolio_count
        Added value: +{
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • addedOutput schema / properties / portfolio_id
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / portfolio_name
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / portfolios
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "company_count": {
        +        "type": "integer"
        +      },
        +      "is_default": {
        +        "type": "boolean"
        +      },
        +      "portfolio_id": {
        +        "type": "string"
        +      },
        +      "portfolio_name": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "portfolio_id",
        +      "portfolio_name",
        +      "is_default",
        +      "company_count"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • removedOutput schema / properties / removed
        Removed value: -{
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / status
        Added value: +{
        +  "enum": [
        +    "removed",
        +    "not_in_portfolio",
        +    "has_transactions",
        +    "ambiguous_listing",
        +    "portfolio_not_found"
        +  ],
        +  "type": "string"
        +}
      • removedOutput schema / properties / total_holdings
        Removed value: -{
        -  "type": "integer"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "ticker",
        -  "exchange",
        -  "removed",
        -  "total_holdings",
        -  "scope"
        -]New value: +[
        +  "status",
        +  "message",
        +  "scope"
        +]
  5. 2 tool updates
    • Changeddiscover_stocks1 field changed
      • addedOutput schema / properties / next_step / properties / arguments / properties / exchange
        Added value: +{
        +  "type": "string"
        +}
    • Changedget_market_summary2 fields changed
      • addedOutput schema / properties / analysis_offered
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / next_step / properties / arguments / properties / exchange
        Added value: +{
        +  "type": "string"
        +}
  6. 3 tool updates
    • Changeddiscover_stocks3 fields changed
      • changedInput schema / properties / sort_by / description
        Previous value: -"One of the 6 StockLens scores or a non-score signal to sort by. Default composite_score."New value: +"One of the 6 StockLens scores, market_cap, volume or ticker. Default composite_score. Popularity ordering is unavailable."
      • changedInput schema / properties / sort_by / enum
        Previous value: -[
        -  "composite_score",
        -  "fundamental_score",
        -  "technical_score",
        -  "risk_score",
        -  "sentiment_score",
        -  "macro_score",
        -  "analysis_volume",
        -  "user_volume",
        -  "ticker",
        -  "market_cap",
        -  "volume"
        -]New value: +[
        +  "composite_score",
        +  "fundamental_score",
        +  "technical_score",
        +  "risk_score",
        +  "sentiment_score",
        +  "macro_score",
        +  "ticker",
        +  "market_cap",
        +  "volume"
        +]
      • addedOutput schema / properties / signed_in_as
        Added value: +{
        +  "type": "string"
        +}
    • Changedfetch_analysis_result1 field changed
      • addedOutput schema / properties / report_url
        Added value: +{
        +  "description": "Open this saved report for factor values, peer context and ranked contributors through Explain where supplied. Sign in to the owning StockLens account. Reading it does not start another analysis. Only present after the completed result passes ownership checks.",
        +  "type": "string"
        +}
    • Changedinitiate_analysis1 field changed
      • changedInput schema / properties / depth / description
        Previous value: -"Analysis depth: standard or plus. Standard consumes an Analysis credit (LENS_AI). Plus consumes a Plus Analysis credit (LENS_AI_PLUS) and may add AI narratives. Default standard."New value: +"Analysis depth: standard or plus. Both include written domain summaries and synthesis when produced. Plus uses deeper synthesis and adds extra cards in the web report where available. Standard uses an Analysis credit (LENS_AI); Plus uses a Plus Analysis credit (LENS_AI_PLUS). Default standard."
  7. 1 tool update
    • Changedget_market_summary2 fields changed
      • addedOutput schema / properties / domain_coverage / properties / sentiment_sources_note
        Added value: +{
        +  "description": "The Sentiment evidence this reading did not use and why, as one sentence to relay as given, for example: Evidence not read in this analysis: earnings calls (none found recently).",
        +  "type": "string"
        +}
      • removedOutput schema / properties / domain_coverage / required
        Removed value: -[
        -  "not_scored"
        -]
  8. 1 tool update
    • Changedfetch_analysis_result2 fields changed
      • addedOutput schema / properties / result / properties / filing_facts
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "fact_type": {
        +        "type": "string"
        +      },
        +      "filing_date": {
        +        "type": "string"
        +      },
        +      "form_type": {
        +        "type": "string"
        +      },
        +      "quote": {
        +        "type": "string"
        +      },
        +      "reading": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "fact_type",
        +      "reading",
        +      "form_type",
        +      "filing_date",
        +      "quote"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / result / properties / filing_facts_note
        Added value: +{
        +  "type": "string"
        +}
  9. 4 tool updates
    • Changedadd_to_watchlist1 field changed
      • changedInput schema / properties / ticker / pattern
        Previous value: -"^[A-Za-z][A-Za-z.\\-]{0,9}$"New value: +"^[A-Za-z0-9][A-Za-z0-9.\\-]{0,19}$"
    • Changedget_market_summary1 field changed
      • changedInput schema / properties / ticker / pattern
        Previous value: -"^[A-Za-z][A-Za-z.\\-]{0,9}$"New value: +"^[A-Za-z0-9][A-Za-z0-9.\\-]{0,19}$"
    • Changedinitiate_analysis1 field changed
      • changedInput schema / properties / ticker / pattern
        Previous value: -"^[A-Za-z][A-Za-z.\\-]{0,9}$"New value: +"^[A-Za-z0-9][A-Za-z0-9.\\-]{0,19}$"
    • Changedremove_from_watchlist1 field changed
      • changedInput schema / properties / ticker / pattern
        Previous value: -"^[A-Za-z][A-Za-z.\\-]{0,9}$"New value: +"^[A-Za-z0-9][A-Za-z0-9.\\-]{0,19}$"
  10. 1 tool update
    • Changedget_market_summary4 fields changed
      • addedOutput schema / properties / domain_coverage
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "not_scored": {
        +      "items": {
        +        "enum": [
        +          "Fundamental",
        +          "Technical",
        +          "Risk",
        +          "Sentiment",
        +          "Macro"
        +        ],
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "not_scored"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • addedOutput schema / properties / key_drivers
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "context": {
        +        "type": [
        +          "null",
        +          "string"
        +        ]
        +      },
        +      "domain": {
        +        "type": [
        +          "null",
        +          "string"
        +        ]
        +      },
        +      "kind": {
        +        "enum": [
        +          "SUPPORTIVE",
        +          "HEADWIND",
        +          "MIXED",
        +          "COVERAGE_GAP",
        +          "NEUTRAL_NOT_MATERIAL"
        +        ],
        +        "type": "string"
        +      },
        +      "label": {
        +        "type": "string"
        +      },
        +      "metric": {
        +        "type": [
        +          "null",
        +          "string"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "label"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / lens
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "label": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "label"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • removedOutput schema / properties / watchlist
        Removed value: -{
        -  "additionalProperties": false,
        -  "properties": {
        -    "message": {
        -      "type": "string"
        -    },
        -    "tool": {
        -      "type": "string"
        -    },
        -    "tracked": {
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "tracked",
        -    "tool",
        -    "message"
        -  ],
        -  "type": [
        -    "null",
        -    "object"
        -  ]
        -}
  11. 7 tool updates
    • Changedadd_to_watchlist3 fields changed
      • changedInput schema / properties / exchange / description
        Previous value: -"Exchange code (e.g. NASDAQ). Optional - resolved automatically if omitted."New value: +"Exchange code (e.g. NASDAQ). Optional. Resolved automatically if omitted."
      • addedInput schema / properties / exchange / enum
        Added value: +[
        +  "NYSE",
        +  "NASDAQ",
        +  "AMEX",
        +  "OTC",
        +  "CBOE",
        +  "TSX",
        +  "TSXV",
        +  "CNQ",
        +  "NEO",
        +  "MEX",
        +  "B3",
        +  "SANTIAGO",
        +  "BUE",
        +  "BVC",
        +  "LSE",
        +  "EURONEXT_PARIS",
        +  "EURONEXT_AMSTERDAM",
        +  "EURONEXT_BRUSSELS",
        +  "EURONEXT_LISBON",
        +  "EURONEXT_DUBLIN",
        +  "XETRA",
        +  "SIX",
        +  "BME",
        +  "MILAN",
        +  "OSLO",
        +  "OMX_STOCKHOLM",
        +  "OMX_HELSINKI",
        +  "OMX_COPENHAGEN",
        +  "WSE",
        +  "VIE",
        +  "ATH",
        +  "PRA",
        +  "BUD",
        +  "IST",
        +  "ICE",
        +  "RIS",
        +  "TAL",
        +  "MCX",
        +  "TSE",
        +  "HKEX",
        +  "SHANGHAI",
        +  "SHENZHEN",
        +  "ASX",
        +  "TWSE",
        +  "SGX",
        +  "NSE",
        +  "KRX",
        +  "BSE",
        +  "KOE",
        +  "JKT",
        +  "KLS",
        +  "SET",
        +  "NZE",
        +  "HOSE",
        +  "TWO",
        +  "TADAWUL",
        +  "JSE",
        +  "TLV",
        +  "DFM",
        +  "EGX",
        +  "DOH",
        +  "KUW"
        +]
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol to add to the watchlist (e.g. AAPL). Exactly one ticker per call."New value: +"Stock ticker symbol (e.g. AAPL). Exactly one ticker per call."
    • Changeddiscover_stocks12 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Number of matches to return (the N in top/bottom N), 1-100. Default 10."New value: +"Number of matches to return (the N in top/bottom N), 1 to 100. Default 10."
      • addedInput schema / properties / limit / maximum
        Added value: +100
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / page / description
        Previous value: -"0-based page of results, 0-500. Default 0."New value: +"0-based page of results, 0 to 500. Default 0."
      • addedInput schema / properties / page / maximum
        Added value: +500
      • addedInput schema / properties / page / minimum
        Added value: +0
      • addedOutput schema / properties / message
        Added value: +{
        +  "type": [
        +    "null",
        +    "string"
        +  ]
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "arguments": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "ticker": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "ticker"
        +      ],
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "call_tool",
        +        "ask_user",
        +        "human_action"
        +      ],
        +      "type": "string"
        +    },
        +    "options": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "tool": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • changedOutput schema / properties / rows / items / properties / macro_code / description
        Previous value: -"Listing geography of the exchange (US, CA, EU, CH, GB, JP, or GLOBAL when unmapped) — the same value macro_in filters on."New value: +"Listing geography of the exchange (US, CA, EU, CH, GB, JP, or GLOBAL when unmapped), the same value macro_in filters on."
      • addedOutput schema / properties / status
        Added value: +{
        +  "enum": [
        +    "ranked",
        +    "browse_substituted",
        +    "locked"
        +  ],
        +  "type": "string"
        +}
      • removedOutput schema / properties / upgrade_message
        Removed value: -{
        -  "type": [
        -    "null",
        -    "string"
        -  ]
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "rows",
        -  "scores_locked",
        -  "hard_locked",
        -  "access_tier",
        -  "rows_returned",
        -  "effective_sort",
        -  "effective_direction",
        -  "config_context",
        -  "data_source",
        -  "scope"
        -]New value: +[
        +  "status",
        +  "rows",
        +  "scores_locked",
        +  "hard_locked",
        +  "access_tier",
        +  "rows_returned",
        +  "effective_sort",
        +  "effective_direction",
        +  "config_context",
        +  "data_source",
        +  "scope"
        +]
    • Changedfetch_analysis_result5 fields changed
      • removedOutput schema / properties / result / properties / domains / items / properties / confidence
        Removed value: -{
        -  "type": [
        -    "null",
        -    "number"
        -  ]
        -}
      • removedOutput schema / properties / result / properties / domains / items / properties / news_key_articles / items / properties / rating
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / result / properties / domains / items / properties / news_key_articles / items / properties / tone
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / result / properties / domains / items / properties / news_key_articles / items / required
        Previous value: -[
        -  "title",
        -  "publisher",
        -  "url",
        -  "published_at",
        -  "rating",
        -  "conviction"
        -]New value: +[
        +  "title",
        +  "publisher",
        +  "url",
        +  "published_at",
        +  "tone",
        +  "conviction"
        +]
      • addedOutput schema / properties / result / properties / evidence
        Added value: +{
        +  "type": "string"
        +}
    • Changedget_market_summary18 fields changed
      • changedInput schema / properties / exchange / description
        Previous value: -"Exchange code (e.g. NASDAQ NYSE). Optional - resolved automatically if omitted."New value: +"Exchange code (e.g. NASDAQ NYSE). Optional. Resolved automatically if omitted."
      • addedInput schema / properties / exchange / enum
        Added value: +[
        +  "NYSE",
        +  "NASDAQ",
        +  "AMEX",
        +  "OTC",
        +  "CBOE",
        +  "TSX",
        +  "TSXV",
        +  "CNQ",
        +  "NEO",
        +  "MEX",
        +  "B3",
        +  "SANTIAGO",
        +  "BUE",
        +  "BVC",
        +  "LSE",
        +  "EURONEXT_PARIS",
        +  "EURONEXT_AMSTERDAM",
        +  "EURONEXT_BRUSSELS",
        +  "EURONEXT_LISBON",
        +  "EURONEXT_DUBLIN",
        +  "XETRA",
        +  "SIX",
        +  "BME",
        +  "MILAN",
        +  "OSLO",
        +  "OMX_STOCKHOLM",
        +  "OMX_HELSINKI",
        +  "OMX_COPENHAGEN",
        +  "WSE",
        +  "VIE",
        +  "ATH",
        +  "PRA",
        +  "BUD",
        +  "IST",
        +  "ICE",
        +  "RIS",
        +  "TAL",
        +  "MCX",
        +  "TSE",
        +  "HKEX",
        +  "SHANGHAI",
        +  "SHENZHEN",
        +  "ASX",
        +  "TWSE",
        +  "SGX",
        +  "NSE",
        +  "KRX",
        +  "BSE",
        +  "KOE",
        +  "JKT",
        +  "KLS",
        +  "SET",
        +  "NZE",
        +  "HOSE",
        +  "TWO",
        +  "TADAWUL",
        +  "JSE",
        +  "TLV",
        +  "DFM",
        +  "EGX",
        +  "DOH",
        +  "KUW"
        +]
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol (e.g. AAPL MSFT TSLA)"New value: +"Stock ticker symbol (e.g. AAPL MSFT TSLA). Exactly one ticker per call."
      • addedOutput schema / properties / candidates
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "company_name": {
        +        "type": "string"
        +      },
        +      "exchange": {
        +        "type": "string"
        +      },
        +      "ticker": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "ticker",
        +      "exchange",
        +      "company_name"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • changedOutput schema / properties / composite_score / type
        Previous value: -"number"New value: +[
        +  "null",
        +  "number"
        +]
      • removedOutput schema / properties / config_context / properties / config_name
        Removed value: -{
        -  "type": [
        -    "null",
        -    "string"
        -  ]
        -}
      • removedOutput schema / properties / config_context / properties / config_version
        Removed value: -{
        -  "type": [
        -    "null",
        -    "string"
        -  ]
        -}
      • changedOutput schema / properties / config_context / type
        Previous value: -"object"New value: +[
        +  "null",
        +  "object"
        +]
      • removedOutput schema / properties / data_source
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / domain_scores / items / properties / display_name
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / properties / domain_scores / items / required
        Previous value: -[
        -  "domain",
        -  "display_name",
        -  "score",
        -  "grade"
        -]New value: +[
        +  "domain",
        +  "score",
        +  "grade"
        +]
      • addedOutput schema / properties / freshness
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "age_days": {
        +      "type": "integer"
        +    },
        +    "last_scored": {
        +      "type": "string"
        +    },
        +    "requested_ticker": {
        +      "type": "string"
        +    },
        +    "state": {
        +      "enum": [
        +        "current",
        +        "aging",
        +        "stale"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "state",
        +    "last_scored",
        +    "age_days"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • removedOutput schema / properties / key_challenges
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "domain": {
        -        "type": [
        -          "null",
        -          "string"
        -        ]
        -      },
        -      "headline": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "headline"
        -    ],
        -    "type": "object"
        -  },
        -  "type": [
        -    "null",
        -    "array"
        -  ]
        -}
      • removedOutput schema / properties / key_strengths
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "domain": {
        -        "type": [
        -          "null",
        -          "string"
        -        ]
        -      },
        -      "headline": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "headline"
        -    ],
        -    "type": "object"
        -  },
        -  "type": [
        -    "null",
        -    "array"
        -  ]
        -}
      • addedOutput schema / properties / message
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "arguments": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "ticker": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "ticker"
        +      ],
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "call_tool",
        +        "ask_user",
        +        "human_action"
        +      ],
        +      "type": "string"
        +    },
        +    "options": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "tool": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • addedOutput schema / properties / status
        Added value: +{
        +  "enum": [
        +    "scored",
        +    "not_in_surface",
        +    "not_covered",
        +    "ambiguous",
        +    "not_found"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "ticker",
        -  "exchange",
        -  "company_name",
        -  "sector",
        -  "industry",
        -  "composite_score",
        -  "rating",
        -  "domain_scores",
        -  "analysis_date",
        -  "config_context",
        -  "data_source",
        -  "scope"
        -]New value: +[
        +  "status",
        +  "ticker",
        +  "scope"
        +]
    • Changedinitiate_analysis5 fields changed
      • changedInput schema / properties / exchange / description
        Previous value: -"Exchange code (e.g. NASDAQ). Optional - resolved automatically if omitted."New value: +"Exchange code (e.g. NASDAQ). Optional. Resolved automatically if omitted."
      • addedInput schema / properties / exchange / enum
        Added value: +[
        +  "NYSE",
        +  "NASDAQ",
        +  "AMEX",
        +  "OTC",
        +  "CBOE",
        +  "TSX",
        +  "TSXV",
        +  "CNQ",
        +  "NEO",
        +  "MEX",
        +  "B3",
        +  "SANTIAGO",
        +  "BUE",
        +  "BVC",
        +  "LSE",
        +  "EURONEXT_PARIS",
        +  "EURONEXT_AMSTERDAM",
        +  "EURONEXT_BRUSSELS",
        +  "EURONEXT_LISBON",
        +  "EURONEXT_DUBLIN",
        +  "XETRA",
        +  "SIX",
        +  "BME",
        +  "MILAN",
        +  "OSLO",
        +  "OMX_STOCKHOLM",
        +  "OMX_HELSINKI",
        +  "OMX_COPENHAGEN",
        +  "WSE",
        +  "VIE",
        +  "ATH",
        +  "PRA",
        +  "BUD",
        +  "IST",
        +  "ICE",
        +  "RIS",
        +  "TAL",
        +  "MCX",
        +  "TSE",
        +  "HKEX",
        +  "SHANGHAI",
        +  "SHENZHEN",
        +  "ASX",
        +  "TWSE",
        +  "SGX",
        +  "NSE",
        +  "KRX",
        +  "BSE",
        +  "KOE",
        +  "JKT",
        +  "KLS",
        +  "SET",
        +  "NZE",
        +  "HOSE",
        +  "TWO",
        +  "TADAWUL",
        +  "JSE",
        +  "TLV",
        +  "DFM",
        +  "EGX",
        +  "DOH",
        +  "KUW"
        +]
      • changedInput schema / properties / risk_tolerance / description
        Previous value: -"Analysis focus — reweights how much the analysis weighs downside/quality risk vs. growth/fundamentals. NOT a personal risk or suitability assessment, and it never changes the company's underlying facts. low=Defensive, medium=Balanced, high=Growth. Default medium."New value: +"Analysis focus. It reweights how much the analysis weighs downside/quality risk vs. growth/fundamentals. NOT a personal risk or suitability assessment, and it never changes the company's underlying facts. low=Defensive, medium=Balanced, high=Growth. Default medium."
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol (e.g. AAPL)"New value: +"Stock ticker symbol (e.g. AAPL). Exactly one ticker per call."
      • changedInput schema / properties / time_range / description
        Previous value: -"Time horizon — shapes which signals the analysis weighs most (shorter horizons favor price action, momentum and news; longer favor fundamentals and quality). Not a price forecast. One window per calibrated band: short_2_wk (Short-term), medium_1_mo (Medium-term), long_1_yr (Long-term). Default medium_1_mo. The legacy medium_2_mo and long_2_yr aliases are still accepted and resolve to medium_1_mo and long_1_yr respectively."New value: +"Time horizon. It shapes which signals the analysis weighs most (shorter horizons favor price action, momentum and news; longer favor fundamentals and quality). Not a price forecast. One window per calibrated band: short_2_wk (Short-term), medium_1_mo (Medium-term), long_1_yr (Long-term). Default medium_1_mo. The legacy medium_2_mo and long_2_yr aliases are still accepted and resolve to medium_1_mo and long_1_yr respectively."
    • Changedping1 field changed
      • changedOutput schema / properties / status / description
        Previous value: -"Connectivity status — \"ok\" when the MCP server is reachable"New value: +"Connectivity status: \"ok\" when the MCP server is reachable"
    • Changedremove_from_watchlist3 fields changed
      • changedInput schema / properties / exchange / description
        Previous value: -"Exchange code (e.g. NASDAQ). Optional — when omitted, the ticker is matched against your own watchlist; if it is tracked on more than one exchange you will be asked which one."New value: +"Exchange code (e.g. NASDAQ). Optional. When omitted, the ticker is matched against the portfolio; if it is there on more than one exchange you will be asked which."
      • addedInput schema / properties / exchange / enum
        Added value: +[
        +  "NYSE",
        +  "NASDAQ",
        +  "AMEX",
        +  "OTC",
        +  "CBOE",
        +  "TSX",
        +  "TSXV",
        +  "CNQ",
        +  "NEO",
        +  "MEX",
        +  "B3",
        +  "SANTIAGO",
        +  "BUE",
        +  "BVC",
        +  "LSE",
        +  "EURONEXT_PARIS",
        +  "EURONEXT_AMSTERDAM",
        +  "EURONEXT_BRUSSELS",
        +  "EURONEXT_LISBON",
        +  "EURONEXT_DUBLIN",
        +  "XETRA",
        +  "SIX",
        +  "BME",
        +  "MILAN",
        +  "OSLO",
        +  "OMX_STOCKHOLM",
        +  "OMX_HELSINKI",
        +  "OMX_COPENHAGEN",
        +  "WSE",
        +  "VIE",
        +  "ATH",
        +  "PRA",
        +  "BUD",
        +  "IST",
        +  "ICE",
        +  "RIS",
        +  "TAL",
        +  "MCX",
        +  "TSE",
        +  "HKEX",
        +  "SHANGHAI",
        +  "SHENZHEN",
        +  "ASX",
        +  "TWSE",
        +  "SGX",
        +  "NSE",
        +  "KRX",
        +  "BSE",
        +  "KOE",
        +  "JKT",
        +  "KLS",
        +  "SET",
        +  "NZE",
        +  "HOSE",
        +  "TWO",
        +  "TADAWUL",
        +  "JSE",
        +  "TLV",
        +  "DFM",
        +  "EGX",
        +  "DOH",
        +  "KUW"
        +]
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol to remove from the watchlist (e.g. AAPL). Exactly one ticker per call."New value: +"Stock ticker symbol (e.g. AAPL). Exactly one ticker per call."
  12. 1 tool update
    • Changedfetch_analysis_result2 fields changed
      • addedOutput schema / properties / result / properties / domains / items / properties / contribution
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / result / properties / domains / items / properties / weight
        Removed value: -{
        -  "type": [
        -    "null",
        -    "number"
        -  ]
        -}
  13. 1 tool update
    • Changeddiscover_stocks1 field changed
      • addedOutput schema / properties / sort_substituted
        Added value: +{
        +  "type": "boolean"
        +}
  14. 1 tool update
    • Changedget_market_summary2 fields changed
      • addedOutput schema / properties / watchlist
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "type": "string"
        +    },
        +    "tool": {
        +      "type": "string"
        +    },
        +    "tracked": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tracked",
        +    "tool",
        +    "message"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • addedOutput schema / properties / watchlist_offered
        Added value: +{
        +  "type": "boolean"
        +}
  15. 3 tool updates
    • Changedadd_to_watchlist1 field changed
      • changedInput schema / properties / exchange / description
        Previous value: -"Exchange code (e.g. NASDAQ). Optional — auto-resolved via StockLens autocomplete if omitted."New value: +"Exchange code (e.g. NASDAQ). Optional - resolved automatically if omitted."
    • Changeddiscover_stocks2 fields changed
      • addedOutput schema / properties / hard_locked
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "rows",
        -  "scores_locked",
        -  "access_tier",
        -  "rows_returned",
        -  "effective_sort",
        -  "effective_direction",
        -  "config_context",
        -  "data_source",
        -  "scope"
        -]New value: +[
        +  "rows",
        +  "scores_locked",
        +  "hard_locked",
        +  "access_tier",
        +  "rows_returned",
        +  "effective_sort",
        +  "effective_direction",
        +  "config_context",
        +  "data_source",
        +  "scope"
        +]
    • Changedinitiate_analysis1 field changed
      • changedInput schema / properties / exchange / description
        Previous value: -"Exchange code (e.g. NASDAQ). Optional."New value: +"Exchange code (e.g. NASDAQ). Optional - resolved automatically if omitted."

Publisher details

Operator
StockLens · Publisher source
Vendor relationship
First-party · Publisher source
Trust center
Not available
Restrictions
No setup constraints: no admin approval, no custom OAuth app, no regional limit. ping and get_market_summary work with no account and cover the 600 largest companies by market value. All other tools sign in to a free StockLens account over OAuth 2.1 with PKCE. Starting a full analysis uses one plan credit, and Discover Stocks has a daily limit that depends on the plan.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Daily stock screens, RS ratings, market breadth and group rankings for 12 markets. No API keys.
    20
    6
    411
    Apache 2.0
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI clients to analyze stocks and get scored BUY/HOLD/SELL assessments with technical and fundamental data for Indian (NSE/BSE) and US markets.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Free stock, ETF & crypto analysis for AI agents: 10-point score, descriptive verdict and all key metrics for any ticker. Remote MCP server (Streamable HTTP, no auth, nothing to install) at https://www.stoxlyonline.com/api/mcp, plus a stdio server (server.js) for platforms that run MCP servers as a local process. Rate limit: 30 tool calls per IP per hour. Docs: https://www.stoxlyonline.com/mcp
    2
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources