Skip to main content
Glama

Server Details

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

Ownership verified
Status
Healthy
Uptime
99.9% over 59 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.3/5.0

Scored across 8 tools

Disambiguation5/5

Each tool has a sharply distinct purpose: discover_stocks is the sole ranking/screening tool, get_market_summary covers a single company, get_portfolio_insights covers the watchlist, and the create/fetch analysis pair is clearly split. The descriptions actively carve out boundaries (e.g. 'never build a ranking from repeated calls'), leaving little room for misselection. Minor surface overlap in score-returning tools is disambiguated by scope statements.

Naming Consistency5/5

Names consistently follow a snake_case verb_noun pattern (add_to_watchlist, remove_from_watchlist, discover_stocks, fetch_analysis_result, get_market_summary, get_portfolio_insights, initiate_analysis). The paired add/remove and initiate/fetch tools mirror each other cleanly. The lone exception, ping, is a conventional health-check name and is not a real deviation.

Tool Count5/5

Eight tools is well-scoped for a stock scoring/analysis service, with each tool earning its place across discovery, single-company lookup, portfolio management, and asynchronous analysis. Nothing feels redundant or padded beyond the trivial ping. The count maps directly to the core user workflows.

Completeness4/5

The surface covers the main lifecycle: screen (discover_stocks), read a score (get_market_summary), run and retrieve analysis (initiate_analysis, fetch_analysis_result), and manage the watchlist (add/remove/get insights). Minor gaps exist—no tool to list or manage multiple portfolios, no cancel/abort for a running analysis, and holdings/transactions are referenced but not exposed. These are workable around for the stated purpose.

Available Tools

8 tools
add_to_watchlistAdd To WatchlistAInspect

Add one company to the authenticated user's default StockLens portfolio 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. If the portfolio is already at the limit of the person's current plan, the result says so. After an add the person accepted from a get_market_summary offer, call get_market_summary again to answer their question. Does NOT execute trades, does NOT record a holding or transaction, and does NOT accept more than one ticker per call.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
scopeYes
tickerYes
exchangeYes
plan_limitYes
company_nameNo
total_holdingsYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only state readOnlyHint=false and destructiveHint=false, so the description carries much of the behavioral burden. It adds valuable side-effect context: no trades, no holding/transaction recorded, one ticker per call, and plan-limit behavior. It does not mention what happens if the same ticker is added twice, but this is a minor gap given the available annotations.

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

Conciseness4/5

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

The description is front-loaded with the primary action, then proceeds through trigger conditions, limit behavior, follow-up workflow, and exclusions. Each sentence serves a purpose and there is no filler, though the description is somewhat dense.

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

Completeness5/5

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

The tool is simple, the schema is rich, an output schema exists, and the description covers purpose, trigger, scope, side-effect exclusions, and post-call workflow. Nothing essential is missing for an agent to select and invoke this tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, with both ticker and exchange already documented in the input schema. The description reinforces 'exactly one ticker per call' but does not add meaning beyond the schema. A 3 is appropriate because the schema already carries the semantic load.

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

Purpose5/5

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

States a specific verb+resource: 'Add one company to the authenticated user's default StockLens portfolio as a company they follow.' It also distinguishes itself from trading tools by explicitly saying it does NOT execute trades or record a holding/transaction, and from get_market_summary by describing the follow-up call. Purpose is unambiguous.

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

Usage Guidelines4/5

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

Gives an explicit trigger condition: 'Call it only when the person has asked for it or agreed to an offer.' It also provides workflow guidance to call get_market_summary again after an accepted add. However, it does not explicitly name remove_from_watchlist as the alternative for removing a company, so sibling routing is not fully enumerated.

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

discover_stocksDiscover Stocks
Read-only
Inspect

Screen the companies StockLens scores nightly by region, exchange, sector, industry, market-cap band and trading volume, sorted by one of the six StockLens scores or by market cap, volume, popularity or ticker, and return the top or bottom N. 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. 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. Report only the rows returned. It does not trade and gives no personal recommendations.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
scopeYes
statusYes
messageNo
next_stepNo
as_of_dateNo
access_tierYes
data_sourceYes
hard_lockedYes
rows_returnedYes
scores_lockedYes
total_matchesNo
config_contextYes
effective_sortYes
reach_capped_atNo
sort_substitutedNo
effective_directionYes
quota_remaining_todayNo
fetch_analysis_resultFetch Analysis ResultA
Read-onlyIdempotent
Inspect

Return the progress or result of an analysis started with initiate_analysis, by its analysis_id. Each call returns the current state once and does not wait. While status is in_progress, 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 carries 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), key strengths and challenges, and for a Plus Analysis a written narrative. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
analysis_idYesThe analysis_id returned by initiate_analysis

Output Schema

ParametersJSON Schema
NameRequiredDescription
scopeYes
resultNo
statusYes
analysis_idYes
progress_pctNo
error_messageNo
retry_after_secondsNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only cover the read-only/idempotent safety profile; the description adds genuinely new behavior: single-shot non-waiting semantics, retry_after_seconds pacing, that a failed status is a terminal answer and error_message should be relayed, and the presentation constraint that domain weight must be expressed via the contribution word rather than a number. That is substantial disclosure beyond the structured fields.

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

