gdelt-mcp-server

v0.2.1 pre-1.0

Search and analyze global news coverage and US television transcripts via the GDELT Project's real-time APIs via MCP. STDIO or Streamable HTTP.

gdelt.caseyjhand.com/mcp
claude mcp add --transport http gdelt-mcp-server https://gdelt.caseyjhand.com/mcp
codex mcp add gdelt-mcp-server --url https://gdelt.caseyjhand.com/mcp
{
  "mcpServers": {
    "gdelt-mcp-server": {
      "url": "https://gdelt.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http gdelt-mcp-server https://gdelt.caseyjhand.com/mcp
{
  "mcpServers": {
    "gdelt-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://gdelt.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "gdelt-mcp-server": {
      "type": "http",
      "url": "https://gdelt.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://gdelt.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

9

gdelt_search_articles

open-world

Search the last 3 months of global news coverage (65+ languages) using the GDELT DOC API. Returns up to 250 articles with URL, title, source domain, language, country, publication date, and social image URL. Query supports full GDELT syntax: phrases ("bird flu"), boolean OR ((flu OR pandemic)), source country (sourcecountry:china), source language (sourcelang:spanish), domain (domain:who.int), GKG theme (theme:DISEASE_OUTBREAK), tone filter (tone<-5 for negative), proximity (near20:"flu virus"), and repeat (repeat3:"outbreak"). Note: this API covers only the most recent 3 months — use gdelt_search_tv for historical TV transcripts back to 2009.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gdelt_search_articles",
    "arguments": {
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "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\"."
    },
    "timespan": {
      "description": "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.",
      "type": "string"
    },
    "startDatetime": {
      "description": "Start of date range in GDELT format YYYYMMDDHHMMSS (e.g. 20240101000000). Must be used together with endDatetime.",
      "type": "string"
    },
    "endDatetime": {
      "description": "End of date range in GDELT format YYYYMMDDHHMMSS (e.g. 20240131235959). Must be used together with startDatetime.",
      "type": "string"
    },
    "maxRecords": {
      "default": 75,
      "description": "Maximum number of articles to return (1–250).",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "sort": {
      "default": "relevance",
      "description": "Sort order: relevance (default), date (newest first), social (most socially shared).",
      "type": "string",
      "enum": [
        "date",
        "relevance",
        "social"
      ]
    }
  },
  "required": [
    "query",
    "maxRecords",
    "sort"
  ],
  "additionalProperties": false
}
view source ↗

gdelt_get_coverage_timeline

open-world

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 automatically chosen based on timespan: hours for short windows, days for longer ones. Note: DOC API covers only the last 3 months.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gdelt_get_coverage_timeline",
    "arguments": {
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme:, tone<."
    },
    "mode": {
      "default": "volume",
      "description": "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.",
      "type": "string",
      "enum": [
        "volume",
        "volume_with_articles",
        "tone"
      ]
    },
    "timespan": {
      "description": "Time window relative to now, e.g. \"24h\", \"7d\", \"1m\". Ignored when startDatetime/endDatetime are set. Maximum 3 months.",
      "type": "string"
    },
    "startDatetime": {
      "description": "Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime.",
      "type": "string"
    },
    "endDatetime": {
      "description": "End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime.",
      "type": "string"
    },
    "smoothing": {
      "description": "Smoothing window in timesteps (0 = none, 1–5 = moving average width). Reduces noise for spotty topics.",
      "type": "integer",
      "minimum": 0,
      "maximum": 5
    }
  },
  "required": [
    "query",
    "mode"
  ],
  "additionalProperties": false
}
view source ↗

gdelt_get_tone_distribution

open-world

Get the tonal distribution of articles matching a query as a histogram (bins approximately -30 to +30). Unlike a single average tone score, the histogram reveals whether coverage is uniformly negative, bimodal (some articles extremely positive and some extremely negative), or clustered near neutral. Each bin includes representative article URLs. Distinct from gdelt_get_coverage_timeline (mode: tone) — this is a snapshot distribution across all matching articles, not a time series. Use gdelt_get_coverage_timeline with mode "tone" to see how sentiment shifted over time.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gdelt_get_tone_distribution",
    "arguments": {
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme:."
    },
    "timespan": {
      "description": "Time window relative to now, e.g. \"24h\", \"7d\", \"1m\". Ignored when startDatetime/endDatetime are set. Maximum 3 months.",
      "type": "string"
    },
    "startDatetime": {
      "description": "Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime.",
      "type": "string"
    },
    "endDatetime": {
      "description": "End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime.",
      "type": "string"
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}
view source ↗

gdelt_get_coverage_breakdown

open-world

Break down news coverage volume over time by source language or source country, returning a multi-series time series (one series per language or country). Shows which countries or languages drove early vs. late coverage — useful for tracing how a story propagated geographically or across language communities. Returns up to 10 series by total volume; remaining series are aggregated into an "Other" bucket. Use breakdownBy "country" with the signal-detection chain to map geographic attention, or "language" to detect non-English media surges.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gdelt_get_coverage_breakdown",
    "arguments": {
      "query": "<query>",
      "breakdownBy": "<breakdownBy>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "Search query using GDELT syntax. Same operators as gdelt_search_articles: phrases, boolean OR, sourcecountry:, sourcelang:, domain:, theme:."
    },
    "breakdownBy": {
      "type": "string",
      "enum": [
        "language",
        "country"
      ],
      "description": "Breakdown dimension: \"language\" for source language time series, \"country\" for source country time series."
    },
    "timespan": {
      "description": "Time window relative to now, e.g. \"24h\", \"7d\", \"1m\". Ignored when startDatetime/endDatetime are set. Maximum 3 months.",
      "type": "string"
    },
    "startDatetime": {
      "description": "Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime.",
      "type": "string"
    },
    "endDatetime": {
      "description": "End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime.",
      "type": "string"
    }
  },
  "required": [
    "query",
    "breakdownBy"
  ],
  "additionalProperties": false
}
view source ↗

