Connects Claude to the GDELT Project's DOC and TV APIs for searching and analyzing global news coverage and US television transcripts. Nine tools span article search across 65 languages and three months of coverage, time series extraction for volume and tone tracking, histogram analysis for sentiment distribution, and geographic breakdown by country or language. The TV side covers 2009 through October 2024 with clip retrieval, trending topics, contextual vocabulary analysis, and station metadata lookups. Built with shared rate limiting to respect GDELT's 1 request per 5 seconds quota. Use this when you need structured access to large scale media monitoring data or want to trace how stories propagate across languages, countries, and broadcast networks without manually polling APIs.
Search and analyze global news coverage and US television transcripts via the GDELT Project's real-time APIs via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://gdelt.caseyjhand.com/mcp
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 |
|---|---|
gdelt_search_articles | Search the last 3 months of global news coverage (65 languages) with full-text and filter operators. Returns up to 250 articles. |
gdelt_get_coverage_timeline | Retrieve a time series of coverage volume or average tone for a query. volume_with_articles mode includes top articles per spike timestep. |
gdelt_get_tone_distribution | Get a tone histogram (bins ~−30 to +30) showing whether coverage is uniformly negative, bimodal, or clustered near neutral. |
gdelt_get_coverage_breakdown | Break down coverage volume by source language or source country — a multi-series time series showing geographic propagation. |
gdelt_search_tv | Search US television news closed captions (2009–Oct 2024) and return per-station airtime time series. |
gdelt_get_tv_clips | Retrieve up to 3,000 matching TV clips with transcript excerpts and Internet Archive viewing links. |
gdelt_get_tv_context | Get the 200 most frequent co-occurring words and phrases from TV clips matching a query. |
gdelt_get_tv_trending | Retrieve trending topics currently dominating US television news (updated every 15 minutes; no query required). |
gdelt_list_tv_stations | List all TV stations with market, network, and monitoring date ranges to verify station availability before querying. |
gdelt_search_articlesSearch the last 3 months of global news with GDELT's full query syntax.
"bird flu"), boolean OR, and exclusion (-sports)sourcecountry:, sourcelang:, domain:, theme: (GKG taxonomy), tone</tone>near20:"flu virus", repeat3:"outbreak"gdelt_get_coverage_timelineRetrieve 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 with gdelt_get_tone_distribution for the full picture)gdelt_get_tone_distributionSnapshot tone histogram across all articles matching a query.
peakNegativeBin, peakPositiveBin, neutralPct (% of articles in the −2 to +2 range)gdelt_get_coverage_breakdownMulti-series time series showing which countries or languages drove coverage.
language or countrygdelt_search_tvSearch US television news transcripts (2009–Oct 2024) with per-station airtime analysis.
stations parameter (e.g. ["CNN", "FOXNEWS"]) — the server embeds station filters in the query stringmarket:, show:, context:gdelt_list_tv_stations to verify station active date ranges before querying recent eventsgdelt_get_tv_clipsRetrieve actual TV news clips driving a coverage signal.
gdelt_get_tv_contextVocabulary framing analysis for TV coverage of a topic.
gdelt_get_tv_trendingZero-argument entry point for the current TV news cycle.
gdelt_list_tv_stationsStation metadata lookup before querying.
isActive flag — true when end date is within the last 24 hoursBuilt on @cyanheads/mcp-ts-core:
none, jwt, oauthin-memory, filesystem, Supabase, Cloudflare KV/R2/D1GDELT-specific:
GdeltDocService, GdeltTvService) mapping clean tool parameters to the DOC and TV API URL conventionsstations arrays, not raw query syntaxAgent-friendly output:
label fields ("Volume Intensity", "Average Tone", language/country names) rather than positional arraysisActive boolean and ISO 8601 date fields let agents reason about TV station availability without parsing date stringsneutralPct, peakNegativeBin, peakPositiveBin summary fields let agents branch on sentiment without histogramming the raw bins themselvesA 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"
}
}
}
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/mcp
git clone https://github.com/cyanheads/gdelt-mcp-server.git
cd gdelt-mcp-server
bun install
cp .env.example .env
# edit .env if you need to override defaults
All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:
| Variable | Description | Default |
|---|---|---|
GDELT_BASE_URL | Override the GDELT API base URL for both DOC and TV APIs. | https://api.gdeltproject.org/api/v2 |
GDELT_REQUEST_DELAY_MS | Minimum milliseconds between GDELT requests (enforces 1 req/5s limit). | 5100 |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for the HTTP server. | 3010 |
MCP_HTTP_ENDPOINT_PATH | HTTP endpoint path where the MCP server is mounted. | /mcp |
MCP_PUBLIC_URL | Public origin override for TLS-terminating reverse-proxy deployments. | none |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.). | info |
MCP_GC_PRESSURE_INTERVAL_MS | Opt-in Bun-only forced-GC pressure loop in ms. Try 60000 if heap growth is observed under sustained HTTP load. | 0 (disabled) |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry instrumentation. | false |
See .env.example for the full list of optional overrides.
Build and run:
# One-time build
bun run rebuild
# Run the built server
bun run start:stdio
# or
bun run start:http
Run 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 build -t gdelt-mcp-server .
docker run --rm -p 3010:3010 gdelt-mcp-server
The 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.
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools and inits services. |
src/config | Server-specific environment variable parsing and validation with Zod. |
src/mcp-server/tools | Tool definitions (*.tool.ts). Nine tools across DOC and TV APIs. |
src/services/gdelt-doc | GdeltDocService — wraps the DOC API for article search, timelines, tone, and breakdowns. |
src/services/gdelt-tv | GdeltTvService — wraps the TV API for transcript search, clips, context, and trending. |
src/services/gdelt-rate-limiter | GdeltRateLimiter singleton — shared 1 req/5s queue across both services. |
tests/ | Unit and integration tests mirroring src/. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storagesrc/mcp-server/tools/definitions/index.tsIssues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
Apache-2.0 — see LICENSE for details.
MCP_LOG_LEVELdefault: infoSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
MCP_HTTP_HOSTdefault: 127.0.0.1The hostname for the HTTP server.
MCP_HTTP_PORTdefault: 3010The port to run the HTTP server on.
MCP_HTTP_ENDPOINT_PATHdefault: /mcpThe endpoint path for the MCP server.
MCP_AUTH_MODEdefault: noneAuthentication mode to use: 'none', 'jwt', or 'oauth'.
com.mcparmory/google-search
io.github.pipeworx-io/brave-search
marcopesani/mcp-server-serper
brave/brave-search-mcp-server
com.mcparmory/google-search-console
acamolese/google-search-console-mcp