Conciseness4/5

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

Front-loaded with purpose and packed with operational rules, and most clauses earn their place. The long enumeration of result fields (composite score, rating word, evidence word, domain grade, contributions) partly duplicates the output schema, which is the only mild redundancy.

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

Completeness5/5

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

Given an output schema covering return shape, read-only annotations covering safety, and a single required parameter, the description closes the remaining gaps: polling cadence, non-blocking semantics, error relay, and how to communicate domain weighting. Nothing needed to call or interpret it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the single analysis_id parameter is already documented in the schema as coming from initiate_analysis. The description restates the same provenance without adding format or validation detail, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource ('Return the progress or result of an analysis') and names the originating sibling tool (initiate_analysis) whose output it consumes. An agent can distinguish this from initiate_analysis and the market-data siblings without opening a schema.

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

Usage Guidelines5/5

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

Explicitly states when to re-poll ('only when the person asks, and no sooner than retry_after_seconds'), that calls are non-blocking, and what the tool does not accept or do ('does not accept a ticker and does not rank companies'). This is explicit when/when-not guidance tied to the alternative path.

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 Score
Read-onlyIdempotent
Inspect

One company's latest nightly StockLens score: the composite score (0 to 100) and its rating word, the domain scores with their grade words, the named signals that most shaped the reading (up to three, each with its evidence), the business-model lens where one applies, and any domain that was not scored in it. Use the rating word for the company and grade words only for a domain. A higher Risk score means a stronger risk posture and less downside concern. Without an account, scores answer for the 600 largest companies by market value; a signed-in account also reaches any company in its own portfolios. A result with a status other than scored is an answer, not an error; do not retry it unchanged. Relay its message; not_in_surface means the company is scored and outside the caller's reach, never that StockLens has no analysis. Then act on next_step: for ask_user, ask the person and call the named tool only if they agree; mention an offer on a scored result at most once per conversation. Every result carries freshness; a stale result is StockLens's last computed reading for that listing, not last night's, and should be quoted with its date. When freshness.requested_ticker is present, say which listing was served and what was asked. 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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
lensNo
scopeYes
ratingNo
sectorNo
statusYes
tickerYes
messageNo
exchangeNo
industryNo
freshnessNo
next_stepNo
candidatesNo
key_driversNo
company_nameNo
analysis_dateNo
domain_scoresNo
config_contextNo
composite_scoreNo
domain_coverageNo
watchlist_offeredNo
get_portfolio_insightsGet Portfolio InsightsA
Read-onlyIdempotent
Inspect

Retrieve StockLens analysis summaries for the authenticated user's watchlist. Returns available composite scores and grades for watchlisted stocks; either value may be absent when no completed score exists. Returns the full watchlist up to the capacity of the person's current plan; tier_limited says whether it was cut short. Use this to give users an overview of their portfolio's analytical health. Does NOT accept a ticker or filter arguments and does NOT rank or screen stocks outside the user's own watchlist; call discover_stocks for a market-wide ranked or filtered list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
scopeYes
watchlistYes
tier_limitedYes
total_holdingsYes
aggregate_signalNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description adds valuable behavioral detail: missing scores may be absent, the watchlist is returned up to plan capacity, and tier_limited indicates truncation. These details go beyond the structured annotations and help the agent set caller expectations.

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

Conciseness5/5

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

The description is concise and front-loaded, with the core purpose in the first sentence and supporting behavior, limitations, and alternatives following in a logical order. Every sentence adds meaningful information; there is no redundancy with the schema or annotations.

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

Completeness5/5

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

With zero parameters, a meaningful output schema, and annotations covering safety, the description still supplies the missing context: return semantics, absence behavior, plan capacity limits, and the correct sibling alternative. Nothing an agent needs to select or invoke this tool correctly is missing.

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

Parameters4/5

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

The tool has zero parameters, so the schema carries no semantic burden. The description reinforces this by explicitly stating that it does not accept ticker or filter arguments, which prevents agents from assuming optional inputs exist. This is slightly above the no-params baseline because it proactively clarifies the absence of parameters.

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

Purpose5/5

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

States a specific verb and resource: 'Retrieve StockLens analysis summaries for the authenticated user's watchlist.' It explicitly distinguishes itself from discover_stocks by saying it does not rank or screen outside the user's watchlist, making sibling differentiation clear.

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

Usage Guidelines5/5

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