gdelt_search_tv

open-world

Search US television news closed captions (2009–October 2024, 150+ stations) for spoken mentions of a query. Returns a normalized per-station time series showing relative airtime devoted to the topic. Use the stations parameter to compare specific networks (e.g. ["CNN", "FOXNEWS", "MSNBC"]); omit to get combined national coverage. 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.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gdelt_search_tv",
    "arguments": {
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "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."
    },
    "stations": {
      "description": "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.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "timespan": {
      "description": "Time window, e.g. \"1m\", \"6m\", \"1y\". Ignored when startDatetime/endDatetime are set. TV data spans 2009–October 2024.",
      "type": "string"
    },
    "startDatetime": {
      "description": "Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime.",
      "type": "string"
    },
    "endDatetime": {
      "description": "End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime.",
      "type": "string"
    },
    "smoothing": {
      "description": "Smoothing window in timesteps (0 = none). Reduces noise for sporadic topics.",
      "type": "integer",
      "minimum": 0,
      "maximum": 5
    },
    "normalize": {
      "default": true,
      "description": "When true (default), values are normalized as % of total airtime, enabling cross-station comparison. When false, returns raw coverage volume.",
      "type": "boolean"
    }
  },
  "required": [
    "query",
    "normalize"
  ],
  "additionalProperties": false
}
view source ↗

gdelt_get_tv_clips

open-world

Retrieve the top matching TV news clips (up to 3,000) for a query from the Internet Archive's Television News Archive. Each clip includes show name, station, air timestamp, a 15-second transcript excerpt, and a direct link to view the full one-minute clip. Use after gdelt_search_tv to read the actual transcript content driving a coverage spike. Archive coverage spans 2009–October 2024.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gdelt_get_tv_clips",
    "arguments": {
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "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": {
      "description": "Station IDs to filter to (e.g. [\"CNN\", \"FOXNEWS\"]). Omit for all stations. Use gdelt_list_tv_stations to see valid IDs.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "timespan": {
      "description": "Time window, e.g. \"1m\", \"6m\". Ignored when startDatetime/endDatetime are set. TV data spans 2009–October 2024.",
      "type": "string"
    },
    "startDatetime": {
      "description": "Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime.",
      "type": "string"
    },
    "endDatetime": {
      "description": "End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime.",
      "type": "string"
    },
    "maxRecords": {
      "default": 50,
      "description": "Maximum number of clips to return (1–3000).",
      "type": "integer",
      "minimum": 1,
      "maximum": 3000
    },
    "sort": {
      "default": "relevance",
      "description": "Sort order: relevance (default), dateDesc (newest first), dateAsc (oldest first).",
      "type": "string",
      "enum": [
        "relevance",
        "dateDesc",
        "dateAsc"
      ]
    }
  },
  "required": [
    "query",
    "maxRecords",
    "sort"
  ],
  "additionalProperties": false
}
view source ↗

gdelt_get_tv_context

open-world

Get the top co-occurring words and phrases from TV news clips matching a query — the vocabulary framing a topic on television. Returns the most frequent non-stopword terms from matching clips, with relative frequency scores (0–100, where 100 = the query term itself). Use to understand narrative framing, identify related concepts mentioned alongside a topic, or generate follow-up search terms. TV data spans 2009–October 2024.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gdelt_get_tv_context",
    "arguments": {
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "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": {
      "description": "Station IDs to filter to. Omit for all stations. Use gdelt_list_tv_stations to see valid IDs.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "timespan": {
      "description": "Time window, e.g. \"1m\", \"6m\". Ignored when startDatetime/endDatetime are set. TV data spans 2009–October 2024.",
      "type": "string"
    },
    "startDatetime": {
      "description": "Start datetime in GDELT format YYYYMMDDHHMMSS. Must pair with endDatetime. TV data spans 2009–October 2024.",
      "type": "string"
    },
    "endDatetime": {
      "description": "End datetime in GDELT format YYYYMMDDHHMMSS. Must pair with startDatetime.",
      "type": "string"
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}
view source ↗

gdelt_list_tv_stations

List all television stations available for TV search with their market, network, monitoring start date, and monitoring end date. Stations with an end date within the last 24 hours are flagged as active; stations with earlier end dates are discontinued. Use before querying to verify a station was active during the target time period, or to discover valid station IDs for the stations parameter in other TV tools. Most station monitoring ended October 2024 when the Internet Archive TV feed stopped updating.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gdelt_list_tv_stations",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
view source ↗