Skip to main content
Glama
SlothyAfk

finance-pulse

by SlothyAfk

Finance Pulse: Python client and MCP server

Financial news as structured, sourced data. Finance Pulse reads financial news as it is published and turns every article into statements: one-sentence facts with sentiment, importance, tickers, sector, source and publication time. Statements about the same development are clustered into topics, and topics into 19 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: Basic is free and is enough 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 the news saying about Nvidia today? Only the key facts, with sources."

  • "Which tickers are suddenly getting more coverage than yesterday?"

  • "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

search_statements

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

trending

The developments most outlets are reporting now, or per 2-hour slot over 7 days

find_topics

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

get_topic

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

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 against the previous period

themes

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

reference

The data window, known data incidents, theme ids and accepted filter values

Each tool call is one API request. Results are trimmed and default to 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']})")

# 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": {...}}. The snapshot block says how fresh the data is.

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 24 hours back, 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, one request per 100 statements; delete the cursor file to start 24 hours back 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 API builds new data about every 2.5 minutes, so the poller waits 150 seconds between polls by default. Timeouts and server errors are retried; a used-up quota (429) is raised.

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. Without max_items it stops after 500 rows; max_items=None reads to the end of the window.

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 the plan's request quota or rate limit is used up. Timeouts and network failures are raised as FinancePulseError too, with status 0; e.transient is true for those and for 5xx answers.

Methods

Method

Endpoint

statements, iter_statements, statement

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

feed, poll_feed

/v2/feed

series

/v2/series

symbols, sectors

/v2/symbols, /v2/sectors

trending

/v2/trending

topics, topic

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

themes, theme

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

meta

/v2/meta

The package targets Finance Pulse API 2.0 (the /v2 endpoints). Parameters and response fields are documented in the API reference, and the guides show complete worked examples.

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, FX, crypto, commodities and organisations under short codes (SPX, US10Y, USD, BTC, GOLD, FED). Use kind=["equity", "etf"] for tradable tickers only.

  • Sentiment describes the statement, not a price forecast. A symbol's sentiment is the count of its statements' labels.

  • The window is a rolling 62 days. meta() lists known outages and delays under incidents.

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

8 tools
find_topicsFind developmentsB
Read-onlyIdempotent

List developments for a symbol, sector or theme. sort=velocity: most statements in the last 24 hours; size: most statements in the window; recent: latest statement first. symbol: comma-separate several (OR).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNovelocity
limitNoHow many to return, 1-100
cursorNonext_cursor from the previous call, for the next page
sectorNoGICS sector
symbolNoTicker or entity code, e.g. NVDA. Comma-separate several (OR), up to 10.
theme_idNoTheme id from `themes` or `reference`
min_statementsNoLeave out developments with fewer statements

TDQS

B3.4/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, so the safety profile is covered. The description adds the sort semantics (velocity = 24h statements, size = window statements) which is useful behavioral context, but says nothing about result volume, pagination, or rate limits.

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?

Four short clauses, all front-loaded: purpose first, then the sort semantics, then the symbol syntax. No filler sentences and nothing repeated from the schema.

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

Completeness3/5

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

For a 7-parameter discovery tool with no output schema, the description covers purpose and sorting but leaves pagination (cursor), result shape, and the relationship to sibling search tools unexplained. Adequate to make a call, incomplete for calling it well.

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, but the description genuinely adds meaning the schema lacks: the sort enum values (recent/size/velocity) are undocumented in the schema and are explained here, and the comma-separated OR behavior for symbol is clarified. It omits the 'oldest' sort value and says nothing about limit, cursor, or min_statements.

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 verb ('List') and resource ('developments') with the three scoping axes (symbol, sector, theme). It does not differentiate itself from the sibling get_topic, which reads like the singular counterpart, so an agent cannot fully disambiguate from the description alone.

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

Usage Guidelines2/5

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

No statement of when to use this tool versus search_statements, trending, or get_topic, and no exclusions or prerequisites. The sort explanations describe behavior of the call, not when the call is the right choice.

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), and its 20 newest statements, each with its outlet. For older statements call search_statements with topic_id and the returned statements_cursor as cursor.

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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description goes beyond them by disclosing the return shape (counts, source_mix breakdown, 20 statements with outlets) and the pagination mechanism via statements_cursor, which is genuinely useful behavioral context.

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?

Two sentences, zero filler, and the primary scope (what is returned) is front-loaded before the fallback routing to search_statements. Every clause carries information.

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 carries the return-value burden and does so: it names counts, the source_mix composition, the 20-statement cap, and the cursor for deeper retrieval. For a single-param read tool this is sufficient for correct invocation.

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?

There is a single parameter with 100% schema description coverage, which already explains topic_id and where it comes from. The description only implies the topic via 'one development' and adds no syntax or format detail beyond the schema, so 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?

States a specific verb and resource (retrieve one development in full) and enumerates what comes back: counts, source_mix, and the 20 newest statements. It also names the sibling (search_statements) it is not, so an agent can separate it from the other topic tools without opening schemas.

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

