Tools
All tools return JSON strings. Empty results always 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
| Field | Type | Description |
|---|---|---|
generated_at | ISO 8601 | When the digest was built |
window_hours | int | Always 24 |
market_summary.total_events | int | All events in the window |
market_summary.market_events | int | Events with market_relevance_score ≥ 70 |
market_summary.sentiment | object | {bullish, bearish, neutral} counts |
market_summary.top_tickers | list | Most-mentioned tickers, up to 10 |
top_market_events | list | Up to 5 events sorted by market relevance |
most_contested | list | Up to 5 events sorted by divergence score |
categories | object | Event count by category |
get_market_news
Recent events with material market relevance.
get_market_news(limit=10, hours=24, min_score=70)
Parameters
| Name | Type | Default | Notes |
|---|---|---|---|
limit | int | 10 | 1 to 25 |
hours | int | 24 | Lookback window. Max 168 (7 days) |
min_score | int | 70 | Minimum market_relevance_score. Use 50 for broader results, 85+ for high-impact only |
get_ticker_news
Events mentioning a specific stock ticker.
get_ticker_news(ticker)
Parameters
| Name | Type | Default | Notes |
|---|---|---|---|
ticker | string | required | Case-insensitive. E.g. NVDA, nvda |
scan_portfolio
Batch ticker check. Returns hits, no-news tickers, and an aggregate sentiment breakdown.
scan_portfolio(tickers, hours=24)
Parameters
| Name | Type | Default | Notes |
|---|---|---|---|
tickers | string | required | Comma-separated. E.g. NVDA,AAPL,MSFT. Max 20 |
hours | int | 24 | Lookback window. Max 168 |
Response fields
| Field | Description |
|---|---|
hits | Tickers with at least one event, each with a list of matching events |
no_news | Tickers with no events in the window |
tickers_checked | How many tickers were queried (capped at 20) |
overall_sentiment | {bullish, bearish, neutral} counts across all hits |
get_market_sentiment_overview
Aggregate bullish/bearish breakdown for the market as a whole.
get_market_sentiment_overview(hours=24, min_score=70)
Parameters
| Name | Type | Default | Notes |
|---|---|---|---|
hours | int | 24 | Lookback window. Max 168 |
min_score | int | 70 | Minimum market_relevance_score to include |
Response fields
| Field | Description |
|---|---|
window_hours | The hours value used |
total_market_events | Events meeting the score threshold |
sentiment_breakdown | {bullish, bearish, neutral} counts |
top_tickers | Most-mentioned tickers in market events |
most_divergent | Up 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
| Name | Type | Default | Notes |
|---|---|---|---|
tickers | string | - | Comma-separated ticker symbols |
sentiment | enum | - | bullish, bearish, neutral |
category | enum | - | war, economy, politics, ai, health, other |
min_divergence | int | 0 | 0 to 100 |
max_divergence | int | 100 | 0 to 100 |
min_market_score | int | 0 | Minimum market_relevance_score |
hours | int | 24 | Lookback window. Max 168 |
sort | enum | recent | recent, divergence, market |
limit | int | 10 | 1 to 25 |
get_top_divergent
Most editorially contested stories — Divergence's core feature.
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
| Name | Type | Default | Notes |
|---|---|---|---|
category | enum | - | war, economy, politics, ai, health, other. Empty = all |
hours | int | 24 | Lookback window. Max 168 |
limit | int | 10 | 1 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
| Name | Type | Default | Notes |
|---|---|---|---|
query | string | required | Matched against title and event_summary |
category | enum | - | war, economy, politics, ai, health, other |
sentiment | enum | - | bullish, bearish, neutral |
min_divergence | int | 0 | 0 to 100 |
limit | int | 10 | 1 to 25 |
get_event
Full event detail: sources, facts, takeaway, and article count.
get_event(event_id)
Parameters
| Name | Type | Notes |
|---|---|---|
event_id | int | From the id field on any other tool result |
Response fields
| Field | Description |
|---|---|
id | Event ID |
title | Event title |
summary | 2–3 sentence factual summary |
takeaway | How outlet coverage splits — key framings in italics |
category | war, economy, politics, ai, health, other |
divergence_score | 0–100. See Divergence score |
market_relevance_score | 0–100, or null |
market_sentiment | bullish, bearish, neutral, or null |
market_relevance_reason | Why this event is market-relevant, or null |
tickers | Extracted stock ticker symbols |
sources | Per-outlet: outlet, headline, framing_label, framing_color |
facts | Per-fact: status (confirmed/disputed), text, source_attribution |
article_count | Articles clustered into this event |
Returns {"error": "not_found"} if the event ID does not exist or the event was rejected during analysis.