Docs  /  Tools

Tools

The MCP server exposes 13 read-only tools across two layers:

  • Event-level: clustered and analyzed. Carries divergence, market relevance, market sentiment, fact ledger, per-outlet framing.
  • Article-level: individual articles tagged with ~720 ticker symbols and 47 topics. Pre-clustering, so duplicates from different outlets are expected. Broader ticker coverage than event-level.

All tools return JSON strings. Empty results return {"results": [], "count": 0, "message": "..."} rather than an error.


get_digest

Zero-parameter morning briefing. The right starting point for any session.

get_digest()

Returns a 24-hour summary: top market events, sentiment breakdown, most contested stories, category counts, and top tickers. No parameters needed.

Response fields

FieldTypeDescription
generated_atISO 8601When the digest was built
window_hoursintAlways 24
market_summary.total_eventsintAll events in the window
market_summary.market_eventsintEvents with market_relevance_score ≥ 70
market_summary.sentimentobject{bullish, bearish, neutral} counts
market_summary.top_tickerslistMost-mentioned tickers, up to 10
top_market_eventslistUp to 5 events sorted by market relevance
most_contestedlistUp to 5 events sorted by divergence score
categoriesobjectEvent count by category

get_market_news

Recent events with material market relevance.

get_market_news(limit=10, hours=24, min_score=70)

Parameters

NameTypeDefaultNotes
limitint101 to 25
hoursint24Lookback window. Max 168 (7 days)
min_scoreint70Minimum market_relevance_score. Use 50 for broader results, 85+ for high-impact only

get_market_articles

Article-level market desk items. Pre-clustering, so duplicates from different outlets covering the same story are expected.

get_market_articles(tag="", tags="", outlet="", hours=168, limit=25, offset=0)

Two filter modes:

  • tag - single exact tag, e.g. "ticker:NVDA" or "topic:fed".
  • tags - comma-separated tags, all must match (intersection), e.g. "ticker:LLY,topic:fda" for Eli Lilly FDA articles only.

Tag taxonomy

ticker:<SYMBOL> - ~720 names: equities and ETFs. Use get_market_tags(tag_type="ticker") to discover what's active.

topic:<NAME> - 47 topics:

GroupTopics
Central banksfed, ecb, boe, boj
Macro / datarates, inflation, cpi, ppi, gdp, jobs, recession, confidence, retail
Markets / instrumentsindices, treasuries, bonds, credit, pe_vc, fx
Corporateearnings, guidance, ipo, m&a, layoffs, dividend, bankruptcy
Trade / policytrade, sanctions, antitrust, regulation, litigation
Healthcarefda
Managementmanagement, labor
Tech / cyberai, cyber
Multilateralimf, rating
Corporate eventscontract, split, offering
Crypto / commoditiescrypto, oil, gold, commodities
Catch-allmarkets, analyst

Parameters

NameTypeDefaultNotes
tagstring-Single exact tag. Ignored if tags is provided
tagsstring-Comma-separated AND-filter
outletstring-Exact outlet name
hoursint168Lookback. Max 336 (14 days)
limitint251 to 50
offsetint0Pagination offset

Response fields

FieldDescription
resultsArticle rows with id, headline, outlet, url, image_url, published_at, fetched_at, sentiment, bias_label, tickers, topics, tags
countNumber of rows returned
tagSingle-tag filter used (if any)
tagsMulti-tag filter used (if any)
outlet, offset, limitEcho of inputs

get_market_tags

Most common market classifier tags in recent article-level data.

get_market_tags(hours=168, limit=50, tag_type="all")

Use this before get_market_articles to discover active ticker and topic tags, or to build a current "hot tickers" or "hot topics" scan.

Parameters

NameTypeDefaultNotes
hoursint168Lookback. Max 336 (14 days)
limitint501 to 200
tag_typeenumallticker, topic, or all

Response fields

FieldDescription
resultsTag rows with tag and count, sorted by count descending
countNumber of tag rows returned
window_hoursEcho of input
tag_typeEcho of input

get_ticker_news

Event-level lookup for a specific ticker (last 30 days).

get_ticker_news(ticker)

Returns clustered events with divergence and sentiment for a given ticker. If empty, try get_ticker_articles for article-level coverage, which has broader ticker recognition including smaller-cap and foreign issuers.

Parameters

NameTypeNotes
tickerstringRequired. Case-insensitive. No $ prefix.

get_ticker_articles

Article-level lookup for a specific ticker. Wider coverage than get_ticker_news: ~720 names including foreign issuers (SFTBY, BAYRY, NU), small caps (TEM, RXRX), and ETFs (SPY, XBI, IBIT).

get_ticker_articles(ticker, hours=168, limit=25)

Parameters

