io.github.cyanheads/gdelt-mcp-server
REMOTE · GDELT.CASEYJHAND.COM · 2 COMPONENTS · SCANNED SEP 22
Search and analyze global news coverage and US TV transcripts via the GDELT Project APIs.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security66
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation not fully verified: no authorisation is required to call this server, and 9 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability60
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 3884 tokens (~431/item across 9 items; 9 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 9 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 10 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the io.github.cyanheads/gdelt-mcp-server server?
io.github.cyanheads/gdelt-mcp-server is a hosted endpoint at https://gdelt.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · gdelt.caseyjhand.com
claude mcp add --transport http cyanheads-gdelt-mcp-server 'https://gdelt.caseyjhand.com/mcp'
{
"mcpServers": {
"cyanheads-gdelt-mcp-server": {
"url": "https://gdelt.caseyjhand.com/mcp"
}
}
} {
"servers": {
"cyanheads-gdelt-mcp-server": {
"type": "http",
"url": "https://gdelt.caseyjhand.com/mcp"
}
}
} [mcp_servers.cyanheads-gdelt-mcp-server] url = "https://gdelt.caseyjhand.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cyanheads-gdelt-mcp-server": {
"type": "remote",
"url": "https://gdelt.caseyjhand.com/mcp",
"enabled": true
}
}
} openclaw mcp add cyanheads-gdelt-mcp-server --url 'https://gdelt.caseyjhand.com/mcp' --transport streamable-http
mcp_servers:
cyanheads-gdelt-mcp-server:
url: "https://gdelt.caseyjhand.com/mcp" {
"McpServers": {
"cyanheads-gdelt-mcp-server": {
"Transport": "http",
"Url": "https://gdelt.caseyjhand.com/mcp"
}
}
} assistant mcp add cyanheads-gdelt-mcp-server -t streamable-http -u 'https://gdelt.caseyjhand.com/mcp'
{
"mcpServers": {
"cyanheads-gdelt-mcp-server": {
"type": "http",
"url": "https://gdelt.caseyjhand.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 19 Sept 26 0
- Server version: 0.4.1 → 0.4.2 functional
- 9 Sept 26 0
- Stability: 0.97 → pass security
- 8 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 7 Sept 26 −1
- Stability: pass → 0.93 functional
- 3 Sept 26 0
- Server version: 0.4.0 → 0.4.1 functional
- 31 Aug 26 0
- Tool “gdelt_get_coverage_timeline” rewrote its description, which is the text the model reads security
- Tool “gdelt_search_tv” rewrote its description, which is the text the model reads security
- Server version: 0.3.1 → 0.4.0 functional
- “gdelt_search_tv” added an optional parameter “limit” cosmetic
- “gdelt_search_tv” added an optional parameter “offset” cosmetic
- “gdelt_search_tv” added an optional parameter “dateres” cosmetic
- “gdelt_search_tv” reworded the description of “normalize” cosmetic
- “gdelt_search_tv” reworded the description of “stations” cosmetic
- “gdelt_search_articles” reworded the description of “sort” cosmetic
- 30 Aug 26 0
- Server version: 0.2.7 → 0.3.1 functional
- “gdelt_get_coverage_timeline” reworded the description of “timespan” cosmetic
- “gdelt_search_articles” reworded the description of “timespan” cosmetic
- “gdelt_get_tone_distribution” reworded the description of “timespan” cosmetic
- “gdelt_get_coverage_breakdown” reworded the description of “timespan” cosmetic
- 26 Aug 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 22 Sept 2026 · Probed https://gdelt.caseyjhand.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=caseyjhand.com | CN=WE1,O=Google Trust Services,C=US | 4 Sept 2026 | 3 Dec 2026 | ECDSA 256 | ECDSA-SHA256 | a6985204ed51ae050e7738aa6be668e9 |
| SANs: caseyjhand.com, *.caseyjhand.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of gdelt.caseyjhand.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| caseyjhand.com. | present | 2371 | 13 | Verified |
| gdelt.caseyjhand.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://gdelt.caseyjhand.com/mcp | Verified | 200 | |
| http (plaintext) | http://gdelt.caseyjhand.com/mcp | HTTPS enforced | 301 | https://gdelt.caseyjhand.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
gdelt_get_coverage_breakdown Get GDELT Coverage Breakdown ~527
Break down news coverage volume over time by source language or source country, returning a multi-series time series (one series per language or country). Shows which countries or languages drove early vs. late coverage — useful for tracing how a story propagated geographically or across language communities. Returns up to 10 series by total volume and aggregates the rest into an "Other" bucket, naming every series it folded in there under otherSeriesLabels — pass any of those labels back as the series input to get that series complete, ranked or not. Values are normalized: each point is the topic's share of media output, not an absolute article count. Small media markets with concentrated coverage therefore rank above large markets with diverse output — a high value means the topic dominated that source's coverage, not that it published the most articles. Use breakdownBy "country" with the signal-detection chain to map geographic attention, or "language" to detect non-English media surges.
| Name | Type | Req | Description |
|---|---|---|---|
| breakdownBy | string | yes | Breakdown dimension: "language" for source language time series, "country" for source country time series. |
| endDatetime | string | – | End datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20240131235959). Must pair with startDatetime; supplying only one of the two is rejected. |
| query | string | yes | Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme:. |
| series | array | – | Exact series labels to additionally return in full, e.g. ["Portuguese", "Vietnamese"]. Take them verbatim from otherSeriesLabels (the series folded into "Other") or topSeries[].label in a response, o… |
| startDatetime | string | – | Start datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20240101000000). Must pair with endDatetime; supplying only one of the two is rejected. |
| timespan | string | – | Time window relative to now, minimum "15min"; other examples: "24h", "7d", "1m". Ignored when startDatetime/endDatetime are set. Maximum 3 months. |
| Name | Type | Req | Description |
|---|---|---|---|
| breakdownBy | string | – | Breakdown dimension used for this response. |
| dateResolution | string | – | Temporal resolution of data points — 15min, hour, or day. |
| effectiveQuery | string | – | Echoed query string for use in follow-up calls. |
| endDatetime | string | – | Echoed end datetime when provided (YYYYMMDDHHMMSS). |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Recovery hint when no breakdown data was returned. Absent on successful responses. |
| otherAggregated | array | – | Combined time series for all series beyond the top 10. Omitted when all series fit. |
| otherSeriesLabels | array | – | Label of every series folded into otherAggregated, ranked by total volume — the identities the "Other" bucket would otherwise dissolve. Pass any of them to the series input to retrieve that series' c… |
| selectedSeries | array | – | Complete, untruncated time series for each label requested via the series input, in the order requested. Omitted when series was not supplied. |
| startDatetime | string | – | Echoed start datetime when provided (YYYYMMDDHHMMSS). |
| topSeries | array | – | Top 10 series by total coverage volume. |
| totalCount | number | – | Total number of series returned before truncation to top 10. |
No examples provided.
gdelt_get_coverage_timeline Get GDELT Coverage Timeline ~585
Retrieve a time series showing when news coverage of a topic spiked, or how average tone shifted over time. Use mode "volume" for normalized coverage intensity (% of all global coverage per timestep). Use mode "volume_with_articles" for the same signal plus the top articles that drove each spike — this is the primary signal-detection mode: a single call reveals both the spike and its cause, avoiding a follow-up gdelt_search_articles call. Use mode "tone" for average sentiment score per timestep (negative = hostile/fearful, positive = celebratory). Date resolution is inferred from returned intervals: 15 minutes or hours for short windows, days for longer ones. In volume_with_articles mode the text surface shows the first 3 article links per timestep next to that timestep's true article count; name a timestep's date in points to render its full list. Note: DOC API covers only the last 3 months.
| Name | Type | Req | Description |
|---|---|---|---|
| endDatetime | string | – | End datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20240131235959). Must pair with startDatetime; supplying only one of the two is rejected. |
| mode | string | – | Timeline mode: "volume" returns normalized coverage % per timestep, "volume_with_articles" returns volume plus top articles per spike (best for signal detection), "tone" returns average sentiment sco… |
| points | array | – | Timestep dates whose complete article list should be rendered in the text surface, e.g. ["2024-01-05T12:00:00Z"]. Take them verbatim from series[].data[].date in a prior response, or from the list an… |
| query | string | yes | Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme:, tone<. |
| smoothing | integer | – | Smoothing window in timesteps (0 = none, 1–5 = moving average width). Reduces noise for spotty topics. |
| startDatetime | string | – | Start datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20240101000000). Must pair with endDatetime; supplying only one of the two is rejected. |
| timespan | string | – | Time window relative to now, minimum "15min"; other examples: "24h", "7d", "1m". Ignored when startDatetime/endDatetime are set. Maximum 3 months. |
| Name | Type | Req | Description |
|---|---|---|---|
| dateResolution | string | – | Temporal resolution of the data points — 15min, hour, or day. |
| effectiveQuery | string | – | Echoed query string for use in follow-up calls. |
| endDatetime | string | – | Echoed end datetime when provided (YYYYMMDDHHMMSS). |
| error | object | – | Present when the call failed. Absent on success. |
| expandedPoints | array | – | Timestep dates whose full article list is rendered in the text surface instead of the first 3, echoing the points input. Omitted when points was not supplied. Purely a rendering concern — structuredC… |
| mode | string | – | Timeline mode used for this response. |
| notice | string | – | Recovery hint when no timeline data was returned. Absent on successful responses. |
| series | array | – | One or more time series (typically one for volume/tone, one per label for breakdowns). |
| startDatetime | string | – | Echoed start datetime when provided (YYYYMMDDHHMMSS). |
| totalCount | number | – | Total number of data points across all series. |
No examples provided.
gdelt_get_tone_distribution Get GDELT Tone Distribution ~320
Get the tonal distribution of articles matching a query as a histogram (bins approximately -30 to +30). Unlike a single average tone score, the histogram reveals whether coverage is uniformly negative, bimodal (some articles extremely positive and some extremely negative), or clustered near neutral. Each bin includes representative article URLs. Distinct from gdelt_get_coverage_timeline (mode: tone) — this is a snapshot distribution across all matching articles, not a time series. Use gdelt_get_coverage_timeline with mode "tone" to see how sentiment shifted over time.
| Name | Type | Req | Description |
|---|---|---|---|
| endDatetime | string | – | End datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20240131235959). Must pair with startDatetime; supplying only one of the two is rejected. |
| query | string | yes | Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme:. |
| startDatetime | string | – | Start datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20240101000000). Must pair with endDatetime; supplying only one of the two is rejected. |
| timespan | string | – | Time window relative to now, minimum "15min"; other examples: "24h", "7d", "1m". Ignored when startDatetime/endDatetime are set. Maximum 3 months. |
| Name | Type | Req | Description |
|---|---|---|---|
| effectiveQuery | string | – | Echoed query string for use in follow-up calls. |
| endDatetime | string | – | Echoed end datetime when provided (YYYYMMDDHHMMSS). |
| error | object | – | Present when the call failed. Absent on success. |
| histogram | array | – | Tone histogram sorted from most negative to most positive bin. |
| notice | string | – | Recovery hint when no tone data was returned. Absent on successful responses. |
| startDatetime | string | – | Echoed start datetime when provided (YYYYMMDDHHMMSS). |
| summary | object | – | Summary statistics derived from the histogram. |
| totalCount | number | – | Total number of articles across all histogram bins. |
No examples provided.
gdelt_get_tv_clips Get GDELT TV Clips ~505
Retrieve the top matching TV news clips (up to 3,000) for a query from the Internet Archive's Television News Archive. Each clip includes show name, station, air timestamp, a 15-second transcript excerpt, and a direct link to view the full one-minute clip. Use after gdelt_search_tv to read the actual transcript content driving a coverage spike. 3,000 is a hard per-call ceiling and GDELT offers no cursor: when a query fills it, split the run into narrower startDatetime/endDatetime windows — the response hands back the exact windows to use. Archive coverage spans 2009–October 2024.
| Name | Type | Req | Description |
|---|---|---|---|
| endDatetime | string | – | End datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20200131235959). Must pair with startDatetime; supplying only one of the two is rejected. |
| maxRecords | integer | – | Maximum number of clips to return (1–3000). 3000 is GDELT's hard per-call ceiling, not a page size — there is no cursor past it, so a query that fills 3000 must be split into narrower startDatetime/e… |
| query | string | yes | Search query for TV transcript content. Same TV operators as gdelt_search_tv: station:CNN, network:CBS, market:"National", show:"Anderson Cooper", context:"vaccine". |
| sort | string | – | Sort order: relevance (default), dateDesc (newest first), dateAsc (oldest first). |
| startDatetime | string | – | Start datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20200101000000). Must pair with endDatetime; supplying only one of the two is rejected. |
| stations | array | – | Station IDs to filter to (e.g. ["CNN", "FOXNEWS"]). The GDELT TV API requires at least one station — supply it here, or embed a station: selector directly in query. Omitting both is rejected; it does… |
| timespan | string | – | Time window, e.g. "1m", "6m". Ignored when startDatetime/endDatetime are set. TV data spans 2009–October 2024. |
| Name | Type | Req | Description |
|---|---|---|---|
| clips | array | – | Matching TV clips sorted per the sort parameter. |
| continuationWindows | array | – | The queried window halved, to re-run this query against one pair at a time when maxRecords is at its 3000 ceiling. The halves overlap by one second so no clip falls through the seam; a clip aired on… |
| effectiveQuery | string | – | Echoed query string for use in follow-up calls. |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Disclosure that the maxRecords cap was reached and more clips may exist, naming the route to them — a higher maxRecords below the 3000 ceiling, or a narrower date window at it. Absent when the full r… |
| totalCount | number | – | Number of clips returned. |
No examples provided.
gdelt_get_tv_context Get GDELT TV Context ~382
Get the top co-occurring words and phrases from TV news clips matching a query — the vocabulary framing a topic on television. Returns the most frequent non-stopword terms from matching clips, with relative frequency scores (0–100, where 100 = the query term itself). Use to understand narrative framing, identify related concepts mentioned alongside a topic, or generate follow-up search terms. TV data spans 2009–October 2024.
| Name | Type | Req | Description |
|---|---|---|---|
| endDatetime | string | – | End datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20200131235959). Must pair with startDatetime; supplying only one of the two is rejected. |
| query | string | yes | Search query for TV transcript content. Same TV operators as gdelt_search_tv: station:CNN, network:CBS, market:"National", show:"Anderson Cooper", context:"vaccine". |
| startDatetime | string | – | Start datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20200101000000). Must pair with endDatetime; supplying only one of the two is rejected. TV data spans 2009–Octob… |
| stations | array | – | Station IDs to filter to (e.g. ["CNN", "FOXNEWS"]). The GDELT TV API requires at least one station — supply it here, or embed a station: selector directly in query. Omitting both is rejected; it does… |
| timespan | string | – | Time window, e.g. "1m", "6m". Ignored when startDatetime/endDatetime are set. TV data spans 2009–October 2024. |
| Name | Type | Req | Description |
|---|---|---|---|
| effectiveQuery | string | – | Echoed query string for use in follow-up calls. |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Recovery hint when no context was found. Absent on successful responses. |
| totalCount | number | – | Number of clips from which co-occurrences were computed. Absent when the upstream API does not return a clip count. |
| words | array | – | Co-occurring terms sorted by score descending. |
No examples provided.
gdelt_get_tv_trending Get GDELT TV Trending ~83
Retrieve trending topics, keywords, and phrases currently dominating US television news across national networks. No query required — returns the top memes of the present news cycle. Updated every 15 minutes. Note: the GDELT TV archive feed stopped updating around October 2024; results from this endpoint reflect that most-recent archived data rather than a live feed.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Recovery hint when no trending topics were returned. Absent on successful responses. |
| topics | array | – | Trending topics sorted by score descending. |
| totalCount | number | – | Total number of trending topics returned. |
No examples provided.
gdelt_list_tv_stations List GDELT TV Stations ~106
List all television stations available for TV search with their market, network, monitoring start date, and monitoring end date. Stations with an end date within the last 24 hours are flagged as active; stations with earlier end dates are discontinued. Use before querying to verify a station was active during the target time period, or to discover valid station IDs for the stations parameter in other TV tools. Most station monitoring ended October 2024 when the Internet Archive TV feed stopped updating.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| activeCount | number | – | Number of stations currently flagged as active. |
| error | object | – | Present when the call failed. Absent on success. |
| stations | array | – | All TV stations sorted by station ID. |
| totalCount | number | – | Total number of stations in the list. |
No examples provided.
gdelt_search_articles Search GDELT Articles ~560
Search the last 3 months of global news coverage (65+ languages) using the GDELT DOC API. Returns up to 250 articles with URL, title, source domain, language, country, publication date, and social image URL. Query supports full GDELT syntax: phrases ("bird flu"), boolean OR ((flu OR pandemic)), source country (sourcecountry:china), source language (sourcelang:spanish), domain (domain:who.int), GKG theme (theme:DISEASE_OUTBREAK), tone filter (tone<-5 for negative), proximity (near20:"flu virus"), and repeat (repeat3:"outbreak"). 250 is a hard per-call ceiling and GDELT offers no cursor: when a query fills it, split the run into narrower startDatetime/endDatetime windows — the response hands back the exact windows to use. Note: this API covers only the most recent 3 months — use gdelt_search_tv for historical TV transcripts back to 2009.
| Name | Type | Req | Description |
|---|---|---|---|
| endDatetime | string | – | End of date range in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20240131235959). Must be supplied together with startDatetime; supplying only one of the two is rejected. |
| maxRecords | integer | – | Maximum number of articles to return (1–250). 250 is GDELT's hard per-call ceiling, not a page size — there is no cursor past it, so a query that fills 250 must be split into narrower startDatetime/e… |
| query | string | yes | Search query. Supports GDELT operators: phrases ("bird flu"), boolean OR ((flu OR pandemic)), sourcecountry:china, sourcelang:spanish, domain:who.int, theme:DISEASE_OUTBREAK, tone<-5, near20:"flu vir… |
| sort | string | – | Sort order: relevance (default), dateDesc/dateAsc, toneDesc/toneAsc, or hybridRel (GDELT hybrid relevance and recency). |
| startDatetime | string | – | Start of date range in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20240101000000). Must be supplied together with endDatetime; supplying only one of the two is rejected. |
| timespan | string | – | Time window relative to now, minimum "15min"; other examples: "24h", "7d", "1m". Ignored when startDatetime/endDatetime are set. Maximum is 3 months (the full DOC API window). Defaults to the full 3-… |
| Name | Type | Req | Description |
|---|---|---|---|
| articles | array | – | Matching articles sorted per the sort parameter. |
| continuationWindows | array | – | The queried window halved, to re-run this query against one pair at a time when maxRecords is at its 250 ceiling. The halves overlap by one second so no article falls through the seam; an article pub… |
| effectiveQuery | string | – | Echoed query string for use in follow-up calls. |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Disclosure that the maxRecords cap was reached and more articles may exist, naming the route to them — a higher maxRecords below the 250 ceiling, or a narrower date window at it. Absent when the full… |
| timespan | string | – | Echoed timespan parameter when provided. |
| totalCount | number | – | Number of articles returned in this response. |
No examples provided.
gdelt_search_tv Search GDELT TV News ~607
Search US television news closed captions (2009–October 2024, 150+ stations) for spoken mentions of a query. Returns a bounded, paged per-station time series showing airtime devoted to the topic. Use the stations parameter to select networks (e.g. ["CNN", "FOXNEWS", "MSNBC"]) — the TV API requires at least one station, supplied either there or as a station: selector inside query. TV query also supports in-query operators: station:CNN, network:CBS, market:"National", show:"Anderson Cooper 360", context:"vaccine". Important: most station monitoring ended October 2024 — use gdelt_list_tv_stations to verify active date ranges before querying recent events.
| Name | Type | Req | Description |
|---|---|---|---|
| dateres | string | – | Optional GDELT aggregation resolution. Omit to let GDELT choose from the query window; the effective recognized or inferred resolution is returned as dateResolution. |
| endDatetime | string | – | End datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20200131235959). Must pair with startDatetime; supplying only one of the two is rejected. |
| limit | integer | – | Maximum timeline points returned in this response (1–500). |
| normalize | boolean | – | When true (default), values are normalized as % of total airtime, enabling cross-station comparison. When false, returns raw matching 15-second clip counts. |
| offset | integer | – | Zero-based point offset into the deterministic date-then-station ordering. Use nextOffset from the preceding response with the same query inputs to retrieve the next page. |
| query | string | yes | Search query for TV transcript content. Supports TV operators: station:CNN, network:CBS, market:"National", show:"Anderson Cooper", context:"vaccine". Boolean OR and phrase operators also work. |
| smoothing | integer | – | Smoothing window in timesteps (0 = none). Reduces noise for sporadic topics. |
| startDatetime | string | – | Start datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators (e.g. 20200101000000). Must pair with endDatetime; supplying only one of the two is rejected. |
| stations | array | – | Up to 10 station IDs to filter to (e.g. ["CNN", "FOXNEWS", "MSNBC"]). The GDELT TV API requires at least one station — supply it here, or embed a station: selector directly in query. Omitting both is… |
| timespan | string | – | Time window, e.g. "1m", "6m", "1y". Ignored when startDatetime/endDatetime are set. TV data spans 2009–October 2024. |
| Name | Type | Req | Description |
|---|---|---|---|
| dateResolution | string | – | Temporal resolution of data points. |
| effectiveQuery | string | – | Echoed query string for use in follow-up calls. |
| error | object | – | Present when the call failed. Absent on success. |
| limit | number | – | Maximum points requested for this page. |
| nextOffset | number | – | Offset for the next page using the same query inputs. Absent when this is the final page. |
| normalized | boolean | – | True when values are normalized coverage percentages. |
| notice | string | – | Recovery hint when no TV coverage was found. Absent on successful responses. |
| offset | number | – | Zero-based offset of this point page. |
| series | array | – | Station series represented in this point page. |
| timeRange | object | – | Date range spanned by this returned point page. |
| totalCount | number | – | Number of station series returned. |
| totalPoints | number | – | Total points available across all matched station series before pagination. |
No examples provided.
What is the io.github.cyanheads/gdelt-mcp-server server?
io.github.cyanheads/gdelt-mcp-server is listed in the public MCP registry as io.github.cyanheads/gdelt-mcp-server. Search and analyze global news coverage and US TV transcripts via the GDELT Project APIs. This page covers its hosted endpoint (https://gdelt.caseyjhand.com/mcp).
Is the io.github.cyanheads/gdelt-mcp-server server safe to use?
io.github.cyanheads/gdelt-mcp-server scores 79 out of 100 on VerifyMCP. 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 io.github.cyanheads/gdelt-mcp-server server expose?
io.github.cyanheads/gdelt-mcp-server exposes 9 tools: gdelt_search_articles, gdelt_get_coverage_timeline, gdelt_get_tone_distribution, gdelt_get_coverage_breakdown, gdelt_search_tv, and 4 more. Their descriptions and schemas cost roughly 3,675 tokens of context every time the server is loaded.
Does the io.github.cyanheads/gdelt-mcp-server server require authentication?
No. We connected to io.github.cyanheads/gdelt-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the io.github.cyanheads/gdelt-mcp-server server still maintained?
io.github.cyanheads/gdelt-mcp-server is still listed as active in the MCP registry. We last reached this channel on 22 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.