Usage Guidelines5/5

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

Explicitly scopes this tool to the 20 newest statements and routes older-statement retrieval to search_statements, including the exact arguments to pass (topic_id and the returned statements_cursor). The when-to-use and when-to-use-something-else conditions are both stated.

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

referenceData window, themes and accepted valuesA
Read-onlyIdempotent

The data's window and size, known data incidents (outages, delays), the themes with their ids, and the accepted sector, sentiment, importance, source-type and entity-kind values. Call once; it rarely changes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely useful behavioral context beyond them: the data is stable and should be fetched once rather than repeatedly. It does not mention response shape, but with no output schema this is a modest gap.

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 the enumerated contents, then the operational hint. The first sentence is a dense list but every element earns its place. No wasted preamble.

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 burden of explaining what comes back, and it does list the returned categories (window/size, incidents, theme ids, accepted enum values). A caller knows what to expect. It could be more explicit about the structure of those values, but it is adequate.

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 there is nothing for the description to disambiguate; the baseline of 4 applies. No parameter-level confusion is possible.

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 names the concrete contents returned: the data window and size, known incidents, themes with their ids, and accepted enum values. That is far more specific than the generic name 'reference'. It does not explicitly distinguish itself from the sibling 'themes', which plausibly overlaps on the theme list, so it falls short of a 5.

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?

The only guidance is 'Call once; it rarely changes,' which addresses call frequency and caching rather than when to choose this tool over siblings like 'themes' or 'find_topics'. Usage is implied (consult for available enum values) but no alternatives or exclusions are named.

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 11 GICS sectors) by news attention. Use for "which tickers are suddenly in the news".

period: d = last 24 hours, w = last 7 days, window = everything held. sort=change ranks by the rise in mentions against the previous period (not available for period=window; use sort=mentions there). Each row: mentions, topics, sources (distinct outlets), sentiment counts, score and change. Only for rank=symbols: sector limits the screen to one sector; min_mentions drops rarely mentioned codes; entity_kinds narrows the kind of entity, comma-separated, from: equity, etf, index, rate, fx, crypto, commodity, org, private, country. Without it the list mixes companies with rates, commodities and central banks; pass "equity,etf" for tradable tickers.

ParametersJSON Schema
NameRequiredDescriptionDefault
rankNosymbols
sortNochange
limitNoHow many rows to return
periodNod = 24 hours, w = 7 days, window = everything heldd
sectorNoGICS sector
entity_kindsNoComma-separated entity kinds, e.g. "equity,etf"
min_mentionsNoLeave out codes with fewer mentions

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, openWorld), so the description's job is supplementary — and it delivers: it enumerates the returned row fields (mentions, topics, sources, sentiment counts, score, change) and warns that omitting entity_kinds mixes companies with rates, commodities and central banks. This is meaningful behavioral context beyond the annotations.

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

Conciseness4/5

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

Front-loaded with the purpose and a quotable use case before diving into parameter nuance. Dense but largely waste-free; the parameter detail could be tightened marginally, and the second sentence is a slightly redundant gloss on the first.

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 a 7-parameter filtering tool with no output schema, the description anticipates the important gaps: it lists the row fields that will be returned, explains the period windows, and flags the entity_kinds default mixing behavior. Only minor omissions remain (e.g. what 'score' represents, limit interaction).

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 71%, and the description compensates for the gaps well: it documents the full entity_kinds vocabulary (equity, etf, index, rate, fx, crypto, commodity, org, private, country) that the schema only shows as a bare string, states that sector applies only when rank=symbols, and explains the sort=change incompatibility with period=window. These are cross-parameter constraints the schema cannot express.

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?

Opens with a precise verb+resource: "Rank symbols (or the 11 GICS sectors) by news attention," and adds a concrete use case ("which tickers are suddenly in the news"). It is clearly distinguished from siblings like get_topic or sentiment_series, though the relationship to the closest sibling `trending` is left implicit.

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 clear context for when to reach for it (sudden news attention on tickers) and conditional guidance — sort=change is unavailable for period=window, and entity_kinds should be set to "equity,etf" for tradable tickers. No explicit when-not or named-alternative routing to siblings, so it stops 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.

search_statementsSearch news statementsA
Read-onlyIdempotent

Search extracted 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. since/until: ISO-8601 times on the article's publication time, e.g. 2026-10-01T00:00:00Z. limit: 1-100. Pass next_cursor back as cursor for the next page (null means no more).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many to return, 1-100
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
sectorNoGICS sector
symbolNoTicker or entity code, e.g. NVDA. Comma-separate several (OR), up to 10.
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_typeNonews leaves out speculative analysis and reddit
importance_minNoMinimum importance; high = key facts only

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, open-world and non-destructive, so safety is covered. The description adds real behavioral context beyond that: results are newest-first, pagination works by passing next_cursor back as cursor, and null means no more pages, plus filter semantics for importance_min and source_type.

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 in sentence one, then uses tight parameter annotations. Every line earns its place, though several lines duplicate schema descriptions rather than adding new 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?

