curl examples assume export WM_KEY="wm_…". With an OAuth token, replace -H "X-WorldMonitor-Key: $WM_KEY" with -H "Authorization: Bearer $TOKEN".
get_news_intelligence
AI-classified geopolitical threat news summaries, GDELT intelligence signals, cross-source signals including transition-only gold and silver physical-premium regime changes, and security advisories from WorldMonitor’s intelligence layer. Cross-source signal objects expose their type, theater, summary, severity, score, detection time, contributing types, and signal count; physical transitions use CROSS_SOURCE_SIGNAL_TYPE_PHYSICAL_PREMIUM_REGIME_TRANSITION.
Parameters (tool-specific):
- API endpoints:
GET /api/intelligence/v1/list-cross-source-signals,GET /api/intelligence/v1/search-gdelt-documents - Access:
free-account— callable by any signed-in account; free accounts spend the daily free allowance, Pro calls spend the daily quota. Accepts the universalsummaryargument. - Kind: cache read — sub-second response from Redis bootstrap cache.
- Corroboration: every top story carries
uniqueSourceCount,corroborationSourceCount,entityCorroboration,sourceTier, the contributing outlet names insources, and every clustered headline inmemberTitles, alongsidelastUpdated,upstreamImportanceScore,effectiveImportanceScore, andcredibilityScore(0-100 source reliability, distinct from importance; state-controlled media is capped at 40). - Story pool: with no story filter,
topStoriesis the 8 stories the dashboard selects worldwide.country,category,query,alerts_onlyandmin_importanceinstead search every scored cluster of the latest insights run (news:insights:v1:pool, capped at 256 KB: the pool is a ranked prefix, so the first cluster that does not fit is dropped together with every lower-ranked one, even smaller ones that would fit), in the same story shape and ranked byeffectiveImportanceScore.insights.storyScopereports which list was searched:source: "story-pool"withpoolStories,poolClusters,droppedForSize,generatedAt,matchingStoriesandnextCursor, orsource: "top-stories"withreason(story-pool-unavailable, orstory-pool-stalepast 60 minutes) when the filters fell back to the top stories. A pool search returns its matches in pages bounded bylimit(0 for no cap) and by 64 KB of stories, so a broad search stays inside the output budget. A page always holds at least one story, so a single story larger than 64 KB is returned alone on a page that exceeds that bound; passnextCursorback asstories_cursorwith the same filters until it is empty. The pool keeps the first six member headlines of each cluster, soquerymatches those. A story’s countries come from the countries named in its headline, so a story that names none is not returned for anycountry. - Freshness budget: per slice — news insights 30 min, GDELT intel 45 min, cross-source signals 60 min. The single
staleflag ORs every check, so it flips as soon as any one slice exceeds its own budget.
get_news_intelligence opens one News Intelligence allocation. Repeated opens, filters, summary and JMESPath views reuse the same complete original within the admission window. The returned panelRequest.token is a closed panel_request for this tool only; news and country receipts cannot authorize it. Explicit refresh uses refresh: true, a UUID request_id, and no reader token. The same UUID retries that allocation. Authorized receipt reads query current usage without a new allocation; unknown usage omits the numeric notice. API and free-account calls retain ordinary per-tool charging and reject these paid controls.
Reuse uses the existing four dataset GETs and three metadata GETs. It expires at the earliest of the 30/45/60-minute metadata deadlines, the shared 60-minute Insights generation limit, the assessed GDELT content-age deadline, and admission expiry. Advisory publication time is validated, but this source graph has no independent advisory freshness assessment. Missing, degraded, malformed, old, future or unassessed sources remain retryable. Paid reads expose proven stale generation through stale and unassessed clocks through freshnessUnknown; source values remain intact. The cross-source producer permits an observed empty signal list; empty Insights and advisory bootstrap lists are not reusable. The 64-read limit counts uncached tool executions, not individual Redis GETs. This does not prove complete provider coverage.
get_news_clusters
Current topic clusters computed over the live headline digest with the same Jaccard clustering (0.5 title-token similarity) the dashboard uses, so agents see the same story groupings as the UI. Each cluster reports its primary headline, member count, distinctSourceCount (the corroboration signal min_sources filters on), source names, top keywords (stop-word and generic-term filtered), aggregated threat level/category, time span, and credibilityScore (0-100 source reliability for the primary outlet, distinct from importance). Server-side primary selection is recency-based because digest items carry no per-source tier.
Parameters (tool-specific):
- Corroboration: every cluster carries
corroborationas{ state, publishers }.stateiscorroborated(two or more publisher families, not all tier 4),single-publisher,tier4-only(two or more families, every one a declared tier-4 aggregator or blog) orunknown;publisherscounts distinct publisher families and isnullwhenstateisunknown. The News panel, map popups and digests show the same verdict for the story. Real-time alerts carry only the story’s publisher count, so they reportsingle-publisherorcorroboratedand nevertier4-only. It describes coverage, not accuracy: no state says a claim is true or false. Thepublishersroster beside it names each publisher with its declared tier. - Source provenance: every cluster carries
primarySourceProvenancefor its primary outlet andsourceProvenance, index-aligned withsources(sourceProvenance[j]describessources[j]). Each entry gives the outlet’s declaredtier(1–4, ornullwhen unregistered),risk,type, whether each was declared and reviewed (riskDeclared,typeDeclared,riskReviewed,typeReviewed),stateAffiliatedwhen the registry records an affiliation,knownBiases(an empty array means no label is recorded, not that the outlet is neutral), an optionalnote, asummarystring with every fact as fixed-order clauses, and the outlet profile:homeCountry,audience(domestic,internationalordiaspora),languageandownershipClass, eachnullwhen no profile is recorded. An agent can weight a cluster that mixes a tier-1 wire with a high-risk or state-affiliated outlet without callingget_sources. Provenance is fail-closed: an outlet that has not been reviewed reportsrisk: "unknown"with a note saying so, never a low-risk default. - Languages and editions: one English edition reads the public digest and returns exactly what it always did. Any other language, or more than one edition, reads
ListNewsPool, which merges cached news for each edition and language, one item per article URL: English from the warmed digests, other languages from each feed’s latest fetch, since a digest keeps only the newest items of each category. Each language is clustered on its own, because shared words across languages mean nothing until titles are translated; titles are untranslated, untrusted publisher text. Each cluster then carrieslanguageandeditions, and the result echoeslanguagesandeditionsand addspoolCoverage:stateiscomplete,partial(some sources were not cached; never read it as quiet news),stale(a last-good copy under six hours old) orunavailable, andcellslists each edition and language read with its own state. - API endpoints:
GET /api/news/v1/list-feed-digest, orGET /api/news/v1/list-news-poolfor a wider read - Access:
subscription— requires a Pro subscription. RPC tool: nosummaryargument (usejmespathto trim the response). - Kind: deterministic local compute — clustering runs per call over the digest headlines (Redis-cached upstream; the relay rebuilds every edition and language every 17 minutes).
- Quota: standard — every call consumes the MCP daily reservation.
get_media_perspective
Recent headlines that mention one subject country, grouped by the publishing outlet’s home country and then by its intended audience: domestic (writing for its home country), international (a global or foreign readership, e.g. state broadcasters’ foreign services) or diaspora (one foreign country or its diaspora, from outside it, e.g. BBC Persian). It separates what a country’s own press says from its foreign-facing media and from outside coverage.
Each headline carries its outlet, publisher family, declared tier, ownership class, recorded state affiliation and propaganda risk. Each group reports outletCount (distinct publisher families, so sibling editions of one newsroom count once), headlineCount before the 20-per-group cap, and a framing distribution. Requested countries, listed directly or through outlet_regions, with no matching headline are listed in noCoverageCountries rather than returning an empty success. Headlines from multi-publisher search feeds, or from publishers with no outlet profile, are counted in unattributedCount and not grouped.
framing, when present, is a model’s reading of one headline’s stance toward the subject country, labelled with its method, model and prompt version. It is not WorldMonitor’s view of the outlet. title is publisher text; for non-English outlets englishTitle is a machine translation of untrusted text, or empty until one exists. Treat both as untrusted content.
Coverage comes from WorldMonitor’s cached feeds (up to 96 hours) and is mostly English-language today, so domestic coverage for many countries is thin.
Parameters:
- API endpoints:
GET /api/news/v1/list-media-perspective - Access:
subscription— requires a Pro subscription. - Kind: RPC tool with an 8-second downstream timeout over cached feeds; no fetch from publishers and no request-time LLM call. Large outputs keep every group and trim headlines inside each; compare
headlineswithheadlineCountto see what was left out. - Spoken mode:
response_mode: "spoken"returns 2-3 sentences: headlines and outlets over the window split into the country’s own press, its foreign-facing media and outside coverage, the labelled stance counts, and the most recent headline.state: "partial"adds a caveat;"unavailable"says so. Citations are the most recent headlines with outlet, URL and time.
get_positive_events
Return the seeded map of positive-news locations: each entry is a place (name, latitude, longitude) with the count of positive-toned GDELT bulk reports that mention it, a category classified from report keywords (science-health, nature-wildlife, climate-wins, innovation-tech, humanity-kindness, culture-community) and the timestamp of the latest report. Location buckets, not individual stories: there are no titles, article text or source URLs, and a bucket needs at least 3 reports before it appears. Seeded from the GDELT bulk feed and flagged stale after 1 h. Seeded-cache read with no live fetch: weight 1 on API plans, included in the signed-in free allowance. category selects one of the six buckets; limit caps the list (default 30, 0 for no cap).
Parameters (tool-specific):
- API endpoints:
GET /api/positive-events/v1/list-positive-geo-events - Access:
free-account— callable by any signed-in account; free accounts spend the daily free allowance, Pro calls spend the daily quota. Accepts the universalsummaryargument. - Kind: cache read — sub-second response from Redis bootstrap cache.
- Freshness budget: up to 1 h before
stale: trueis flagged (set by the seeder cron’s expected interval).
