StockLens
Server Details
Scores for the 600 largest stocks with no account. Sign in for analysis, screening and a watchlist.
- Status
- Healthy
- Uptime
- 99.9% over 77 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- StockLens
- Claude
- –
TDQS
Scored across 9 tools
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.
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.
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.
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 toolsadd_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.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Stock ticker symbol (e.g. AAPL). Exactly one ticker per call. | |
| exchange | No | Exchange code (e.g. NASDAQ). Optional. Resolved automatically if omitted. | |
| portfolio_id | No | 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. | |
| portfolio_name | No | The name of the portfolio to add to, as the person names it (exact, case does not matter). Optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| scope | Yes | |
| status | Yes | |
| ticker | No | |
| message | Yes | |
| exchange | No | |
| next_step | No | |
| candidates | No | |
| is_default | No | |
| plan_limit | No | |
| portfolios | No | |
| company_name | No | |
| portfolio_id | No | |
| company_count | No | |
| portfolio_name | No | |
| portfolio_count | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | The companies the person gave you, one per row, in their order. Never add a row they did not name. | |
| confirm | Yes | false previews the list and adds nothing. true adds the rows of confirmed_indexes from the preview that preview_id names. | |
| preview_id | No | The preview_id the preview returned. Required when confirm is true. | |
| portfolio_id | No | The 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_name | No | The name of the portfolio to add to, as the person names it (exact, case does not matter). Optional. | |
| confirmed_indexes | No | The index of every row the person approved, from the preview. Required when confirm is true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | |
| scope | Yes | |
| reason | No | |
| status | Yes | |
| message | No | |
| summary | No | |
| capacity | No | |
| next_step | No | |
| is_default | No | |
| portfolios | No | |
| preview_id | No | |
| portfolio_id | No | |
| summary_line | No | |
| company_count | No | |
| portfolio_name | No | |
| portfolio_count | No |
TDQS
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.
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.
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.
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.
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.
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 StocksARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 0-based page of results, 0 to 500. Default 0. | |
| limit | No | Number of matches to return (the N in top/bottom N), 1 to 100. Default 10. | |
| sort_by | No | One of the 6 StockLens scores, market_cap, volume or ticker. Default composite_score. Popularity ordering is unavailable. | |
| macro_in | No | Restrict to these macro regions. Omitted = no restriction. | |
| direction | No | top = highest first, bottom = lowest first. Default top. | |
| sector_in | No | Restrict to these GICS sectors. Omitted = no restriction. | |
| exchange_in | No | Restrict to these exchanges. Omitted = no restriction. | |
| industry_in | No | Restrict to these GICS industries. Omitted = no restriction. | |
| search_text | No | Free-text company name/ticker search, up to 80 characters. | |
| volume_floor | No | Minimum average trading volume. Omitted = no floor. | |
| market_cap_band | No | Restrict to this market-cap band. Omitted = no cap restriction. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| scope | Yes | |
| status | Yes | |
| message | No | |
| next_step | No | |
| as_of_date | No | |
| access_tier | Yes | |
| data_source | Yes | |
| hard_locked | Yes | |
| signed_in_as | No | |
| rows_returned | Yes | |
| scores_locked | Yes | |
| total_matches | No | |
| config_context | Yes | |
| effective_sort | Yes | |
| reach_capped_at | No | |
| sort_substituted | No | |
| effective_direction | Yes | |
| quota_remaining_today | No |
TDQS
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.
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.
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.
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.
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.
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 ResultARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| analysis_id | Yes | The analysis_id returned by initiate_analysis |
Output Schema
| Name | Required | Description |
|---|---|---|
| scope | Yes | |
| result | No | |
| status | Yes | |
| message | No | 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. |
| narrative | No | The state of the written summaries (the domain conclusions, the synthesis, and the key strengths and challenges) of a complete result. |
| report_url | No | 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. |
| analysis_id | Yes | |
| base_digest | No | Identifies the saved scores and evidence of a complete result. It stays the same when the written summaries arrive. |
| progress_pct | No | |
| error_message | No | |
| retry_after_seconds | No | |
| deterministic_ready_at | No | When the scores and evidence were saved, ahead of the written summaries (ISO 8601). Absent when the report was saved together with its summaries. |
TDQS
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.
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.
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.
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.
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.
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 ScoreARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Stock ticker symbol (e.g. AAPL MSFT TSLA). Exactly one ticker per call. | |
| exchange | No | Exchange code (e.g. NASDAQ NYSE). Optional. Resolved automatically if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| lens | No | |
| scope | Yes | |
| rating | No | |
| sector | No | |
| status | Yes | |
| ticker | Yes | |
| message | No | |
| exchange | No | |
| industry | No | |
| freshness | No | |
| next_step | No | |
| candidates | No | |
| key_drivers | No | |
| company_name | No | |
| analysis_date | No | |
| domain_scores | No | |
| config_context | No | |
| composite_score | No | |
| domain_coverage | No | |
| analysis_offered | No | |
| watchlist_offered | No |
TDQS
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.
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.
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.
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.
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.
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 PortfolioARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| portfolio_id | No | The id of the portfolio to read, as a portfolios list gives it. Optional: without it or portfolio_name the default portfolio is read. | |
| portfolio_name | No | The name of the portfolio to read, as the person names it (exact, case does not matter). Optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
| as_of | No | |
| scope | Yes | |
| trust | No | |
| rating | No | |
| status | Yes | |
| caption | No | |
| message | No | |
| companies | No | |
| next_step | No | |
| fund_count | No | |
| is_default | No | |
| population | No | |
| portfolios | No | |
| top_movers | No | |
| portfolio_id | No | |
| tier_limited | No | |
| company_count | No | |
| concentration | No | |
| movers_window | No | |
| window_change | No | |
| holdings_count | No | |
| portfolio_name | No | |
| portfolio_count | No | |
| scored_company_count | No | |
| scored_holdings_count | No | |
| average_composite_score | No |
TDQS
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.
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.
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.
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.
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.
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 AnalysisADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | 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. | |
| ticker | Yes | Stock ticker symbol (e.g. AAPL). Exactly one ticker per call. | |
| exchange | No | Exchange code (e.g. NASDAQ). Optional. Resolved automatically if omitted. | |
| time_range | No | 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. | |
| risk_tolerance | No | 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. | |
| analysis_emphasis | No | Optional. 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_family | No | Optional. 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
| Name | Required | Description |
|---|---|---|
| depth | Yes | |
| scope | Yes | |
| status | Yes | |
| analysis_id | Yes | |
| credit_type | Yes | |
| new_run_started | Yes | |
| reused_existing | Yes | |
| estimated_seconds | Yes |
TDQS
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.
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.
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.
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.
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.
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.
pingPingARead-onlyIdempotentInspect
Health check. Returns pong.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | Connectivity status: "ok" when the MCP server is reachable |
TDQS
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.
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.
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.
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.
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.
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 PortfolioADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Stock ticker symbol (e.g. AAPL). Exactly one ticker per call. | |
| exchange | No | 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. | |
| portfolio_id | No | 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. | |
| portfolio_name | No | The name of the portfolio to remove from, as the person names it (exact, case does not matter). Optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| scope | Yes | |
| status | Yes | |
| ticker | No | |
| message | Yes | |
| exchange | No | |
| next_step | No | |
| is_default | No | |
| portfolios | No | |
| portfolio_id | No | |
| company_count | No | |
| portfolio_name | No | |
| portfolio_count | No |
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
- Changed
fetch_analysis_result1 field changed- added
Output schema / properties / result / properties / key_drivers / items / properties / peer_groupAdded value: +{ + "type": [ + "null", + "string" + ] +}
- Changed
get_market_summary1 field changed- added
Output schema / properties / key_drivers / items / properties / peer_groupAdded value: +{ + "type": [ + "null", + "string" + ] +}
- Changed
get_portfolio_insights1 field changed- added
Output schema / properties / top_movers / items / properties / driver / properties / peer_groupAdded value: +{ + "type": [ + "null", + "string" + ] +}
1 tool update
- Changed
fetch_analysis_result11 fields changed- added
Output schema / properties / base_digestAdded value: +{ + "description": "Identifies the saved scores and evidence of a complete result. It stays the same when the written summaries arrive.", + "type": "string" +} - added
Output schema / properties / deterministic_ready_atAdded 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" +} - added
Output schema / properties / messageAdded 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" +} - added
Output schema / properties / narrativeAdded 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" + ] +} - changed
Output schema / properties / report_url / descriptionPrevious 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." - added
Output schema / properties / result / properties / currencyAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / domain_coverageAdded 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" + ] +} - changed
Output schema / properties / result / properties / domains / items / properties / analysis / typePrevious value: -"string"New value: +[ + "null", + "string" +] - changed
Output schema / properties / result / properties / domains / items / requiredPrevious value: -[ - "domain", - "score", - "grade", - "analysis" -]New value: +[ + "domain", + "score", + "grade" +] - added
Output schema / properties / result / properties / key_driversAdded 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" + ] +} - added
Output schema / properties / result / properties / lensAdded value: +{ + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": [ + "null", + "object" + ] +}
2 tool updates
- Changed
add_to_watchlist1 field changed- added
Output schema / properties / candidates / items / properties / scoredAdded value: +{ + "type": [ + "null", + "boolean" + ] +}
- Changed
get_market_summary1 field changed- added
Output schema / properties / candidates / items / properties / scoredAdded value: +{ + "type": [ + "null", + "boolean" + ] +}
4 tool updates
- Changed
add_to_watchlist15 fields changed- added
Input schema / properties / portfolio_idAdded 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" +} - added
Input schema / properties / portfolio_nameAdded value: +{ + "description": "The name of the portfolio to add to, as the person names it (exact, case does not matter). Optional.", + "type": "string" +} - added
Output schema / properties / candidatesAdded 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" + ] +} - added
Output schema / properties / company_countAdded value: +{ + "type": [ + "null", + "integer" + ] +} - added
Output schema / properties / is_defaultAdded value: +{ + "type": [ + "null", + "boolean" + ] +} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / modeAdded value: +{ + "enum": [ + "holding", + "watching" + ], + "type": "string" +} - added
Output schema / properties / next_stepAdded 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" + ] +} - added
Output schema / properties / portfolio_countAdded value: +{ + "type": [ + "null", + "integer" + ] +} - added
Output schema / properties / portfolio_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / portfolio_nameAdded value: +{ + "type": "string" +} - added
Output schema / properties / portfoliosAdded 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" + ] +} - added
Output schema / properties / statusAdded value: +{ + "enum": [ + "added", + "already_in_portfolio", + "over_capacity", + "ambiguous", + "not_found", + "portfolio_not_found" + ], + "type": "string" +} - removed
Output schema / properties / total_holdingsRemoved value: -{ - "type": "integer" -} - changed
Output schema / requiredPrevious value: -[ - "ticker", - "exchange", - "total_holdings", - "plan_limit", - "scope" -]New value: +[ + "status", + "message", + "scope" +]
- Added
add_to_watchlist_batch - Changed
get_portfolio_insights30 fields changed- added
Input schema / propertiesAdded 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" + } +} - removed
Output schema / properties / aggregate_signalRemoved value: -{ - "type": [ - "null", - "string" - ] -} - added
Output schema / properties / as_ofAdded value: +{ + "type": "string" +} - added
Output schema / properties / average_composite_scoreAdded value: +{ + "type": [ + "null", + "integer" + ] +} - added
Output schema / properties / captionAdded value: +{ + "type": "string" +} - added
Output schema / properties / companiesAdded 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" + ] +} - added
Output schema / properties / company_countAdded value: +{ + "type": [ + "null", + "integer" + ] +} - added
Output schema / properties / concentrationAdded 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" + ] +} - added
Output schema / properties / fund_countAdded value: +{ + "type": "integer" +} - added
Output schema / properties / holdings_countAdded value: +{ + "type": "integer" +} - added
Output schema / properties / is_defaultAdded value: +{ + "type": [ + "null", + "boolean" + ] +} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / movers_windowAdded value: +{ + "enum": [ + "7_nights" + ], + "type": "string" +} - added
Output schema / properties / next_stepAdded 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" + ] +} - added
Output schema / properties / populationAdded value: +{ + "type": "string" +} - added
Output schema / properties / portfolio_countAdded value: +{ + "type": [ + "null", + "integer" + ] +} - added
Output schema / properties / portfolio_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / portfolio_nameAdded value: +{ + "type": "string" +} - added
Output schema / properties / portfoliosAdded 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" + ] +} - added
Output schema / properties / ratingAdded value: +{ + "type": "string" +} - added
Output schema / properties / scored_company_countAdded value: +{ + "type": [ + "null", + "integer" + ] +} - added
Output schema / properties / scored_holdings_countAdded value: +{ + "type": "integer" +} - added
Output schema / properties / statusAdded value: +{ + "enum": [ + "ok", + "empty", + "portfolio_not_found" + ], + "type": "string" +} - changed
Output schema / properties / tier_limited / typePrevious value: -"boolean"New value: +[ + "null", + "boolean" +] - added
Output schema / properties / top_moversAdded 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" + ] +} - removed
Output schema / properties / total_holdingsRemoved value: -{ - "type": "integer" -} - added
Output schema / properties / trustAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - removed
Output schema / properties / watchlistRemoved 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" - ] -} - added
Output schema / properties / window_changeAdded 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" + ] +} - changed
Output schema / requiredPrevious value: -[ - "watchlist", - "total_holdings", - "tier_limited", - "scope" -]New value: +[ + "status", + "scope" +]
- Changed
remove_from_watchlist15 fields changed- added
Input schema / properties / portfolio_idAdded 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" +} - added
Input schema / properties / portfolio_nameAdded value: +{ + "description": "The name of the portfolio to remove from, as the person names it (exact, case does not matter). Optional.", + "type": "string" +} - added
Output schema / properties / company_countAdded value: +{ + "type": [ + "null", + "integer" + ] +} - added
Output schema / properties / is_defaultAdded value: +{ + "type": [ + "null", + "boolean" + ] +} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / modeAdded value: +{ + "enum": [ + "holding", + "watching" + ], + "type": "string" +} - added
Output schema / properties / next_stepAdded 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" + ] +} - added
Output schema / properties / portfolio_countAdded value: +{ + "type": [ + "null", + "integer" + ] +} - added
Output schema / properties / portfolio_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / portfolio_nameAdded value: +{ + "type": "string" +} - added
Output schema / properties / portfoliosAdded 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" + ] +} - removed
Output schema / properties / removedRemoved value: -{ - "type": "boolean" -} - added
Output schema / properties / statusAdded value: +{ + "enum": [ + "removed", + "not_in_portfolio", + "has_transactions", + "ambiguous_listing", + "portfolio_not_found" + ], + "type": "string" +} - removed
Output schema / properties / total_holdingsRemoved value: -{ - "type": "integer" -} - changed
Output schema / requiredPrevious value: -[ - "ticker", - "exchange", - "removed", - "total_holdings", - "scope" -]New value: +[ + "status", + "message", + "scope" +]
2 tool updates
- Changed
discover_stocks1 field changed- added
Output schema / properties / next_step / properties / arguments / properties / exchangeAdded value: +{ + "type": "string" +}
- Changed
get_market_summary2 fields changed- added
Output schema / properties / analysis_offeredAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / next_step / properties / arguments / properties / exchangeAdded value: +{ + "type": "string" +}
3 tool updates
- Changed
discover_stocks3 fields changed- changed
Input schema / properties / sort_by / descriptionPrevious 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." - changed
Input schema / properties / sort_by / enumPrevious 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" +] - added
Output schema / properties / signed_in_asAdded value: +{ + "type": "string" +}
- Changed
fetch_analysis_result1 field changed- added
Output schema / properties / report_urlAdded 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" +}
- Changed
initiate_analysis1 field changed- changed
Input schema / properties / depth / descriptionPrevious 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."
1 tool update
- Changed
get_market_summary2 fields changed- added
Output schema / properties / domain_coverage / properties / sentiment_sources_noteAdded 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" +} - removed
Output schema / properties / domain_coverage / requiredRemoved value: -[ - "not_scored" -]
1 tool update
- Changed
fetch_analysis_result2 fields changed- added
Output schema / properties / result / properties / filing_factsAdded 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" + ] +} - added
Output schema / properties / result / properties / filing_facts_noteAdded value: +{ + "type": "string" +}
4 tool updates
- Changed
add_to_watchlist1 field changed- changed
Input schema / properties / ticker / patternPrevious value: -"^[A-Za-z][A-Za-z.\\-]{0,9}$"New value: +"^[A-Za-z0-9][A-Za-z0-9.\\-]{0,19}$"
- Changed
get_market_summary1 field changed- changed
Input schema / properties / ticker / patternPrevious value: -"^[A-Za-z][A-Za-z.\\-]{0,9}$"New value: +"^[A-Za-z0-9][A-Za-z0-9.\\-]{0,19}$"
- Changed
initiate_analysis1 field changed- changed
Input schema / properties / ticker / patternPrevious value: -"^[A-Za-z][A-Za-z.\\-]{0,9}$"New value: +"^[A-Za-z0-9][A-Za-z0-9.\\-]{0,19}$"
- Changed
remove_from_watchlist1 field changed- changed
Input schema / properties / ticker / patternPrevious value: -"^[A-Za-z][A-Za-z.\\-]{0,9}$"New value: +"^[A-Za-z0-9][A-Za-z0-9.\\-]{0,19}$"
1 tool update
- Changed
get_market_summary4 fields changed- added
Output schema / properties / domain_coverageAdded value: +{ + "additionalProperties": false, + "properties": { + "not_scored": { + "items": { + "enum": [ + "Fundamental", + "Technical", + "Risk", + "Sentiment", + "Macro" + ], + "type": "string" + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "not_scored" + ], + "type": [ + "null", + "object" + ] +} - added
Output schema / properties / key_driversAdded 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" + ] +} - added
Output schema / properties / lensAdded value: +{ + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": [ + "null", + "object" + ] +} - removed
Output schema / properties / watchlistRemoved value: -{ - "additionalProperties": false, - "properties": { - "message": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "tracked": { - "type": "boolean" - } - }, - "required": [ - "tracked", - "tool", - "message" - ], - "type": [ - "null", - "object" - ] -}
7 tool updates
- Changed
add_to_watchlist3 fields changed- changed
Input schema / properties / exchange / descriptionPrevious value: -"Exchange code (e.g. NASDAQ). Optional - resolved automatically if omitted."New value: +"Exchange code (e.g. NASDAQ). Optional. Resolved automatically if omitted." - added
Input schema / properties / exchange / enumAdded 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" +] - changed
Input schema / properties / ticker / descriptionPrevious 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."
- Changed
discover_stocks12 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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." - added
Input schema / properties / limit / maximumAdded value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / page / descriptionPrevious value: -"0-based page of results, 0-500. Default 0."New value: +"0-based page of results, 0 to 500. Default 0." - added
Input schema / properties / page / maximumAdded value: +500 - added
Input schema / properties / page / minimumAdded value: +0 - added
Output schema / properties / messageAdded value: +{ + "type": [ + "null", + "string" + ] +} - added
Output schema / properties / next_stepAdded 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" + ] +} - changed
Output schema / properties / rows / items / properties / macro_code / descriptionPrevious 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." - added
Output schema / properties / statusAdded value: +{ + "enum": [ + "ranked", + "browse_substituted", + "locked" + ], + "type": "string" +} - removed
Output schema / properties / upgrade_messageRemoved value: -{ - "type": [ - "null", - "string" - ] -} - changed
Output schema / requiredPrevious 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" +]
- Changed
fetch_analysis_result5 fields changed- removed
Output schema / properties / result / properties / domains / items / properties / confidenceRemoved value: -{ - "type": [ - "null", - "number" - ] -} - removed
Output schema / properties / result / properties / domains / items / properties / news_key_articles / items / properties / ratingRemoved value: -{ - "type": "string" -} - added
Output schema / properties / result / properties / domains / items / properties / news_key_articles / items / properties / toneAdded value: +{ + "type": "string" +} - changed
Output schema / properties / result / properties / domains / items / properties / news_key_articles / items / requiredPrevious value: -[ - "title", - "publisher", - "url", - "published_at", - "rating", - "conviction" -]New value: +[ + "title", + "publisher", + "url", + "published_at", + "tone", + "conviction" +] - added
Output schema / properties / result / properties / evidenceAdded value: +{ + "type": "string" +}
- Changed
get_market_summary18 fields changed- changed
Input schema / properties / exchange / descriptionPrevious 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." - added
Input schema / properties / exchange / enumAdded 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" +] - changed
Input schema / properties / ticker / descriptionPrevious value: -"Stock ticker symbol (e.g. AAPL MSFT TSLA)"New value: +"Stock ticker symbol (e.g. AAPL MSFT TSLA). Exactly one ticker per call." - added
Output schema / properties / candidatesAdded 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" + ] +} - changed
Output schema / properties / composite_score / typePrevious value: -"number"New value: +[ + "null", + "number" +] - removed
Output schema / properties / config_context / properties / config_nameRemoved value: -{ - "type": [ - "null", - "string" - ] -} - removed
Output schema / properties / config_context / properties / config_versionRemoved value: -{ - "type": [ - "null", - "string" - ] -} - changed
Output schema / properties / config_context / typePrevious value: -"object"New value: +[ + "null", + "object" +] - removed
Output schema / properties / data_sourceRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / domain_scores / items / properties / display_nameRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / domain_scores / items / requiredPrevious value: -[ - "domain", - "display_name", - "score", - "grade" -]New value: +[ + "domain", + "score", + "grade" +] - added
Output schema / properties / freshnessAdded 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" + ] +} - removed
Output schema / properties / key_challengesRemoved value: -{ - "items": { - "additionalProperties": false, - "properties": { - "domain": { - "type": [ - "null", - "string" - ] - }, - "headline": { - "type": "string" - } - }, - "required": [ - "headline" - ], - "type": "object" - }, - "type": [ - "null", - "array" - ] -} - removed
Output schema / properties / key_strengthsRemoved value: -{ - "items": { - "additionalProperties": false, - "properties": { - "domain": { - "type": [ - "null", - "string" - ] - }, - "headline": { - "type": "string" - } - }, - "required": [ - "headline" - ], - "type": "object" - }, - "type": [ - "null", - "array" - ] -} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / next_stepAdded 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" + ] +} - added
Output schema / properties / statusAdded value: +{ + "enum": [ + "scored", + "not_in_surface", + "not_covered", + "ambiguous", + "not_found" + ], + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "ticker", - "exchange", - "company_name", - "sector", - "industry", - "composite_score", - "rating", - "domain_scores", - "analysis_date", - "config_context", - "data_source", - "scope" -]New value: +[ + "status", + "ticker", + "scope" +]
- Changed
initiate_analysis5 fields changed- changed
Input schema / properties / exchange / descriptionPrevious value: -"Exchange code (e.g. NASDAQ). Optional - resolved automatically if omitted."New value: +"Exchange code (e.g. NASDAQ). Optional. Resolved automatically if omitted." - added
Input schema / properties / exchange / enumAdded 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" +] - changed
Input schema / properties / risk_tolerance / descriptionPrevious 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." - changed
Input schema / properties / ticker / descriptionPrevious value: -"Stock ticker symbol (e.g. AAPL)"New value: +"Stock ticker symbol (e.g. AAPL). Exactly one ticker per call." - changed
Input schema / properties / time_range / descriptionPrevious 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."
- Changed
ping1 field changed- changed
Output schema / properties / status / descriptionPrevious value: -"Connectivity status — \"ok\" when the MCP server is reachable"New value: +"Connectivity status: \"ok\" when the MCP server is reachable"
- Changed
remove_from_watchlist3 fields changed- changed
Input schema / properties / exchange / descriptionPrevious 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." - added
Input schema / properties / exchange / enumAdded 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" +] - changed
Input schema / properties / ticker / descriptionPrevious 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."
1 tool update
- Changed
fetch_analysis_result2 fields changed- added
Output schema / properties / result / properties / domains / items / properties / contributionAdded value: +{ + "type": "string" +} - removed
Output schema / properties / result / properties / domains / items / properties / weightRemoved value: -{ - "type": [ - "null", - "number" - ] -}
1 tool update
- Changed
discover_stocks1 field changed- added
Output schema / properties / sort_substitutedAdded value: +{ + "type": "boolean" +}
1 tool update
- Changed
get_market_summary2 fields changed- added
Output schema / properties / watchlistAdded value: +{ + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "tracked": { + "type": "boolean" + } + }, + "required": [ + "tracked", + "tool", + "message" + ], + "type": [ + "null", + "object" + ] +} - added
Output schema / properties / watchlist_offeredAdded value: +{ + "type": "boolean" +}
3 tool updates
- Changed
add_to_watchlist1 field changed- changed
Input schema / properties / exchange / descriptionPrevious 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."
- Changed
discover_stocks2 fields changed- added
Output schema / properties / hard_lockedAdded value: +{ + "type": "boolean" +} - changed
Output schema / requiredPrevious 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" +]
- Changed
initiate_analysis1 field changed- changed
Input schema / properties / exchange / descriptionPrevious 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
- Operator website
- https://stocklens.com · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://stocklens.com/features/ai-integrations · 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
Stock scores (0-100) and signals for any US stock, with full AI analysis for 83 AI-related names.
Stock health scores, valuation verdicts, sector rankings and analyses for 8,000+ US companies.
Free stock, ETF & crypto analysis: 10-point score, verdict and key metrics for any ticker.
Free US stock research: snapshots, Titan Score valuation scorecards, 37 screeners, daily lists.
Related MCP Servers
- AlicenseAqualityAmaintenanceDaily stock screens, RS ratings, market breadth and group rankings for 12 markets. No API keys.206411Apache 2.0
- AlicenseNot gradedqualityBmaintenanceAnalyze stocks with financial ratios, comparisons, and sector performance data.4 npm23 PyPIMIT
- FlicenseNot gradedqualityBmaintenanceEnables AI clients to analyze stocks and get scored BUY/HOLD/SELL assessments with technical and fundamental data for Indian (NSE/BSE) and US markets.-
- AlicenseAqualityAmaintenanceFree 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/mcp2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.