For an 11-parameter, no-output-schema search tool, the description covers ordering, pagination, and the key filters, and annotations cover the safety profile. It is largely complete, though it could say more about what a 'statement' contains and the unused sector/theme_id/topic_id filters.

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%, so the schema already documents all 11 parameters. The description largely restates schema text (limit range, ISO-8601 format, comma-separated symbols, source_type effects), adding only the clarification that since/until apply to the article's publication time. Baseline 3 is appropriate.

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 verb+resource ('Search extracted news statements') and adds ordering ('newest first'), which distinguishes it from sibling lookups like get_topic or themes. It does not explicitly name an alternative, but the resource is concrete enough for an agent to recognize.

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?

"Use for 'what is the news saying about X'" gives a clear activation context, and the symbol/source_type lines hint at narrowing behavior. There are no explicit exclusions or named alternatives, 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.

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. Unless until is set, the series ends at the current, still incomplete day or hour: do not read a low last bucket as a drop. interval=hour covers at most 14 days and defaults to the last 7; interval=day defaults to the whole window.

ParametersJSON Schema
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.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: it documents the omitted empty buckets, and warns that unless `until` is set the series ends on a still-incomplete day/hour so a low last bucket must not be read as a drop. That is precisely the kind of interpretive gotcha an agent would otherwise misread as data.

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 scoping rule are front-loaded in the first sentence, followed by the return-bucket contract and then the last-bucket caveat. The bucket specification sentence is dense with seven field names and a formula in one breath, but nearly every clause carries information, so the length is defensible.

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 carries the full burden and meets it: it defines each bucket field, the score formula, source counting, empty-bucket omission, and time-range defaults. An agent can both call the tool correctly and interpret its results from this text alone.

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, but the description adds a cross-parameter constraint the schema cannot express: the four entity parameters are all optional and nullable in the schema, yet the description imposes 'exactly one of' and specifies the interval default windows. That is genuine semantic value above the field descriptions.

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 first line states a specific resource (news volume and sentiment), a specific shape (over time), and an exact scoping rule (one of symbol, sector, theme_id or topic_id). That is enough to separate it from siblings like search_statements, trending and themes without opening a schema.

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

Usage Guidelines4/5

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

It gives concrete selection guidance: pick exactly one entity dimension, and interval=hour is bounded to 14 days (default 7) while interval=day covers the whole window. It never names a sibling tool or states when to prefer `trending` or `search_statements` over this one, so the 'vs alternatives' half of the bar is unmet.

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 (Energy, Central banks & rates, ...), 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.

ParametersJSON Schema
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), up to 10.

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description still adds real behavioral context: the non-obvious caveat that counts remain whole-theme even when filtered by symbol/sector, plus the id-reuse contract with other tools. No return-shape or pagination detail, but that is minor here.

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 a theme is and what it returns, then the filter caveat and the id hand-off. The middle sentence is slightly convoluted ('the counts are still those of the whole theme, so use...'), but every clause earns its place.

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

Completeness4/5

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

With no output schema, the description does the work of enumerating the returned fields and the filter caveat, and it explains the id contract for downstream calls. Adequate for a 3-param, 0-required list tool; only the missing sibling differentiation keeps it from being fully complete.

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 is 3. The description goes beyond the schema by explaining the semantics of the symbol/sector filter (themes are matched, but the counts are not scoped to that symbol), which is the one behaviorally surprising parameter effect and is not captured in the schema.

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?

It names the resource ('standing subjects the news is grouped into') and enumerates what each item carries (developments, statements, 24-hour volume, sources, sentiment counts), which is more specific than a tautology. It distinguishes itself from search_statements but never contrasts with the sibling find_topics, which an agent could easily confuse it with.

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 conditional: 'With symbol or sector: only the themes that have statements about it,' and routes the agent to search_statements when per-symbol statements are wanted. It also states the follow-on usage ('use the returned id as theme_id in the other tools'). Missing is any guidance on when to prefer this over find_topics or get_topic.

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

A3.9/5.0

Scored across 8 tools

Disambiguation4/5

Most tools have clearly distinct purposes: search_statements for raw news search, get_topic for a single development, trending for top stories, find_topics for listing developments, themes for standing subjects, sentiment_series for time series, screen for ranking symbols, and reference for metadata. However, trending and find_topics overlap somewhat in surfacing current developments, and themes/reference both expose theme-related metadata, which could cause occasional misselection.

Naming Consistency3/5

Names mix verb_noun patterns (get_topic, search_statements, find_topics, sentiment_series) with noun-only names (trending, themes, screen, reference). The set is still readable, but the convention is not predictable throughout.

Tool Count5/5

Eight tools is well-scoped for a finance news analytics server. Each tool covers a distinct analytical need without obvious redundancy or bloat.

Completeness4/5

The surface covers search, topic discovery, trending, themes, sentiment series, ranking, and reference metadata, which supports most analysis workflows. Minor gaps exist, such as no direct tool for retrieving full article content or outlet-level details, but agents can work around these via existing tools.

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.
    17 npm
    1
    MIT