Skip to main content
Glama
SlothyAfk

finance-pulse

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-pulse

Claude 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

get_symbol

Everything about one company or other entity in one call: counts and sentiment per period, largest topics, storylines, related entities, newest statements

find_symbol

A company's code from its name ("micron" finds MU)

search_statements

Statements by symbol, sector, theme, topic, storyline, sentiment, minimum importance and time range

trending

The developments most outlets are reporting right now, or the top of each recent time slot

find_topics

Developments for a symbol, sector, theme or storyline, by velocity, size or recency

get_topic

One development: counts, its mix of news, analysis and reddit statements, its storylines, newest statements with their outlets

storylines

One company's news grouped into continuing stories: an event, then its follow-ups and reactions

get_storyline

One storyline: its topics in order and its newest statements

sentiment_series

Daily or hourly news volume and sentiment for a symbol, sector, theme or topic

screen

Symbols (optionally only equities and ETFs) or sectors ranked by news attention and its change, for the last day, week or any interval

themes

The standing subjects with their volume and sentiment, optionally only those a symbol or sector appears in

reference

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_KEY

The 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 symbol

A 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

statements, iter_statements, statement

/v2/statements, /v2/statements/{id}

feed, poll_feed

/v2/feed

series

/v2/series

symbols, symbol, sectors

/v2/symbols, /v2/symbols/{code}, /v2/sectors

trending

/v2/trending

topics, topic

/v2/topics, /v2/topics/{id}

storylines, storyline

/v2/storylines, /v2/storylines/{id}

themes, theme

/v2/themes, /v2/themes/{id}

meta

/v2/meta

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). Use kind=["equity", "etf"] for tradable tickers only, and symbols(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_start in every response says where your history starts and meta() 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]"
pytest

The tests use canned responses and make no API requests.

Releasing

  1. Set the new version in src/finance_pulse/__init__.py and in server.json (two places).

  2. Build and upload to PyPI (uv build && uv publish). From GitHub Actions, use pypa/gh-action-pypi-publish v1.14.2 or newer: older versions reject the metadata version this build writes.

  3. Only then run mcp-publisher publish: the registry verifies the package on PyPI (it looks for the mcp-name line in its description), so the release must be there first.

Licence

MIT

Available Tools

12 tools
find_symbolFind a symbol's code by nameA
Read-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.

NameRequiredDescriptionDefault
limitNoHow many matches to return
queryYesPart of a name or code, e.g. "micron"

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines4/5

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 developmentsA
Read-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).

NameRequiredDescriptionDefault
sortNovelocity
limitNoHow many to return per call; use the cursor for more
cursorNonext_cursor from the previous call, for the next page; keep every other argument the same
sectorNoGICS sector
symbolNoTicker or entity code, e.g. NVDA. Comma-separate several (OR).
theme_idNoTheme id from `themes` or `reference`
storyline_idNoStoryline id, as returned by `storylines`, `get_symbol` or a topic's storylines
min_statementsNoLeave out developments with fewer statements. Default: 3, or 1 with storyline_id

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 storylineA
Read-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.

NameRequiredDescriptionDefault
membersNoHow many of its topics to list, oldest first
statementsNoHow many of its newest statements to include
storyline_idYesStoryline id, as returned by `storylines`, `get_symbol` or a topic's storylines

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 symbolA
Read-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.

NameRequiredDescriptionDefault
codeYesTicker or entity code, e.g. NVDA. Non-US tickers carry an exchange suffix (0700.HK). When unsure of the code, call find_symbol first.
topicsNoHow many of its largest topics to include
statementsNoHow many of its newest statements to include

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 developmentA
Read-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).

NameRequiredDescriptionDefault
topic_idYesTopic (development) id, as returned in topic_id or topics[].id

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 valuesA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 attentionA
Read-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.

NameRequiredDescriptionDefault
rankNosymbols
sortNochange
limitNoHow many rows to return
sinceNoStart of a custom interval (ISO-8601) to count instead of `period`
untilNoEnd of the custom interval (ISO-8601); omit for up to now
periodNod = last 24 hours, w = last 7 days, window = all the history the plan includesd
sectorNoGICS sector
entity_kindsNoComma-separated entity kinds from: equity, etf, index, rate, fx, crypto, commodity, org, private, country. E.g. "equity,etf"
min_mentionsNoLeave out codes with fewer mentions

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

The opening sentence gives a specific verb (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.

Usage Guidelines4/5

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 statementsA
Read-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).

NameRequiredDescriptionDefault
limitNoHow many to return per call; use the cursor for more
sinceNoISO-8601 time, e.g. 2026-10-01T00:00:00Z
untilNoISO-8601 time, e.g. 2026-10-01T00:00:00Z
cursorNonext_cursor from the previous call, for the next page; keep every other argument the same
sectorNoGICS sector
symbolNoTicker or entity code, e.g. NVDA. Comma-separate several (OR).
theme_idNoTheme id from `themes` or `reference`
topic_idNoTopic (development) id, as returned in topic_id or topics[].id
sentimentNoOnly statements with this sentiment
source_typeNoOne of: news, speculative, reddit. news leaves out speculative analysis and reddit
storyline_idNoStoryline id, as returned by `storylines`, `get_symbol` or a topic's storylines
importance_minNoMinimum importance; high = key facts only

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description 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.