Gives explicit use context ('Use this to give users an overview of their portfolio's analytical health') and an explicit alternative ('call discover_stocks for a market-wide ranked or filtered list'). It also states what arguments it does NOT accept, leaving no ambiguity about when to choose this tool.

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

initiate_analysisInitiate AnalysisA
Destructive
Inspect

Start a full StockLens analysis of one company, only when the person asks for one. A new run may use one Analysis credit, or one Plus Analysis credit when depth is plus; Plus adds a written narrative and the result says if the person's plan does not include it. 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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
depthYes
scopeYes
statusYes
analysis_idYes
credit_typeYes
new_run_startedYes
reused_existingYes
estimated_secondsYes

TDQS

A4.9/5.0
Behavior5/5

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

The annotations already flag destructiveHint=true and readOnlyHint=false, and the description meaningfully expands on this by disclosing credit consumption, asynchronous execution, immediate return of analysis_id, and the new_run_started/reused_existing reuse semantics. This helps the agent understand side effects and lifecycle without over-relying on structured hints.

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

Conciseness5/5

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

The description is compact but complete: trigger condition, cost implications, async behavior, follow-up instruction, reuse flags, and explicit non-goals. Every sentence earns its place, and the most important operational constraint is front-loaded.

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

Completeness5/5

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

Given the tool's complexity (7 params, output schema, destructive/credit side effects), the description covers everything an agent needs: when to invoke it, what it costs, how it behaves asynchronously, how to fetch the result, whether an analysis may be reused, and what it will not do. The output schema covers return values, so no description redundancy is needed.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds extra meaning beyond the schema by clarifying the ticker constraint ('One ticker per call') and explaining the behavioral consequence of the depth parameter ('Plus adds a written narrative'). These additions enrich the otherwise well-documented schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Start a full StockLens analysis of one company.' It is immediately distinguishable from siblings by stating what it does not do ('does not rank or compare companies, and does not trade or move money') and by referencing its natural counterpart, fetch_analysis_result. An agent can clearly identify the tool's scope.

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

Usage Guidelines5/5

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

It gives an explicit trigger condition ('only when the person asks for one') and explicitly routes the follow-up action ('fetch the result with fetch_analysis_result when the person asks for it'). It also provides when-not context: it does not rank/compare or trade/move money. These are explicit usage directions with clear alternatives.

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

pingPingA
Read-onlyIdempotent
Inspect

Health check. Returns pong.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

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

TDQS

A3.6/5.0
Behavior3/5

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

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

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

Conciseness5/5

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

The description is two short sentences, front-loaded with the primary purpose ('Health check') and the expected result. There is zero waste, and it is appropriately sized for a tool of this simplicity.

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

Completeness5/5

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

For a tool with no parameters and an output schema, the description is complete. It clearly states what it does and what it returns, which is all an agent needs to know to call it correctly. No additional context is necessary.

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

Parameters4/5

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

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

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

Purpose4/5

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

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

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

Usage Guidelines2/5

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

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

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

remove_from_watchlistRemove From WatchlistA
DestructiveIdempotent
Inspect

Remove one company from the authenticated user's default StockLens portfolio. Does NOT execute trades and does NOT delete a recorded holding or its transactions; a holding with recorded transactions cannot be removed through this tool. Does NOT accept more than one ticker per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerYesStock ticker symbol (e.g. AAPL). Exactly one ticker per call.
exchangeNoExchange code (e.g. NASDAQ). Optional. When omitted, the ticker is matched against the portfolio; if it is there on more than one exchange you will be asked which.

Output Schema

ParametersJSON Schema
NameRequiredDescription
scopeYes
tickerYes
removedYes
exchangeYes
total_holdingsYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark the tool as destructive and idempotent; the description adds crucial context that removing from the watchlist does not affect recorded holdings or transactions. It also specifies that only one ticker per call is allowed, which is behavioral guidance beyond the annotation flags.

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

Conciseness5/5

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

Three short sentences front-load the primary action, followed by two exclusions and a constraint. There is no redundancy or filler; every sentence earns its place.

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

Completeness4/5

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

With two parameters, one required, a full schema, annotations, and an output schema, the description covers the essential behavior including exclusions and constraints. An agent has sufficient detail to decide when and how to invoke remove_from_watchlist correctly.

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

Parameters3/5

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

Schema description coverage is 100%, with both ticker and exchange parameters already well described. The description's main contribution is confirming the single-ticker constraint, which mirrors the schema, and clarifying that removal applies to the default portfolio, so it adds minimal new parameter-specific meaning.

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

Purpose5/5

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

The description uses a specific verb ('Remove') and resource ('one company from the authenticated user's default StockLens portfolio'), and explicitly distinguishes itself from trade execution and transaction deletion. This makes it clearly distinguishable from sibling tools like add_to_watchlist, which perform the inverse operation.

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

Usage Guidelines4/5

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

The description clearly states the intended action and adds negative guidance: it does not execute trades, does not delete holdings/transactions, and holdings with recorded transactions cannot be removed. While it does not name alternative tools explicitly, the context and sibling list make the use case unambiguous.

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

Tool Schema Changelog

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

  1. 1 tool update
    • Changedget_market_summary2 fields changed
      • addedOutput schema / properties / domain_coverage / properties / sentiment_sources_note
        Added value: +{
        +  "description": "The Sentiment evidence this reading did not use and why, as one sentence to relay as given, for example: Evidence not read in this analysis: earnings calls (none found recently).",
        +  "type": "string"
        +}
      • removedOutput schema / properties / domain_coverage / required
        Removed value: -[
        -  "not_scored"
        -]
  2. 1 tool update
    • Changedfetch_analysis_result2 fields changed
      • addedOutput schema / properties / result / properties / filing_facts
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "fact_type": {
        +        "type": "string"
        +      },
        +      "filing_date": {
        +        "type": "string"
        +      },
        +      "form_type": {
        +        "type": "string"
        +      },
        +      "quote": {
        +        "type": "string"
        +      },
        +      "reading": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "fact_type",
        +      "reading",
        +      "form_type",
        +      "filing_date",
        +      "quote"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / result / properties / filing_facts_note
        Added value: +{
        +  "type": "string"
        +}
  3. 4 tool updates
    • Changedadd_to_watchlist1 field changed
      • changedInput schema / properties / ticker / pattern
        Previous value: -"^[A-Za-z][A-Za-z.\\-]{0,9}$"New value: +"^[A-Za-z0-9][A-Za-z0-9.\\-]{0,19}$"
    • Changedget_market_summary1 field changed
      • changedInput schema / properties / ticker / pattern
        Previous value: -"^[A-Za-z][A-Za-z.\\-]{0,9}$"New value: +"^[A-Za-z0-9][A-Za-z0-9.\\-]{0,19}$"
    • Changedinitiate_analysis1 field changed
      • changedInput schema / properties / ticker / pattern
        Previous value: -"^[A-Za-z][A-Za-z.\\-]{0,9}$"New value: +"^[A-Za-z0-9][A-Za-z0-9.\\-]{0,19}$"
    • Changedremove_from_watchlist1 field changed
      • changedInput schema / properties / ticker / pattern
        Previous value: -"^[A-Za-z][A-Za-z.\\-]{0,9}$"New value: +"^[A-Za-z0-9][A-Za-z0-9.\\-]{0,19}$"
  4. 1 tool update
    • Changedget_market_summary4 fields changed
      • addedOutput schema / properties / domain_coverage
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "not_scored": {
        +      "items": {
        +        "enum": [
        +          "Fundamental",
        +          "Technical",
        +          "Risk",
        +          "Sentiment",
        +          "Macro"
        +        ],
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "not_scored"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • addedOutput schema / properties / key_drivers
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "context": {
        +        "type": [
        +          "null",
        +          "string"
        +        ]
        +      },
        +      "domain": {
        +        "type": [
        +          "null",
        +          "string"
        +        ]
        +      },
        +      "kind": {
        +        "enum": [
        +          "SUPPORTIVE",
        +          "HEADWIND",
        +          "MIXED",
        +          "COVERAGE_GAP",
        +          "NEUTRAL_NOT_MATERIAL"
        +        ],
        +        "type": "string"
        +      },
        +      "label": {
        +        "type": "string"
        +      },
        +      "metric": {
        +        "type": [
        +          "null",
        +          "string"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "label"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / lens
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "label": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "label"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • removedOutput schema / properties / watchlist
        Removed value: -{
        -  "additionalProperties": false,
        -  "properties": {
        -    "message": {
        -      "type": "string"
        -    },
        -    "tool": {
        -      "type": "string"
        -    },
        -    "tracked": {
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "tracked",
        -    "tool",
        -    "message"
        -  ],
        -  "type": [
        -    "null",
        -    "object"
        -  ]
        -}
  5. 7 tool updates
    • Changedadd_to_watchlist3 fields changed
      • changedInput schema / properties / exchange / description
        Previous value: -"Exchange code (e.g. NASDAQ). Optional - resolved automatically if omitted."New value: +"Exchange code (e.g. NASDAQ). Optional. Resolved automatically if omitted."
      • addedInput schema / properties / exchange / enum
        Added value: +[
        +  "NYSE",
        +  "NASDAQ",
        +  "AMEX",
        +  "OTC",
        +  "CBOE",
        +  "TSX",
        +  "TSXV",
        +  "CNQ",
        +  "NEO",
        +  "MEX",
        +  "B3",
        +  "SANTIAGO",
        +  "BUE",
        +  "BVC",
        +  "LSE",
        +  "EURONEXT_PARIS",
        +  "EURONEXT_AMSTERDAM",
        +  "EURONEXT_BRUSSELS",
        +  "EURONEXT_LISBON",
        +  "EURONEXT_DUBLIN",
        +  "XETRA",
        +  "SIX",
        +  "BME",
        +  "MILAN",
        +  "OSLO",
        +  "OMX_STOCKHOLM",
        +  "OMX_HELSINKI",
        +  "OMX_COPENHAGEN",
        +  "WSE",
        +  "VIE",
        +  "ATH",
        +  "PRA",
        +  "BUD",
        +  "IST",
        +  "ICE",
        +  "RIS",
        +  "TAL",
        +  "MCX",
        +  "TSE",
        +  "HKEX",
        +  "SHANGHAI",
        +  "SHENZHEN",
        +  "ASX",
        +  "TWSE",
        +  "SGX",
        +  "NSE",
        +  "KRX",
        +  "BSE",
        +  "KOE",
        +  "JKT",
        +  "KLS",
        +  "SET",
        +  "NZE",
        +  "HOSE",
        +  "TWO",
        +  "TADAWUL",
        +  "JSE",
        +  "TLV",
        +  "DFM",
        +  "EGX",
        +  "DOH",
        +  "KUW"
        +]
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol to add to the watchlist (e.g. AAPL). Exactly one ticker per call."New value: +"Stock ticker symbol (e.g. AAPL). Exactly one ticker per call."
    • Changeddiscover_stocks12 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Number of matches to return (the N in top/bottom N), 1-100. Default 10."New value: +"Number of matches to return (the N in top/bottom N), 1 to 100. Default 10."
      • addedInput schema / properties / limit / maximum
        Added value: +100
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / page / description
        Previous value: -"0-based page of results, 0-500. Default 0."New value: +"0-based page of results, 0 to 500. Default 0."
      • addedInput schema / properties / page / maximum
        Added value: +500
      • addedInput schema / properties / page / minimum
        Added value: +0
      • addedOutput schema / properties / message
        Added value: +{
        +  "type": [
        +    "null",
        +    "string"
        +  ]
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "arguments": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "ticker": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "ticker"
        +      ],
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "call_tool",
        +        "ask_user",
        +        "human_action"
        +      ],
        +      "type": "string"
        +    },
        +    "options": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "tool": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • changedOutput schema / properties / rows / items / properties / macro_code / description
        Previous value: -"Listing geography of the exchange (US, CA, EU, CH, GB, JP, or GLOBAL when unmapped) — the same value macro_in filters on."New value: +"Listing geography of the exchange (US, CA, EU, CH, GB, JP, or GLOBAL when unmapped), the same value macro_in filters on."
      • addedOutput schema / properties / status
        Added value: +{
        +  "enum": [
        +    "ranked",
        +    "browse_substituted",
        +    "locked"
        +  ],
        +  "type": "string"
        +}
      • removedOutput schema / properties / upgrade_message
        Removed value: -{
        -  "type": [
        -    "null",
        -    "string"
        -  ]
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "rows",
        -  "scores_locked",
        -  "hard_locked",
        -  "access_tier",
        -  "rows_returned",
        -  "effective_sort",
        -  "effective_direction",
        -  "config_context",
        -  "data_source",
        -  "scope"
        -]New value: +[
        +  "status",
        +  "rows",
        +  "scores_locked",
        +  "hard_locked",
        +  "access_tier",
        +  "rows_returned",
        +  "effective_sort",
        +  "effective_direction",
        +  "config_context",
        +  "data_source",
        +  "scope"
        +]
    • Changedfetch_analysis_result5 fields changed
      • removedOutput schema / properties / result / properties / domains / items / properties / confidence
        Removed value: -{
        -  "type": [
        -    "null",
        -    "number"
        -  ]
        -}
      • removedOutput schema / properties / result / properties / domains / items / properties / news_key_articles / items / properties / rating
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / result / properties / domains / items / properties / news_key_articles / items / properties / tone
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / result / properties / domains / items / properties / news_key_articles / items / required
        Previous value: -[
        -  "title",
        -  "publisher",
        -  "url",
        -  "published_at",
        -  "rating",
        -  "conviction"
        -]New value: +[
        +  "title",
        +  "publisher",
        +  "url",
        +  "published_at",
        +  "tone",
        +  "conviction"
        +]
      • addedOutput schema / properties / result / properties / evidence
        Added value: +{
        +  "type": "string"
        +}
    • Changedget_market_summary18 fields changed
      • changedInput schema / properties / exchange / description
        Previous value: -"Exchange code (e.g. NASDAQ NYSE). Optional - resolved automatically if omitted."New value: +"Exchange code (e.g. NASDAQ NYSE). Optional. Resolved automatically if omitted."
      • addedInput schema / properties / exchange / enum
        Added value: +[
        +  "NYSE",
        +  "NASDAQ",
        +  "AMEX",
        +  "OTC",
        +  "CBOE",
        +  "TSX",
        +  "TSXV",
        +  "CNQ",
        +  "NEO",
        +  "MEX",
        +  "B3",
        +  "SANTIAGO",
        +  "BUE",
        +  "BVC",
        +  "LSE",
        +  "EURONEXT_PARIS",
        +  "EURONEXT_AMSTERDAM",
        +  "EURONEXT_BRUSSELS",
        +  "EURONEXT_LISBON",
        +  "EURONEXT_DUBLIN",
        +  "XETRA",
        +  "SIX",
        +  "BME",
        +  "MILAN",
        +  "OSLO",
        +  "OMX_STOCKHOLM",
        +  "OMX_HELSINKI",
        +  "OMX_COPENHAGEN",
        +  "WSE",
        +  "VIE",
        +  "ATH",
        +  "PRA",
        +  "BUD",
        +  "IST",
        +  "ICE",
        +  "RIS",
        +  "TAL",
        +  "MCX",
        +  "TSE",
        +  "HKEX",
        +  "SHANGHAI",
        +  "SHENZHEN",
        +  "ASX",
        +  "TWSE",
        +  "SGX",
        +  "NSE",
        +  "KRX",
        +  "BSE",
        +  "KOE",
        +  "JKT",
        +  "KLS",
        +  "SET",
        +  "NZE",
        +  "HOSE",
        +  "TWO",
        +  "TADAWUL",
        +  "JSE",
        +  "TLV",
        +  "DFM",
        +  "EGX",
        +  "DOH",
        +  "KUW"
        +]
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol (e.g. AAPL MSFT TSLA)"New value: +"Stock ticker symbol (e.g. AAPL MSFT TSLA). Exactly one ticker per call."
      • addedOutput schema / properties / candidates
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "company_name": {
        +        "type": "string"
        +      },
        +      "exchange": {
        +        "type": "string"
        +      },
        +      "ticker": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "ticker",
        +      "exchange",
        +      "company_name"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • changedOutput schema / properties / composite_score / type
        Previous value: -"number"New value: +[
        +  "null",
        +  "number"
        +]
      • removedOutput schema / properties / config_context / properties / config_name
        Removed value: -{
        -  "type": [
        -    "null",
        -    "string"
        -  ]
        -}
      • removedOutput schema / properties / config_context / properties / config_version
        Removed value: -{
        -  "type": [
        -    "null",
        -    "string"
        -  ]
        -}
      • changedOutput schema / properties / config_context / type
        Previous value: -"object"New value: +[
        +  "null",
        +  "object"
        +]
      • removedOutput schema / properties / data_source
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / domain_scores / items / properties / display_name
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / properties / domain_scores / items / required
        Previous value: -[
        -  "domain",
        -  "display_name",
        -  "score",
        -  "grade"
        -]New value: +[
        +  "domain",
        +  "score",
        +  "grade"
        +]
      • addedOutput schema / properties / freshness
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "age_days": {
        +      "type": "integer"
        +    },
        +    "last_scored": {
        +      "type": "string"
        +    },
        +    "requested_ticker": {
        +      "type": "string"
        +    },
        +    "state": {
        +      "enum": [
        +        "current",
        +        "aging",
        +        "stale"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "state",
        +    "last_scored",
        +    "age_days"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • removedOutput schema / properties / key_challenges
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "domain": {
        -        "type": [
        -          "null",
        -          "string"
        -        ]
        -      },
        -      "headline": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "headline"
        -    ],
        -    "type": "object"
        -  },
        -  "type": [
        -    "null",
        -    "array"
        -  ]
        -}
      • removedOutput schema / properties / key_strengths
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "domain": {
        -        "type": [
        -          "null",
        -          "string"
        -        ]
        -      },
        -      "headline": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "headline"
        -    ],
        -    "type": "object"
        -  },
        -  "type": [
        -    "null",
        -    "array"
        -  ]
        -}
      • addedOutput schema / properties / message
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "arguments": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "ticker": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "ticker"
        +      ],
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "call_tool",
        +        "ask_user",
        +        "human_action"
        +      ],
        +      "type": "string"
        +    },
        +    "options": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "tool": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • addedOutput schema / properties / status
        Added value: +{
        +  "enum": [
        +    "scored",
        +    "not_in_surface",
        +    "not_covered",
        +    "ambiguous",
        +    "not_found"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "ticker",
        -  "exchange",
        -  "company_name",
        -  "sector",
        -  "industry",
        -  "composite_score",
        -  "rating",
        -  "domain_scores",
        -  "analysis_date",
        -  "config_context",
        -  "data_source",
        -  "scope"
        -]New value: +[
        +  "status",
        +  "ticker",
        +  "scope"
        +]
    • Changedinitiate_analysis5 fields changed
      • changedInput schema / properties / exchange / description
        Previous value: -"Exchange code (e.g. NASDAQ). Optional - resolved automatically if omitted."New value: +"Exchange code (e.g. NASDAQ). Optional. Resolved automatically if omitted."
      • addedInput schema / properties / exchange / enum
        Added value: +[
        +  "NYSE",
        +  "NASDAQ",
        +  "AMEX",
        +  "OTC",
        +  "CBOE",
        +  "TSX",
        +  "TSXV",
        +  "CNQ",
        +  "NEO",
        +  "MEX",
        +  "B3",
        +  "SANTIAGO",
        +  "BUE",
        +  "BVC",
        +  "LSE",
        +  "EURONEXT_PARIS",
        +  "EURONEXT_AMSTERDAM",
        +  "EURONEXT_BRUSSELS",
        +  "EURONEXT_LISBON",
        +  "EURONEXT_DUBLIN",
        +  "XETRA",
        +  "SIX",
        +  "BME",
        +  "MILAN",
        +  "OSLO",
        +  "OMX_STOCKHOLM",
        +  "OMX_HELSINKI",
        +  "OMX_COPENHAGEN",
        +  "WSE",
        +  "VIE",
        +  "ATH",
        +  "PRA",
        +  "BUD",
        +  "IST",
        +  "ICE",
        +  "RIS",
        +  "TAL",
        +  "MCX",
        +  "TSE",
        +  "HKEX",
        +  "SHANGHAI",
        +  "SHENZHEN",
        +  "ASX",
        +  "TWSE",
        +  "SGX",
        +  "NSE",
        +  "KRX",
        +  "BSE",
        +  "KOE",
        +  "JKT",
        +  "KLS",
        +  "SET",
        +  "NZE",
        +  "HOSE",
        +  "TWO",
        +  "TADAWUL",
        +  "JSE",
        +  "TLV",
        +  "DFM",
        +  "EGX",
        +  "DOH",
        +  "KUW"
        +]
      • changedInput schema / properties / risk_tolerance / description
        Previous value: -"Analysis focus — reweights how much the analysis weighs downside/quality risk vs. growth/fundamentals. NOT a personal risk or suitability assessment, and it never changes the company's underlying facts. low=Defensive, medium=Balanced, high=Growth. Default medium."New value: +"Analysis focus. It reweights how much the analysis weighs downside/quality risk vs. growth/fundamentals. NOT a personal risk or suitability assessment, and it never changes the company's underlying facts. low=Defensive, medium=Balanced, high=Growth. Default medium."
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol (e.g. AAPL)"New value: +"Stock ticker symbol (e.g. AAPL). Exactly one ticker per call."
      • changedInput schema / properties / time_range / description
        Previous value: -"Time horizon — shapes which signals the analysis weighs most (shorter horizons favor price action, momentum and news; longer favor fundamentals and quality). Not a price forecast. One window per calibrated band: short_2_wk (Short-term), medium_1_mo (Medium-term), long_1_yr (Long-term). Default medium_1_mo. The legacy medium_2_mo and long_2_yr aliases are still accepted and resolve to medium_1_mo and long_1_yr respectively."New value: +"Time horizon. It shapes which signals the analysis weighs most (shorter horizons favor price action, momentum and news; longer favor fundamentals and quality). Not a price forecast. One window per calibrated band: short_2_wk (Short-term), medium_1_mo (Medium-term), long_1_yr (Long-term). Default medium_1_mo. The legacy medium_2_mo and long_2_yr aliases are still accepted and resolve to medium_1_mo and long_1_yr respectively."
    • Changedping1 field changed
      • changedOutput schema / properties / status / description
        Previous value: -"Connectivity status — \"ok\" when the MCP server is reachable"New value: +"Connectivity status: \"ok\" when the MCP server is reachable"
    • Changedremove_from_watchlist3 fields changed
      • changedInput schema / properties / exchange / description
        Previous value: -"Exchange code (e.g. NASDAQ). Optional — when omitted, the ticker is matched against your own watchlist; if it is tracked on more than one exchange you will be asked which one."New value: +"Exchange code (e.g. NASDAQ). Optional. When omitted, the ticker is matched against the portfolio; if it is there on more than one exchange you will be asked which."
      • addedInput schema / properties / exchange / enum
        Added value: +[
        +  "NYSE",
        +  "NASDAQ",
        +  "AMEX",
        +  "OTC",
        +  "CBOE",
        +  "TSX",
        +  "TSXV",
        +  "CNQ",
        +  "NEO",
        +  "MEX",
        +  "B3",
        +  "SANTIAGO",
        +  "BUE",
        +  "BVC",
        +  "LSE",
        +  "EURONEXT_PARIS",
        +  "EURONEXT_AMSTERDAM",
        +  "EURONEXT_BRUSSELS",
        +  "EURONEXT_LISBON",
        +  "EURONEXT_DUBLIN",
        +  "XETRA",
        +  "SIX",
        +  "BME",
        +  "MILAN",
        +  "OSLO",
        +  "OMX_STOCKHOLM",
        +  "OMX_HELSINKI",
        +  "OMX_COPENHAGEN",
        +  "WSE",
        +  "VIE",
        +  "ATH",
        +  "PRA",
        +  "BUD",
        +  "IST",
        +  "ICE",
        +  "RIS",
        +  "TAL",
        +  "MCX",
        +  "TSE",
        +  "HKEX",
        +  "SHANGHAI",
        +  "SHENZHEN",
        +  "ASX",
        +  "TWSE",
        +  "SGX",
        +  "NSE",
        +  "KRX",
        +  "BSE",
        +  "KOE",
        +  "JKT",
        +  "KLS",
        +  "SET",
        +  "NZE",
        +  "HOSE",
        +  "TWO",
        +  "TADAWUL",
        +  "JSE",
        +  "TLV",
        +  "DFM",
        +  "EGX",
        +  "DOH",
        +  "KUW"
        +]
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol to remove from the watchlist (e.g. AAPL). Exactly one ticker per call."New value: +"Stock ticker symbol (e.g. AAPL). Exactly one ticker per call."
  6. 1 tool update
    • Changedfetch_analysis_result2 fields changed
      • addedOutput schema / properties / result / properties / domains / items / properties / contribution
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / result / properties / domains / items / properties / weight
        Removed value: -{
        -  "type": [
        -    "null",
        -    "number"
        -  ]
        -}
  7. 1 tool update
    • Changeddiscover_stocks1 field changed
      • addedOutput schema / properties / sort_substituted
        Added value: +{
        +  "type": "boolean"
        +}
  8. 1 tool update
    • Changedget_market_summary2 fields changed
      • addedOutput schema / properties / watchlist
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "type": "string"
        +    },
        +    "tool": {
        +      "type": "string"
        +    },
        +    "tracked": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tracked",
        +    "tool",
        +    "message"
        +  ],
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • addedOutput schema / properties / watchlist_offered
        Added value: +{
        +  "type": "boolean"
        +}
  9. 3 tool updates
    • Changedadd_to_watchlist1 field changed
      • changedInput schema / properties / exchange / description
        Previous value: -"Exchange code (e.g. NASDAQ). Optional — auto-resolved via StockLens autocomplete if omitted."New value: +"Exchange code (e.g. NASDAQ). Optional - resolved automatically if omitted."
    • Changeddiscover_stocks2 fields changed
      • addedOutput schema / properties / hard_locked
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "rows",
        -  "scores_locked",
        -  "access_tier",
        -  "rows_returned",
        -  "effective_sort",
        -  "effective_direction",
        -  "config_context",
        -  "data_source",
        -  "scope"
        -]New value: +[
        +  "rows",
        +  "scores_locked",
        +  "hard_locked",
        +  "access_tier",
        +  "rows_returned",
        +  "effective_sort",
        +  "effective_direction",
        +  "config_context",
        +  "data_source",
        +  "scope"
        +]
    • Changedinitiate_analysis1 field changed
      • changedInput schema / properties / exchange / description
        Previous value: -"Exchange code (e.g. NASDAQ). Optional."New value: +"Exchange code (e.g. NASDAQ). Optional - resolved automatically if omitted."
  10. 2 tool updates
    • Addedadd_to_watchlist
    • Addedremove_from_watchlist
  11. 5 tool updates
    • Addeddiscover_stocks
    • Changedfetch_analysis_result2 fields changed
      • addedOutput schema / properties / scope
        Added value: +{
        +  "enum": [
        +    "single_analysis_result"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "analysis_id",
        -  "status"
        -]New value: +[
        +  "analysis_id",
        +  "status",
        +  "scope"
        +]
    • Changedget_market_summary3 fields changed
      • addedInput schema / properties / ticker / pattern
        Added value: +"^[A-Za-z][A-Za-z.\\-]{0,9}$"
      • addedOutput schema / properties / scope
        Added value: +{
        +  "enum": [
        +    "single_ticker"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "ticker",
        -  "exchange",
        -  "company_name",
        -  "sector",
        -  "industry",
        -  "composite_score",
        -  "rating",
        -  "domain_scores",
        -  "analysis_date",
        -  "config_context",
        -  "data_source"
        -]New value: +[
        +  "ticker",
        +  "exchange",
        +  "company_name",
        +  "sector",
        +  "industry",
        +  "composite_score",
        +  "rating",
        +  "domain_scores",
        +  "analysis_date",
        +  "config_context",
        +  "data_source",
        +  "scope"
        +]
    • Changedget_portfolio_insights2 fields changed
      • addedOutput schema / properties / scope
        Added value: +{
        +  "enum": [
        +    "user_watchlist"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "watchlist",
        -  "total_holdings",
        -  "tier_limited"
        -]New value: +[
        +  "watchlist",
        +  "total_holdings",
        +  "tier_limited",
        +  "scope"
        +]
    • Changedinitiate_analysis3 fields changed
      • addedInput schema / properties / ticker / pattern
        Added value: +"^[A-Za-z][A-Za-z.\\-]{0,9}$"
      • addedOutput schema / properties / scope
        Added value: +{
        +  "enum": [
        +    "single_analysis_receipt"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "analysis_id",
        -  "status",
        -  "estimated_seconds",
        -  "depth",
        -  "credit_type",
        -  "new_run_started",
        -  "reused_existing"
        -]New value: +[
        +  "analysis_id",
        +  "status",
        +  "estimated_seconds",
        +  "depth",
        +  "credit_type",
        +  "new_run_started",
        +  "reused_existing",
        +  "scope"
        +]
  12. 1 tool update
    • Changedfetch_analysis_result4 fields changed
      • addedOutput schema / properties / result / properties / domains / items / properties / confidence
        Added value: +{
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • addedOutput schema / properties / result / properties / domains / items / properties / insider_key_metrics
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "label": {
        +        "type": "string"
        +      },
        +      "value": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "label",
        +      "value"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / result / properties / domains / items / properties / news_key_articles
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "conviction": {
        +        "type": "number"
        +      },
        +      "published_at": {
        +        "type": "string"
        +      },
        +      "publisher": {
        +        "type": "string"
        +      },
        +      "rating": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "title",
        +      "publisher",
        +      "url",
        +      "published_at",
        +      "rating",
        +      "conviction"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / result / properties / domains / items / properties / weight
        Added value: +{
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
  13. 1 tool update
    • Changedinitiate_analysis1 field changed
      • changedInput schema / properties / depth / description
        Previous value: -"Analysis depth: standard or plus. Standard uses LENS_AI credit. Plus uses LENS_AI_PLUS credit and may add AI narratives. Default standard."New 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."
  14. 5 tool updates
    • First observedfetch_analysis_result
    • First observedget_market_summary
    • First observedget_portfolio_insights
    • First observedinitiate_analysis
    • First observedping

Publisher details

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

Related MCP Connectors

Related MCP Servers

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

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources