@cyanheads/gdelt-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@cyanheads/gdelt-mcp-serversearch for latest news on artificial intelligence"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Public Hosted Server: https://gdelt.caseyjhand.com/mcp
Tools
Nine tools across two GDELT APIs — DOC API for global print/web news (last 3 months, 65 languages, no auth) and TV API for US television transcripts (2009–Oct 2024, 150+ stations):
Tool | Description |
| Search the last 3 months of global news coverage (65 languages) with full-text and filter operators. Returns up to 250 articles, and hands back the date windows to re-query when that ceiling is hit. |
| Retrieve a time series of coverage volume or average tone for a query. |
| Get a tone histogram (bins ~−30 to +30) showing whether coverage is uniformly negative, bimodal, or clustered near neutral. |
| Break down coverage volume by source language or source country — a multi-series time series showing geographic propagation. Values are normalized shares of media output, not article counts. |
| Search US television news closed captions (2009–Oct 2024) and return per-station airtime time series. |
| Retrieve up to 3,000 matching TV clips with transcript excerpts and Internet Archive viewing links, and the date windows to re-query when that ceiling is hit. |
| Get the most frequent co-occurring words and phrases from TV clips matching a query. |
| Retrieve trending topics currently dominating US television news (updated every 15 minutes; no query required). |
| List all TV stations with market, network, and monitoring date ranges to verify station availability before querying. |
gdelt_search_articles
Search the last 3 months of global news with GDELT's full query syntax.
Keywords, phrases (
"bird flu"), boolean OR, and exclusion (-sports)Filter operators:
sourcecountry:,sourcelang:,domain:,theme:(GKG taxonomy),tone</tone>Proximity and repetition:
near20:"flu virus",repeat3:"outbreak"Configurable sort (relevance, date) and result count (up to 250)
Returns URL, title, publication date, domain, language, source country, and social image URL
250 is a hard per-call ceiling, not a page size — GDELT exposes no cursor. Fill it and the response returns
continuationWindows: the queried window halved, ready to re-query. The halves overlap by a second so nothing falls through the seam; de-duplicate byurlQuery is echoed in response for chaining
gdelt_get_coverage_timeline
Retrieve when coverage of a topic spiked, with three modes:
volume— normalized percentage of all global coverage per timestepvolume_with_articles— volume plus top articles driving each spike; use for signal detection without a follow-up search calltone— average sentiment score per timestep (combine withgdelt_get_tone_distributionfor the full picture)Every article reference is always in
structuredContent; the text surface renders the first 3 links per timestep beside that timestep's true count, andpoints: ["<date>"]renders named timesteps in fullConfigurable smoothing and time range
gdelt_get_tone_distribution
Snapshot tone histogram across all articles matching a query.
Bins from approximately −30 to +30; each bin includes representative article URLs
Summary fields:
peakNegativeBin,peakPositiveBin,neutralPct(% of articles in the −2 to +2 range)Distinct from the tone timeline — distribution across all matching articles, not over time
gdelt_get_coverage_breakdown
Multi-series time series showing which countries or languages drove coverage.
Break down by
languageorcountryTop 10 series by total volume; remaining series aggregated into an "Other" bucket and named in
otherSeriesLabelsNothing is dissolved into "Other" anonymously — pass any label to
series: ["<label>"]and that series comes back complete underselectedSeries, alongside the usual overviewValues are normalized — the topic's share of media output, not absolute article counts. Small media markets with concentrated coverage rank above large markets with diverse output, so a high value means the topic dominated that source's coverage rather than that it published the most articles
Use to trace how a story propagated geographically
gdelt_search_tv
Search US television news transcripts (2009–Oct 2024) with per-station airtime analysis.
Structured
stationsparameter (e.g.["CNN", "FOXNEWS"]) — the server embeds station filters in the query stringNormalize results to relative % or return raw counts
TV-specific operators:
market:,show:,context:Use
gdelt_list_tv_stationsto verify station active date ranges before querying recent events
gdelt_get_tv_clips
Retrieve actual TV news clips driving a coverage signal.
Up to 3,000 clips per call
Each clip: show name, station, air timestamp, 15-second transcript excerpt, direct Archive.org link, and optional thumbnail
3,000 is a hard per-call ceiling, not a page size — GDELT exposes no cursor. Fill it and the response returns
continuationWindows: the queried window halved, ready to re-query. The halves overlap by a second so nothing falls through the seam; de-duplicate byarchiveUrlSort by relevance, date descending, or date ascending
gdelt_get_tv_context
Vocabulary framing analysis for TV coverage of a topic.
Returns the most frequent non-stopword terms from matching clips
Relative frequency scores (query term = 100)
Use to identify narrative framing, related concepts, or follow-up search terms
gdelt_get_tv_trending
Zero-argument entry point for the current TV news cycle.
Returns trending topics, keywords, and phrases dominating national networks
Updated every 15 minutes
Note: coverage data ends Oct 2024; results reflect the archive endpoint, not a live feed
gdelt_list_tv_stations
Station metadata lookup before querying.
All available stations with market, network, monitoring start date, and end date
isActiveflag —truewhen end date is within the last 24 hoursUse to verify a station was active during a target time period
Related MCP server: news-monitor-mcp
Features
Built on @cyanheads/mcp-ts-core:
Declarative tool definitions — single file per tool, framework handles registration and validation
Unified error handling — handlers throw, framework catches, classifies, and formats
Pluggable auth:
none,jwt,oauthSwappable storage backends:
in-memory,filesystem,Supabase,Cloudflare KV/R2/D1Structured logging with optional OpenTelemetry tracing
STDIO and Streamable HTTP transports
GDELT-specific:
Shared rate-limit queue (1 req/5s) across all tools — enforces GDELT's published limit without caller coordination
Two service layers (
GdeltDocService,GdeltTvService) mapping clean tool parameters to the DOC and TV API URL conventionsTV station filter operators embedded in query strings internally — callers pass structured
stationsarrays, not raw query syntax
Agent-friendly output:
Query echo on every response — searches return the original query and applied timespan so agents can chain calls without re-deriving parameters
Discriminated series labels — timeline and breakdown responses carry typed
labelfields ("Volume Intensity","Average Tone", language/country names) rather than positional arraysStructured station metadata —
isActiveboolean and ISO 8601 date fields let agents reason about TV station availability without parsing date stringsPartial-coverage signals in distribution output —
neutralPct,peakNegativeBin,peakPositiveBinsummary fields let agents branch on sentiment without histogramming the raw bins themselves
Getting started
Public Hosted Instance
A public instance is available at https://gdelt.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"gdelt-mcp-server": {
"type": "streamable-http",
"url": "https://gdelt.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
Add the following to your MCP client configuration file.
{
"mcpServers": {
"gdelt-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/gdelt-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"gdelt-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/gdelt-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"gdelt-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/gdelt-mcp-server:latest"
]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.3.0 or higher (or Node.js v24+).
No API key required — GDELT is a free public API.
Installation
Clone the repository:
git clone https://github.com/cyanheads/gdelt-mcp-server.gitNavigate into the directory:
cd gdelt-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env if you need to override defaultsConfiguration
All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:
Variable | Description | Default |
| Override the GDELT API base URL for both DOC and TV APIs. |
|
| Minimum milliseconds between GDELT requests (enforces 1 req/5s limit). |
|
| Transport: |
|
| Port for the HTTP server. |
|
| HTTP endpoint path where the MCP server is mounted. |
|
| Public origin override for TLS-terminating reverse-proxy deployments. | none |
| Auth mode: |
|
| Log level ( |
|
| Opt-in Bun-only forced-GC pressure loop in ms. Try |
|
| Directory for log files (Node.js only). |
|
| Storage backend: |
|
| Enable OpenTelemetry instrumentation. |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security audit bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t gdelt-mcp-server .
docker run --rm -p 3010:3010 gdelt-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/gdelt-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
| Server-specific environment variable parsing and validation with Zod. |
| Tool definitions ( |
|
|
|
|
|
|
| Unit and integration tests mirroring |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools via the barrels in
src/mcp-server/tools/definitions/index.tsWrap GDELT API calls: validate raw JSON → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Flicense-qualityFmaintenanceMCP server providing access to the GNews API for fetching news articles and headlines. Supports search and top headlines with advanced filtering by language, country, category, and date.Last updated1
- AlicenseAqualityAmaintenanceMCP server for global news monitoring, media analysis and sentiment tracking via WorldNewsAPI — full-text search across 150+ countries, German/English sentiment analysis, top headlines, GL briefings, newspaper front pages and geo-search. API key required.Last updated15MIT
- Flicense-qualityBmaintenanceEnables macro/geopolitical event detection by wrapping the GDELT 2.0 API, providing tools for searching events, trending actors, and sentiment timeseries from global news.Last updated1
- AlicenseAqualityCmaintenanceMCP server that wraps the UMT media monitoring API, enabling search and retrieval of media mentions with filters such as date range, language, sentiment, and tags.Last updated246ISC
Related MCP Connectors
Geopolitical event detection, tone timeseries, actor trends from GDELT 2.0.
GDELT MCP — Global Database of Events, Language, and Tone (free, no auth)
Search ReliefWeb humanitarian reports, disasters, jobs, training, and country profiles via MCP.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/cyanheads/gdelt-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server