NameTypeDefaultNotes
tickerstringrequiredCase-insensitive. No $ prefix
hoursint168Lookback. Max 336 (14 days)
limitint251 to 50

Surfaces tickers with disproportionate recent mention activity compared to a baseline window. Unlike get_market_tags (ranked by volume), this ranks by acceleration.

Returns ratio = recent_per_hour / baseline_per_hour. Ratios above 3 indicate a story is breaking around the name; above 6 indicates a major event.

get_trending_tickers(hours=24, baseline_hours=168, limit=10, min_recent_mentions=2)

Parameters

NameTypeDefaultNotes
hoursint24Recent window
baseline_hoursint168Baseline window. Must be larger than hours
limitint101 to 25
min_recent_mentionsint2Excludes one-off mentions

Response fields per row

FieldDescription
tickerSymbol
recent_mentionsMention count in hours window
baseline_mentionsMention count in baseline_hours window
ratiorecent rate / baseline rate, rounded to 2 decimals

scan_portfolio

Batch ticker check. Returns hits, no-news tickers, and an aggregate sentiment breakdown.

scan_portfolio(tickers, hours=24, include_articles=False)

Parameters

NameTypeDefaultNotes
tickersstringrequiredComma-separated. E.g. "NVDA,AAPL,MSFT". Max 20, excess silently dropped
hoursint24Lookback. Max 168 (events) / 336 (articles)
include_articlesboolfalseAlso surface per-ticker article-level hits, which cover foreign and smaller-cap names that event-level may miss

Response fields

FieldDescription
hitsTickers with at least one event, each with a list of matching events
no_newsTickers with no events (and no articles, when include_articles=true) in the window
tickers_checkedEcho of inputs (capped)
overall_sentiment{bullish, bearish, neutral} counts across all hits
article_hitsPresent when include_articles=true. Per-ticker article-level matches (up to 10 each)

get_market_sentiment_overview

Aggregate bullish/bearish breakdown for the market as a whole.

get_market_sentiment_overview(hours=48, min_score=70)

Parameters

NameTypeDefaultNotes
hoursint48Lookback. Max 168
min_scoreint70Minimum market_relevance_score to include

Response fields

FieldDescription
window_hoursEcho of input
total_market_eventsEvents meeting the score threshold
sentiment_breakdown{bullish, bearish, neutral} counts
top_tickersMost-mentioned tickers in market events
most_divergentUp to 5 highest-divergence market events

query_news

Power query. Combine any filters in a single call.

query_news(tickers="", sentiment="", category="", min_divergence=0,
           max_divergence=100, min_market_score=0, hours=24,
           sort="recent", limit=10)

Parameters

NameTypeDefaultNotes
tickersstring-Comma-separated ticker symbols
sentimentenum-bullish, bearish, neutral
categoryenum-war, economy, politics, ai, health, other
min_divergenceint00 to 100
max_divergenceint1000 to 100
min_market_scoreint0Minimum market_relevance_score
hoursint24Lookback. Max 168
sortenumrecentrecent, divergence, market
limitint101 to 25

get_top_divergent

Most editorially contested stories, sorted by divergence score.

get_top_divergent(category="", hours=24, limit=10)

Returns events sorted by divergence_score descending. Each result includes a takeaway sentence summarising the editorial split. Use get_event for the full per-outlet breakdown.

Parameters

NameTypeDefaultNotes
categoryenum-war, economy, politics, ai, health, other. Empty = all
hoursint24Lookback. Max 168
limitint101 to 25

search_news

Keyword search across event titles and summaries.

search_news(query, category="", sentiment="", min_divergence=0, limit=10)

Case-insensitive substring match. Does not search raw article text.

Parameters

NameTypeDefaultNotes
querystringrequiredMatched against title and event_summary
categoryenum-war, economy, politics, ai, health, other
sentimentenum-bullish, bearish, neutral
min_divergenceint00 to 100
limitint101 to 25

get_event

Full event detail: sources, facts, takeaway, and article count.

get_event(event_id)

Parameters

NameTypeNotes
event_idintFrom the id field on any other tool result

Response fields

FieldDescription
idEvent ID
titleEvent title
summary2–3 sentence factual summary
takeawaySummary of how outlet coverage diverges on this event
categorywar, economy, politics, ai, health, other
divergence_score0–100. See Divergence score
market_relevance_score0–100, or null
market_sentimentbullish, bearish, neutral, or null
market_relevance_reasonWhy this event is market-relevant, or null
tickersStock ticker symbols extracted from coverage
companiesCompany names mentioned
sourcesPer-outlet: outlet, headline, framing_label, framing_color
factsPer-fact: status (confirmed/disputed), text, source_attribution
article_countArticles clustered into this event

Returns {"error": "not_found"} if the event ID does not exist or the event was rejected during analysis.