Purpose5/5

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

The description opens with a specific verb and resource ('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.

Usage Guidelines4/5

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 timeA
Read-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.

NameRequiredDescriptionDefault
sinceNoISO-8601 time, e.g. 2026-10-01T00:00:00Z
untilNoISO-8601 time, e.g. 2026-10-01T00:00:00Z
sectorNoGICS sector
symbolNoOne ticker or entity code, e.g. NVDA
intervalNoday
theme_idNoTheme id from `themes` or `reference`
topic_idNoTopic (development) id, as returned in topic_id or topics[].id

TDQS

A4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 storylinesA
Read-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.

NameRequiredDescriptionDefault
sortNorecent = newest statement; mentions; topics; velocity = mentions in the last 24 hoursrecent
limitNoHow many to return per call; use the cursor for more
cursorNonext_cursor from the previous call, for the next page; keep every other argument the same
symbolYesExactly one ticker or entity code, e.g. MSFT
min_topicsNoOnly storylines with at least this many topics; 1 also lists single-topic ones

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

themesThemesA
Read-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.

NameRequiredDescriptionDefault
sortNosize = statements; topics = developments; recent = last statement; velocity = statements in the last 24 hourssize
sectorNoGICS sector
symbolNoTicker or entity code, e.g. NVDA. Comma-separate several (OR).

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Tool Schema Changelog

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

  1. 10 tool updatesv0.2.1
    • Addedfind_symbol
    • Changedfind_topics10 fields changed
      • changedInput schema / properties / cursor / description
        Previous 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"
      • changedInput schema / properties / limit / description
        Previous value: -"How many to return, 1-100"New value: +"How many to return per call; use the cursor for more"
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +50
      • addedInput schema / properties / min_statements / anyOf
        Added value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / min_statements / default
        Previous value: -3New value: +null
      • changedInput schema / properties / min_statements / description
        Previous value: -"Leave out developments with fewer statements"New value: +"Leave out developments with fewer statements. Default: 3, or 1 with storyline_id"
      • removedInput schema / properties / min_statements / minimum
        Removed value: -1
      • removedInput schema / properties / min_statements / type
        Removed value: -"integer"
      • addedInput schema / properties / storyline_id
        Added 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"
        +}
      • changedInput schema / properties / symbol / description
        Previous 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)."
    • Addedget_storyline
    • Addedget_symbol
    • Changedget_topic1 field changed
      • addedInput schema / properties / topic_id / minLength
        Added value: +1
    • Changedscreen5 fields changed
      • changedInput schema / properties / entity_kinds / description
        Previous 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\""
      • changedInput schema / properties / limit / maximum
        Previous value: -500New value: +100
      • changedInput schema / properties / period / description
        Previous 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"
      • addedInput schema / properties / since
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Start of a custom interval (ISO-8601) to count instead of `period`",
        +  "title": "Since"
        +}
      • addedInput schema / properties / until
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "End of the custom interval (ISO-8601); omit for up to now",
        +  "title": "Until"
        +}
    • Changedsearch_statements7 fields changed
      • changedInput schema / properties / cursor / description
        Previous 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"
      • changedInput schema / properties / limit / description
        Previous value: -"How many to return, 1-100"New value: +"How many to return per call; use the cursor for more"
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +50
      • changedInput schema / properties / source_type / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "news",
        -      "speculative",
        -      "reddit"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / source_type / description
        Previous value: -"news leaves out speculative analysis and reddit"New value: +"One of: news, speculative, reddit. news leaves out speculative analysis and reddit"
      • addedInput schema / properties / storyline_id
        Added 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"
        +}
      • changedInput schema / properties / symbol / description
        Previous 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)."
    • Addedstorylines
    • Changedthemes1 field changed
      • changedInput schema / properties / symbol / description
        Previous 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)."
    • Changedtrending2 fields changed
      • changedInput schema / properties / kind / description
        Previous 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"
      • changedInput schema / properties / limit / maximum
        Previous value: -300New value: +30
  2. 8 tool updatesv0.1.0
    • First observedfind_topics
    • First observedget_topic
    • First observedreference
    • First observedscreen
    • First observedsearch_statements
    • First observedsentiment_series
    • First observedthemes
    • First observedtrending

TDQS

A4.1/5.0

Scored across 12 tools

Disambiguation4/5

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'.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables 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.
    7
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables querying scored and classified Russian and English news via MCP clients, offering filtered feeds, keyword search, breaking news, and coverage stats.
    5
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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 npm
    1
    MIT