# Finance Pulse (pypi · finance-pulse)

Financial news as sourced statements with sentiment and tickers, grouped into developments.

- Trust score: 60/100 (medium)
- Change this week: −8
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-18

## Components

- pypi · `finance-pulse`: 60/100 (this document), [markdown](https://verifymcp.io/servers/slothyafk-finance-pulse/finance-pulse.md), [page](https://verifymcp.io/servers/slothyafk-finance-pulse/finance-pulse)

## Channel facts

- Registry: `pypi`
- Package: `finance-pulse`
- Version: `0.2.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-18.

- **Supply Chain Security**: 50/100
  - Malware scan not yet available for this package.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 1 of 31 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 58/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 3465 tokens (~288/item across 12 items; 12 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 53/100
  - Stability observed for 16 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 98/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 93% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 12 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 13 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the Finance Pulse MCP server?

Finance Pulse runs locally as a PyPI package, launched with uvx finance-pulse. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add slothyafk-finance-pulse -- uvx finance-pulse
```

### Cursor

```json
{
  "mcpServers": {
    "slothyafk-finance-pulse": {
      "command": "uvx",
      "args": [
        "finance-pulse"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "slothyafk-finance-pulse": {
      "command": "uvx",
      "args": [
        "finance-pulse"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add slothyafk-finance-pulse -- uvx finance-pulse
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "slothyafk-finance-pulse": {
      "type": "local",
      "command": [
        "uvx",
        "finance-pulse"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add slothyafk-finance-pulse --command uvx --arg finance-pulse
```

### Hermes

```yaml
mcp_servers:
  slothyafk-finance-pulse:
    command: "uvx"
    args: ["finance-pulse"]
```

### Netclaw

```json
{
  "McpServers": {
    "slothyafk-finance-pulse": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "finance-pulse"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add slothyafk-finance-pulse -t stdio -c uvx -a finance-pulse
```

### Other

```json
{
  "mcpServers": {
    "slothyafk-finance-pulse": {
      "command": "uvx",
      "args": [
        "finance-pulse"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-18 (score 60, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-17 (score 59, −1)

- [security improvement] Malware scan: unverified → pass
- [functional regression] Schema quality: 234 → 288
- [functional] Schema quality: excellent → good
- [functional] Package version: 0.1.0 → 0.2.1

### 2026-10-16 (score 60, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-14 (score 59, −9)

- [security regression] Malware scan: pass → unverified
- [functional improvement] Stability: unverified → 0.40

### 2026-10-03 (score 68, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-02 (score 53)

First indexed and scored.

## MCP tools (12)

### `search_statements` (~398 tokens)

Search news statements

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

Input parameters:

- `cursor`: next_cursor from the previous call, for the next page; keep every other argument the same
- `importance_min`: Minimum importance; high = key facts only
- `limit` (integer): How many to return per call; use the cursor for more
- `sector`: GICS sector
- `sentiment`: Only statements with this sentiment
- `since`: ISO-8601 time, e.g. 2026-10-01T00:00:00Z
- `source_type`: One of: news, speculative, reddit. news leaves out speculative analysis and reddit
- `storyline_id`: Storyline id, as returned by `storylines`, `get_symbol` or a topic's storylines
- `symbol`: Ticker or entity code, e.g. NVDA. Comma-separate several (OR).
- `theme_id`: Theme id from `themes` or `reference`
- `topic_id`: Topic (development) id, as returned in topic_id or topics[].id
- `until`: ISO-8601 time, e.g. 2026-10-01T00:00:00Z

### `get_symbol` (~342 tokens)

Everything about one symbol

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.

Input parameters:

- `code` (string, required): Ticker or entity code, e.g. NVDA. Non-US tickers carry an exchange suffix (0700.HK). When unsure of the code, call find_symbol first.
- `statements` (integer): How many of its newest statements to include
- `topics` (integer): How many of its largest topics to include

### `find_symbol` (~158 tokens)

Find a symbol's code by name

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.

Input parameters:

- `limit` (integer): How many matches to return
- `query` (string, required): Part of a name or code, e.g. "micron"

### `screen` (~416 tokens)

Screen symbols or sectors by news attention

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.

Input parameters:

- `entity_kinds`: Comma-separated entity kinds from: equity, etf, index, rate, fx, crypto, commodity, org, private, country. E.g. "equity,etf"
- `limit` (integer): How many rows to return
- `min_mentions` (integer): Leave out codes with fewer mentions
- `period` (string): d = last 24 hours, w = last 7 days, window = all the history the plan includes
- `rank` (string)
- `sector`: GICS sector
- `since`: Start of a custom interval (ISO-8601) to count instead of `period`
- `sort` (string)
- `until`: End of the custom interval (ISO-8601); omit for up to now

### `sentiment_series` (~246 tokens)

News volume and sentiment over time

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.

Input parameters:

- `interval` (string)
- `sector`: GICS sector
- `since`: ISO-8601 time, e.g. 2026-10-01T00:00:00Z
- `symbol`: One ticker or entity code, e.g. NVDA
- `theme_id`: Theme id from `themes` or `reference`
- `topic_id`: Topic (development) id, as returned in topic_id or topics[].id
- `until`: ISO-8601 time, e.g. 2026-10-01T00:00:00Z

### `trending` (~261 tokens)

Trending developments

The developments most outlets are reporting. Use for "what is moving / what is the big news right now".

kind=live: the current list. kind=slot: the top stories of each recent time slot, newest slot first. Each
item's `trending` holds its three newest labels (the live list or a slot's start, the rank and the number
of sources there); `trending_labels` is how many labels it has in all. The slot list is long (`total`):
narrow it with symbol or theme_id rather than asking for all of it.
For a whole day rather than right now, use find_topics with sort=velocity (statements in the last 24 hours).
Each item has its distinct source count, sentiment counts and newest statement. symbol: one code only.

Input parameters:

- `kind` (string): live = what is most reported right now; slot = the top of each recent time slot
- `limit` (integer): How many to return, taken from the top of the API's ranking; `total` in the result says how many there are
- `symbol`: One ticker or entity code, e.g. NVDA
- `theme_id`: Theme id from `themes` or `reference`

### `find_topics` (~264 tokens)

Find developments

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

Input parameters:

- `cursor`: next_cursor from the previous call, for the next page; keep every other argument the same
- `limit` (integer): How many to return per call; use the cursor for more
- `min_statements`: Leave out developments with fewer statements. Default: 3, or 1 with storyline_id
- `sector`: GICS sector
- `sort` (string)
- `storyline_id`: Storyline id, as returned by `storylines`, `get_symbol` or a topic's storylines
- `symbol`: Ticker or entity code, e.g. NVDA. Comma-separate several (OR).
- `theme_id`: Theme id from `themes` or `reference`

### `get_topic` (~103 tokens)

Get one development

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

Input parameters:

- `topic_id` (string, required): Topic (development) id, as returned in topic_id or topics[].id

### `storylines` (~351 tokens)

One symbol's storylines

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.

Input parameters:

- `cursor`: next_cursor from the previous call, for the next page; keep every other argument the same
- `limit` (integer): How many to return per call; use the cursor for more
- `min_topics` (integer): Only storylines with at least this many topics; 1 also lists single-topic ones
- `sort` (string): recent = newest statement; mentions; topics; velocity = mentions in the last 24 hours
- `symbol` (string, required): Exactly one ticker or entity code, e.g. MSFT

### `get_storyline` (~263 tokens)

Get one storyline

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.

Input parameters:

- `members` (integer): How many of its topics to list, oldest first
- `statements` (integer): How many of its newest statements to include
- `storyline_id` (string, required): Storyline id, as returned by `storylines`, `get_symbol` or a topic's storylines

### `themes` (~151 tokens)

Themes

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.

Input parameters:

- `sector`: GICS sector
- `sort` (string): size = statements; topics = developments; recent = last statement; velocity = statements in the last 24 hours
- `symbol`: Ticker or entity code, e.g. NVDA. Comma-separate several (OR).

### `reference` (~66 tokens)

History reach, counts and accepted values

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.

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/slothyafk-finance-pulse/finance-pulse#diagnostics

## Score history

- 2026-10-18: 60
- 2026-10-17: 59
- 2026-10-16: 60
- 2026-10-15: 59
- 2026-10-14: 59
- 2026-10-13: 68
- 2026-10-12: 68
- 2026-10-08: 68
- 2026-10-04: 68
- 2026-10-03: 68
- 2026-10-02: 53

## Common questions

### What is the Finance Pulse MCP server?

Finance Pulse is an MCP server listed in the public MCP registry as io.github.SlothyAfk/finance-pulse. Financial news as sourced statements with sentiment and tickers, grouped into developments. This page covers its PyPI package (finance-pulse).

### Is the Finance Pulse MCP server safe to use?

Finance Pulse scores 60 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 18 October 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Finance Pulse MCP server expose?

Finance Pulse exposes 12 tools: search_statements, get_symbol, find_symbol, screen, sentiment_series, and 7 more. Their descriptions and schemas cost roughly 3,019 tokens of context every time the server is loaded.

### Is the Finance Pulse MCP server still maintained?

Finance Pulse is still listed as active in the MCP registry. We last reached this channel on 18 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Finance Pulse MCP server under?

Finance Pulse declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/finance-pulse/
- Socket report: https://socket.dev/pypi/package/finance-pulse
- Repository: https://github.com/SlothyAfk/finance-pulse-python
- Website: https://fintopic.news/docs
- Changelog RSS feed: https://verifymcp.io/servers/slothyafk-finance-pulse/finance-pulse.xml
- Changelog JSON feed: https://verifymcp.io/servers/slothyafk-finance-pulse/finance-pulse.json
- HTML version of this page: https://verifymcp.io/servers/slothyafk-finance-pulse/finance-pulse
