Altair
Server Details
Free TradingAgents equity research reports and Altair pages; paid signals feed via x402 inside MCP.
- Status
- Healthy
- Uptime
- 100.0% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 9 tools
Most tools target distinct resource/action pairs: market breadth, market indicators, ticker indicators, research decisions, research signals, pages, and reports. The main possible confusion is between get_market_indicators and get_ticker_indicators, and to a lesser extent get_research_decisions and get_research_signals, though the descriptions clarify index-vs-ticker scope and decision-vs-signal granularity.
All names use consistent snake_case and follow a predictable verb_noun pattern: get_*, list_*, read_*. The verbs are appropriate to the operation and no naming convention mixing is present.
Nine tools is well within the expected range and each tool appears to earn its place in the read-only market/research workflow. The set covers market data, ticker data, research reports, and site pages without excessive granularity.
The tool surface covers the core read-only lifecycle: discovering and reading pages, listing and reading research reports, and retrieving market, ticker, and research signal/decision data. Minor gaps exist, such as no direct tool for broader historical indicator series despite mention of API history endpoints, but agents can work around these for the apparent purpose.
Available Tools
9 toolsget_market_breadthGet market breadthARead-onlyIdempotentInspect
Return the latest S&P 500 sector breadth and S&P 500, Nasdaq-100 and PHLX Semiconductor (SOX) constituent percentages above their 20-session simple moving averages, with SPX, NDX and SOX price-index benchmark levels (no dividends). History uses the loader's constituent lists, not point-in-time membership. Optionally choose 1–252 recent trading sessions; default 20.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Recent trading sessions to return in history; integer from 1 to 252, default 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds genuinely useful behavioral context that annotations cannot: no dividends in the benchmark levels, and the important caveat that history is built from the loader's current constituent lists rather than point-in-time membership — a material data-quality limitation for any agent interpreting the series.
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 returned data, then appends the two critical caveats and the parameter default. It is dense and slightly run-on, but nearly every clause adds information; only the repeated 'default 20' overlaps with the schema.
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 covering return shape and annotations covering safety, the description's remaining job is data provenance and caveats — which it handles via the no-dividends note and the point-in-time membership warning. Nothing needed to call or interpret the 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% and already documents the 1–252 range and default of 20; the description only restates '1–252 recent trading sessions; default 20' without adding format or edge-case meaning. Baseline 3 is appropriate when the schema carries the parameter semantics.
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 ('Return') and precisely names the resources: S&P 500 sector breadth, constituent percentages above 20-session SMAs for SPX/NDX/SOX, plus the index benchmark levels. The scope is unambiguous and cannot be confused with any sibling (research reports, pages, signals).
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?
Usage is only implied — the description explains what data is produced and how the optional `days` history window works, but never says when to call this versus another tool or when it is inappropriate. Siblings are in unrelated domains, so the risk of mis-selection is low, keeping this at minimum-viable rather than poor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_indicatorsGet market indicatorsARead-onlyIdempotentInspect
Return the latest readings of ten factor indicators and TD Sequential 9 (daily and weekly) for the S&P 500 (SPX), Nasdaq-100 (NDX) and PHLX Semiconductor (SOX) price indices: value, reading, bullish/neutral/bearish signal, the rule's bands and the previous session's value and signal, with each rule's source and its 2005–2026 S&P 500 and Nasdaq-100 evidence. Signals are rule readings, not forecasts; several are contrarian, and SOX implied volatility is Cboe's semiconductor ETF index VXSMH. Five-year histories are at /api/market/indicators.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds meaningful behavioral context beyond annotations: signals are 'rule readings, not forecasts,' several are 'contrarian,' and SOX implied volatility refers to Cboe's VXSMH index. This helps prevent misinterpretation of the returned signals.
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 dense but front-loads what the tool returns before adding caveats about interpretation and sourcing. It contains no obvious filler, though the long first sentence packs many concepts and could be slightly easier to parse if broken up.
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 the description does not need to enumerate every return field. It still complements the schema by naming the covered indices, signal categories, historical evidence, and interpretation caveats. Given the tool's complexity, this is largely complete.
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?
The tool has zero parameters, so there are no parameter semantics to explain. The schema naturally covers this fully, and the description appropriately focuses on output content rather than nonexistent inputs.
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 latest readings of ten factor indicators and TD Sequential 9' for three named indices. The scope is clear enough to distinguish index-level indicators from ticker-level or breadth tools, but it does not explicitly name or contrast with siblings such as get_market_breadth or get_ticker_indicators.
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?
The description implies usage for monitoring S&P 500, Nasdaq-100, and SOX indicators, and it points to '/api/market/indicators' for five-year histories. However, it does not explicitly state when to choose this tool over sibling market tools or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_research_decisionsGet research decisionsARead-onlyIdempotentInspect
Return every model's final portfolio decision for one ticker on its newest analysis date, or a chosen one: rating, report-time price, price target, confidence, time horizon and executive summary, with report URLs. Set includePrevious to compare each represented model's rating with its nearest earlier analysis date, with both source URLs and explicit missing/unavailable states. Same-date reruns use the latest run-start time; model names are not merged. No explanation of why a rating changed is inferred. Use read_research_report for reasoning.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Analysis date YYYY-MM-DD from list_research_reports. Omit for the newest. | |
| ticker | Yes | Stock or ETF ticker, e.g. NVDA or SPY; case-insensitive, 1–32 characters after trimming. | |
| includePrevious | No | Include each selected model's rating comparison with its nearest strictly earlier analysis date. Default false; not a comparison across models or reruns of the same date. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses meaningful behavior: same-date reruns resolve by latest run-start time, model names are not merged, missing/unavailable states are explicit rather than omitted, and rating-change rationale is deliberately not inferred. These are non-obvious traits an agent could not get 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?
Front-loaded with the core purpose in the first clause and every sentence carries information about scope, the flag, edge cases, or sibling routing. The sentences are dense and slightly run-on, which costs a point on readability but not on substance.
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 lookup with a full output schema and complete parameter documentation, everything an agent needs is present: scope, the optional date override, the previous-comparison flag semantics, rerun resolution, and where to go for reasoning. Return-value detail is correctly left to the output schema.
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 the baseline is 3. The description's note about includePrevious ('nearest earlier analysis date', 'not a comparison across models or reruns') largely restates the schema's own parameter description, and it adds no format or syntax detail for ticker or date that the schema does not already carry.
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 ('Return every model's final portfolio decision') plus the exact scope: one ticker, newest or chosen analysis date, with the fields enumerated. It also explicitly distinguishes itself from read_research_report, so an agent can tell the two apart without opening either 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?
The final sentence routes reasoning requests to read_research_report, and 'Set includePrevious to compare...' gives a clear condition for that flag. It lacks an explicit statement of when this tool should be preferred over siblings like get_research_signals, so it falls short of the full when/when-not/alternatives bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_research_signalsBuy research signalsAInspect
Return the latest final portfolio decision per ticker as structured JSON, including report dates, models, source URLs and summaries. Optional tickers and since filters; ten-minute cache. Costs $0.01 USD per call by default via x402 payments inside MCP; the payment challenge gives the current price. Free sample: /api/research/signals/sample.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Inclusive minimum analysis date, a valid YYYY-MM-DD date. Omit for all dates. | |
| tickers | No | 1–100 comma-separated uppercase ticker symbols, e.g. NVDA,AAPL. Omit for all tickers. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the paid nature of the call ($0.01 USD default via x402), that the payment challenge carries the live price, a ten-minute cache, and a free sample path — critical context that explains why readOnlyHint is false. It stops short of saying whether failed or empty responses are still billed, or any rate limit.
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?
Three dense sentences, front-loaded with what is returned before filters, cost, and the sample pointer. Almost nothing is wasted, though the trailing sample URL is slightly tacked on rather than integrated into the payment sentence.
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 explained, and the description still covers filters, caching, and the payment flow. It is nearly complete for a paid read endpoint; only failure/empty-result charging behavior and sibling routing are 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 coverage is 100%, so both parameters are already fully documented with patterns and omit-behavior in the schema. The description only restates 'Optional tickers and since filters' without adding syntax or edge-case meaning, so the baseline of 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 ('Return the latest final portfolio decision per ticker as structured JSON') and enumerates the payload fields (report dates, models, source URLs, summaries). It is clear what the tool does, but it never names or contrasts the closest sibling, get_research_decisions, so the agent must infer the distinction between 'signals' and 'decisions' itself.
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?
Usage is only implied: the optional tickers/since filters and the free sample endpoint hint at how to explore or scope calls, but there is no explicit 'use this when…' or 'prefer X instead'. With siblings like get_research_decisions and read_research_report present, the absence of routing guidance leaves a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ticker_indicatorsGet ticker indicatorsARead-onlyIdempotentInspect
Return latest factor and daily/weekly TD Sequential readings for one Yahoo Finance symbol, with session, price, rules, sources and historical index evidence. Reuses /api/market/indicators?ticker=; no chart histories. Stock implied volatility and variance risk premium are null; VIX term structure, credit and yield curve are shared market context. Evidence is not validated single-stock returns. Signals are rule readings, not forecasts or investment advice; the session may still be open. Each reading includes the previous session's value and signal.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Yahoo Finance symbol, case-insensitive, 1–20 characters after trimming: letters, digits, . - = ^; e.g. NVDA, BRK-B or 0700.HK. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, openWorld, and non-destructive, but the description goes well beyond them: it discloses null stock IV/VRP values, shared market context fields, the lack of chart histories, unvalidated evidence, non-forecast signal semantics, and the possibility of an open session. This is exactly the behavioral context an agent needs before relying on the output.
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 return content is front-loaded, followed by caveats and limitations; every sentence carries non-trivial information. It is semicolon-dense and a little hard to scan, but not padded with filler.
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, full schema coverage, output schema, and rich annotations, the description is complete enough to call and interpret the tool. It covers nulls, shared context, evidence limits, and signal interpretation, with no material omissions for a read-only indicator fetch.
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?
The single ticker parameter has 100% schema description coverage, including pattern, case-insensitivity, length, allowed characters, and examples. The description adds only 'one Yahoo Finance symbol,' which is already implied, so baseline 3 is appropriate.
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 latest factor and daily/weekly TD Sequential readings for one Yahoo Finance symbol. The scope 'for one Yahoo Finance symbol' distinguishes it from a market-wide tool, but it never names the sibling get_market_indicators, so an agent must infer the boundary.
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?
Usage is implied by 'for one Yahoo Finance symbol' and by the note that it reuses /api/market/indicators?ticker=. There is no explicit when-to-use or when-not-to-use guidance and no named alternative, leaving sibling selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pagesList public pagesARead-onlyIdempotentInspect
Return public Altair page paths, URLs, titles and descriptions. Use this to discover pages before read_page.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds only that the pages are 'public' and enumerates the returned fields, which the output schema also covers, so it contributes little behavioral context beyond 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?
Two short sentences, zero waste, and the payload description is front-loaded ahead of the usage hint. Every sentence earns its place.
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 zero-parameter, read-only listing tool with an output schema already documenting the return shape, the description supplies everything needed: what is listed, the public scope, and the natural follow-up call.
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?
The tool takes zero parameters, which is the baseline-4 case; there is nothing for the description to disambiguate. The description correctly implies no filtering or input is required.
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 ('Return public Altair page paths, URLs, titles and descriptions'), so the agent knows exactly what comes back. It differentiates the primary sibling by naming read_page, but does not distinguish itself from get_research_signals or list_research_reports.
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?
'Use this to discover pages before read_page' gives a clear sequencing context and names the follow-up tool. It does not state any exclusion conditions or say when a different listing tool should be chosen instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_research_reportsList research reportsARead-onlyIdempotentInspect
Return published TradingAgents report metadata and URLs newest first, the matching total and counts for all tickers. Use this to find reports before read_research_report, optionally filter by ticker and page with limit and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum reports to return per call; integer from 1 to 100, default 20. | |
| offset | No | Number of matching reports to skip, e.g. 20 for the next page with limit 20; integer from 0 to 9007199254740991, default 0. | |
| ticker | No | Stock ticker, e.g. NVDA; case-insensitive, 1–32 characters after trimming. Omit to list all tickers. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world. The description adds value beyond that: results are restricted to published reports, sorted newest first, and the response includes a matching total plus per-ticker counts. It does not discuss rate limits or result size ceilings, but ordering and scope are useful disclosures.
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?
Two front-loaded sentences with no filler; the purpose and ordering come first, then the workflow and optional filters. The clause 'the matching total and counts for all tickers' is slightly dense but still earns its place by describing the return shape.
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, return-value detail is not required, and the description still covers purpose, ordering, filtering, paging and the relationship to read_research_report. Nothing an agent needs to invoke it 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 limit, offset and ticker are already fully documented with ranges and defaults. The description only restates that ticker filtering and limit/offset paging are optional, adding no syntax or edge-case guidance 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 ('Return published TradingAgents report metadata and URLs'), specifies ordering (newest first), and names the sibling tool read_research_report as the follow-up step, so an agent can separate listing metadata from reading full reports without opening either 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?
Explicitly says to use this to find reports before read_research_report, giving a clear discovery-then-read workflow and naming the alternative. It does not state when NOT to use it (e.g. when the report ID is already known), but the routing context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_pageRead a public pageARead-onlyIdempotentInspect
Return a public Altair page's full markdown with its path, URL, title and description. Use a path from list_pages when you need the page content.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Site path from list_pages, e.g. /indicators; 1–2048 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description's one added behavioral fact is the 'public' qualifier, implying only public pages are reachable — useful but thin; with an output schema present it need not describe return format.
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?
Two short sentences, no filler, with the purpose (what is returned) front-loaded before the usage pointer. Every clause carries information.
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?
A single required parameter at 100% coverage, rich annotations and an output schema mean almost nothing else needs saying. The only small gap is unstated behavior for invalid paths or pages that are not public.
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% for the single 'path' parameter, and the schema already says 'Site path from list_pages, e.g. /indicators; 1–2048 characters.' The description only restates the list_pages origin, adding no syntax or format detail 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 ('Return a public Altair page's full markdown') and enumerates what comes back (path, URL, title, description). It implicitly separates itself from list_pages by being the content-retrieval step, but never explicitly distinguishes itself from read_research_report, the other 'read' 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?
'Use a path from list_pages when you need the page content' gives an explicit prerequisite and the condition that selects this tool over list_pages. There is no statement of when-not to use it (e.g. for non-public or report content), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_research_reportRead a research reportARead-onlyIdempotentInspect
Return a full TradingAgents report as markdown, its ticker, date, model and URL, and an informational-only disclaimer; sections cover analyst reports, research decisions, trading plans, risk management and portfolio decisions. Use a url from list_research_reports for free access without sign-in.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | A report url returned by list_research_reports; 1–2048 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds useful context the annotations cannot convey: the response is markdown plus metadata, it carries an informational-only disclaimer, and it can be accessed unsigned when the URL comes from list_research_reports.
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?
Two sentences, front-loaded with the return payload and then the usage instruction; little waste. The first sentence is dense and list-heavy but every clause maps to something the agent would otherwise have to discover.
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 need not enumerate return fields, yet it does so briefly, and it covers the one input's provenance and the auth condition. Coverage is complete for a single-parameter read tool; only the sibling routing dimension is lightly covered.
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 url parameter is fully documented in the schema as 'a report url returned by list_research_reports'. The description repeats that provenance but adds no format, constraint, or edge-case detail 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 ('Return a full TradingAgents report as markdown') and enumerates the payload (ticker, date, model, URL, disclaimer) and content sections. This makes it clearly distinguishable from the sibling list_research_reports, which only lists URLs.
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?
Explicitly tells the agent to source the url from list_research_reports and notes that doing so grants free access without sign-in, which is a real precondition. It stops short of saying when to prefer this over siblings like get_research_signals, so no explicit exclusions.
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.
2 tool updates
- Changed
get_market_indicators1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "asOf": { - "description": "Latest upstream quote timestamp among the three indices; not necessarily a session close.", - "type": [ - "string", - "null" - ] - }, - "generatedAt": { - "description": "Time this snapshot was calculated; cached responses retain this timestamp.", - "type": "string" - }, - "indicators": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "description": "What followed each state from 2005 to 2026 on the S&P 500 and Nasdaq-100; SOX is untested.", - "type": "string" - }, - "family": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "readings": { - "additionalProperties": false, - "properties": { - "NDX": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "bands": { - "additionalProperties": false, - "description": "Bullish is checked first; any other value is neutral.", - "properties": { - "bearish": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "above": { - "type": "number" - } - }, - "required": [ - "above" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "below": { - "type": "number" - } - }, - "required": [ - "below" - ], - "type": "object" - } - ], - "description": "Holds at `above` or higher, or at `below` or lower." - }, - "bullish": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "above": { - "type": "number" - } - }, - "required": [ - "above" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "below": { - "type": "number" - } - }, - "required": [ - "below" - ], - "type": "object" - } - ], - "description": "Holds at `above` or higher, or at `below` or lower." - } - }, - "type": "object" - }, - "reading": { - "description": "The value in words, as shown on /indicators.", - "type": "string" - }, - "signal": { - "enum": [ - "bullish", - "neutral", - "bearish" - ], - "type": "string" - }, - "value": { - "description": "The quantity the bands test; a fraction when unit is percent (0.05 is 5%).", - "type": "number" - } - }, - "required": [ - "value", - "reading", - "signal", - "bands" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Null when a series the rule needs is missing, e.g. implied volatility for SOX." - }, - "SOX": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "bands": { - "additionalProperties": false, - "description": "Bullish is checked first; any other value is neutral.", - "properties": { - "bearish": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "above": { - "type": "number" - } - }, - "required": [ - "above" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "below": { - "type": "number" - } - }, - "required": [ - "below" - ], - "type": "object" - } - ], - "description": "Holds at `above` or higher, or at `below` or lower." - }, - "bullish": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "above": { - "type": "number" - } - }, - "required": [ - "above" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "below": { - "type": "number" - } - }, - "required": [ - "below" - ], - "type": "object" - } - ], - "description": "Holds at `above` or higher, or at `below` or lower." - } - }, - "type": "object" - }, - "reading": { - "description": "The value in words, as shown on /indicators.", - "type": "string" - }, - "signal": { - "enum": [ - "bullish", - "neutral", - "bearish" - ], - "type": "string" - }, - "value": { - "description": "The quantity the bands test; a fraction when unit is percent (0.05 is 5%).", - "type": "number" - } - }, - "required": [ - "value", - "reading", - "signal", - "bands" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Null when a series the rule needs is missing, e.g. implied volatility for SOX." - }, - "SPX": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "bands": { - "additionalProperties": false, - "description": "Bullish is checked first; any other value is neutral.", - "properties": { - "bearish": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "above": { - "type": "number" - } - }, - "required": [ - "above" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "below": { - "type": "number" - } - }, - "required": [ - "below" - ], - "type": "object" - } - ], - "description": "Holds at `above` or higher, or at `below` or lower." - }, - "bullish": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "above": { - "type": "number" - } - }, - "required": [ - "above" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "below": { - "type": "number" - } - }, - "required": [ - "below" - ], - "type": "object" - } - ], - "description": "Holds at `above` or higher, or at `below` or lower." - } - }, - "type": "object" - }, - "reading": { - "description": "The value in words, as shown on /indicators.", - "type": "string" - }, - "signal": { - "enum": [ - "bullish", - "neutral", - "bearish" - ], - "type": "string" - }, - "value": { - "description": "The quantity the bands test; a fraction when unit is percent (0.05 is 5%).", - "type": "number" - } - }, - "required": [ - "value", - "reading", - "signal", - "bands" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Null when a series the rule needs is missing, e.g. implied volatility for SOX." - } - }, - "required": [ - "SPX", - "NDX", - "SOX" - ], - "type": "object" - }, - "rule": { - "type": "string" - }, - "source": { - "additionalProperties": false, - "properties": { - "label": { - "type": "string" - }, - "url": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "label", - "url" - ], - "type": "object" - }, - "unit": { - "enum": [ - "percent", - "number" - ], - "type": "string" - } - }, - "required": [ - "id", - "name", - "family", - "unit", - "rule", - "source", - "evidence", - "readings" - ], - "type": "object" - }, - "type": "array" - }, - "indices": { - "items": { - "additionalProperties": false, - "properties": { - "close": { - "description": "Price-only index level on that session; no dividends.", - "type": "number" - }, - "date": { - "description": "Latest trading session read, which can still be open.", - "type": "string" - }, - "name": { - "type": "string" - }, - "symbol": { - "enum": [ - "SPX", - "NDX", - "SOX" - ], - "type": "string" - } - }, - "required": [ - "symbol", - "name", - "date", - "close" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "generatedAt", - "asOf", - "indices", - "indicators" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - } - }, - "required": [ - "error" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "asOf": { + "description": "Latest upstream quote timestamp among the three indices; not necessarily a session close.", + "type": [ + "string", + "null" + ] + }, + "generatedAt": { + "description": "Time this snapshot was calculated; cached responses retain this timestamp.", + "type": "string" + }, + "indicators": { + "items": { + "additionalProperties": false, + "properties": { + "evidence": { + "description": "What followed each state from 2005 to 2026 on the S&P 500 and Nasdaq-100; SOX is untested.", + "type": "string" + }, + "family": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "readings": { + "additionalProperties": false, + "properties": { + "NDX": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "bands": { + "additionalProperties": false, + "description": "Bullish is checked first; any other value is neutral.", + "properties": { + "bearish": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "above": { + "type": "number" + } + }, + "required": [ + "above" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "below": { + "type": "number" + } + }, + "required": [ + "below" + ], + "type": "object" + } + ], + "description": "Holds at `above` or higher, or at `below` or lower." + }, + "bullish": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "above": { + "type": "number" + } + }, + "required": [ + "above" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "below": { + "type": "number" + } + }, + "required": [ + "below" + ], + "type": "object" + } + ], + "description": "Holds at `above` or higher, or at `below` or lower." + } + }, + "type": "object" + }, + "previous": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "date": { + "description": "The session before the latest.", + "type": "string" + }, + "signal": { + "enum": [ + "bullish", + "neutral", + "bearish" + ], + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "date", + "value", + "signal" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The previous session's value and signal under the same bands; null when that session has no reading." + }, + "reading": { + "description": "The value in words, as shown on /indicators.", + "type": "string" + }, + "signal": { + "enum": [ + "bullish", + "neutral", + "bearish" + ], + "type": "string" + }, + "value": { + "description": "The quantity the bands test; a fraction when unit is percent (0.05 is 5%).", + "type": "number" + } + }, + "required": [ + "value", + "reading", + "signal", + "bands", + "previous" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Null when a series the rule needs is missing, e.g. implied volatility for SOX." + }, + "SOX": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "bands": { + "additionalProperties": false, + "description": "Bullish is checked first; any other value is neutral.", + "properties": { + "bearish": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "above": { + "type": "number" + } + }, + "required": [ + "above" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "below": { + "type": "number" + } + }, + "required": [ + "below" + ], + "type": "object" + } + ], + "description": "Holds at `above` or higher, or at `below` or lower." + }, + "bullish": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "above": { + "type": "number" + } + }, + "required": [ + "above" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "below": { + "type": "number" + } + }, + "required": [ + "below" + ], + "type": "object" + } + ], + "description": "Holds at `above` or higher, or at `below` or lower." + } + }, + "type": "object" + }, + "previous": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "date": { + "description": "The session before the latest.", + "type": "string" + }, + "signal": { + "enum": [ + "bullish", + "neutral", + "bearish" + ], + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "date", + "value", + "signal" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The previous session's value and signal under the same bands; null when that session has no reading." + }, + "reading": { + "description": "The value in words, as shown on /indicators.", + "type": "string" + }, + "signal": { + "enum": [ + "bullish", + "neutral", + "bearish" + ], + "type": "string" + }, + "value": { + "description": "The quantity the bands test; a fraction when unit is percent (0.05 is 5%).", + "type": "number" + } + }, + "required": [ + "value", + "reading", + "signal", + "bands", + "previous" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Null when a series the rule needs is missing, e.g. implied volatility for SOX." + }, + "SPX": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "bands": { + "additionalProperties": false, + "description": "Bullish is checked first; any other value is neutral.", + "properties": { + "bearish": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "above": { + "type": "number" + } + }, + "required": [ + "above" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "below": { + "type": "number" + } + }, + "required": [ + "below" + ], + "type": "object" + } + ], + "description": "Holds at `above` or higher, or at `below` or lower." + }, + "bullish": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "above": { + "type": "number" + } + }, + "required": [ + "above" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "below": { + "type": "number" + } + }, + "required": [ + "below" + ], + "type": "object" + } + ], + "description": "Holds at `above` or higher, or at `below` or lower." + } + }, + "type": "object" + }, + "previous": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "date": { + "description": "The session before the latest.", + "type": "string" + }, + "signal": { + "enum": [ + "bullish", + "neutral", + "bearish" + ], + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "date", + "value", + "signal" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The previous session's value and signal under the same bands; null when that session has no reading." + }, + "reading": { + "description": "The value in words, as shown on /indicators.", + "type": "string" + }, + "signal": { + "enum": [ + "bullish", + "neutral", + "bearish" + ], + "type": "string" + }, + "value": { + "description": "The quantity the bands test; a fraction when unit is percent (0.05 is 5%).", + "type": "number" + } + }, + "required": [ + "value", + "reading", + "signal", + "bands", + "previous" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Null when a series the rule needs is missing, e.g. implied volatility for SOX." + } + }, + "required": [ + "SPX", + "NDX", + "SOX" + ], + "type": "object" + }, + "rule": { + "type": "string" + }, + "source": { + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "unit": { + "enum": [ + "percent", + "number" + ], + "type": "string" + } + }, + "required": [ + "id", + "name", + "family", + "unit", + "rule", + "source", + "evidence", + "readings" + ], + "type": "object" + }, + "type": "array" + }, + "indices": { + "items": { + "additionalProperties": false, + "properties": { + "close": { + "description": "Price-only index level on that session; no dividends.", + "type": "number" + }, + "date": { + "description": "Latest trading session read, which can still be open.", + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "enum": [ + "SPX", + "NDX", + "SOX" + ], + "type": "string" + } + }, + "required": [ + "symbol", + "name", + "date", + "close" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "generatedAt", + "asOf", + "indices", + "indicators" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "type": "string" + } + }, + "required": [ + "error" + ], + "type": "object" + } +]
- Changed
get_ticker_indicators1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "asOf": { - "description": "Latest upstream quote timestamp; not necessarily a session close.", - "type": [ - "string", - "null" - ] - }, - "disclaimer": { - "type": "string" - }, - "generatedAt": { - "description": "Time this snapshot was calculated.", - "type": "string" - }, - "indicators": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "description": "Historical S&P 500 and Nasdaq-100 evidence, not validated returns for this instrument.", - "type": "string" - }, - "family": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "reading": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "bands": { - "additionalProperties": false, - "description": "Bullish is checked first; any other value is neutral.", - "properties": { - "bearish": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "above": { - "type": "number" - } - }, - "required": [ - "above" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "below": { - "type": "number" - } - }, - "required": [ - "below" - ], - "type": "object" - } - ], - "description": "Holds at `above` or higher, or at `below` or lower." - }, - "bullish": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "above": { - "type": "number" - } - }, - "required": [ - "above" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "below": { - "type": "number" - } - }, - "required": [ - "below" - ], - "type": "object" - } - ], - "description": "Holds at `above` or higher, or at `below` or lower." - } - }, - "type": "object" - }, - "reading": { - "description": "The value in words, as shown on /indicators.", - "type": "string" - }, - "signal": { - "enum": [ - "bullish", - "neutral", - "bearish" - ], - "type": "string" - }, - "value": { - "description": "The quantity the bands test; a fraction when unit is percent (0.05 is 5%).", - "type": "number" - } - }, - "required": [ - "value", - "reading", - "signal", - "bands" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Null when a series the rule needs is missing, e.g. implied volatility for SOX." - }, - "rule": { - "type": "string" - }, - "source": { - "additionalProperties": false, - "properties": { - "label": { - "type": "string" - }, - "url": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "label", - "url" - ], - "type": "object" - }, - "unit": { - "enum": [ - "percent", - "number" - ], - "type": "string" - } - }, - "required": [ - "id", - "name", - "family", - "unit", - "rule", - "source", - "evidence", - "reading" - ], - "type": "object" - }, - "type": "array" - }, - "instrument": { - "additionalProperties": false, - "properties": { - "close": { - "description": "Latest split-adjusted daily price; not a guaranteed final closing quote.", - "type": "number" - }, - "date": { - "description": "Latest trading session, which can still be open.", - "type": "string" - }, - "name": { - "type": "string" - }, - "symbol": { - "type": "string" - } - }, - "required": [ - "symbol", - "name", - "date", - "close" - ], - "type": "object" - } - }, - "required": [ - "generatedAt", - "asOf", - "instrument", - "indicators", - "disclaimer" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - } - }, - "required": [ - "error" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "asOf": { + "description": "Latest upstream quote timestamp; not necessarily a session close.", + "type": [ + "string", + "null" + ] + }, + "disclaimer": { + "type": "string" + }, + "generatedAt": { + "description": "Time this snapshot was calculated.", + "type": "string" + }, + "indicators": { + "items": { + "additionalProperties": false, + "properties": { + "evidence": { + "description": "Historical S&P 500 and Nasdaq-100 evidence, not validated returns for this instrument.", + "type": "string" + }, + "family": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "reading": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "bands": { + "additionalProperties": false, + "description": "Bullish is checked first; any other value is neutral.", + "properties": { + "bearish": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "above": { + "type": "number" + } + }, + "required": [ + "above" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "below": { + "type": "number" + } + }, + "required": [ + "below" + ], + "type": "object" + } + ], + "description": "Holds at `above` or higher, or at `below` or lower." + }, + "bullish": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "above": { + "type": "number" + } + }, + "required": [ + "above" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "below": { + "type": "number" + } + }, + "required": [ + "below" + ], + "type": "object" + } + ], + "description": "Holds at `above` or higher, or at `below` or lower." + } + }, + "type": "object" + }, + "previous": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "date": { + "description": "The session before the latest.", + "type": "string" + }, + "signal": { + "enum": [ + "bullish", + "neutral", + "bearish" + ], + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "date", + "value", + "signal" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The previous session's value and signal under the same bands; null when that session has no reading." + }, + "reading": { + "description": "The value in words, as shown on /indicators.", + "type": "string" + }, + "signal": { + "enum": [ + "bullish", + "neutral", + "bearish" + ], + "type": "string" + }, + "value": { + "description": "The quantity the bands test; a fraction when unit is percent (0.05 is 5%).", + "type": "number" + } + }, + "required": [ + "value", + "reading", + "signal", + "bands", + "previous" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Null when a series the rule needs is missing, e.g. implied volatility for SOX." + }, + "rule": { + "type": "string" + }, + "source": { + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "unit": { + "enum": [ + "percent", + "number" + ], + "type": "string" + } + }, + "required": [ + "id", + "name", + "family", + "unit", + "rule", + "source", + "evidence", + "reading" + ], + "type": "object" + }, + "type": "array" + }, + "instrument": { + "additionalProperties": false, + "properties": { + "close": { + "description": "Latest split-adjusted daily price; not a guaranteed final closing quote.", + "type": "number" + }, + "date": { + "description": "Latest trading session, which can still be open.", + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + } + }, + "required": [ + "symbol", + "name", + "date", + "close" + ], + "type": "object" + } + }, + "required": [ + "generatedAt", + "asOf", + "instrument", + "indicators", + "disclaimer" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "type": "string" + } + }, + "required": [ + "error" + ], + "type": "object" + } +]
1 tool update
- Added
get_ticker_indicators
1 tool update
- Changed
get_research_decisions2 fields changed- added
Input schema / properties / includePreviousAdded value: +{ + "description": "Include each selected model's rating comparison with its nearest strictly earlier analysis date. Default false; not a comparison across models or reruns of the same date.", + "type": "boolean" +} - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "date": { - "description": "Analysis date shared by every decision.", - "type": "string" - }, - "decisions": { - "description": "Newest run of each model on that date.", - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "confidence": { - "type": [ - "string", - "null" - ] - }, - "currentPrice": { - "description": "Report-time price as written, not a live quote.", - "type": [ - "string", - "null" - ] - }, - "model": { - "type": "string" - }, - "priceTarget": { - "type": [ - "string", - "null" - ] - }, - "rating": { - "description": "Final portfolio rating as written, e.g. Overweight; null if the report states none.", - "type": [ - "string", - "null" - ] - }, - "summary": { - "description": "The portfolio manager's executive summary.", - "type": [ - "string", - "null" - ] - }, - "timeHorizon": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "model", - "url", - "rating", - "currentPrice", - "priceTarget", - "confidence", - "timeHorizon", - "summary" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - }, - "model": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "model", - "url", - "error" - ], - "type": "object" - } - ] - }, - "type": "array" - }, - "disclaimer": { - "type": "string" - }, - "ticker": { - "type": "string" - } - }, - "required": [ - "ticker", - "date", - "decisions", - "disclaimer" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - } - }, - "required": [ - "error" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "comparisons": { + "description": "Only returned when includePrevious is true. Each model on the selected date versus its nearest strictly earlier analysis date; no model-name aliases.", + "items": { + "additionalProperties": false, + "properties": { + "current": { + "additionalProperties": false, + "properties": { + "date": { + "type": "string" + }, + "error": { + "type": "string" + }, + "rating": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "date", + "url", + "rating" + ], + "type": "object" + }, + "model": { + "type": "string" + }, + "previous": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "date": { + "type": "string" + }, + "error": { + "type": "string" + }, + "rating": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "date", + "url", + "rating" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "status": { + "description": "Rating-only comparison after case/whitespace normalization; missing ratings or unreadable reports are unavailable, not unchanged.", + "enum": [ + "changed", + "unchanged", + "no_previous", + "unavailable" + ], + "type": "string" + } + }, + "required": [ + "model", + "current", + "previous", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "date": { + "description": "Analysis date shared by every decision.", + "type": "string" + }, + "decisions": { + "description": "Newest run of each model on that date.", + "items": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "confidence": { + "type": [ + "string", + "null" + ] + }, + "currentPrice": { + "description": "Report-time price as written, not a live quote.", + "type": [ + "string", + "null" + ] + }, + "model": { + "type": "string" + }, + "priceTarget": { + "type": [ + "string", + "null" + ] + }, + "rating": { + "description": "Final portfolio rating as written, e.g. Overweight; null if the report states none.", + "type": [ + "string", + "null" + ] + }, + "summary": { + "description": "The portfolio manager's executive summary.", + "type": [ + "string", + "null" + ] + }, + "timeHorizon": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "model", + "url", + "rating", + "currentPrice", + "priceTarget", + "confidence", + "timeHorizon", + "summary" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "type": "string" + }, + "model": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "model", + "url", + "error" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "disclaimer": { + "type": "string" + }, + "ticker": { + "type": "string" + } + }, + "required": [ + "ticker", + "date", + "decisions", + "disclaimer" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "type": "string" + } + }, + "required": [ + "error" + ], + "type": "object" + } +]
1 tool update
- Added
get_market_indicators
2 tool updates
- Changed
get_market_breadth1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "asOf": { - "description": "Latest upstream quote timestamp among priced S&P 500 stocks; not necessarily the latest breadth session date.", - "type": [ - "string", - "null" - ] - }, - "constituents": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "generatedAt": { - "description": "Time this snapshot was calculated; cached responses retain this timestamp.", - "type": "string" - }, - "history": { - "items": { - "additionalProperties": false, - "properties": { - "all": { - "description": "Percentage of eligible S&P 500 stocks above their 20-session simple moving average.", - "maximum": 100, - "minimum": 0, - "type": "integer" - }, - "date": { - "description": "Trading-session date; use this, not asOf, to identify the reading's session.", - "type": "string" - }, - "nasdaq100": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "Nasdaq-100 percentage above SMA20; null when coverage is insufficient." - }, - "soxx": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "SOXX holdings percentage above SMA20; null when coverage is insufficient." - }, - "total": { - "description": "Sum of the eleven rounded sector percentages; not a stock count or a percentage.", - "maximum": 1100, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "date", - "total", - "all", - "nasdaq100", - "soxx" - ], - "type": "object" - }, - "type": "array" - }, - "index": { - "type": "string" - }, - "latest": { - "additionalProperties": false, - "properties": { - "all": { - "description": "Percentage of eligible S&P 500 stocks above their 20-session simple moving average.", - "maximum": 100, - "minimum": 0, - "type": "integer" - }, - "benchmarks": { - "additionalProperties": { - "type": [ - "number", - "null" - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "date": { - "description": "Trading-session date; use this, not asOf, to identify the reading's session.", - "type": "string" - }, - "nasdaq100": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "Nasdaq-100 percentage above SMA20; null when coverage is insufficient." - }, - "sectors": { - "items": { - "additionalProperties": false, - "properties": { - "above": { - "description": "Percentage of eligible sector stocks above their 20-session simple moving average.", - "maximum": 100, - "minimum": 0, - "type": "integer" - }, - "code": { - "type": "string" - }, - "name": { - "type": "string" - }, - "stocks": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "code", - "name", - "stocks", - "above" - ], - "type": "object" - }, - "type": "array" - }, - "soxx": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "SOXX holdings percentage above SMA20; null when coverage is insufficient." - }, - "total": { - "description": "Sum of the eleven rounded sector percentages; not a stock count or a percentage.", - "maximum": 1100, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "date", - "total", - "all", - "nasdaq100", - "soxx", - "sectors", - "benchmarks" - ], - "type": "object" - }, - "movingAverage": { - "maximum": 9007199254740991, - "minimum": 1, - "type": "integer" - }, - "priced": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "generatedAt", - "asOf", - "index", - "movingAverage", - "constituents", - "priced", - "latest", - "history" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - } - }, - "required": [ - "error" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "asOf": { + "description": "Latest upstream quote timestamp among priced S&P 500 stocks; not necessarily the latest breadth session date.", + "type": [ + "string", + "null" + ] + }, + "constituents": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "generatedAt": { + "description": "Time this snapshot was calculated; cached responses retain this timestamp.", + "type": "string" + }, + "history": { + "items": { + "additionalProperties": false, + "properties": { + "all": { + "description": "Percentage of eligible S&P 500 stocks above their 20-session simple moving average.", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "date": { + "description": "Trading-session date; use this, not asOf, to identify the reading's session.", + "type": "string" + }, + "nasdaq100": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "Nasdaq-100 percentage above SMA20; null when coverage is insufficient." + }, + "sox": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "PHLX Semiconductor constituent percentage above SMA20; null when coverage is insufficient." + }, + "total": { + "description": "Sum of the eleven rounded sector percentages; not a stock count or a percentage.", + "maximum": 1100, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "date", + "total", + "all", + "nasdaq100", + "sox" + ], + "type": "object" + }, + "type": "array" + }, + "index": { + "type": "string" + }, + "latest": { + "additionalProperties": false, + "properties": { + "all": { + "description": "Percentage of eligible S&P 500 stocks above their 20-session simple moving average.", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "benchmarks": { + "additionalProperties": false, + "properties": { + "NDX": { + "description": "Nasdaq-100 price index level (^NDX); no dividends.", + "type": [ + "number", + "null" + ] + }, + "SOX": { + "description": "PHLX Semiconductor price index level (^SOX); no dividends.", + "type": [ + "number", + "null" + ] + }, + "SPX": { + "description": "S&P 500 price index level (^GSPC); no dividends.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "SPX", + "NDX", + "SOX" + ], + "type": "object" + }, + "date": { + "description": "Trading-session date; use this, not asOf, to identify the reading's session.", + "type": "string" + }, + "nasdaq100": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "Nasdaq-100 percentage above SMA20; null when coverage is insufficient." + }, + "sectors": { + "items": { + "additionalProperties": false, + "properties": { + "above": { + "description": "Percentage of eligible sector stocks above their 20-session simple moving average.", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "code": { + "type": "string" + }, + "name": { + "type": "string" + }, + "stocks": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "code", + "name", + "stocks", + "above" + ], + "type": "object" + }, + "type": "array" + }, + "sox": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "PHLX Semiconductor constituent percentage above SMA20; null when coverage is insufficient." + }, + "total": { + "description": "Sum of the eleven rounded sector percentages; not a stock count or a percentage.", + "maximum": 1100, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "date", + "total", + "all", + "nasdaq100", + "sox", + "sectors", + "benchmarks" + ], + "type": "object" + }, + "movingAverage": { + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + }, + "priced": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "generatedAt", + "asOf", + "index", + "movingAverage", + "constituents", + "priced", + "latest", + "history" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "type": "string" + } + }, + "required": [ + "error" + ], + "type": "object" + } +]
- Added
get_research_decisions
1 tool update
- Added
get_market_breadth
2 tool updates
- Removed
get_service - Changed
read_page1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"Site path from list_pages, e.g. /services/pet-sitting; 1–2048 characters."New value: +"Site path from list_pages, e.g. /indicators; 1–2048 characters."
1 tool update
- Changed
get_research_signals2 fields changed- added
Input schema / properties / tickers / maxLengthAdded value: +3299 - changed
Input schema / properties / tickers / patternPrevious value: -"^[A-Z0-9][A-Z0-9.^-]{0,31}(,[A-Z0-9][A-Z0-9.^-]{0,31}){0,99}$"New value: +"^[A-Z0-9][A-Z0-9.^\\-]{0,31}(,[A-Z0-9][A-Z0-9.^\\-]{0,31})*$"
6 tool updates
- First observed
get_research_signals - First observed
get_service - First observed
list_pages - First observed
list_research_reports - First observed
read_page - First observed
read_research_report
Related MCP Connectors
Crypto/stock trade setups, signal bias, levels, regime, odds. Free track record. Pay per call, x402.
SEC filings, insider trades, 13F, IPO calendar, macro & FX MCP tools via x402.
Research-only MCP server: your AI as a quant research desk. 90 tools, no trades, no brokers.
Pay-per-call research tools for AI agents, paid via x402 USDC. Remote MCP, one free tool.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server for autonomous agents to rug-check tokens, monitor liquidity drains, and get market briefs, with pay-per-call via x402.2MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that exposes 16 free investment-research signals (insider trades, SEC filings, short data, and live quotes) to any MCP-compatible LLM.63 npm103MIT
- AlicenseAqualityDmaintenanceMarket intelligence MCP server enabling AI agents to buy crypto sentiment reads, divergence verdicts, and analyst answers via pay-per-call x402 micropayments on Base.23638 npmMIT
- AlicenseAqualityBmaintenanceAI-powered financial intelligence for autonomous trading agents. 9 MCP tools for real-time trading signals, risk index, market regime detection, stock analysis, commodity scoring, sector radar, and geopolitical intelligence briefings.131MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.