finance-pulse
The Finance Pulse MCP server gives read-only, paged access to structured financial news — statements, developments (topics), themes and sentiment — through 8 tools for search, discovery, trend detection, time-series analysis, screening and reference lookup.
search_statements — search news statements newest-first, filtered by symbol(s) (up to 10, OR), sector, theme_id, topic_id, sentiment, source_type (news/speculative/reddit), minimum importance and ISO-8601 since/until; paginate via cursor, 1–100 per page.
trending — the developments most outlets report right now (last 2 hours) or the top stories of each 2-hour slot over 7 days, with source counts and sentiment; filter by one symbol or a theme.
get_topic — full detail on one development: counts, news/speculative/reddit source mix, its storylines, and its 20 newest statements each with outlet.
find_topics — list developments for a symbol, sector or theme, sorted by velocity (last 24h), size, recency or oldest, with a minimum-statements filter and pagination.
themes — the standing subjects with their development/statement counts, 24-hour volume, distinct sources and sentiment; can be restricted to those a symbol or sector appears in, and their ids feed other tools.
sentiment_series — daily or hourly news volume and sentiment buckets (count, bullish/bearish/neutral, distinct sources, score) for exactly one symbol, sector, theme or topic.
screen — rank symbols or the 11 GICS sectors by news attention over the last day, week or full window, sortable by change, mentions, sources or score, filterable by sector, entity kinds (e.g. equity,etf) and minimum mentions.
reference — the data window and size, known data incidents, theme ids, and accepted sector, sentiment, importance, source-type and entity-kind values.
Provides a metadata tool that returns the data window, known data incidents, theme ids, and accepted filter values.
Can query news statements about Nvidia, including key facts with sources and sentiment analysis.
Requires a RapidAPI key subscribed to Finance Pulse, and all tools make API requests through the RapidAPI platform.
Topic details include reddit statements mixed with news and analysis statements.
Can retrieve Tesla's daily news sentiment and volume for a requested time range.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@finance-pulseWhat is the news saying about Nvidia today? Key facts with sources."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Finance Pulse: Python client and MCP server
Financial news as structured, sourced data. Finance Pulse gives you financial news as statements: one-sentence facts from each article, with sentiment, importance, tickers, sector, source, headline and publication time. Statements about the same development are grouped into topics; one company's topics that continue each other form a storyline; and topics belong to standing themes. fintopic.news is a front page built on the same API.
The same setup guide, with the other guides and the API reference, is on the docs site: Use Finance Pulse from Claude, Cursor or Python.
This package gives you two ways to use it:
a Python client for scripts, notebooks and pipelines;
an MCP server, so Claude, Cursor and other MCP clients can query the news directly.
You need a RapidAPI key that is subscribed to Finance Pulse. Create a RapidAPI account, open the
plans page and subscribe to a plan: there is a free one to
try everything below. Then copy your X-RapidAPI-Key from the API's page on RapidAPI (the endpoint playground shows it). A key that
is not subscribed to a plan is answered with 403.
Use it from Claude or Cursor (MCP)
The server runs with uvx, which is part of uv:
install uv first. The package itself needs no separate install.
Claude Code
claude mcp add --env RAPIDAPI_KEY=YOUR_RAPIDAPI_KEY --transport stdio finance-pulse -- uvx finance-pulseClaude Desktop and Cursor
Claude Desktop: Settings > Developer > Edit Config opens
claude_desktop_config.json(macOS~/Library/Application Support/Claude/, Windows%APPDATA%\Claude\). Quit and restart Claude Desktop completely afterwards.Cursor:
~/.cursor/mcp.json
{
"mcpServers": {
"finance-pulse": {
"command": "uvx",
"args": ["finance-pulse"],
"env": { "RAPIDAPI_KEY": "YOUR_RAPIDAPI_KEY" }
}
}
}If the server does not start in Claude Desktop, it usually cannot find uvx: put the full path (the output of
which uvx, or where uvx on Windows) in "command".
uvx keeps the version it installed first. To move to a new release, use finance-pulse@latest in place of
finance-pulse once, or run uv cache clean finance-pulse.
Then ask things like:
"What is going on with Nvidia? Give me the picture, then the key facts with sources."
"Which tickers are suddenly getting more coverage than yesterday?"
"What are the ongoing stories about Microsoft, and how did the biggest one unfold?"
"What are the top developing stories in Energy, and how did the biggest one grow?"
"Show me Tesla's daily news sentiment for the last two weeks."
Tools
Tool | What it does |
| Everything about one company or other entity in one call: counts and sentiment per period, largest topics, storylines, related entities, newest statements |
| A company's code from its name ("micron" finds |
| Statements by symbol, sector, theme, topic, storyline, sentiment, minimum importance and time range |
| The developments most outlets are reporting right now, or the top of each recent time slot |
| Developments for a symbol, sector, theme or storyline, by velocity, size or recency |
| One development: counts, its mix of news, analysis and reddit statements, its storylines, newest statements with their outlets |
| One company's news grouped into continuing stories: an event, then its follow-ups and reactions |
| One storyline: its topics in order and its newest statements |
| Daily or hourly news volume and sentiment for a symbol, sector, theme or topic |
| Symbols (optionally only equities and ETFs) or sectors ranked by news attention and its change, for the last day, week or any interval |
| The standing subjects with their volume and sentiment, optionally only those a symbol or sector appears in |
| How far back your plan's history goes, counts, theme ids and accepted filter values |
Each tool call is normally one API request. Results are trimmed and come in small pages.
Related MCP server: NewsAgent Data MCP server
Use it from Python
pip install finance-pulse
export RAPIDAPI_KEY=YOUR_RAPIDAPI_KEYThe MCP SDK is installed with the package even if you only use the client.
from datetime import datetime, timedelta, timezone
from finance_pulse import FinancePulse
fp = FinancePulse() # or FinancePulse("YOUR_RAPIDAPI_KEY")
# The newest key facts about a ticker
for s in fp.statements(symbol="NVDA", importance_min="high", limit=5)["data"]:
print(s["published_at"][:16], s["sentiment"], s["statement"], f"({s['source_domain']})")
# One company in one call: counts per period, largest topics, storylines, newest statements
nvda = fp.symbol("NVDA")["data"]
week = nvda["periods"].get("w") # a period without mentions is left out
if week:
print(nvda["name"], week["mentions"], "mentions this week, score", week["score"])
# A company's news as continuing stories
for line in fp.storylines(symbol="MSFT", min_topics=2, sort="mentions", limit=5)["data"]:
print(line["topics"], "topics,", line["mentions"], "mentions:", line["name"])
# Which tickers are suddenly in the news (kind= leaves out rates, central banks, countries, ...)
for row in fp.symbols(period="d", sort="change", kind=["equity", "etf"], limit=10)["data"]:
print(row["id"], row["mentions"], row["change"])
# Daily news volume and sentiment, last two weeks
since = (datetime.now(timezone.utc) - timedelta(days=14)).strftime("%Y-%m-%dT00:00:00Z")
for b in fp.series(symbol="TSLA", interval="day", since=since)["data"]["buckets"]:
print(b["t"][:10], b["count"], b["score"])
# What most outlets are reporting right now
for t in fp.trending(kind="live")["data"][:10]:
print(t["sources"], "sources:", t["name"])Every method returns the API's JSON unchanged: {"data": ..., "next_cursor": ..., "snapshot": {...}}
(iter_statements and poll_feed yield its rows one by one). The
snapshot block carries the times the data refers to (window_start, anchor, lag_days), and every statement
carries published_at and indexed_at.
Follow the news without missing anything
poll_feed yields every new statement in the order it entered the API and keeps its position in a file, so it
survives restarts: after a crash nothing is skipped and only the statement you were working on is delivered
again. The first run, with no saved position, starts at the feed's default starting point (a limited time back,
not the beginning of the data), and the position is first stored once that first page has been handled. After a
long pause the poller reads the whole backlog since its saved position, as far back as your plan's history
reaches, at least one request per 100 statements; delete the cursor file to start afresh instead.
for s in fp.poll_feed(sector="Energy", importance_min="high", cursor_file="energy.cursor.json"):
print(s["indexed_at"], s["statement"], s["source_url"])The poller pauses 150 seconds between polls unless you pass interval=. Every poll is one request (and so is
every retry), so at the default a poller that runs all month makes about 17,000 requests: set interval= to fit
your plan's monthly quota (a month has about 2.6 million seconds; divide by the requests you want to spend on
polling). Timeouts, server errors and a passing 429 (the plan's rate limit, or too many requests at once) are
retried for as long as they last, with a pause that grows to 5 minutes, and each retry is logged as a warning
on the finance_pulse logger. A used-up quota, or a 429 that asks to wait more than 5 minutes, is raised at
once.
More than one page
rows = list(fp.iter_statements(symbol=["NVDA", "AMD"], importance_min="medium", max_items=1000))Each page of 100 is one request (and each retry one more). Without max_items it stops after 500 rows; max_items=None reads to the end
of the data.
Errors
from finance_pulse import FinancePulseError
try:
fp.statements(symbol="S&P")
except FinancePulseError as e:
print(e.status, e.title, e.detail, e.param)
# 400 Invalid symbol 'S&P' is not a ticker symbolA 429 means too many requests: the plan's quota is used up (e.quota_used_up is true), the plan's rate
limit was reached, or too many requests are open at once; the last two usually pass on their own. Send
requests one after another rather than many in parallel. Timeouts and network failures are raised as
FinancePulseError too, with status 0; e.transient is true for those and for 5xx answers. e.retry_after
says how long to wait when the API gives a time.
Single calls raise every error at once. iter_statements retries a page up to five times in a row after a
temporary failure or a passing 429, with a growing pause; poll_feed keeps retrying those for as long as they
last (see above). Both raise at once a used-up quota and a 429 that asks to wait more than 5 minutes.
Methods
Method | Endpoint |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Parameters, response fields and limits are documented in the
API reference, and the guides show complete
worked examples. fp.get("/v2/...", **params) calls any endpoint the client has no method for yet.
What the data is, and is not
Symbols are canonical entity codes with a kind. Equities and ETFs appear under their ticker (
NVDA,0700.HK); indices, rates, currencies, crypto, commodities and organisations under short codes (SPX,USD,BTC,FED). Usekind=["equity", "etf"]for tradable tickers only, andsymbols(q="name", period="window")to find a code.Sentiment describes the statement, not a price forecast. A symbol's sentiment is the count of its statements' labels.
Topics and storylines are grouped automatically and can be wrong or incomplete: a reading aid, not a count of events.
How far back you can read depends on your plan.
window_startin every response says where your history starts andmeta()gives it in days (window_days); older statements are not returned.
See the docs for the full list of caveats.
Development
pip install -e ".[dev]"
pytestThe tests use canned responses and make no API requests.
Releasing
Set the new version in
src/finance_pulse/__init__.pyand inserver.json(two places).Build and upload to PyPI (
uv build && uv publish). From GitHub Actions, usepypa/gh-action-pypi-publishv1.14.2 or newer: older versions reject the metadata version this build writes.Only then run
mcp-publisher publish: the registry verifies the package on PyPI (it looks for themcp-nameline in its description), so the release must be there first.
Licence
MIT
Available Tools
12 toolsfind_symbolFind a symbol's code by nameARead-onlyIdempotent
Look up the code of a company, index, currency, commodity or organisation by name: "micron" finds MU.
The query is matched against codes and registered names, so use the company's own name rather than a brand
(Alphabet, not Google). Returns the matches mentioned within the plan's history, most mentioned first, each
with its code (id), name and kind; an empty list means nothing there matches, and a list as long as limit
may have more matches behind it. Use the code as symbol or code in the other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many matches to return | |
| query | Yes | Part of a name or code, e.g. "micron" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses matching behavior, the important scope constraint that results come only from the plan's history, the ordering (most mentioned first), the returned fields (id, name, kind), and the two edge cases — empty list means no match, list length equal to limit may mean more behind it.
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 core action and the name-vs-brand rule are front-loaded, followed by return shape and edge cases in a compact block. No sentence is redundant, and the truncation and empty-list semantics are packed economically into one clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter lookup with no output schema, the description covers what is searched, what comes back, result ordering, the coverage limitation (plan history), and both boundary cases. An agent can call it and interpret the response without further information.
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, but the description adds genuine semantic meaning: the query matches codes and registered names and should be the company's own name, and a result count equal to limit signals possible truncation. Limit's default/max stay in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('look up the code') and resource (company, index, currency, commodity, organisation), with a concrete example ('micron' finds MU). It is clearly distinguishable from get_symbol, which takes a code rather than resolving one, and the last sentence directs the agent to pass the returned code into the other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real usage guidance: search by the company's registered name, not a brand (Alphabet, not Google), and query against codes or names. It also implies the resolve-then-call pattern for the sibling tools. It does not explicitly name an alternative tool or state when-not to use this one, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_topicsFind developmentsARead-onlyIdempotent
List developments for a symbol, sector, theme or storyline. sort=velocity: most statements in the last 24 hours; size: most statements; recent: latest statement first. symbol: comma-separate several (OR). Topics with fewer than 3 statements are left out unless you lower min_statements, so an empty list can mean "only small ones": retry with min_statements=1. With storyline_id every topic of the storyline is listed by default (sort="oldest" gives them in order).
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | velocity | |
| limit | No | How many to return per call; use the cursor for more | |
| cursor | No | next_cursor from the previous call, for the next page; keep every other argument the same | |
| sector | No | GICS sector | |
| symbol | No | Ticker or entity code, e.g. NVDA. Comma-separate several (OR). | |
| theme_id | No | Theme id from `themes` or `reference` | |
| storyline_id | No | Storyline id, as returned by `storylines`, `get_symbol` or a topic's storylines | |
| min_statements | No | Leave out developments with fewer statements. Default: 3, or 1 with storyline_id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), yet the description still adds non-obvious behavior: the silent 3-statement drop threshold, the fact that an empty result may mean "only small ones", and that a storyline_id query silently changes the default sort. Those are the exact gotchas that would otherwise cause a wrong conclusion from an empty page.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, then each following clause handles one concern (sort, symbols, threshold, storyline default) with no filler or repetition. Dense but every sentence carries a distinct, actionable fact.
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 an 8-parameter, all-optional listing tool with no output schema, the description covers the traps that matter: filtering, threshold behavior, sort semantics, and storyline default ordering. Pagination is deferred entirely to the schema's `cursor`/`limit` descriptions, and the shape of a returned topic is never sketched, which is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (88%), so the baseline is 3, and the description earns the extra point by defining what the bare `sort` enum members actually mean (velocity = most statements in the last 24h, size = most statements, recent = latest first, oldest) — information the schema does not carry. It also reinforces the min_statements default split and the comma-OR behavior for symbol.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ("List developments") plus the four filter axes (symbol, sector, theme, storyline), so an agent knows exactly what the tool returns. It never names a sibling like `trending` or `search_statements` to contrast against, so differentiation from the rest of the family is left to inference.
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?
There is real operational guidance — which sort mode to pick, the 3-statement default threshold, and the explicit recovery step ("retry with min_statements=1") when a list comes back empty. What is missing is tool-selection guidance: nothing says when to reach for this instead of `trending`, `search_statements`, or `storylines`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_storylineGet one storylineARead-onlyIdempotent
One storyline in full: its topics, oldest first (how the story unfolded), and its newest statements.
If topics is larger than the members list, ask again with members at its maximum; for a storyline
longer than that, page through all of them with find_topics(storyline_id=..., sort="oldest"). While the
list is cut, top_topics names the storyline's largest topics.
more_statements says whether it has more statements than shown. If you expect to need them, ask for
statements at its maximum: only then is statements_cursor set, and
search_statements(storyline_id=..., cursor=...) continues exactly after them (add symbol to keep only those
naming the company). With fewer, the cursor is null and search_statements(storyline_id=...) starts again at
the newest, repeating the ones shown here.
| Name | Required | Description | Default |
|---|---|---|---|
| members | No | How many of its topics to list, oldest first | |
| statements | No | How many of its newest statements to include | |
| storyline_id | Yes | Storyline id, as returned by `storylines`, `get_symbol` or a topic's storylines |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world safety. The description adds meaningful behavioral context beyond that: `top_topics` appears only when the members list is cut, `more_statements` indicates truncation, and crucially the cursor is null unless `statements` is at maximum, causing `search_statements` to restart and repeat. That cursor-reset behavior is a subtle trait worth disclosing.
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 front-loaded with the return summary, followed by dense but purposeful paging instructions. Every sentence carries information about output or continuation behavior. It is a single dense paragraph rather than clearly structured subsections, but it avoids true redundancy.
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 no output schema, the description must explain the return shape, and it does: topics (oldest first), newest statements, `top_topics` fallback, `more_statements`, and `statements_cursor`. It does not describe the internal fields of a topic or statement, but for a retrieval tool that is reasonable and likely covered by sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3. The description adds value by explaining the practical consequence of parameter values: `members` at maximum versus paging via `find_topics`, and `statements` at maximum as the only way to obtain `statements_cursor`. It clarifies how parameters interact with returned fields, not just their types.
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 resource (one storyline) and what it returns (topics oldest-first and newest statements), making the detail-view nature clear against the plural `storylines` sibling. It does not explicitly name the list endpoint or `get_topic` as alternatives, so sibling differentiation is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit paging guidance: raise `members` to maximum if topics are truncated, use `find_topics` for longer storylines, and raise `statements` to maximum to get a cursor for `search_statements`. It never says when to choose this over `storylines` or `get_topic`, but the within-call guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_symbolEverything about one symbolARead-onlyIdempotent
One company or other entity in a single call. Use first for "what is going on with X".
Returns who it is (name, kind, exchange); its mentions, topics, distinct sources, sentiment counts and score
for the last 24 hours (d), the last 7 days (w) and all the history the plan includes, with the change
against the period before and the counts over statements that name only this entity (mentions_single, score_single); the
sectors of its statements; its largest topics; its storylines with the most mentions lately; the entities
it shares topics with (related, empty for a rarely mentioned symbol); and its newest statements.
A period without any mention is left out of periods. more_statements says whether the symbol has
more statements than shown. If you expect to need them, ask for statements at its maximum: only then is
statements_cursor set, and search_statements(symbol=..., cursor=...) continues exactly after them. With
fewer, the cursor is null and search_statements(symbol=...) starts again at the newest, repeating the ones
shown here. Do not guess a code: a wrong one costs a request. Look it up with find_symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Ticker or entity code, e.g. NVDA. Non-US tickers carry an exchange suffix (0700.HK). When unsure of the code, call find_symbol first. | |
| topics | No | How many of its largest topics to include | |
| statements | No | How many of its newest statements to include |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, the description discloses important behavior: omitted empty periods, more_statements, the conditional statements_cursor, related being empty for rarely mentioned symbols, and the cost of guessing a code. These details materially affect how an agent invokes and interprets the tool.
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 front-loaded with purpose and then structured around returns and continuation behavior. It is fairly long, but most sentences carry necessary information because there is no output schema; the density is justified, though some return-field enumeration could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex entity-overview tool with no output schema, the description is highly complete: it explains the profile, time-window sentiment, topics, sectors, storylines, related entities, statements, empty-period behavior, and cursor semantics. An agent has enough context to call it correctly and understand the response shape.
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 schema already documents code, topics, and statements. The description still adds meaningful semantics by explaining that only requesting statements at its maximum sets statements_cursor and enables exact continuation, and by reinforcing code lookup via find_symbol when unsure.
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 resource and scope: 'One company or other entity in a single call' and positions it as the first stop for 'what is going on with X'. It then enumerates exactly what is returned, making the tool's purpose unambiguous and distinguishable from lookup-oriented siblings like find_symbol.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this first for entity overview questions, warns against guessing a code and routes to find_symbol, and explains how to continue with search_statements using the returned cursor. These are concrete when-to-use and alternative-tool instructions, not implied guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_topicGet one developmentARead-onlyIdempotent
One development in full: its counts, how many of its statements come from news, speculative analysis and reddit (source_mix), the storylines it belongs to, and its newest statements, each with its outlet and headline. For older statements call search_statements with topic_id and the returned statements_cursor as cursor (null when there are no more).
| Name | Required | Description | Default |
|---|---|---|---|
| topic_id | Yes | Topic (development) id, as returned in topic_id or topics[].id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered structurally. The description adds real value beyond that: it discloses the shape of the payload (counts, source_mix, storylines, newest statements) and the pagination contract, including that the cursor is null when there are no more results.
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 what is returned before the pagination instruction, and no filler. Slightly dense enumeration in the first sentence, but every clause names a distinct returned field.
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 no output schema, the description carries the return-value burden and does so adequately: it names the main payload components and the cursor semantics. It does not say how many statements come back per call or what happens with an invalid or unknown topic_id, which leaves a small gap for a single-parameter detail tool.
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 topic_id description already explains the id format, so the schema carries parameter meaning. The description adds one genuinely useful semantic link — that the returned statements_cursor is an input to search_statements — but says nothing new about topic_id itself; 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?
The description opens with a concrete statement of what is returned: 'One development in full', then enumerates the substance (counts, source_mix, storylines, newest statements with outlet and headline). It also disambiguates the 'topic'/'development' terminology that the tool name leaves ambiguous, so an agent can tell this detail-fetch apart from list/search siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names a specific alternative and the exact handoff: use search_statements with topic_id and the returned statements_cursor to retrieve older statements. That is a clear, actionable routing rule. What's missing is the entry condition (e.g., 'use find_topics first if you only have a name rather than an id'), so it stops just short of full when-to-use coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
referenceHistory reach, counts and accepted valuesARead-onlyIdempotent
What the API holds right now: how far back the plan's history goes (window_days), counts of statements, topics, storylines and symbols, the themes with their ids, and the accepted sector, sentiment, importance, source-type and entity-kind values. One call per conversation is enough.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive behavior. The description adds that the response is a current snapshot and that one call suffices per conversation, but it does not cover auth needs, rate limits, or response format details.
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 front-loaded with the core purpose and then lists distinct returned categories in one dense but waste-free sentence. The short usage note earns its place by preventing redundant calls.
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 zero parameters, no output schema, and annotations covering the safety profile, the description carries the remaining burden well. It enumerates the returned content categories an agent needs to know before calling it.
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, so the baseline is 4. The mention of window_days refers to a returned field, not an input, so there is no schema gap to compensate for.
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 reference resource and enumerates exactly what it returns: history window, counts, themes and accepted values. It clearly distinguishes itself from sibling tools that query actual statements, topics, storylines or symbols.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says 'One call per conversation is enough,' which gives useful frequency guidance, but it does not explicitly say when to use this versus sibling tools or any prerequisites. Usage is implied by the purpose rather than stated with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenScreen symbols or sectors by news attentionARead-onlyIdempotent
Rank symbols (or the GICS sectors) by news attention. Use for "which tickers are suddenly in the news".
period: d = last 24 hours, w = last 7 days, window = all the history the plan includes; or pass since (and
until) to count any interval. sort=change ranks by the rise in mentions against the period (or equally
long interval) before. change is null when there is nothing before to compare with: for period=window,
for an interval given only by until, and for an interval whose preceding interval reaches before the
plan's history. Use sort=mentions then.
Each row: mentions, topics, sources (distinct outlets), sentiment counts, score and change; symbol rows also
carry name, kind and the counts over statements naming only that symbol (mentions_single, score_single).
Only for rank=symbols: sector limits the screen to one sector; min_mentions drops rarely mentioned codes;
entity_kinds narrows the kind of entity (reference lists the kinds). Without it the list mixes companies
with rates, commodities and central banks; pass "equity,etf" for tradable tickers.
| Name | Required | Description | Default |
|---|---|---|---|
| rank | No | symbols | |
| sort | No | change | |
| limit | No | How many rows to return | |
| since | No | Start of a custom interval (ISO-8601) to count instead of `period` | |
| until | No | End of the custom interval (ISO-8601); omit for up to now | |
| period | No | d = last 24 hours, w = last 7 days, window = all the history the plan includes | d |
| sector | No | GICS sector | |
| entity_kinds | No | Comma-separated entity kinds from: equity, etf, index, rate, fx, crypto, commodity, org, private, country. E.g. "equity,etf" | |
| min_mentions | No | Leave out codes with fewer mentions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), but the description adds substantive behavior beyond them: the exact conditions under which `change` is null and the recommended fallback, and the caveat that without entity_kinds the list mixes companies with rates, commodities and central banks. It also enumerates what each returned row contains, which matters because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the key "when" are front-loaded, and nearly every clause carries new information. Some sentences are dense run-ons, particularly the null-change enumeration, which costs one read to parse but does earn 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?
With nine parameters, no output schema and no required fields, the description does the important work: row shape, default-mixing caveat, cross-parameter scope (sector only with rank=symbols), and null semantics. Minor gaps remain around ordering of results and how `limit` interacts with min_mentions filtering, but nothing an agent needs in order to call it correctly is absent.
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?
It adds real meaning over the schema — sort=change semantics, the null-change conditions, that sector applies only when rank=symbols, and what min_mentions filters out. But schema coverage is already 78%, so much of this (period, since/until, sector, entity_kinds) is partly redundant with the schema descriptions, and `limit` is untouched. Solid but largely reinforcing existing field docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb (rank), a specific resource (symbols or GICS sectors) and the ranking axis (news attention), plus a concrete question it answers: "which tickers are suddenly in the news". That framing distinguishes it immediately from siblings like search_statements, get_symbol, or sentiment_series.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear contextual guidance: use it for sudden news attention, pick period vs since/until for the interval, and explicitly says "Use sort=mentions" when `change` is null. It also advises passing entity_kinds="equity,etf" for tradable tickers. What's missing is explicit routing against siblings — notably how it differs from `trending`, which overlaps on the 'what's hot now' use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_statementsSearch news statementsARead-onlyIdempotent
Search news statements, newest first. Use for "what is the news saying about X".
symbol: ticker or entity code, e.g. NVDA; comma-separate several (OR), no spaces inside a code. importance_min=high keeps only key facts. source_type=news leaves out speculative analysis and reddit. storyline_id: every statement of that storyline's topics; add symbol for only those naming its company. since/until: ISO-8601 times on the article's publication time, e.g. 2026-10-01T00:00:00Z. Each statement has its source, the article's headline and its topic. Pass next_cursor back as cursor for the next page (null means no more).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many to return per call; use the cursor for more | |
| since | No | ISO-8601 time, e.g. 2026-10-01T00:00:00Z | |
| until | No | ISO-8601 time, e.g. 2026-10-01T00:00:00Z | |
| cursor | No | next_cursor from the previous call, for the next page; keep every other argument the same | |
| sector | No | GICS sector | |
| symbol | No | Ticker or entity code, e.g. NVDA. Comma-separate several (OR). | |
| theme_id | No | Theme id from `themes` or `reference` | |
| topic_id | No | Topic (development) id, as returned in topic_id or topics[].id | |
| sentiment | No | Only statements with this sentiment | |
| source_type | No | One of: news, speculative, reddit. news leaves out speculative analysis and reddit | |
| storyline_id | No | Storyline id, as returned by `storylines`, `get_symbol` or a topic's storylines | |
| importance_min | No | Minimum importance; high = key facts only |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent profile, so the description sensibly spends its space on behavior beyond safety: newest-first ordering, cursor-based pagination with next_cursor/cursor, and a summary of what each statement contains (source, headline, topic). It does not mention result-size limits or any auth/rate-limit context, but for a read-only search tool this is solid coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and use case are front-loaded in the first sentence, and the remaining lines are a compact parameter cheat-sheet. A few lines duplicate schema wording (source_type, importance_min) rather than adding new information, which is minor waste but not damaging.
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 12 optional parameters, no output schema, and full schema descriptions, the description covers the non-obvious behaviors an agent needs: ordering, cursor pagination with the exact handoff mechanism, return-content shape, and the subtle storyline_id/symbol interaction. The remaining filters (sector, theme_id, topic_id, sentiment, limit) are fully described in the schema, so nothing critical 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 coverage is 100%, so the baseline is 3; the description earns extra credit by adding meaning beyond the schema: 'no spaces inside a code' for symbol, the exact interaction between storyline_id and symbol ('add symbol for only those naming its company'), and the clarification that since/until apply to the article's publication time. Several other sentences merely restate schema text (source_type, importance_min), which keeps it from a 5.
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 opens with a specific verb and resource ('Search news statements') and adds an ordering guarantee ('newest first'), then anchors the purpose in a concrete use case ('what is the news saying about X'). That use-case framing implicitly distinguishes it from siblings like sentiment_series, trending, and the topic/storyline lookup tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage trigger and explains how specific filters change results (importance_min=high for key facts, source_type=news to exclude speculative/reddit, storyline_id combined with symbol to narrow to a company). It does not explicitly name when to use a sibling instead, so it stops short of a full when/when-not framework.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sentiment_seriesNews volume and sentiment over timeARead-onlyIdempotent
News volume and sentiment over time for exactly one of symbol, sector, theme_id or topic_id.
Each bucket: t (UTC start), count, bullish, bearish, neutral, sources (distinct outlets) and score = (bullish - bearish) / count. Buckets with no statements are omitted here. The last bucket is usually the current, still incomplete day or hour: do not read a low last bucket as a drop. interval=hour is for short ranges: pass since/until, and if the range is too long the error says the maximum.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ISO-8601 time, e.g. 2026-10-01T00:00:00Z | |
| until | No | ISO-8601 time, e.g. 2026-10-01T00:00:00Z | |
| sector | No | GICS sector | |
| symbol | No | One ticker or entity code, e.g. NVDA | |
| interval | No | day | |
| theme_id | No | Theme id from `themes` or `reference` | |
| topic_id | No | Topic (development) id, as returned in topic_id or topics[].id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the read-only/idempotent annotations by documenting bucket contents, the score formula, that empty buckets are omitted, and the important caveat that the last bucket is a partial day/hour and must not be read as a drop. It also discloses the failure mode for oversized ranges (error states the maximum), which is exactly the kind of behavior an agent cannot get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and the selector constraint, then the bucket shape, then the two caveats — a logical ordering with no filler sentences. Slightly dense and line-broken mid-thought, but 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?
With no output schema, the description does the work of explaining the returned bucket fields and score formula, and it flags the partial-last-bucket pitfall. It leaves gaps on the default range when since/until are omitted and on what happens if zero or multiple selectors are supplied.
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 86%, so the baseline is 3; the description earns above that by adding the cross-parameter constraint 'exactly one of symbol, sector, theme_id or topic_id', which the zero-required-parameter schema does not encode at all. It also adds meaning to interval that the bare enum lacks (hour only for short ranges).
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 resource and shape: 'News volume and sentiment over time' for exactly one of four entity keys, which tells an agent precisely what comes back. It does not compare itself to siblings like search_statements or trending, so the agent must infer that this is the time-series aggregation rather than the raw statement search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives one concrete usage rule — 'interval=hour is for short ranges: pass since/until' — plus the self-healing hint that the error message reports the maximum range. It never says when to prefer this over search_statements or how to pick among symbol/sector/theme_id/topic_id beyond 'exactly one', leaving the main routing decision implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storylinesOne symbol's storylinesARead-onlyIdempotent
One company's news grouped into continuing stories: an event, then its follow-ups, reactions and consequences. Use for "how did the X story unfold" or "what are the ongoing stories about X".
By default only storylines with two or more topics are listed: an empty list means
"none with several topics", so pass min_topics=1 to see the single-topic ones.
Each storyline has a name (one of its topics' names), first_seen and last_seen, its number of topics,
statements and mentions (statements naming the symbol), distinct sources, sentiment counts of the mentions,
top_topics (its largest topics; that is all of them when topics is no larger than the list) and related:
storylines of other symbols that share topics with it. Storylines belong to one symbol, so news about two
companies appears under each. The grouping is automatic and can be wrong or incomplete, and one real story
can be split over several storylines: a reading aid, not a count of events. Call get_storyline when you
need every topic in order or the statements.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | recent = newest statement; mentions; topics; velocity = mentions in the last 24 hours | recent |
| limit | No | How many to return per call; use the cursor for more | |
| cursor | No | next_cursor from the previous call, for the next page; keep every other argument the same | |
| symbol | Yes | Exactly one ticker or entity code, e.g. MSFT | |
| min_topics | No | Only storylines with at least this many topics; 1 also lists single-topic ones |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), and the description adds substantial behavioral context on top: the default min_topics=2 filter and what an empty list means, the automatic grouping's unreliability, story splitting, and the framing as 'a reading aid, not a count of events'. That caveat materially changes how an agent should trust and present results.
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?
Dense but front-loaded: purpose first, then the default-filter gotcha, then return shape and caveats. The return-field enumeration is long but earns its place because there is no output 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 no output schema, the description supplies the return fields (name, first_seen, last_seen, topic/statement/mention counts, sources, sentiment, top_topics, related) plus the caveats an agent needs to interpret them. Nothing essential for correct invocation or result interpretation 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 coverage is 100%, so the baseline is 3, but the description adds real meaning for min_topics (default hides single-topic storylines; pass 1 to see them), which the schema only states mechanically. Minor deduction for referencing a `topics` parameter that doesn't exist in the schema when explaining top_topics.
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+resource+scope: one company's news grouped into continuing stories (an event plus follow-ups, reactions, consequences). It also distinguishes itself from the sibling get_storyline by naming the case where that tool is needed (every topic in order, or the statements).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrases ('how did the X story unfold', 'what are the ongoing stories about X') and routes to get_storyline for finer detail. It doesn't explicitly exclude other siblings like search_statements or find_topics, so it stops short of a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
themesThemesARead-onlyIdempotent
The standing subjects the news is grouped into, each with its number of developments and statements, 24-hour volume, distinct sources and sentiment counts. With symbol or sector: only the themes that have statements about it; the counts are still those of the whole theme, so use search_statements with theme_id and symbol for the symbol's own statements. Use the returned id as theme_id in the other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | size = statements; topics = developments; recent = last statement; velocity = statements in the last 24 hours | size |
| sector | No | GICS sector | |
| symbol | No | Ticker or entity code, e.g. NVDA. Comma-separate several (OR). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds the non-obvious semantic that filtered counts are still whole-theme counts, which prevents a real misinterpretation; it does not mention pagination or result-size limits, keeping it short of a 5.
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 what the tool returns, then the filtering caveat, then the id-reuse instruction. Slightly dense and run-on in the middle clause, but every sentence carries necessary information with no 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?
With no output schema, the description usefully enumerates the returned fields and explains the filter semantics and id handoff. It stops short of describing item structure or ordering guarantees for the sort options, but nothing critical to invoking the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the sort enum values are already documented in the schema. The description still adds meaning the schema lacks: what symbol/sector filtering actually does and that the counts are not narrowed by it, which is the main semantic trap for these parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific resource (standing news themes) and what each item carries — developments, statements, 24-hour volume, distinct sources, sentiment counts — so an agent knows exactly what it gets back. It is clearly distinct from sibling listing tools like find_topics or trending.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditional behavior for symbol/sector ('only the themes that have statements about it') and routes the agent to the correct alternative when per-symbol statements are needed: 'use search_statements with theme_id and symbol'. It also tells the agent to reuse the returned id as theme_id in other tools, which is real workflow guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trendingTrending developmentsARead-onlyIdempotent
The developments most outlets are reporting. Use for "what is moving / what is the big news right now".
kind=live: the current list. kind=slot: the top stories of each recent time slot, newest slot first. Each
item's trending holds its three newest labels (the live list or a slot's start, the rank and the number
of sources there); trending_labels is how many labels it has in all. The slot list is long (total):
narrow it with symbol or theme_id rather than asking for all of it.
For a whole day rather than right now, use find_topics with sort=velocity (statements in the last 24 hours).
Each item has its distinct source count, sentiment counts and newest statement. symbol: one code only.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | live = what is most reported right now; slot = the top of each recent time slot | live |
| limit | No | How many to return, taken from the top of the API's ranking; `total` in the result says how many there are | |
| symbol | No | One ticker or entity code, e.g. NVDA | |
| theme_id | No | Theme id from `themes` or `reference` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the description's added value is the cost/shape warning that the slot list is long and should be narrowed, plus the item content (source counts, sentiment counts, newest statement). With no output schema, disclosing the `trending` vs. `trending_labels` distinction and the `total` field is genuinely useful. It stops short of pagination or ordering edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and every topic is relevant, but the body interleaves kind semantics, return-shape detail, an alternative-tool pointer, and item field definitions without clear ordering. The trailing fragment 'symbol: one code only.' reads as an orphaned patch rather than intentional structure.
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 no output schema, the description steps in to explain the returned fields and the `total` indicator, which is the main gap it needed to fill for a 4-parameter read tool. Behavior of conflicting filters (symbol plus theme_id) and how `limit` interacts with `total` are left implicit.
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, and the description goes beyond it by advising which parameters to use to avoid pulling the full slot list and by noting symbol accepts 'one code only'. The `kind` semantics in the description largely restate the schema's own enum descriptions, so the gain is modest rather than transformative.
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 the resource and scope precisely: 'The developments most outlets are reporting', plus a plain-language gloss ('what is moving / what is the big news right now'). It also differentiates the two modes (live list vs. top of each recent slot). The only softness is that 'developments' is a domain term never defined, so an agent must infer it from the described item fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('what is moving right now'), an explicit alternative with the condition that selects it ('For a whole day rather than right now, use find_topics with sort=velocity'), and a scoping instruction ('narrow it with symbol or theme_id rather than asking for all of it'). All three when/when-not/alternative dimensions are covered.
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.
10 tool updates
v0.2.1- Added
find_symbol - Changed
find_topics10 fields changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"next_cursor from the previous call, for the next page"New value: +"next_cursor from the previous call, for the next page; keep every other argument the same" - changed
Input schema / properties / limit / descriptionPrevious value: -"How many to return, 1-100"New value: +"How many to return per call; use the cursor for more" - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +50 - added
Input schema / properties / min_statements / anyOfAdded value: +[ + { + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / min_statements / defaultPrevious value: -3New value: +null - changed
Input schema / properties / min_statements / descriptionPrevious value: -"Leave out developments with fewer statements"New value: +"Leave out developments with fewer statements. Default: 3, or 1 with storyline_id" - removed
Input schema / properties / min_statements / minimumRemoved value: -1 - removed
Input schema / properties / min_statements / typeRemoved value: -"integer" - added
Input schema / properties / storyline_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Storyline id, as returned by `storylines`, `get_symbol` or a topic's storylines", + "title": "Storyline Id" +} - changed
Input schema / properties / symbol / descriptionPrevious value: -"Ticker or entity code, e.g. NVDA. Comma-separate several (OR), up to 10."New value: +"Ticker or entity code, e.g. NVDA. Comma-separate several (OR)."
- Added
get_storyline - Added
get_symbol - Changed
get_topic1 field changed- added
Input schema / properties / topic_id / minLengthAdded value: +1
- Changed
screen5 fields changed- changed
Input schema / properties / entity_kinds / descriptionPrevious value: -"Comma-separated entity kinds, e.g. \"equity,etf\""New value: +"Comma-separated entity kinds from: equity, etf, index, rate, fx, crypto, commodity, org, private, country. E.g. \"equity,etf\"" - changed
Input schema / properties / limit / maximumPrevious value: -500New value: +100 - changed
Input schema / properties / period / descriptionPrevious value: -"d = 24 hours, w = 7 days, window = everything held"New value: +"d = last 24 hours, w = last 7 days, window = all the history the plan includes" - added
Input schema / properties / sinceAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Start of a custom interval (ISO-8601) to count instead of `period`", + "title": "Since" +} - added
Input schema / properties / untilAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "End of the custom interval (ISO-8601); omit for up to now", + "title": "Until" +}
- Changed
search_statements7 fields changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"next_cursor from the previous call, for the next page"New value: +"next_cursor from the previous call, for the next page; keep every other argument the same" - changed
Input schema / properties / limit / descriptionPrevious value: -"How many to return, 1-100"New value: +"How many to return per call; use the cursor for more" - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +50 - changed
Input schema / properties / source_type / anyOfPrevious value: -[ - { - "enum": [ - "news", - "speculative", - "reddit" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / source_type / descriptionPrevious value: -"news leaves out speculative analysis and reddit"New value: +"One of: news, speculative, reddit. news leaves out speculative analysis and reddit" - added
Input schema / properties / storyline_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Storyline id, as returned by `storylines`, `get_symbol` or a topic's storylines", + "title": "Storyline Id" +} - changed
Input schema / properties / symbol / descriptionPrevious value: -"Ticker or entity code, e.g. NVDA. Comma-separate several (OR), up to 10."New value: +"Ticker or entity code, e.g. NVDA. Comma-separate several (OR)."
- Added
storylines - Changed
themes1 field changed- changed
Input schema / properties / symbol / descriptionPrevious value: -"Ticker or entity code, e.g. NVDA. Comma-separate several (OR), up to 10."New value: +"Ticker or entity code, e.g. NVDA. Comma-separate several (OR)."
- Changed
trending2 fields changed- changed
Input schema / properties / kind / descriptionPrevious value: -"live = last 2 hours; slot = 2-hour slots over 7 days"New value: +"live = what is most reported right now; slot = the top of each recent time slot" - changed
Input schema / properties / limit / maximumPrevious value: -300New value: +30
8 tool updates
v0.1.0- First observed
find_topics - First observed
get_topic - First observed
reference - First observed
screen - First observed
search_statements - First observed
sentiment_series - First observed
themes - First observed
trending
TDQS
Scored across 12 tools
The set follows a clear list/detail and entity/aggregate split (find_topics vs get_topic, storylines vs get_storyline), and descriptions carefully delineate overlapping cases like trending vs find_topics(sort=velocity). The remaining ambiguity is in the three-tier conceptual hierarchy (themes vs topics vs storylines) and the get_symbol vs find_symbol pair, where naming alone doesn't signal 'profile' vs 'code lookup'.
All snake_case and readable, but conventions are mixed: verb_noun forms (search_statements, get_symbol, find_symbol, get_topic, get_storyline) coexist with bare nouns (screen, trending, themes, storylines, reference). The find_/get_ prefix on the same resource (find_symbol vs get_symbol) is the least predictable part.
12 tools is well within the ideal range, and each earns its place: discovery, search, per-entity profile, three aggregation views, and a topic/storyline navigation pair with detail counterparts. No redundant or filler tools are visible.
The surface covers the full read lifecycle for a news-analytics domain: reference/discovery, search with pagination and cursors, entity profiles, screening, time-series sentiment, themes, topics and storylines, all with detail drill-downs. Gaps are minor — no way to retrieve a full article/original statement body, and no cross-entity comparison tool beyond screen.
Maintenance
Related MCP Connectors
Get access to real-time and historical news data including top headlines from global sources
Real-time news search across 500,000+ sources in 60+ languages with sentiment and entities.
The only News based AI MCP your agents will ever need — custom categories, global regions, and time-scoped results in one tool. We use multi-vector & sparse-hybrid search to search through thousands of articles across the world to find the exact news you're looking for.
Live global news signals: ranked wire, story timelines, coverage volume/tone/surges. Free, no auth.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables access to real-time news articles through search, topic headlines, full story coverage, and geo-based local news across multiple countries and languages using the Real Time News Data API.7MIT
- AlicenseAqualityCmaintenanceEnables querying scored and classified Russian and English news via MCP clients, offering filtered feeds, keyword search, breaking news, and coverage stats.51MIT
- AlicenseAqualityBmaintenanceProvides news sentiment scores and media volume trends for any topic, enabling AI assistants to analyze whether news coverage is positive or negative.31MIT
- AlicenseNot gradedqualityBmaintenanceEnables agents to discover supported news topics, read source-linked articles, and retrieve changes from a saved cursor. It exposes standard Streamable HTTP MCP tools alongside the news API endpoints for fresh news ingestion and reliable updates.1 npm1MIT