gdelt-mcp-server
Server Details
Search and analyze global news coverage and US TV transcripts via the GDELT Project APIs.
- Status
- Healthy
- Uptime
- 99.9% over 64 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/gdelt-mcp-server
- GitHub Stars
- 6
- Server Listing
- @cyanheads/gdelt-mcp-server
TDQS
Scored across 9 tools
Tools target distinct resources (coverage breakdown by country/language, coverage timeline, tone histogram, TV clips, TV context, TV stations, article search, theme lookup, TV search) and the descriptions explicitly contrast the potentially overlapping tone tools (snapshot histogram vs. time-series tone mode). Minor residual overlap between coverage_timeline 'tone' and tone_distribution, but the guidance resolves it.
Every tool uses the same gdelt_ prefix with clean snake_case verb_noun patterns (get_, list_, search_). Sub-domains (tv, coverage, tone) are named predictably and read consistently as a set.
Nine tools is well-scoped for a news-coverage/analysis server, and each earns its place: search, timeline, breakdown, tone, plus a coherent TV cluster (search, clips, context, stations) and a theme lookup. No redundancy or padding.
The surface covers article search, TV search/transcripts/context/stations, themes, and the full coverage-signal chain (timeline, breakdown, tone), which is a thorough lifecycle for media analysis. Gaps are mostly upstream API constraints (article search limited to 3 months, no event/actor dataset), so an agent can work around them but a few analysis paths dead-end.
Available Tools
9 toolsgdelt_get_coverage_breakdownGet GDELT Coverage BreakdownARead-onlyInspect
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 the top 10 series ranked by the sum of their values and names every other series under otherSeriesLabels — pass any labels, ranked or not, as the series input to get only those series, complete. A response carries as many whole series as fit its size budget; when more remain it returns nextOffset — pass it back as offset with otherwise identical inputs for the next page. Values are normalized: each point is the topic's share of that source's media output, not an absolute article count, so values from different sources do not add up to a share. 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 | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme: (GKG theme identifiers come from gdelt_search_themes). | |
| offset | No | Zero-based series offset — into the ranked top 10, or into the series named in series. Pass nextOffset from the preceding response, with otherwise identical inputs, to get the next page. | |
| series | No | Exact series labels to return instead of the ranked overview, e.g. ["Portuguese", "Vietnamese"]. Take them verbatim from otherSeriesLabels or topSeries[].label in a response, or from the label list an unknown_series error prints. Each one comes back complete under selectedSeries, in the order requested; a label that matches nothing is rejected rather than silently skipped. Omit to get the ranked overview. | |
| timespan | No | Time window relative to now, minimum "15min"; other examples: "24h", "7d", "1m". Ignored when startDatetime/endDatetime are set. Maximum 3 months. | |
| breakdownBy | Yes | Breakdown dimension: "language" for source language time series, "country" for source country time series. | |
| endDatetime | No | 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. | |
| startDatetime | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when the query matched no coverage in the window — how to broaden the query or extend the window — or, when this response is one page of several, which series it returned out of how many. Absent when every series fit in one response. |
| topSeries | No | The ranked overview: the top 10 series by the sum of their values, those of this page in rank order. Omitted when the series input selects series instead. |
| nextOffset | No | Offset of the next page, for the same inputs. Absent when this page reaches the last series. |
| totalCount | No | Total number of series GDELT returned, before ranking into the top 10 or paging. |
| breakdownBy | No | Breakdown dimension used for this response. |
| endDatetime | No | Echoed end datetime when provided (YYYYMMDDHHMMSS). |
| startDatetime | No | Echoed start datetime when provided (YYYYMMDDHHMMSS). |
| dateResolution | No | Temporal resolution of data points — 15min, hour, or day — inferred from the spacing of the returned timesteps. Omitted when fewer than two distinct timesteps came back. |
| effectiveQuery | No | Echoed query string for use in follow-up calls. |
| selectedSeries | No | Complete, untruncated time series for the labels requested via the series input — those of this page, in the order requested. Omitted when series was not supplied. |
| otherSeriesLabels | No | Label of every series beyond the top 10, ranked by the sum of its values, on every overview page. Pass any of them to the series input to retrieve that series' complete data. Omitted when all series fit in the top 10, or when the series input selects series instead. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint and openWorldHint, yet the description adds a great deal: values are normalized shares not article counts, small concentrated markets can outrank large ones, only the top 10 series are returned with the rest under otherSeriesLabels, a size budget may truncate the response and yield nextOffset, and a non-matching series label is rejected rather than skipped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and each block covers a distinct concern (what it returns, pagination, normalization, usage). It is on the long side and the normalization explanation is dense, but no sentence is idle filler — the verbosity is driven by genuinely useful semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not restate field types, and it complements it by explaining ranking, truncation and the selectedSeries/otherSeriesLabels shape. Pagination, time-window limits (max 3 months) and query syntax are all covered, leaving nothing an agent needs before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema by explaining what offset pages through (nextOffset with otherwise identical inputs), what series accepts (verbatim labels from otherSeriesLabels/topSeries/unknown_series errors, returned complete under selectedSeries) and why normalization makes cross-series values non-additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (break down news coverage volume over time) and pins the scope precisely: one series per source language or source country, returned as a multi-series time series. It is clearly separable from the sibling gdelt_get_coverage_timeline, which lacks the per-source breakdown dimension.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete when-to-use guidance for each enum value: breakdownBy "country" with the signal-detection chain to map geographic attention, "language" to detect non-English media surges. What it does not do is explicitly contrast against gdelt_get_coverage_timeline or state exclusions, so it falls short of a full when/when-not/alternatives treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gdelt_get_coverage_timelineGet GDELT Coverage TimelineARead-onlyInspect
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 each timestep carries its first 3 article links and referenceCount, its true article count; name timesteps' dates in points to get only those timesteps, each with its full list. A response carries as many whole timesteps as fit its size budget; when more remain it returns nextOffset — pass it back as offset with otherwise identical inputs for the next page. Note: DOC API covers only the last 3 months.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 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 score per timestep. | volume |
| query | Yes | Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme: (GKG theme identifiers come from gdelt_search_themes), tone<. | |
| offset | No | Zero-based timestep offset — into the timeline, or into the timesteps named in points. Pass nextOffset from the preceding response, with otherwise identical inputs, to get the next page. | |
| points | No | Timestep dates to return alone, e.g. ["2024-01-05T12:00:00Z"]. Take them verbatim from series[].data[].date in a prior response, or from the list an unknown_point error prints. The response then carries only these timesteps, in timeline order, and in volume_with_articles mode each carries its complete article list instead of the first 3. A date matching no timestep is rejected rather than silently ignored. | |
| timespan | No | Time window relative to now, minimum "15min"; other examples: "24h", "7d", "1m". Ignored when startDatetime/endDatetime are set. Maximum 3 months. | |
| smoothing | No | Smoothing window in timesteps (0 = none, 1–5 = moving average width). Reduces noise for spotty topics. | |
| endDatetime | No | 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. | |
| startDatetime | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | Timeline mode used for this response. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when the query matched no coverage in the window — how to broaden the query or extend the window — or, when this response is one page of several, which timesteps it returned out of how many. Absent when the whole timeline fit in one response. |
| series | No | One or more time series (typically one for volume/tone), holding the timesteps of this page. |
| nextOffset | No | Offset of the next page, for the same inputs. Absent when this page reaches the last timestep. |
| totalCount | No | Total number of data points across all series of the full timeline, not this page. |
| endDatetime | No | Echoed end datetime when provided (YYYYMMDDHHMMSS). |
| startDatetime | No | Echoed start datetime when provided (YYYYMMDDHHMMSS). |
| dateResolution | No | Temporal resolution of the data points — 15min, hour, or day — inferred from the spacing of the returned timesteps. Omitted when fewer than two distinct timesteps came back. |
| effectiveQuery | No | Echoed query string for use in follow-up calls. |
| expandedPoints | No | Timestep dates this response is restricted to, each carrying its full article list — echoing the points input. Omitted when points was not supplied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint and openWorldHint, and the description adds substantial behavioral context beyond them: the size-budget-driven pagination contract (nextOffset/offset with otherwise identical inputs), the 3-month DOC API coverage limit, the fact that volume_with_articles truncates each timestep to 3 article links plus a true referenceCount, and that unknown dates are rejected rather than ignored. This is exactly the kind of non-obvious operational detail an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads the purpose, and the remaining sentences are dense with actionable detail rather than filler. It is long and somewhat packed — the mode, pagination, and resolution-inference sentences each carry weight, though the resolution sentence could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with an output schema, full schema coverage, and annotations already present, the description covers the remaining ambiguity: mode selection intent, pagination loop, article truncation, and the temporal coverage limit. An agent has everything needed to call and page this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description still adds meaning beyond the schema by tying mode semantics to intent ('primary signal-detection mode'), explaining offset as paging 'with otherwise identical inputs', and clarifying that points returns full article lists in volume_with_articles mode. These enrich rather than merely restate the schema, warranting a point above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource — 'Retrieve a time series showing when news coverage of a topic spiked, or how average tone shifted over time' — and enumerates three named modes with distinct semantics. It distinguishes itself from gdelt_search_articles by explaining that volume_with_articles avoids a follow-up call, but it never clarifies its boundary versus close siblings gdelt_get_coverage_breakdown or gdelt_get_tone_distribution, which overlap with its volume and tone modes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is well specified within the tool: the description states which mode to reach for ('volume_with_articles' is called out as 'the primary signal-detection mode') and gives the condition that selects it. It also explains the points/offset interaction for paging. What is missing is guidance on when to choose this tool over sibling aggregation tools like gdelt_get_coverage_breakdown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gdelt_get_tone_distributionGet GDELT Tone DistributionARead-onlyInspect
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 carries its first 3 representative article links and referenceCount, how many GDELT returned; name bins in the bins input to get only those bins, each with every link. A response carries as many whole bins as fit its size budget; when more remain it returns nextOffset — pass it back as offset with otherwise identical inputs for the next page. 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 | Required | Description | Default |
|---|---|---|---|
| bins | No | Tone bins to return alone, e.g. [-7, 4]. Take them from histogram[].bin in a prior response, or from the list an unknown_bin error prints. The response then carries only these bins, in histogram order, each with every representative article link instead of the first 3. A value matching no bin is rejected rather than silently ignored. | |
| query | Yes | Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme: (GKG theme identifiers come from gdelt_search_themes). | |
| offset | No | Zero-based bin offset — into the histogram, or into the bins named in bins. Pass nextOffset from the preceding response, with otherwise identical inputs, to get the next page. | |
| timespan | No | Time window relative to now, minimum "15min"; other examples: "24h", "7d", "1m". Ignored when startDatetime/endDatetime are set. Maximum 3 months. | |
| endDatetime | No | 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. | |
| startDatetime | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no articles matched in the window — how to broaden the query or extend the window — or, when this response is one page of several, which bins it returned out of how many. Absent when the whole histogram fit in one response. |
| summary | No | Summary statistics derived from the whole histogram, not this page. Each value is omitted when the histogram cannot support it — all of them on an empty result. |
| histogram | No | The bins of this page, sorted from most negative to most positive — the whole histogram when it fits. |
| nextOffset | No | Offset of the next page, for the same inputs. Absent when this page reaches the last bin. |
| totalCount | No | Total number of articles across all histogram bins, not only this page. |
| endDatetime | No | Echoed end datetime when provided (YYYYMMDDHHMMSS). |
| startDatetime | No | Echoed start datetime when provided (YYYYMMDDHHMMSS). |
| effectiveQuery | No | Echoed query string for use in follow-up calls. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint, so the description carries the real behavioral burden and does so well: it discloses the size budget, that a response returns whole bins only, and the nextOffset/offset paging protocol with 'otherwise identical inputs'. It also explains the default-vs-bins response difference (first 3 links vs every link) and that unmatched bins are rejected rather than ignored. It stops short of auth or rate-limit context, but the pagination and response-shaping behavior is unusually well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and the differentiator, then layers on paging and the sibling comparison. Every sentence carries information, though the response-shape details make it denser than necessary for a 6-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, yet the description still covers paging continuation and bin selection, which is what an agent needs to complete a multi-call workflow. The sibling routing is likewise complete; only minor operational context (e.g. when a query is too broad) is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented in the schema, including bins, offset, and the datetime pairing rule. The description restates the offset pass-back pattern and the bins behavior without adding format or syntax beyond what the schema supplies — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (tonal distribution of matching articles as a histogram) and immediately explains the analytical value over a single average tone score. It explicitly distinguishes itself from the sibling gdelt_get_coverage_timeline (mode: tone), so an agent can pick correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both the when-to-use case (snapshot distribution across all matching articles) and the named alternative with the condition that selects it ('Use gdelt_get_coverage_timeline with mode "tone" to see how sentiment shifted over time'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gdelt_get_tv_clipsGet GDELT TV ClipsARead-onlyInspect
Retrieve the top matching TV news clips for a query from the Internet Archive's Television News Archive: fetches up to 3,000 and returns as many as fit a 48,000-byte response — the rest are counted in withheldCount, with a continuation to reach them. Each clip includes show name, the station's display name — with its station ID when that name resolves to one — 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 — pass a series' station value as stations here. GDELT answers TV windows in whole clock hours; clips it returns from outside an explicit startDatetime/endDatetime window are dropped, and continuing a cut response at maxRecords 3000 leaves room for them. 3,000 is a hard per-call ceiling and GDELT offers no cursor: when a query fills it or a response comes back cut, re-query narrower startDatetime/endDatetime windows — the response hands back the exact windows to use. Archive coverage spans 2009–October 2024.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order: relevance (default), dateDesc (newest first), dateAsc (oldest first). | relevance |
| query | 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". | |
| stations | No | 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 not fall back to all stations. Use gdelt_list_tv_stations to see valid IDs. | |
| timespan | No | Time window, e.g. "1m", "6m". Ignored when startDatetime/endDatetime are set. TV data spans 2009–October 2024. | |
| maxRecords | No | Maximum number of clips to fetch (1–3000; a value up to 30000 runs at 3000, and the response says so in limitClamp). The response carries as many of them as fit its 48,000-byte budget. 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/endDatetime windows instead. | |
| endDatetime | No | 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. | |
| startDatetime | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| clips | No | Matching TV clips sorted per the sort parameter. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance on an incomplete or empty result. When no clips matched, the resolved timespan window and how to target the 2009–October 2024 archive or verify station IDs. When GDELT returned clips aired outside the requested window (it answers whole clock hours), how many were dropped. When the response was cut to its 48,000-byte budget, how many clips it withheld and the route to them. When the maxRecords cap was reached on an uncut response, that more clips may exist — a higher maxRecords below the 3000 ceiling, or a narrower date window at it. When a returned clip has no station ID, why: GDELT returned it without a station label, or its station catalog did not load or has no entry for the named label — with how to look the ID up. Absent when a non-empty result set fit under both the cap and the budget, no clip was dropped as out of window, and every clip carries its station ID. |
| limitClamp | No | Present only when the requested count exceeded the per-call cap: the call ran exactly as a call at the cap, and every count, notice, and continuation in this response reflects the applied value. |
| totalCount | No | Number of clips returned. |
| withheldCount | No | In-window clips GDELT returned that this response withheld to stay within its 48,000-byte budget — fetched minus returned, not counting clips dropped for falling outside the window. Absent when every in-window clip fit. |
| effectiveQuery | No | Echoed query string for use in follow-up calls. |
| continuationWindows | No | Windows to re-run this query against, one at a time, when more clips are out of reach of this response. For a response cut to its budget under dateDesc or dateAsc: one window resuming from the last returned clip, reaching back to the second it aired, so clips from that second come back again — de-duplicate by archiveUrl — or, when resuming there cannot reach a new clip, one window skipping past that second. Otherwise — maxRecords at its 3000 ceiling, or a relevance cut — the queried window split in two, on a clock hour when one falls inside it; the halves share no second. Absent when no window is known, or none would reach further. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint, so the description carries the real behavioral burden and does so richly: the 48,000-byte response budget, withheldCount accounting, continuation behavior, the 3,000 hard per-call ceiling with no cursor, whole-clock-hour window semantics, dropped out-of-window clips, and archive coverage 2009–Oct 2024. This is exactly the operational context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the hard caps, and nearly every sentence adds operational value. The clock-hour/window sentence is dense and slightly convoluted, but it carries non-obvious constraints, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, open-world search tool with an output schema, the description covers what an agent needs: required station constraints, window semantics, ceiling/cursor limits, and the re-query path. Return-value content is sketched, which the output schema handles in more detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it explains the cross-tool relationship of stations to gdelt_search_tv output, and the interaction between maxRecords 3000 and splitting into narrower startDatetime/endDatetime windows when a response is cut.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve the top matching TV news clips for a query from the Internet Archive's Television News Archive') and immediately delineates scope with the 3,000-clip / 48,000-byte caps. It also distinguishes itself from the sibling gdelt_search_tv by positioning this as the tool that reads transcript content rather than discovering coverage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the sequencing condition ('Use after gdelt_search_tv to read the actual transcript content driving a coverage spike'), tells the agent to pass a series' station value as stations, and prescribes a fallback ('re-query narrower startDatetime/endDatetime windows'). It also names gdelt_list_tv_stations in the schema as the way to find valid IDs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gdelt_get_tv_contextGet GDELT TV ContextARead-onlyInspect
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 with relative frequency scores (0–100, where 100 = the query term itself). Terms and scores come from GDELT's relevance-ranked sample of matching clips, documented as the 200 most relevant, not all matching coverage — compare windows or stations with a separate, narrower call for each. 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 | Required | Description | Default |
|---|---|---|---|
| query | 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". | |
| stations | No | 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 not fall back to all stations. Use gdelt_list_tv_stations to see valid IDs. | |
| timespan | No | Time window, e.g. "1m", "6m". Ignored when startDatetime/endDatetime are set. TV data spans 2009–October 2024. | |
| endDatetime | No | 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. | |
| startDatetime | No | 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–October 2024. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| words | No | Co-occurring terms from GDELT's relevance-ranked sample of matching clips, documented as the 200 most relevant, not all matching coverage, sorted by score descending. |
| notice | No | On every non-empty result, that terms and scores come from GDELT's relevance-ranked sample of matching clips, documented as the 200 most relevant, not all matching coverage — compare windows or stations with a separate, narrower call for each. When no clips matched, so there is no vocabulary to report, the resolved timespan window, the October 2024 archive cutoff, and how to broaden the query or check station coverage. |
| totalCount | No | Number of clips from which co-occurrences were computed. Absent when the upstream API does not return a clip count. |
| effectiveQuery | No | Echoed query string for use in follow-up calls. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/openWorldHint already declaring the safety profile, the description still adds material context: results derive from GDELT's relevance-ranked sample documented as only the 200 most relevant clips, not all matching coverage, and scores are on a 0–100 relative scale. The sampling limitation is exactly the kind of trait an agent could otherwise misread, though return-shape details are left to the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then supporting caveats. It is dense and mostly earns its sentences, but the 2009–October 2024 data span is stated in the description and repeated in three parameter descriptions, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be documented, yet the description still conveys the scoring semantics and the sampling caveat. Combined with the exhaustive station/timespan notes in the schema, an agent has what it needs to call this correctly; only explicit sibling routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the parameter docs are rich (station requirement, 14-digit datetime format, timespan precedence), so the schema carries the load. The description adds no parameter syntax of its own, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — return top co-occurring words/phrases from TV clips matching a query — and characterizes the output as 'the vocabulary framing a topic on television.' This cleanly separates it from clip-returning siblings like gdelt_search_tv or gdelt_get_tv_clips without the agent needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit use cases ('understand narrative framing, identify related concepts, or generate follow-up search terms') and warns against the wrong usage pattern ('compare windows or stations with a separate, narrower call for each'). It stops short of naming the specific sibling alternative, but the context is clear enough to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gdelt_list_tv_stationsList GDELT TV StationsARead-onlyInspect
List the television stations available for TV search with their market, network, monitoring start date, and monitoring end date — every station by default, or only those matching the optional stations, network, and market filters (each an exact, case-insensitive match; combined with AND). activeCount and totalCount count the returned stations. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | Market to narrow to (e.g. "National", "San Francisco"), matched as a whole value case-insensitively after trimming — "National" does not match "NationalSpecialty". Values come from the market field of the unfiltered list. Blank is ignored. | |
| network | No | Network to narrow to (e.g. "CNN", "ABC"), matched as a whole value case-insensitively after trimming — "FOX" does not match "FOXNEWS". Values come from the network field of the unfiltered list. Blank is ignored. | |
| stations | No | Station IDs to return (e.g. ["CNN", "FOXNEWS", "MSNBC"]) — the IDs the stations parameter of the other TV tools takes. Matches any listed ID, exactly and case-insensitively after trimming; IDs that match no station are named in the notice. Blank entries are ignored; omit it or pass [] to include every station. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Filter outcome: names the filters when no station matched, and names requested station IDs that are not in the catalog or that another filter excluded. Absent when every requested ID was returned and the result is not empty. |
| stations | No | Stations matching every supplied filter — all stations when none is given — sorted by station ID. |
| totalCount | No | Number of stations returned — the whole catalog when no filter is given. |
| activeCount | No | Number of returned stations currently flagged as active. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description adds meaningful behavioral context: activeCount/totalCount semantics, the active-vs-discontinued flag based on end date within 24 hours, and the important note that most station monitoring ended October 2024. These details help the agent interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and fields, then efficiently covers filters, counts, active status, usage, and historical context in five sentences. Every sentence contributes new, non-redundant information; no filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with optional filters and an output schema, the description covers purpose, filter semantics, count behavior, active/discontinued logic, practical use, and the monitoring cutoff context. An agent has everything needed to decide when to call it and how to interpret responses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with detailed, example-rich descriptions for market, network, and stations. The description adds only the AND-combination behavior and default-to-all behavior, which is useful but not a major lift beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('List the television stations available for TV search') and clearly enumerates the returned fields (market, network, monitoring start/end date). It is immediately distinguishable from sibling tools like gdelt_search_tv or gdelt_get_tv_clips, which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool: '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.' It does not provide explicit when-not-to-use guidance, but the clear usage context earns a solid 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gdelt_search_articlesSearch GDELT ArticlesARead-onlyInspect
Search the last 3 months of global news coverage (65+ languages) using the GDELT DOC API. Fetches up to 250 articles with URL, title, source domain, language, country, publication date, and social image URL, and returns as many as fit a 48,000-byte response — the rest are counted in withheldCount, with a continuation to reach them. 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:TAX_DISEASE_OUTBREAK — find identifiers with gdelt_search_themes), 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 or a response comes back cut, re-query 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 | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order: relevance (default), dateDesc/dateAsc, toneDesc/toneAsc, or hybridRel (GDELT hybrid relevance and recency). | relevance |
| query | Yes | Search query. Supports GDELT operators: phrases ("bird flu"), boolean OR ((flu OR pandemic)), sourcecountry:china, sourcelang:spanish, domain:who.int, theme:TAX_DISEASE_OUTBREAK (GKG theme identifiers come from gdelt_search_themes), tone<-5, near20:"flu virus", repeat3:"outbreak". | |
| timespan | No | 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-month window. | |
| maxRecords | No | Maximum number of articles to fetch (1–250; a value up to 2500 runs at 250, and the response says so in limitClamp). The response carries as many of them as fit its 48,000-byte budget. 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/endDatetime windows instead. | |
| endDatetime | No | 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. | |
| startDatetime | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance on an incomplete or empty result. When no articles matched, how to broaden the query or window. When GDELT returned articles dated outside an explicit startDatetime/endDatetime window, how many were dropped. When the response was cut to its 48,000-byte budget, how many articles it withheld and the route to them. When the maxRecords cap was reached on an uncut response, that more articles may exist — a higher maxRecords below the 250 ceiling, or a narrower date window at it. Absent when a non-empty result set fit under both the cap and the budget and no article was dropped as out of window. |
| articles | No | Matching articles sorted per the sort parameter. |
| timespan | No | Echoed timespan parameter when provided. |
| limitClamp | No | Present only when the requested count exceeded the per-call cap: the call ran exactly as a call at the cap, and every count, notice, and continuation in this response reflects the applied value. |
| totalCount | No | Number of articles returned in this response. |
| withheldCount | No | Articles GDELT returned inside the window that this response withheld to stay within its 48,000-byte budget — fetched minus returned, not counting articles dropped for falling outside an explicit window. Absent when every in-window article fit. |
| effectiveQuery | No | Echoed query string for use in follow-up calls. |
| continuationWindows | No | Windows to re-run this query against, one at a time, when more articles are out of reach of this response. For a response cut to its budget under dateDesc or dateAsc: one window resuming from the last returned article, reaching back to the second it was published, so articles from that second come back again — or, when resuming there cannot reach a new article, one window skipping past that second. Otherwise — maxRecords at its 250 ceiling, or a cut under any other sort — the queried window halved, overlapping by one second so no article falls through the seam. Either way, de-duplicate by url. Absent when no window is known, or none would reach further. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description goes further with genuinely non-obvious behavior: a 48,000-byte response budget, withheldCount accounting, the 250 hard ceiling with no cursor, and the re-query-narrower-windows workaround. That is substantial added context, but the pacing falls short of the most helpful tier because it blends behavioral facts with syntax repetition and never says what a cut response looks like in practice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and scope, and the paging/cursor caveat is placed before the syntax catalog. The long enumeration of query operators duplicates the query parameter's own schema description, which is the one place the text does not fully earn its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still names the fields and the withheldCount continuation mechanism. Combined with the 3-month window limit and the split-window recovery path, an agent has everything needed to call this correctly and handle truncation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents every parameter including the GDELT operator syntax and the maxRecords 250-vs-2500 clamp. The description adds the limitClamp behavior and the '250 is a ceiling, not a page size' framing, but otherwise largely restates the schema. Baseline 3 is appropriate when structured data carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search the last 3 months of global news coverage (65+ languages)') and enumerates the returned fields, so an agent immediately knows what it does. It explicitly differentiates from the sibling gdelt_search_tv for historical TV transcripts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (gdelt_search_tv for pre-2009 historical coverage) and the router (gdelt_search_themes for GKG theme identifiers), and gives the operative constraint that this API only covers the most recent 3 months. When-to-use and when-to-use-something-else are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gdelt_search_themesSearch GDELT GKG ThemesARead-onlyInspect
Find GDELT Global Knowledge Graph (GKG) theme identifiers for the theme: operator that gdelt_search_articles, gdelt_get_coverage_timeline, gdelt_get_tone_distribution, and gdelt_get_coverage_breakdown accept in query. Searches the identifiers in the GDELT GKG theme lookup, which carries no labels or descriptions: every query word must begin one of the _-separated parts of an identifier or run across consecutive parts, or all the words joined must, so "drought" finds NATURAL_DISASTER_DROUGHT, "cyberattack" finds CYBER_ATTACK, "plant disease" finds TAX_PLANTDISEASE, and "wb water" narrows to World Bank water themes. There is no stemming or synonym matching — "displacement" does not reach DISPLACED — except one fallback: when nothing matches, the search retries once with a trailing s dropped from each word of four or more letters, and says so. Matches rank an exact identifier first, then by the count the lookup lists — a static prevalence figure, not a live article total — and each carries a paste-ready operator such as theme:TAX_DISEASE_OUTBREAK. Page with offset and limit (up to 100 matches per page; a larger limit runs at 100).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum matches returned in this response (1–100; a value up to 1000 runs at 100, and the response says so in limitClamp). | |
| query | Yes | Words to find in theme identifiers (e.g. "drought", "cyber attack", "refugee"), a family prefix with a word ("wb water", "crisislex"), or a whole identifier to confirm it is listed ("TAX_DISEASE_OUTBREAK"). Case-insensitive; a leading theme: is ignored; every word must match, or all the words joined must ("plant disease" matches TAX_PLANTDISEASE). Must contain at least one letter or digit. | |
| offset | No | Zero-based offset into the ranked matches. Use nextOffset from the preceding response with the same query to retrieve the next page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| limit | No | Maximum matches this page holds — the requested limit, or 100 when a larger one was clamped. |
| notice | No | Search outcome: that the plural fallback supplied the matches and which words it tried, or, when nothing matched, how to retry. Absent when the query as given matched. |
| offset | No | Zero-based offset of this page. |
| matches | No | Matches on this page: an exact identifier match first, then by count descending, then by identifier. |
| limitClamp | No | Present only when the requested count exceeded the per-call cap: the call ran exactly as a call at the cap, and every count, notice, and continuation in this response reflects the applied value. |
| nextOffset | No | Offset for the next page with the same query. Absent when this is the final page. |
| totalCount | No | Total themes matching the query — the same figure as totalMatches. |
| totalMatches | No | Total themes matching the query, across all pages. |
| effectiveQuery | No | Echoed query string for use in follow-up calls. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint/openWorldHint annotations, the description carries the behavioral burden and does so richly: the lookup has no labels or descriptions, matching requires words to begin an identifier part or span consecutive parts, there is no stemming or synonym matching except a single trailing-s fallback that is self-reported, ranking is exact-first then by a static prevalence count (explicitly not a live article total), and output is a paste-ready operator. Pagination and the 100-cap clamp are also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph, front-loaded with the purpose and consumer tools, then matching rules, ranking, and paging in a sensible order. Nearly every sentence adds substance, but the limit/offset restatement near the end duplicates the schema and adds length without new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no prose, and the description still covers the non-obvious contract points an agent needs: case-insensitivity, leading theme: being ignored, the joined-words match rule, the fallback, ranking rationale, and page sizing. Nothing material is left for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents limit clamping (1–100, larger runs at 100) and offset paging via nextOffset. The description largely restates those facts ('up to 100 matches per page; a larger limit runs at 100'), adding only marginally more than the structured fields. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find GDELT GKG theme identifiers') and immediately ties it to the concrete output consumers: the theme: operator accepted by gdelt_search_articles, gdelt_get_coverage_timeline, gdelt_get_tone_distribution, and gdelt_get_coverage_breakdown. This distinguishes it cleanly from every sibling, which consume these identifiers rather than produce them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly frames the use case — resolve a theme: operator before calling the four named search/aggregation siblings — and explains the retrieval contract in detail. What's missing is explicit when-not guidance (e.g. what to do if no match is found, or whether to skip this and query articles directly), so it's strong context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gdelt_search_tvSearch GDELT TV NewsARead-onlyInspect
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 — up to 500 points per page; a larger limit runs at 500. Each series carries GDELT's display name for the station and, when that name resolves to one, the station ID gdelt_get_tv_clips takes as stations. 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 | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum timeline points returned in this response (1–500; a value up to 5000 runs at 500, and the response says so in limitClamp). | |
| query | 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. | |
| offset | No | Zero-based point offset into the deterministic date-then-station-name ordering. Use nextOffset from the preceding response with the same query inputs to retrieve the next page. | |
| dateres | No | Optional GDELT aggregation resolution. Omit to let GDELT choose from the query window; the effective recognized or inferred resolution is returned as dateResolution. | |
| stations | No | 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 rejected; it does not fall back to all stations. Use gdelt_list_tv_stations to see valid station IDs. | |
| timespan | No | Time window, e.g. "1m", "6m", "1y". Ignored when startDatetime/endDatetime are set. TV data spans 2009–October 2024. | |
| normalize | No | When true (default), values are normalized as % of total airtime, enabling cross-station comparison. When false, returns raw matching 15-second clip counts. | |
| smoothing | No | Smoothing window in timesteps (0 = none). Reduces noise for sporadic topics. | |
| endDatetime | No | 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. | |
| startDatetime | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| limit | No | Maximum points this page holds — the requested limit, or 500 when a larger one was clamped. |
| notice | No | Guidance when the query matched no TV coverage — the resolved timespan window, the October 2024 archive cutoff, and how to check station coverage. When a returned series has no station ID, why: GDELT returned it without a station label, or its station catalog did not load or has no entry for the named label — with how to look the ID up. Absent when coverage was returned and every series carries its station ID. |
| offset | No | Zero-based offset of this point page. |
| series | No | Station series represented in this point page. |
| timeRange | No | Date range spanned by this returned point page. Omitted when the page is empty. |
| limitClamp | No | Present only when the requested count exceeded the per-call cap: the call ran exactly as a call at the cap, and every count, notice, and continuation in this response reflects the applied value. |
| nextOffset | No | Offset for the next page using the same query inputs. Absent when this is the final page. |
| normalized | No | True when values are normalized coverage percentages. |
| totalCount | No | Number of station series returned. |
| totalPoints | No | Total points available across all matched station series before pagination. |
| dateResolution | No | Temporal resolution of data points — as GDELT reported it, as requested via dateres, or inferred from the returned intervals. Omitted when none of those can establish it. |
| effectiveQuery | No | Echoed query string for use in follow-up calls. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description adds substantial behavior: paging semantics with a 500-point clamp that reports itself, the hard requirement that at least one station be supplied (no fallback to all stations), the data-coverage cutoff of October 2024, and how station display names resolve to IDs usable by another tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and return shape before operational caveats, and every sentence carries information. However, it repeats the 500-point clamp (already in the limit schema) and states the at-least-one-station requirement twice, adding modest redundancy to an already dense block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, read-only search tool with an output schema, the description covers everything an agent needs: corpus scope, required station input, paging, date-range caveats, and the verification path via gdelt_list_tv_stations. No material gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (limit, offset, dateres, normalize, smoothing, startDatetime/endDatetime pairing) is already documented. The description largely restates the stations examples and query operators already in the schema, adding only the cross-tool note that station IDs are the ones gdelt_get_tv_clips accepts. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (search US TV news closed captions), pins the corpus scope (2009–Oct 2024, 150+ stations), and names what it returns (per-station airtime time series). It also distinguishes itself from siblings gdelt_get_tv_clips and gdelt_list_tv_stations by explaining how its output feeds them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing guidance: verify active date ranges with gdelt_list_tv_stations before querying recent events, and use the stations parameter or an in-query station: selector because the API rejects omitting both. It does not explicitly say when to prefer gdelt_get_tv_clips or gdelt_get_tv_context over this tool, so a full 5 is not warranted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
- Changed
gdelt_get_coverage_breakdown12 fields changed- added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Zero-based series offset — into the ranked top 10, or into the series named in series. Pass nextOffset from the preceding response, with otherwise identical inputs, to get the next page.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / series / descriptionPrevious value: -"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, or from the label list an unknown_series error prints. Each one comes back complete under selectedSeries, on top of the usual top-10 overview; a label that matches nothing is rejected rather than silently skipped. Omit to get the overview alone."New value: +"Exact series labels to return instead of the ranked overview, e.g. [\"Portuguese\", \"Vietnamese\"]. Take them verbatim from otherSeriesLabels or topSeries[].label in a response, or from the label list an unknown_series error prints. Each one comes back complete under selectedSeries, in the order requested; a label that matches nothing is rejected rather than silently skipped. Omit to get the ranked overview." - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "topSeries", - "effectiveQuery", - "breakdownBy", - "totalCount" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "effectiveQuery", + "breakdownBy", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_series`: A label passed in the series input matches no series in a non-empty breakdown. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_series`: A label passed in the series input matches no series in a non-empty breakdown. `offset_out_of_range`: The requested offset is at or beyond the last series of a non-empty overview (the top 10), or of the series named in series. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_series", - "invalid_date_range", - "invalid_query", - "gdelt_rate_limited", - "gdelt_unavailable" -]New value: +[ + "unknown_series", + "offset_out_of_range", + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +] - added
Output schema / properties / nextOffsetAdded value: +{ + "description": "Offset of the next page, for the same inputs. Absent when this page reaches the last series.", + "type": "number" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when the query matched no coverage in the window — how to broaden the query or extend the window. Absent when breakdown data was returned."New value: +"Guidance when the query matched no coverage in the window — how to broaden the query or extend the window — or, when this response is one page of several, which series it returned out of how many. Absent when every series fit in one response." - removed
Output schema / properties / otherAggregatedRemoved value: -{ - "description": "Combined time series for all series beyond the top 10. Omitted when all series fit.", - "items": { - "additionalProperties": false, - "description": "A single aggregated data point for the \"Other\" bucket.", - "properties": { - "date": { - "description": "Timestep in ISO 8601 format.", - "type": "string" - }, - "value": { - "description": "Aggregated normalized coverage volume for all remaining series — a share of media output, not an absolute article count.", - "type": "number" - } - }, - "required": [ - "date", - "value" - ], - "type": "object" - }, - "type": "array" -} - changed
Output schema / properties / otherSeriesLabels / descriptionPrevious value: -"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' complete data. Omitted when all series fit in the top 10."New value: +"Label of every series beyond the top 10, ranked by the sum of its values, on every overview page. Pass any of them to the series input to retrieve that series' complete data. Omitted when all series fit in the top 10, or when the series input selects series instead." - changed
Output schema / properties / selectedSeries / descriptionPrevious value: -"Complete, untruncated time series for each label requested via the series input, in the order requested. Omitted when series was not supplied."New value: +"Complete, untruncated time series for the labels requested via the series input — those of this page, in the order requested. Omitted when series was not supplied." - changed
Output schema / properties / topSeries / descriptionPrevious value: -"Top 10 series by total coverage volume."New value: +"The ranked overview: the top 10 series by the sum of their values, those of this page in rank order. Omitted when the series input selects series instead." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total number of series returned before truncation to top 10."New value: +"Total number of series GDELT returned, before ranking into the top 10 or paging."
- Changed
gdelt_get_coverage_timeline14 fields changed- added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Zero-based timestep offset — into the timeline, or into the timesteps named in points. Pass nextOffset from the preceding response, with otherwise identical inputs, to get the next page.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / points / descriptionPrevious value: -"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 unknown_point error prints. Only affects volume_with_articles rendering — every timestep already carries its full article list in structuredContent regardless. Timesteps not named here show their first 3 links; a date matching no timestep is rejected rather than silently ignored."New value: +"Timestep dates to return alone, e.g. [\"2024-01-05T12:00:00Z\"]. Take them verbatim from series[].data[].date in a prior response, or from the list an unknown_point error prints. The response then carries only these timesteps, in timeline order, and in volume_with_articles mode each carries its complete article list instead of the first 3. A date matching no timestep is rejected rather than silently ignored." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_point`: A date passed in the points input matches no timestep in a non-empty timeline. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_point`: A date passed in the points input matches no timestep in a non-empty timeline. `offset_out_of_range`: The requested offset is at or beyond the last timestep of a non-empty timeline, or of the timesteps named in points. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_point", - "invalid_date_range", - "invalid_query", - "gdelt_rate_limited", - "gdelt_unavailable" -]New value: +[ + "unknown_point", + "offset_out_of_range", + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +] - changed
Output schema / properties / expandedPoints / descriptionPrevious value: -"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 — structuredContent carries every article for every timestep either way."New value: +"Timestep dates this response is restricted to, each carrying its full article list — echoing the points input. Omitted when points was not supplied." - added
Output schema / properties / nextOffsetAdded value: +{ + "description": "Offset of the next page, for the same inputs. Absent when this page reaches the last timestep.", + "type": "number" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when the query matched no coverage in the window — how to broaden the query or extend the window. Absent when timeline data was returned."New value: +"Guidance when the query matched no coverage in the window — how to broaden the query or extend the window — or, when this response is one page of several, which timesteps it returned out of how many. Absent when the whole timeline fit in one response." - changed
Output schema / properties / series / descriptionPrevious value: -"One or more time series (typically one for volume/tone, one per label for breakdowns)."New value: +"One or more time series (typically one for volume/tone), holding the timesteps of this page." - changed
Output schema / properties / series / items / properties / data / descriptionPrevious value: -"Time-ordered data points for this series."New value: +"Time-ordered data points of this series returned in this response." - changed
Output schema / properties / series / items / properties / data / items / properties / articles / descriptionPrevious value: -"Top articles driving coverage at this timestep. Present only in volume_with_articles mode."New value: +"Top articles driving coverage at this timestep — the first 3, or all of them for a timestep named in points. Present only in volume_with_articles mode." - added
Output schema / properties / series / items / properties / data / items / properties / referenceCountAdded value: +{ + "description": "How many articles GDELT returned for this timestep; articles carries the first 3 unless the timestep was named in points. Present whenever articles is.", + "type": "number" +} - added
Output schema / properties / series / items / properties / peakAdded value: +{ + "additionalProperties": false, + "description": "The point of the whole series with the largest absolute value, across every page — it may lie outside data. Omitted when the series has no points.", + "properties": { + "date": { + "description": "Timestep of the peak, in ISO 8601 format.", + "type": "string" + }, + "value": { + "description": "Value at the peak timestep.", + "type": "number" + } + }, + "required": [ + "date", + "value" + ], + "type": "object" +} - added
Output schema / properties / series / items / properties / pointCountAdded value: +{ + "description": "Data points in the whole series, across every page — not only those in data. Present whenever the series has points.", + "type": "number" +} - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total number of data points across all series."New value: +"Total number of data points across all series of the full timeline, not this page."
- Changed
gdelt_get_tone_distribution12 fields changed- added
Input schema / properties / binsAdded value: +{ + "description": "Tone bins to return alone, e.g. [-7, 4]. Take them from histogram[].bin in a prior response, or from the list an unknown_bin error prints. The response then carries only these bins, in histogram order, each with every representative article link instead of the first 3. A value matching no bin is rejected rather than silently ignored.", + "items": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Zero-based bin offset — into the histogram, or into the bins named in bins. Pass nextOffset from the preceding response, with otherwise identical inputs, to get the next page.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_bin`: A value passed in the bins input matches no bin in a non-empty histogram. `offset_out_of_range`: The requested offset is at or beyond the last bin of a non-empty histogram, or of the bins named in bins. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_date_range", - "invalid_query", - "gdelt_rate_limited", - "gdelt_unavailable" -]New value: +[ + "unknown_bin", + "offset_out_of_range", + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +] - changed
Output schema / properties / histogram / descriptionPrevious value: -"Tone histogram sorted from most negative to most positive bin."New value: +"The bins of this page, sorted from most negative to most positive — the whole histogram when it fits." - changed
Output schema / properties / histogram / items / properties / articles / descriptionPrevious value: -"Representative articles in this tone bin."New value: +"Representative articles in this tone bin — the first 3, or all of them for a bin named in bins." - added
Output schema / properties / histogram / items / properties / referenceCountAdded value: +{ + "description": "How many representative articles GDELT returned for this bin; articles carries the first 3 unless the bin was named in bins.", + "type": "number" +} - changed
Output schema / properties / histogram / items / requiredPrevious value: -[ - "bin", - "count", - "articles" -]New value: +[ + "bin", + "count", + "articles", + "referenceCount" +] - added
Output schema / properties / nextOffsetAdded value: +{ + "description": "Offset of the next page, for the same inputs. Absent when this page reaches the last bin.", + "type": "number" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no articles matched in the window — how to broaden the query or extend the window. Absent when tone data was returned."New value: +"Guidance when no articles matched in the window — how to broaden the query or extend the window — or, when this response is one page of several, which bins it returned out of how many. Absent when the whole histogram fit in one response." - changed
Output schema / properties / summary / descriptionPrevious value: -"Summary statistics derived from the histogram. Each value is omitted when the histogram cannot support it — all of them on an empty result."New value: +"Summary statistics derived from the whole histogram, not this page. Each value is omitted when the histogram cannot support it — all of them on an empty result." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total number of articles across all histogram bins."New value: +"Total number of articles across all histogram bins, not only this page."
- Changed
gdelt_get_tv_clips7 fields changed- changed
Input schema / properties / maxRecords / descriptionPrevious value: -"Maximum number of clips to fetch (1–3000); the response carries as many of them as fit its 48,000-byte budget. 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/endDatetime windows instead."New value: +"Maximum number of clips to fetch (1–3000; a value up to 30000 runs at 3000, and the response says so in limitClamp). The response carries as many of them as fit its 48,000-byte budget. 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/endDatetime windows instead." - changed
Input schema / properties / maxRecords / maximumPrevious value: -3000New value: +30000 - changed
Output schema / properties / clips / items / properties / station / descriptionPrevious value: -"Station ID (e.g. \"CNN\")."New value: +"Station ID — the value the stations input and the station: operator take (e.g. \"FOXNEWS\"). Absent when GDELT's label for the station could not be resolved to an ID; notice says why." - added
Output schema / properties / clips / items / properties / stationNameAdded value: +{ + "description": "GDELT's display label for the station (e.g. \"FOX News\"). Empty when GDELT returned the clip without one; notice says so.", + "type": "string" +} - changed
Output schema / properties / clips / items / requiredPrevious value: -[ - "show", - "station", - "date", - "snippet", - "archiveUrl" -]New value: +[ + "show", + "stationName", + "date", + "snippet", + "archiveUrl" +] - added
Output schema / properties / limitClampAdded value: +{ + "additionalProperties": false, + "description": "Present only when the requested count exceeded the per-call cap: the call ran exactly as a call at the cap, and every count, notice, and continuation in this response reflects the applied value.", + "properties": { + "applied": { + "description": "The per-call cap the call ran with instead.", + "type": "number" + }, + "parameter": { + "description": "The count input that was clamped.", + "enum": [ + "maxRecords", + "limit" + ], + "type": "string" + }, + "requested": { + "description": "The value the call asked for.", + "type": "number" + } + }, + "required": [ + "parameter", + "requested", + "applied" + ], + "type": "object" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance on an incomplete or empty result. When no clips matched, the resolved timespan window and how to target the 2009–October 2024 archive or verify station IDs. When GDELT returned clips aired outside the requested window (it answers whole clock hours), how many were dropped. When the response was cut to its 48,000-byte budget, how many clips it withheld and the route to them. When the maxRecords cap was reached on an uncut response, that more clips may exist — a higher maxRecords below the 3000 ceiling, or a narrower date window at it. Absent when a non-empty result set fit under both the cap and the budget."New value: +"Guidance on an incomplete or empty result. When no clips matched, the resolved timespan window and how to target the 2009–October 2024 archive or verify station IDs. When GDELT returned clips aired outside the requested window (it answers whole clock hours), how many were dropped. When the response was cut to its 48,000-byte budget, how many clips it withheld and the route to them. When the maxRecords cap was reached on an uncut response, that more clips may exist — a higher maxRecords below the 3000 ceiling, or a narrower date window at it. When a returned clip has no station ID, why: GDELT returned it without a station label, or its station catalog did not load or has no entry for the named label — with how to look the ID up. Absent when a non-empty result set fit under both the cap and the budget, no clip was dropped as out of window, and every clip carries its station ID."
- Changed
gdelt_get_tv_context3 fields changed- changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no clips matched, so there is no vocabulary to report — the resolved timespan window, the October 2024 archive cutoff, and how to broaden the query or check station coverage. Absent when terms were returned."New value: +"On every non-empty result, that terms and scores come from GDELT's relevance-ranked sample of matching clips, documented as the 200 most relevant, not all matching coverage — compare windows or stations with a separate, narrower call for each. When no clips matched, so there is no vocabulary to report, the resolved timespan window, the October 2024 archive cutoff, and how to broaden the query or check station coverage." - changed
Output schema / properties / words / descriptionPrevious value: -"Co-occurring terms sorted by score descending."New value: +"Co-occurring terms from GDELT's relevance-ranked sample of matching clips, documented as the 200 most relevant, not all matching coverage, sorted by score descending." - changed
Output schema / properties / words / items / properties / score / descriptionPrevious value: -"Relative frequency score (0–100). The query term itself scores 100; other terms are proportional to their co-occurrence frequency."New value: +"Relative frequency score (0–100). The query term itself scores 100; other terms are proportional to their co-occurrence frequency within GDELT's relevance-ranked sample of matching clips, documented as the 200 most relevant, not all matching coverage."
- Changed
gdelt_search_articles4 fields changed- changed
Input schema / properties / maxRecords / descriptionPrevious value: -"Maximum number of articles to fetch (1–250); the response carries as many of them as fit its 48,000-byte budget. 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/endDatetime windows instead."New value: +"Maximum number of articles to fetch (1–250; a value up to 2500 runs at 250, and the response says so in limitClamp). The response carries as many of them as fit its 48,000-byte budget. 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/endDatetime windows instead." - changed
Input schema / properties / maxRecords / maximumPrevious value: -250New value: +2500 - added
Output schema / properties / limitClampAdded value: +{ + "additionalProperties": false, + "description": "Present only when the requested count exceeded the per-call cap: the call ran exactly as a call at the cap, and every count, notice, and continuation in this response reflects the applied value.", + "properties": { + "applied": { + "description": "The per-call cap the call ran with instead.", + "type": "number" + }, + "parameter": { + "description": "The count input that was clamped.", + "enum": [ + "maxRecords", + "limit" + ], + "type": "string" + }, + "requested": { + "description": "The value the call asked for.", + "type": "number" + } + }, + "required": [ + "parameter", + "requested", + "applied" + ], + "type": "object" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance on an incomplete or empty result. When no articles matched, how to broaden the query or window. When GDELT returned articles dated outside an explicit startDatetime/endDatetime window, how many were dropped. When the response was cut to its 48,000-byte budget, how many articles it withheld and the route to them. When the maxRecords cap was reached on an uncut response, that more articles may exist — a higher maxRecords below the 250 ceiling, or a narrower date window at it. Absent when a non-empty result set fit under both the cap and the budget."New value: +"Guidance on an incomplete or empty result. When no articles matched, how to broaden the query or window. When GDELT returned articles dated outside an explicit startDatetime/endDatetime window, how many were dropped. When the response was cut to its 48,000-byte budget, how many articles it withheld and the route to them. When the maxRecords cap was reached on an uncut response, that more articles may exist — a higher maxRecords below the 250 ceiling, or a narrower date window at it. Absent when a non-empty result set fit under both the cap and the budget and no article was dropped as out of window."
- Changed
gdelt_search_themes4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum matches returned in this response (1–100)."New value: +"Maximum matches returned in this response (1–100; a value up to 1000 runs at 100, and the response says so in limitClamp)." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +1000 - changed
Output schema / properties / limit / descriptionPrevious value: -"Maximum matches requested for this page."New value: +"Maximum matches this page holds — the requested limit, or 100 when a larger one was clamped." - added
Output schema / properties / limitClampAdded value: +{ + "additionalProperties": false, + "description": "Present only when the requested count exceeded the per-call cap: the call ran exactly as a call at the cap, and every count, notice, and continuation in this response reflects the applied value.", + "properties": { + "applied": { + "description": "The per-call cap the call ran with instead.", + "type": "number" + }, + "parameter": { + "description": "The count input that was clamped.", + "enum": [ + "maxRecords", + "limit" + ], + "type": "string" + }, + "requested": { + "description": "The value the call asked for.", + "type": "number" + } + }, + "required": [ + "parameter", + "requested", + "applied" + ], + "type": "object" +}
- Changed
gdelt_search_tv9 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum timeline points returned in this response (1–500)."New value: +"Maximum timeline points returned in this response (1–500; a value up to 5000 runs at 500, and the response says so in limitClamp)." - changed
Input schema / properties / limit / maximumPrevious value: -500New value: +5000 - changed
Input schema / properties / offset / descriptionPrevious value: -"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."New value: +"Zero-based point offset into the deterministic date-then-station-name ordering. Use nextOffset from the preceding response with the same query inputs to retrieve the next page." - changed
Output schema / properties / limit / descriptionPrevious value: -"Maximum points requested for this page."New value: +"Maximum points this page holds — the requested limit, or 500 when a larger one was clamped." - added
Output schema / properties / limitClampAdded value: +{ + "additionalProperties": false, + "description": "Present only when the requested count exceeded the per-call cap: the call ran exactly as a call at the cap, and every count, notice, and continuation in this response reflects the applied value.", + "properties": { + "applied": { + "description": "The per-call cap the call ran with instead.", + "type": "number" + }, + "parameter": { + "description": "The count input that was clamped.", + "enum": [ + "maxRecords", + "limit" + ], + "type": "string" + }, + "requested": { + "description": "The value the call asked for.", + "type": "number" + } + }, + "required": [ + "parameter", + "requested", + "applied" + ], + "type": "object" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when the query matched no TV coverage — the resolved timespan window, the October 2024 archive cutoff, and how to check station coverage. Absent when coverage was returned."New value: +"Guidance when the query matched no TV coverage — the resolved timespan window, the October 2024 archive cutoff, and how to check station coverage. When a returned series has no station ID, why: GDELT returned it without a station label, or its station catalog did not load or has no entry for the named label — with how to look the ID up. Absent when coverage was returned and every series carries its station ID." - changed
Output schema / properties / series / items / properties / station / descriptionPrevious value: -"Station ID (e.g. \"CNN\")."New value: +"Station ID — the value the stations input and the station: operator take (e.g. \"FOXNEWS\"). Absent when GDELT's label for the station could not be resolved to an ID; notice says why." - added
Output schema / properties / series / items / properties / stationNameAdded value: +{ + "description": "GDELT's display label for the station (e.g. \"FOX News\"). Empty when GDELT returned the series without one; notice says so.", + "type": "string" +} - changed
Output schema / properties / series / items / requiredPrevious value: -[ - "station", - "data" -]New value: +[ + "stationName", + "data" +]
5 tool updates
- Changed
gdelt_get_coverage_breakdown1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme:."New value: +"Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme: (GKG theme identifiers come from gdelt_search_themes)."
- Changed
gdelt_get_coverage_timeline1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme:, tone<."New value: +"Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme: (GKG theme identifiers come from gdelt_search_themes), tone<."
- Changed
gdelt_get_tone_distribution1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme:."New value: +"Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme: (GKG theme identifiers come from gdelt_search_themes)."
- Changed
gdelt_search_articles1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"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 virus\", repeat3:\"outbreak\"."New value: +"Search query. Supports GDELT operators: phrases (\"bird flu\"), boolean OR ((flu OR pandemic)), sourcecountry:china, sourcelang:spanish, domain:who.int, theme:TAX_DISEASE_OUTBREAK (GKG theme identifiers come from gdelt_search_themes), tone<-5, near20:\"flu virus\", repeat3:\"outbreak\"."
- Added
gdelt_search_themes
9 tool updates
- Changed
gdelt_get_coverage_breakdown5 fields changed- changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "dateResolution", - "topSeries", - "effectiveQuery", - "breakdownBy", - "totalCount" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "topSeries", + "effectiveQuery", + "breakdownBy", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / dateResolution / descriptionPrevious value: -"Temporal resolution of data points — 15min, hour, or day."New value: +"Temporal resolution of data points — 15min, hour, or day — inferred from the spacing of the returned timesteps. Omitted when fewer than two distinct timesteps came back." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_breakdown_data`: No breakdown data returned for the query. `unknown_series`: A label passed in the series input matches no series in this breakdown. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_series`: A label passed in the series input matches no series in a non-empty breakdown. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_breakdown_data", - "unknown_series", - "invalid_date_range", - "invalid_query", - "gdelt_rate_limited", - "gdelt_unavailable" -]New value: +[ + "unknown_series", + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Recovery hint when no breakdown data was returned. Absent on successful responses."New value: +"Guidance when the query matched no coverage in the window — how to broaden the query or extend the window. Absent when breakdown data was returned."
- Changed
gdelt_get_coverage_timeline5 fields changed- changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "dateResolution", - "series", - "effectiveQuery", - "mode", - "totalCount" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "series", + "effectiveQuery", + "mode", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / dateResolution / descriptionPrevious value: -"Temporal resolution of the data points — 15min, hour, or day."New value: +"Temporal resolution of the data points — 15min, hour, or day — inferred from the spacing of the returned timesteps. Omitted when fewer than two distinct timesteps came back." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_timeline_data`: No timeline data returned for the query and time range. `unknown_point`: A date passed in the points input matches no timestep in this timeline. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_point`: A date passed in the points input matches no timestep in a non-empty timeline. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_timeline_data", - "unknown_point", - "invalid_date_range", - "invalid_query", - "gdelt_rate_limited", - "gdelt_unavailable" -]New value: +[ + "unknown_point", + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Recovery hint when no timeline data was returned. Absent on successful responses."New value: +"Guidance when the query matched no coverage in the window — how to broaden the query or extend the window. Absent when timeline data was returned."
- Changed
gdelt_get_tone_distribution8 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_tone_data`: No tone histogram data returned for the query. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_tone_data", - "invalid_date_range", - "invalid_query", - "gdelt_rate_limited", - "gdelt_unavailable" -]New value: +[ + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Recovery hint when no tone data was returned. Absent on successful responses."New value: +"Guidance when no articles matched in the window — how to broaden the query or extend the window. Absent when tone data was returned." - changed
Output schema / properties / summary / descriptionPrevious value: -"Summary statistics derived from the histogram."New value: +"Summary statistics derived from the histogram. Each value is omitted when the histogram cannot support it — all of them on an empty result." - changed
Output schema / properties / summary / properties / neutralPct / descriptionPrevious value: -"Percentage of articles in the near-neutral range (bins -2 to +2)."New value: +"Percentage of articles in the near-neutral range (bins -2 to +2). Omitted when the histogram counts no articles." - changed
Output schema / properties / summary / properties / peakNegativeBin / descriptionPrevious value: -"Tone bin with the highest count among negative bins (bin < 0)."New value: +"Tone bin with the highest count among negative bins (bin < 0). Omitted when no negative bin was returned." - changed
Output schema / properties / summary / properties / peakPositiveBin / descriptionPrevious value: -"Tone bin with the highest count among positive bins (bin > 0)."New value: +"Tone bin with the highest count among positive bins (bin > 0). Omitted when no positive bin was returned." - removed
Output schema / properties / summary / requiredRemoved value: -[ - "peakNegativeBin", - "peakPositiveBin", - "neutralPct" -]
- Changed
gdelt_get_tv_clips6 fields changed- changed
Input schema / properties / maxRecords / descriptionPrevious value: -"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/endDatetime windows instead."New value: +"Maximum number of clips to fetch (1–3000); the response carries as many of them as fit its 48,000-byte budget. 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/endDatetime windows instead." - changed
Output schema / properties / continuationWindows / descriptionPrevious value: -"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 that second can come back in both, so de-duplicate by archiveUrl. Absent unless the ceiling was reached with a window that is both known and wide enough to divide."New value: +"Windows to re-run this query against, one at a time, when more clips are out of reach of this response. For a response cut to its budget under dateDesc or dateAsc: one window resuming from the last returned clip, reaching back to the second it aired, so clips from that second come back again — de-duplicate by archiveUrl — or, when resuming there cannot reach a new clip, one window skipping past that second. Otherwise — maxRecords at its 3000 ceiling, or a relevance cut — the queried window split in two, on a clock hour when one falls inside it; the halves share no second. Absent when no window is known, or none would reach further." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_clips`: No TV clips matched the query in the specified time range. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_clips", - "invalid_date_range", - "invalid_query", - "gdelt_rate_limited", - "gdelt_unavailable" -]New value: +[ + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"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 result set fit under the cap."New value: +"Guidance on an incomplete or empty result. When no clips matched, the resolved timespan window and how to target the 2009–October 2024 archive or verify station IDs. When GDELT returned clips aired outside the requested window (it answers whole clock hours), how many were dropped. When the response was cut to its 48,000-byte budget, how many clips it withheld and the route to them. When the maxRecords cap was reached on an uncut response, that more clips may exist — a higher maxRecords below the 3000 ceiling, or a narrower date window at it. Absent when a non-empty result set fit under both the cap and the budget." - added
Output schema / properties / withheldCountAdded value: +{ + "description": "In-window clips GDELT returned that this response withheld to stay within its 48,000-byte budget — fetched minus returned, not counting clips dropped for falling outside the window. Absent when every in-window clip fit.", + "type": "number" +}
- Changed
gdelt_get_tv_context3 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_context`: No context words found — no clips matched the query. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_context", - "invalid_date_range", - "invalid_query", - "gdelt_rate_limited", - "gdelt_unavailable" -]New value: +[ + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Recovery hint when no context was found. Absent on successful responses."New value: +"Guidance when no clips matched, so there is no vocabulary to report — the resolved timespan window, the October 2024 archive cutoff, and how to broaden the query or check station coverage. Absent when terms were returned."
- Removed
gdelt_get_tv_trending - Changed
gdelt_list_tv_stations9 fields changed- added
Input schema / properties / marketAdded value: +{ + "description": "Market to narrow to (e.g. \"National\", \"San Francisco\"), matched as a whole value case-insensitively after trimming — \"National\" does not match \"NationalSpecialty\". Values come from the market field of the unfiltered list. Blank is ignored.", + "type": "string" +} - added
Input schema / properties / networkAdded value: +{ + "description": "Network to narrow to (e.g. \"CNN\", \"ABC\"), matched as a whole value case-insensitively after trimming — \"FOX\" does not match \"FOXNEWS\". Values come from the network field of the unfiltered list. Blank is ignored.", + "type": "string" +} - added
Input schema / properties / stationsAdded value: +{ + "description": "Station IDs to return (e.g. [\"CNN\", \"FOXNEWS\", \"MSNBC\"]) — the IDs the stations parameter of the other TV tools takes. Matches any listed ID, exactly and case-insensitively after trimming; IDs that match no station are named in the notice. Blank entries are ignored; omit it or pass [] to include every station.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / activeCount / descriptionPrevious value: -"Number of stations currently flagged as active."New value: +"Number of returned stations currently flagged as active." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_stations`: The station list returned empty — API may be temporarily unavailable. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data, including an empty station catalog. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_stations", - "gdelt_rate_limited", - "gdelt_unavailable" -]New value: +[ + "gdelt_rate_limited", + "gdelt_unavailable" +] - added
Output schema / properties / noticeAdded value: +{ + "description": "Filter outcome: names the filters when no station matched, and names requested station IDs that are not in the catalog or that another filter excluded. Absent when every requested ID was returned and the result is not empty.", + "type": "string" +} - changed
Output schema / properties / stations / descriptionPrevious value: -"All TV stations sorted by station ID."New value: +"Stations matching every supplied filter — all stations when none is given — sorted by station ID." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total number of stations in the list."New value: +"Number of stations returned — the whole catalog when no filter is given."
- Changed
gdelt_search_articles6 fields changed- changed
Input schema / properties / maxRecords / descriptionPrevious value: -"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/endDatetime windows instead."New value: +"Maximum number of articles to fetch (1–250); the response carries as many of them as fit its 48,000-byte budget. 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/endDatetime windows instead." - changed
Output schema / properties / continuationWindows / descriptionPrevious value: -"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 published on that second can come back in both, so de-duplicate by url. Absent unless the ceiling was reached with a window that is both known and wide enough to divide."New value: +"Windows to re-run this query against, one at a time, when more articles are out of reach of this response. For a response cut to its budget under dateDesc or dateAsc: one window resuming from the last returned article, reaching back to the second it was published, so articles from that second come back again — or, when resuming there cannot reach a new article, one window skipping past that second. Otherwise — maxRecords at its 250 ceiling, or a cut under any other sort — the queried window halved, overlapping by one second so no article falls through the seam. Either way, de-duplicate by url. Absent when no window is known, or none would reach further." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_articles`: No articles matched the query within the specified time range. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_articles", - "invalid_date_range", - "invalid_query", - "gdelt_rate_limited", - "gdelt_unavailable" -]New value: +[ + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"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 result set fit under the cap."New value: +"Guidance on an incomplete or empty result. When no articles matched, how to broaden the query or window. When GDELT returned articles dated outside an explicit startDatetime/endDatetime window, how many were dropped. When the response was cut to its 48,000-byte budget, how many articles it withheld and the route to them. When the maxRecords cap was reached on an uncut response, that more articles may exist — a higher maxRecords below the 250 ceiling, or a narrower date window at it. Absent when a non-empty result set fit under both the cap and the budget." - added
Output schema / properties / withheldCountAdded value: +{ + "description": "Articles GDELT returned inside the window that this response withheld to stay within its 48,000-byte budget — fetched minus returned, not counting articles dropped for falling outside an explicit window. Absent when every in-window article fit.", + "type": "number" +}
- Changed
gdelt_search_tv6 fields changed- changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "dateResolution", - "timeRange", - "series", - "normalized", - "totalPoints", - "offset", - "limit", - "effectiveQuery", - "totalCount" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "series", + "normalized", + "totalPoints", + "offset", + "limit", + "effectiveQuery", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / dateResolution / descriptionPrevious value: -"Temporal resolution of data points."New value: +"Temporal resolution of data points — as GDELT reported it, as requested via dateres, or inferred from the returned intervals. Omitted when none of those can establish it." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_tv_coverage`: No TV coverage found for the query in the specified time range. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `offset_out_of_range`: The requested point offset is at or beyond the end of a non-empty timeline. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `offset_out_of_range`: The requested point offset is at or beyond the end of a non-empty timeline. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_tv_coverage", - "invalid_date_range", - "offset_out_of_range", - "invalid_query", - "gdelt_rate_limited", - "gdelt_unavailable" -]New value: +[ + "invalid_date_range", + "offset_out_of_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Recovery hint when no TV coverage was found. Absent on successful responses."New value: +"Guidance when the query matched no TV coverage — the resolved timespan window, the October 2024 archive cutoff, and how to check station coverage. Absent when coverage was returned." - changed
Output schema / properties / timeRange / descriptionPrevious value: -"Date range spanned by this returned point page."New value: +"Date range spanned by this returned point page. Omitted when the page is empty."
7 tool updates
- Changed
gdelt_get_coverage_breakdown1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_breakdown_data`: No breakdown data returned for the query. `unknown_series`: A label passed in the series input matches no series in this breakdown. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_breakdown_data`: No breakdown data returned for the query. `unknown_series`: A label passed in the series input matches no series in this breakdown. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_get_coverage_timeline1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_timeline_data`: No timeline data returned for the query and time range. `unknown_point`: A date passed in the points input matches no timestep in this timeline. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_timeline_data`: No timeline data returned for the query and time range. `unknown_point`: A date passed in the points input matches no timestep in this timeline. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_get_tone_distribution1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_tone_data`: No tone histogram data returned for the query. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_tone_data`: No tone histogram data returned for the query. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_get_tv_clips1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_clips`: No TV clips matched the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_clips`: No TV clips matched the query in the specified time range. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_get_tv_context1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_context`: No context words found — no clips matched the query. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_context`: No context words found — no clips matched the query. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_search_articles1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_articles`: No articles matched the query within the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_articles`: No articles matched the query within the specified time range. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_search_tv1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_tv_coverage`: No TV coverage found for the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `offset_out_of_range`: The requested point offset is at or beyond the end of a non-empty timeline. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_tv_coverage`: No TV coverage found for the query in the specified time range. `invalid_date_range`: Only one of startDatetime / endDatetime was supplied, one of them is not a real UTC calendar timestamp, or startDatetime is not earlier than endDatetime. `offset_out_of_range`: The requested point offset is at or beyond the end of a non-empty timeline. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
9 tool updates
- Changed
gdelt_get_coverage_breakdown1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_breakdown_data`: No breakdown data returned for the query. `unknown_series`: A label passed in the series input matches no series in this breakdown. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_breakdown_data`: No breakdown data returned for the query. `unknown_series`: A label passed in the series input matches no series in this breakdown. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_get_coverage_timeline1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_timeline_data`: No timeline data returned for the query and time range. `unknown_point`: A date passed in the points input matches no timestep in this timeline. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_timeline_data`: No timeline data returned for the query and time range. `unknown_point`: A date passed in the points input matches no timestep in this timeline. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_get_tone_distribution1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_tone_data`: No tone histogram data returned for the query. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_tone_data`: No tone histogram data returned for the query. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_get_tv_clips1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_clips`: No TV clips matched the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_clips`: No TV clips matched the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_get_tv_context1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_context`: No context words found — no clips matched the query. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_context`: No context words found — no clips matched the query. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_get_tv_trending1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_trending`: No trending topics returned — the endpoint returned an empty list. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_trending`: No trending topics returned — the endpoint returned an empty list. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_list_tv_stations1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_stations`: The station list returned empty — API may be temporarily unavailable. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_stations`: The station list returned empty — API may be temporarily unavailable. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_search_articles1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_articles`: No articles matched the query within the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_articles`: No articles matched the query within the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
- Changed
gdelt_search_tv1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_tv_coverage`: No TV coverage found for the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `offset_out_of_range`: The requested point offset is at or beyond the end of a non-empty timeline. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_tv_coverage`: No TV coverage found for the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `offset_out_of_range`: The requested point offset is at or beyond the end of a non-empty timeline. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request for its one-request-per-five-seconds limit, or too many requests were already queued for this one to start in time. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."
4 tool updates
- Changed
gdelt_get_coverage_breakdown2 fields changed- changed
Output schema / properties / dateResolution / descriptionPrevious value: -"Temporal resolution of data points."New value: +"Temporal resolution of data points — 15min, hour, or day." - changed
Output schema / properties / dateResolution / enumPrevious value: -[ - "hour", - "day" -]New value: +[ + "15min", + "hour", + "day" +]
- Changed
gdelt_get_coverage_timeline2 fields changed- changed
Output schema / properties / dateResolution / descriptionPrevious value: -"Temporal resolution of the data points — hour for short windows, day for longer."New value: +"Temporal resolution of the data points — 15min, hour, or day." - changed
Output schema / properties / dateResolution / enumPrevious value: -[ - "hour", - "day" -]New value: +[ + "15min", + "hour", + "day" +]
- Changed
gdelt_search_articles2 fields changed- changed
Input schema / properties / sort / descriptionPrevious value: -"Sort order: relevance (default), date (newest first), social (most socially shared)."New value: +"Sort order: relevance (default), dateDesc/dateAsc, toneDesc/toneAsc, or hybridRel (GDELT hybrid relevance and recency)." - changed
Input schema / properties / sort / enumPrevious value: -[ - "date", - "relevance", - "social" -]New value: +[ + "relevance", + "dateDesc", + "dateAsc", + "toneDesc", + "toneAsc", + "hybridRel" +]
- Changed
gdelt_search_tv17 fields changed- added
Input schema / properties / dateresAdded value: +{ + "description": "Optional GDELT aggregation resolution. Omit to let GDELT choose from the query window; the effective recognized or inferred resolution is returned as dateResolution.", + "enum": [ + "hour", + "day", + "week", + "month", + "year" + ], + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 500, + "description": "Maximum timeline points returned in this response (1–500).", + "maximum": 500, + "minimum": 1, + "type": "integer" +} - changed
Input schema / properties / normalize / descriptionPrevious value: -"When true (default), values are normalized as % of total airtime, enabling cross-station comparison. When false, returns raw coverage volume."New value: +"When true (default), values are normalized as % of total airtime, enabling cross-station comparison. When false, returns raw matching 15-second clip counts." - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "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.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / stations / descriptionPrevious value: -"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 rejected; it does not fall back to all stations. Use gdelt_list_tv_stations to see valid station IDs."New value: +"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 rejected; it does not fall back to all stations. Use gdelt_list_tv_stations to see valid station IDs." - added
Input schema / properties / stations / maxItemsAdded value: +10 - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "dateResolution", - "timeRange", - "series", - "normalized", - "effectiveQuery", - "totalCount" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "dateResolution", + "timeRange", + "series", + "normalized", + "totalPoints", + "offset", + "limit", + "effectiveQuery", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / dateResolution / enumPrevious value: -[ - "hour", - "day", - "month" -]New value: +[ + "hour", + "day", + "week", + "month", + "year" +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_tv_coverage`: No TV coverage found for the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_tv_coverage`: No TV coverage found for the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `offset_out_of_range`: The requested point offset is at or beyond the end of a non-empty timeline. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_tv_coverage", - "invalid_date_range", - "invalid_query", - "gdelt_rate_limited", - "gdelt_unavailable" -]New value: +[ + "no_tv_coverage", + "invalid_date_range", + "offset_out_of_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +] - added
Output schema / properties / limitAdded value: +{ + "description": "Maximum points requested for this page.", + "type": "number" +} - added
Output schema / properties / nextOffsetAdded value: +{ + "description": "Offset for the next page using the same query inputs. Absent when this is the final page.", + "type": "number" +} - added
Output schema / properties / offsetAdded value: +{ + "description": "Zero-based offset of this point page.", + "type": "number" +} - changed
Output schema / properties / series / descriptionPrevious value: -"One coverage series per explicitly selected station."New value: +"Station series represented in this point page." - changed
Output schema / properties / series / items / properties / data / items / properties / value / descriptionPrevious value: -"Coverage value (normalized % or raw count)."New value: +"Coverage value (normalized % or raw matching 15-second clip count)." - changed
Output schema / properties / timeRange / descriptionPrevious value: -"Date range spanned by the returned data."New value: +"Date range spanned by this returned point page." - added
Output schema / properties / totalPointsAdded value: +{ + "description": "Total points available across all matched station series before pagination.", + "type": "number" +}
9 tool updates
- Changed
gdelt_get_coverage_breakdown3 fields changed- changed
Input schema / properties / timespan / descriptionPrevious value: -"Time window relative to now, e.g. \"24h\", \"7d\", \"1m\". Ignored when startDatetime/endDatetime are set. Maximum 3 months."New value: +"Time window relative to now, minimum \"15min\"; other examples: \"24h\", \"7d\", \"1m\". Ignored when startDatetime/endDatetime are set. Maximum 3 months." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_breakdown_data`: No breakdown data returned for the query. `unknown_series`: A label passed in the series input matches no series in this breakdown. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_unavailable`: GDELT DOC API is unreachable or rate-limited. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_breakdown_data`: No breakdown data returned for the query. `unknown_series`: A label passed in the series input matches no series in this breakdown. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_breakdown_data", - "unknown_series", - "invalid_date_range", - "invalid_query", - "gdelt_unavailable" -]New value: +[ + "no_breakdown_data", + "unknown_series", + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +]
- Changed
gdelt_get_coverage_timeline3 fields changed- changed
Input schema / properties / timespan / descriptionPrevious value: -"Time window relative to now, e.g. \"24h\", \"7d\", \"1m\". Ignored when startDatetime/endDatetime are set. Maximum 3 months."New value: +"Time window relative to now, minimum \"15min\"; other examples: \"24h\", \"7d\", \"1m\". Ignored when startDatetime/endDatetime are set. Maximum 3 months." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_timeline_data`: No timeline data returned for the query and time range. `unknown_point`: A date passed in the points input matches no timestep in this timeline. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_unavailable`: GDELT DOC API is unreachable or rate-limited. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_timeline_data`: No timeline data returned for the query and time range. `unknown_point`: A date passed in the points input matches no timestep in this timeline. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_timeline_data", - "unknown_point", - "invalid_date_range", - "invalid_query", - "gdelt_unavailable" -]New value: +[ + "no_timeline_data", + "unknown_point", + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +]
- Changed
gdelt_get_tone_distribution3 fields changed- changed
Input schema / properties / timespan / descriptionPrevious value: -"Time window relative to now, e.g. \"24h\", \"7d\", \"1m\". Ignored when startDatetime/endDatetime are set. Maximum 3 months."New value: +"Time window relative to now, minimum \"15min\"; other examples: \"24h\", \"7d\", \"1m\". Ignored when startDatetime/endDatetime are set. Maximum 3 months." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_tone_data`: No tone histogram data returned for the query. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_unavailable`: GDELT DOC API is unreachable or rate-limited. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_tone_data`: No tone histogram data returned for the query. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_tone_data", - "invalid_date_range", - "invalid_query", - "gdelt_unavailable" -]New value: +[ + "no_tone_data", + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +]
- Changed
gdelt_get_tv_clips2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_clips`: No TV clips matched the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_unavailable`: GDELT TV API is unreachable or rate-limited. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_clips`: No TV clips matched the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_clips", - "invalid_date_range", - "invalid_query", - "gdelt_unavailable" -]New value: +[ + "no_clips", + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +]
- Changed
gdelt_get_tv_context2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_context`: No context words found — no clips matched the query. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_unavailable`: GDELT TV API is unreachable or rate-limited. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_context`: No context words found — no clips matched the query. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_context", - "invalid_date_range", - "invalid_query", - "gdelt_unavailable" -]New value: +[ + "no_context", + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +]
- Changed
gdelt_get_tv_trending2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_trending`: No trending topics returned — the endpoint returned an empty list. `gdelt_unavailable`: GDELT TV API is unreachable or rate-limited. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_trending`: No trending topics returned — the endpoint returned an empty list. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_trending", - "gdelt_unavailable" -]New value: +[ + "no_trending", + "gdelt_rate_limited", + "gdelt_unavailable" +]
- Changed
gdelt_list_tv_stations2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_stations`: The station list returned empty — API may be temporarily unavailable. `gdelt_unavailable`: GDELT TV API is unreachable or rate-limited. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_stations`: The station list returned empty — API may be temporarily unavailable. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_stations", - "gdelt_unavailable" -]New value: +[ + "no_stations", + "gdelt_rate_limited", + "gdelt_unavailable" +]
- Changed
gdelt_search_articles3 fields changed- changed
Input schema / properties / timespan / descriptionPrevious value: -"Time window relative to now, e.g. \"24h\", \"7d\", \"1m\". Ignored when startDatetime/endDatetime are set. Maximum is 3 months (the full DOC API window). Defaults to the full 3-month window."New value: +"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-month window." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_articles`: No articles matched the query within the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_unavailable`: GDELT DOC API is unreachable or rate-limited. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_articles`: No articles matched the query within the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT DOC API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_articles", - "invalid_date_range", - "invalid_query", - "gdelt_unavailable" -]New value: +[ + "no_articles", + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +]
- Changed
gdelt_search_tv3 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_tv_coverage`: No TV coverage found for the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_unavailable`: GDELT TV API is unreachable or rate-limited. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_tv_coverage`: No TV coverage found for the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_rate_limited`: GDELT rejected the request because its one-request-per-five-seconds limit was reached. `gdelt_unavailable`: GDELT TV API is unreachable or temporarily returned no usable data. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_tv_coverage", - "invalid_date_range", - "invalid_query", - "gdelt_unavailable" -]New value: +[ + "no_tv_coverage", + "invalid_date_range", + "invalid_query", + "gdelt_rate_limited", + "gdelt_unavailable" +] - changed
Output schema / properties / series / descriptionPrevious value: -"One series per station or combined national coverage."New value: +"One coverage series per explicitly selected station."
9 tool updates
- Changed
gdelt_get_coverage_breakdown6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "dateResolution", + "topSeries", + "effectiveQuery", + "breakdownBy", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_breakdown_data`: No breakdown data returned for the query. `unknown_series`: A label passed in the series input matches no series in this breakdown. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_unavailable`: GDELT DOC API is unreachable or rate-limited. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_breakdown_data", + "unknown_series", + "invalid_date_range", + "invalid_query", + "gdelt_unavailable" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "dateResolution", - "topSeries", - "effectiveQuery", - "breakdownBy", - "totalCount" -]
- Changed
gdelt_get_coverage_timeline6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "dateResolution", + "series", + "effectiveQuery", + "mode", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_timeline_data`: No timeline data returned for the query and time range. `unknown_point`: A date passed in the points input matches no timestep in this timeline. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_unavailable`: GDELT DOC API is unreachable or rate-limited. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_timeline_data", + "unknown_point", + "invalid_date_range", + "invalid_query", + "gdelt_unavailable" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "dateResolution", - "series", - "effectiveQuery", - "mode", - "totalCount" -]
- Changed
gdelt_get_tone_distribution6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "histogram", + "summary", + "effectiveQuery", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_tone_data`: No tone histogram data returned for the query. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_unavailable`: GDELT DOC API is unreachable or rate-limited. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_tone_data", + "invalid_date_range", + "invalid_query", + "gdelt_unavailable" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "histogram", - "summary", - "effectiveQuery", - "totalCount" -]
- Changed
gdelt_get_tv_clips6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "clips", + "effectiveQuery", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_clips`: No TV clips matched the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_unavailable`: GDELT TV API is unreachable or rate-limited. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_clips", + "invalid_date_range", + "invalid_query", + "gdelt_unavailable" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "clips", - "effectiveQuery", - "totalCount" -]
- Changed
gdelt_get_tv_context6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "words", + "effectiveQuery" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_context`: No context words found — no clips matched the query. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_unavailable`: GDELT TV API is unreachable or rate-limited. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_context", + "invalid_date_range", + "invalid_query", + "gdelt_unavailable" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "words", - "effectiveQuery" -]
- Changed
gdelt_get_tv_trending6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "topics", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_trending`: No trending topics returned — the endpoint returned an empty list. `gdelt_unavailable`: GDELT TV API is unreachable or rate-limited. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_trending", + "gdelt_unavailable" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "topics", - "totalCount" -]
- Changed
gdelt_list_tv_stations6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "stations", + "activeCount", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_stations`: The station list returned empty — API may be temporarily unavailable. `gdelt_unavailable`: GDELT TV API is unreachable or rate-limited. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_stations", + "gdelt_unavailable" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "stations", - "activeCount", - "totalCount" -]
- Changed
gdelt_search_articles6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "articles", + "effectiveQuery", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_articles`: No articles matched the query within the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character. `gdelt_unavailable`: GDELT DOC API is unreachable or rate-limited. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_articles", + "invalid_date_range", + "invalid_query", + "gdelt_unavailable" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "articles", - "effectiveQuery", - "totalCount" -]
- Changed
gdelt_search_tv6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "dateResolution", + "timeRange", + "series", + "normalized", + "effectiveQuery", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_tv_coverage`: No TV coverage found for the query in the specified time range. `invalid_date_range`: Exactly one of startDatetime / endDatetime was supplied. `invalid_query`: GDELT rejected the query — no station was selected, or the query string is malformed. `gdelt_unavailable`: GDELT TV API is unreachable or rate-limited. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_tv_coverage", + "invalid_date_range", + "invalid_query", + "gdelt_unavailable" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "dateResolution", - "timeRange", - "series", - "normalized", - "effectiveQuery", - "totalCount" -]
4 tool updates
- Changed
gdelt_get_coverage_breakdown3 fields changed- added
Input schema / properties / seriesAdded value: +{ + "description": "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, or from the label list an unknown_series error prints. Each one comes back complete under selectedSeries, on top of the usual top-10 overview; a label that matches nothing is rejected rather than silently skipped. Omit to get the overview alone.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / otherSeriesLabelsAdded value: +{ + "description": "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' complete data. Omitted when all series fit in the top 10.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / selectedSeriesAdded value: +{ + "description": "Complete, untruncated time series for each label requested via the series input, in the order requested. Omitted when series was not supplied.", + "items": { + "additionalProperties": false, + "description": "A single language or country coverage series.", + "properties": { + "data": { + "description": "Time-ordered data points for this series.", + "items": { + "additionalProperties": false, + "description": "A single data point for this series.", + "properties": { + "date": { + "description": "Timestep in ISO 8601 format.", + "type": "string" + }, + "value": { + "description": "Normalized coverage volume at this timestep — the topic's share of this source's media output, not an absolute article count.", + "type": "number" + } + }, + "required": [ + "date", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "label": { + "description": "Series label (language name or country name).", + "type": "string" + } + }, + "required": [ + "label", + "data" + ], + "type": "object" + }, + "type": "array" +}
- Changed
gdelt_get_coverage_timeline2 fields changed- added
Input schema / properties / pointsAdded value: +{ + "description": "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 unknown_point error prints. Only affects volume_with_articles rendering — every timestep already carries its full article list in structuredContent regardless. Timesteps not named here show their first 3 links; a date matching no timestep is rejected rather than silently ignored.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / expandedPointsAdded value: +{ + "description": "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 — structuredContent carries every article for every timestep either way.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
gdelt_get_tv_clips3 fields changed- changed
Input schema / properties / maxRecords / descriptionPrevious value: -"Maximum number of clips to return (1–3000)."New value: +"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/endDatetime windows instead." - added
Output schema / properties / continuationWindowsAdded value: +{ + "description": "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 that second can come back in both, so de-duplicate by archiveUrl. Absent unless the ceiling was reached with a window that is both known and wide enough to divide.", + "items": { + "additionalProperties": false, + "description": "One window to re-query with the same query string.", + "properties": { + "endDatetime": { + "description": "End of this window in GDELT format YYYYMMDDHHMMSS.", + "type": "string" + }, + "startDatetime": { + "description": "Start of this window in GDELT format YYYYMMDDHHMMSS.", + "type": "string" + } + }, + "required": [ + "startDatetime", + "endDatetime" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Recovery hint when no clips matched. Absent on successful responses."New value: +"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 result set fit under the cap."
- Changed
gdelt_search_articles3 fields changed- changed
Input schema / properties / maxRecords / descriptionPrevious value: -"Maximum number of articles to return (1–250)."New value: +"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/endDatetime windows instead." - added
Output schema / properties / continuationWindowsAdded value: +{ + "description": "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 published on that second can come back in both, so de-duplicate by url. Absent unless the ceiling was reached with a window that is both known and wide enough to divide.", + "items": { + "additionalProperties": false, + "description": "One window to re-query with the same query string.", + "properties": { + "endDatetime": { + "description": "End of this window in GDELT format YYYYMMDDHHMMSS.", + "type": "string" + }, + "startDatetime": { + "description": "Start of this window in GDELT format YYYYMMDDHHMMSS.", + "type": "string" + } + }, + "required": [ + "startDatetime", + "endDatetime" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Recovery hint when no articles matched — echoes filters and suggests how to broaden. Absent on successful responses."New value: +"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 result set fit under the cap."
1 tool update
- Changed
gdelt_get_coverage_breakdown2 fields changed- changed
Output schema / properties / otherAggregated / items / properties / value / descriptionPrevious value: -"Aggregated coverage volume for all remaining series."New value: +"Aggregated normalized coverage volume for all remaining series — a share of media output, not an absolute article count." - changed
Output schema / properties / topSeries / items / properties / data / items / properties / value / descriptionPrevious value: -"Normalized coverage volume at this timestep."New value: +"Normalized coverage volume at this timestep — the topic's share of this source's media output, not an absolute article count."
7 tool updates
- Changed
gdelt_get_coverage_breakdown4 fields changed- changed
Input schema / properties / endDatetime / descriptionPrevious value: -"End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime."New value: +"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." - added
Input schema / properties / endDatetime / patternAdded value: +"^\\d{14}$" - changed
Input schema / properties / startDatetime / descriptionPrevious value: -"Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime."New value: +"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." - added
Input schema / properties / startDatetime / patternAdded value: +"^\\d{14}$"
- Changed
gdelt_get_coverage_timeline4 fields changed- changed
Input schema / properties / endDatetime / descriptionPrevious value: -"End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime."New value: +"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." - added
Input schema / properties / endDatetime / patternAdded value: +"^\\d{14}$" - changed
Input schema / properties / startDatetime / descriptionPrevious value: -"Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime."New value: +"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." - added
Input schema / properties / startDatetime / patternAdded value: +"^\\d{14}$"
- Changed
gdelt_get_tone_distribution4 fields changed- changed
Input schema / properties / endDatetime / descriptionPrevious value: -"End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime."New value: +"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." - added
Input schema / properties / endDatetime / patternAdded value: +"^\\d{14}$" - changed
Input schema / properties / startDatetime / descriptionPrevious value: -"Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime."New value: +"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." - added
Input schema / properties / startDatetime / patternAdded value: +"^\\d{14}$"
- Changed
gdelt_get_tv_clips5 fields changed- changed
Input schema / properties / endDatetime / descriptionPrevious value: -"End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime."New value: +"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." - added
Input schema / properties / endDatetime / patternAdded value: +"^\\d{14}$" - changed
Input schema / properties / startDatetime / descriptionPrevious value: -"Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime."New value: +"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." - added
Input schema / properties / startDatetime / patternAdded value: +"^\\d{14}$" - changed
Input schema / properties / stations / descriptionPrevious value: -"Station IDs to filter to (e.g. [\"CNN\", \"FOXNEWS\"]). Omit for all stations. Use gdelt_list_tv_stations to see valid IDs."New value: +"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 not fall back to all stations. Use gdelt_list_tv_stations to see valid IDs."
- Changed
gdelt_get_tv_context5 fields changed- changed
Input schema / properties / endDatetime / descriptionPrevious value: -"End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime."New value: +"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." - added
Input schema / properties / endDatetime / patternAdded value: +"^\\d{14}$" - changed
Input schema / properties / startDatetime / descriptionPrevious value: -"Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime. TV data spans 2009–October 2024."New value: +"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–October 2024." - added
Input schema / properties / startDatetime / patternAdded value: +"^\\d{14}$" - changed
Input schema / properties / stations / descriptionPrevious value: -"Station IDs to filter to. Omit for all stations. Use gdelt_list_tv_stations to see valid IDs."New value: +"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 not fall back to all stations. Use gdelt_list_tv_stations to see valid IDs."
- Changed
gdelt_search_articles4 fields changed- changed
Input schema / properties / endDatetime / descriptionPrevious value: -"End of date range in GDELT format YYYYMMDDHHMMSS (e.g. 20240131235959). Must be used together with startDatetime."New value: +"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." - added
Input schema / properties / endDatetime / patternAdded value: +"^\\d{14}$" - changed
Input schema / properties / startDatetime / descriptionPrevious value: -"Start of date range in GDELT format YYYYMMDDHHMMSS (e.g. 20240101000000). Must be used together with endDatetime."New value: +"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." - added
Input schema / properties / startDatetime / patternAdded value: +"^\\d{14}$"
- Changed
gdelt_search_tv5 fields changed- changed
Input schema / properties / endDatetime / descriptionPrevious value: -"End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime."New value: +"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." - added
Input schema / properties / endDatetime / patternAdded value: +"^\\d{14}$" - changed
Input schema / properties / startDatetime / descriptionPrevious value: -"Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime."New value: +"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." - added
Input schema / properties / startDatetime / patternAdded value: +"^\\d{14}$" - changed
Input schema / properties / stations / descriptionPrevious value: -"Station IDs to filter to (e.g. [\"CNN\", \"FOXNEWS\", \"MSNBC\"]). Omit to get coverage across all available stations. Use gdelt_list_tv_stations to see valid station IDs."New value: +"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 rejected; it does not fall back to all stations. Use gdelt_list_tv_stations to see valid station IDs."
4 tool updates
- Changed
gdelt_get_coverage_breakdown2 fields changed- added
Output schema / properties / endDatetimeAdded value: +{ + "description": "Echoed end datetime when provided (YYYYMMDDHHMMSS).", + "type": "string" +} - added
Output schema / properties / startDatetimeAdded value: +{ + "description": "Echoed start datetime when provided (YYYYMMDDHHMMSS).", + "type": "string" +}
- Changed
gdelt_get_coverage_timeline2 fields changed- added
Output schema / properties / endDatetimeAdded value: +{ + "description": "Echoed end datetime when provided (YYYYMMDDHHMMSS).", + "type": "string" +} - added
Output schema / properties / startDatetimeAdded value: +{ + "description": "Echoed start datetime when provided (YYYYMMDDHHMMSS).", + "type": "string" +}
- Changed
gdelt_get_tone_distribution2 fields changed- added
Output schema / properties / endDatetimeAdded value: +{ + "description": "Echoed end datetime when provided (YYYYMMDDHHMMSS).", + "type": "string" +} - added
Output schema / properties / startDatetimeAdded value: +{ + "description": "Echoed start datetime when provided (YYYYMMDDHHMMSS).", + "type": "string" +}
- Changed
gdelt_get_tv_context3 fields changed- added
Input schema / properties / endDatetimeAdded value: +{ + "description": "End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime.", + "type": "string" +} - added
Input schema / properties / startDatetimeAdded value: +{ + "description": "Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime. TV data spans 2009–October 2024.", + "type": "string" +} - changed
Input schema / properties / timespan / descriptionPrevious value: -"Time window, e.g. \"1m\", \"6m\". TV data spans 2009–October 2024."New value: +"Time window, e.g. \"1m\", \"6m\". Ignored when startDatetime/endDatetime are set. TV data spans 2009–October 2024."
1 tool update
- Changed
gdelt_get_tv_context2 fields changed- changed
Output schema / properties / totalCount / descriptionPrevious value: -"Number of matching clips from which co-occurrences were computed."New value: +"Number of clips from which co-occurrences were computed. Absent when the upstream API does not return a clip count." - changed
Output schema / requiredPrevious value: -[ - "words", - "effectiveQuery", - "totalCount" -]New value: +[ + "words", + "effectiveQuery" +]
Related MCP Connectors
Geopolitical event detection, tone timeseries, actor trends from GDELT 2.0.
Search global news in natural language. Filter by language, country, date, sentiment, and domain.
GDELT MCP — Global Database of Events, Language, and Tone (free, no auth)
Official GNews API server: search news articles and top headlines from 80,000+ sources.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables macro/geopolitical event detection by wrapping the GDELT 2.0 API, providing tools for searching events, trending actors, and sentiment timeseries from global news.1-
- AlicenseNot gradedqualityBmaintenanceEnables querying the GDELT database for global events, language, and tone data through natural language.24 npm1MIT
- AlicenseAqualityDmaintenanceProvides access to the GDELT DOC 2.0 API for searching global news articles and images across 65 languages with customizable timespans and query options.27 npm2MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to search worldwide news articles, generate coverage timelines, and analyze topic trends through the GDELT DOC 2.0 API, with rate limiting, caching, and error handling.33 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.