news-monitor-mcp
MCP 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.
README
🇨🇭 Part of the Swiss Public Data MCP Portfolio
📰 news-monitor-mcp
MCP 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.
Overview
news-monitor-mcp transforms any AI assistant into a proactive media intelligence agent. The server connects LLMs like Claude with global news data: from Swiss institutional reputation monitoring to weekly leadership briefings and trend detection across categories.
Source: WorldNewsAPI (worldnewsapi.com) — the only freely available news API with German-language sentiment analysis.
API key required. Get a free key at worldnewsapi.com/console (1,000 calls/month free tier).
Anchor demo query: "How has the Schulamt Zürich been portrayed in the media over the last 30 days, and what is the overall sentiment?"
Features
- 🔍 Full-text search – 150+ countries, 50+ languages, Boolean queries and exact phrase matching
- 📊 Sentiment analysis – German and English only (WorldNewsAPI unique feature); scores from −1 (negative) to +1 (positive)
- 📰 Top headlines – clustered by country and language, ranked by number of sources reporting
- 📋 Media briefing – multi-topic weekly report with sentiment overview for GL / leadership updates
- 🗞️ Newspaper front pages – digital covers from 6,000+ publications in 125 countries
- 📡 Trend radar – category-based trend detection (politics, technology, education, …) per country
- 📍 Geo-search – location-specific news (Zürich, Bern, Basel, Kanton Zürich, …)
- ☁️ Dual transport – stdio for Claude Desktop, Streamable HTTP for cloud deployment
| # | Tool | Description |
|---|---|---|
| 1 | news_search |
Full-text news search in 150+ countries |
| 2 | news_top_headlines |
Top headlines by country and language |
| 3 | news_sentiment_monitor |
Sentiment analysis for entity or topic |
| 4 | news_media_briefing |
Multi-topic weekly briefing report |
| 5 | news_retrieve_article |
Fetch full article by ID |
| 6 | news_search_sources |
Find available news sources by name/country |
| 7 | news_front_pages |
Digital newspaper front pages |
| 8 | news_trend_radar |
Category-based trend detection per country |
| 9 | news_geo_search |
Location-specific news search |
| 10 | news_alert_create |
Create a persistent alert (sentiment / volume / keyword) |
| 11 | news_alert_list |
List configured alerts with status |
| 12 | news_alert_check |
Evaluate alerts against current data |
| 13 | news_alert_delete |
Permanently remove an alert |
| 14 | news_cache_stats |
Cache hit-rate and entries by type |
| 15 | news_cache_clear |
Clear cache (entirely or per tool type) |
Demo

"Create a media briefing for: AI in education, Volksschule Zürich, school digitalisation"
Data Sources
| Source | API Type | Content |
|---|---|---|
| WorldNewsAPI | REST JSON | 150+ countries, 50+ languages, full text, sentiment |
Prerequisites
- Python 3.11+
uvorpip- API key from worldnewsapi.com/console (free tier available)
Installation
# Recommended: uvx (no install step needed)
uvx news-monitor-mcp
# Alternative: pip
pip install news-monitor-mcp
Quickstart
# Start the server (stdio mode for Claude Desktop)
WORLD_NEWS_API_KEY=your-key uvx news-monitor-mcp
Try it immediately in Claude Desktop:
"Show me the top news from Switzerland today" "How is the Schulamt Zürich covered in German-language media this month?" "Create a media briefing on: Volksschule Zürich, AI in education, school digitalisation"
Configuration
Environment Variables
| Variable | Default | Description |
|---|---|---|
WORLD_NEWS_API_KEY |
– | Required. API key from worldnewsapi.com |
MCP_TRANSPORT |
stdio |
Transport: stdio or streamable_http |
MCP_HOST |
127.0.0.1 |
HTTP bind host. Use 0.0.0.0 only inside a container. |
MCP_PORT |
8000 |
Port for HTTP transport |
MCP_BEARER_TOKEN |
– | Required in --http mode. Bearer token clients must present in Authorization: Bearer <token>. Generate via python -c "import secrets; print(secrets.token_urlsafe(32))". |
MCP_ALLOWED_ORIGINS |
– | Optional CSV allowlist for the Origin header (DNS-rebinding protection). Example: https://claude.ai. |
LOG_LEVEL |
INFO |
Log level: DEBUG / INFO / WARNING / ERROR. Logs are emitted as JSON to stderr with automatic redaction of api-key= query params and Authorization: Bearer headers. |
NEWS_MONITOR_ALERTS_DIR |
~/.news-monitor-mcp |
Directory that holds alerts.json. The parent dir must not be a symlink (refused at startup as a defense against path-injection). File is created with mode 0o600, directory with 0o700. |
NEWS_MONITOR_ALERTS_FILE |
– | (Back-compat) explicit path to the alerts file. Same symlink check applies. Prefer NEWS_MONITOR_ALERTS_DIR. |
MCP_ALERT_RETENTION_DAYS |
90 |
Alerts older than this many days are deleted on server start (Privacy default per docs/privacy-dsg.md). Set to 0 to disable retention. |
MCP_CACHE_MAX_PER_TYPE |
1000 |
Maximum cache entries per tool type. When exceeded, the least-recently-used entry of that type is evicted. Set to 0 to disable the cap (unbounded growth — only safe for short-lived processes). |
MCP_CACHE_SWEEP_SECONDS |
300 |
Interval for the background task that removes TTL-expired entries from the cache. Set to 0 to disable the sweep (expired entries are still pruned lazily on news_cache_stats). |
Claude Desktop Configuration
{
"mcpServers": {
"news-monitor": {
"command": "uvx",
"args": ["news-monitor-mcp"],
"env": {
"WORLD_NEWS_API_KEY": "your-api-key-here"
}
}
}
}
Config file locations:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
After restarting Claude Desktop, all tools are available. Example queries:
- "Show me the top Swiss news today"
- "What is the media sentiment on AI in education this month?"
- "Create a weekly briefing for: Schulamt Zürich, Volksschule, KI Bildung"
- "Find all German-language articles about school digitalisation in the last 14 days"
- "Show me the front pages of Swiss newspapers today"
Cloud Deployment (Streamable HTTP)
For use via claude.ai in the browser (e.g. on managed workstations without local software):
Authentication is mandatory. The HTTP transport refuses any request without a valid Authorization: Bearer <token> header. Generate a token once and keep it secret:
python -c "import secrets; print(secrets.token_urlsafe(32))"
Render.com (recommended):
- Push/fork the repository to GitHub
- On render.com: New Web Service → connect GitHub repo
- Set the following environment variables in the Render dashboard:
WORLD_NEWS_API_KEY— your WorldNewsAPI keyMCP_BEARER_TOKEN— the token generated aboveMCP_HOST=0.0.0.0— bind on all interfaces inside the containerMCP_ALLOWED_ORIGINS=https://claude.ai(optional, recommended)
- In claude.ai under Settings → MCP Servers, add the URL
https://your-app.onrender.com/mcpand configure the Bearer token as the auth header.
# Local HTTP mode (binds 127.0.0.1 by default)
WORLD_NEWS_API_KEY=your-key \
MCP_BEARER_TOKEN=$(python -c "import secrets; print(secrets.token_urlsafe(32))") \
news-monitor-mcp --http --port 8000
# Verify auth is enforced
curl -i http://127.0.0.1:8000/mcp # → 401
curl -i -H "Authorization: Bearer $MCP_BEARER_TOKEN" http://127.0.0.1:8000/mcp
Scaling notes
This server is currently single-process / single-replica:
- The TTL cache lives in process memory (
NewsCache). If you run multiple Render or Kubernetes replicas, each replica has its own cache — hit-rates drop linearly with the replica count. - Alerts persist to a local
alerts.json(defaults to/datainside the container). Multiple replicas mounting the same persistent volume serialize viafcntl.flock, but for true cluster operation a shared store (Redis / Postgres) is needed — see the open findingSCALE-STATEFUL. - On Render Free Tier, the container sleeps after ~15 minutes of inactivity and loses non-persistent state. Attach a Persistent Disk for
/dataif you need alerts to survive restarts. For Render Free + alerts you must accept that the cache is lost on every wake-up.
The MCP_CACHE_MAX_PER_TYPE cap (default 1000 entries / type) and the background sweep (MCP_CACHE_SWEEP_SECONDS, default 5 min) prevent the in-process cache from growing without bound.
Container image
A non-root multi-stage Dockerfile is included and built on every CI run. Inside the container the server defaults to --http, binds 0.0.0.0:8000, persists alerts under /data, and refuses to start if MCP_BEARER_TOKEN is missing.
docker build -t news-monitor-mcp .
docker run --rm -p 8000:8000 \
-e WORLD_NEWS_API_KEY=your-key \
-e MCP_BEARER_TOKEN=$(python -c "import secrets; print(secrets.token_urlsafe(32))") \
-e MCP_ALLOWED_ORIGINS=https://claude.ai \
-v news-monitor-data:/data \
news-monitor-mcp
Architecture
┌─────────────────┐ ┌──────────────────────────┐ ┌──────────────────────────┐
│ Claude / AI │────▶│ News Monitor MCP │────▶│ WorldNewsAPI │
│ (MCP Host) │◀────│ (MCP Server) │◀────│ REST JSON API │
└─────────────────┘ │ │ │ 150+ countries │
│ 9 Tools │ │ 50+ languages │
│ Stdio | Streamable HTTP │ │ Sentiment DE/EN │
└──────────────────────────┘ └──────────────────────────┘
Project Structure
news-monitor-mcp/
├── src/
│ └── news_monitor_mcp/
│ ├── __init__.py
│ └── server.py # All 9 tools
├── tests/
│ ├── __init__.py
│ └── test_server.py # 20 tests (unit + live)
├── pyproject.toml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md # This file (English)
└── README.de.md # German version
Testing
# Unit tests (no API key required)
PYTHONPATH=src pytest tests/ -m "not live"
# Integration tests (live API calls, API key required)
PYTHONPATH=src pytest tests/ -m "live"
Example Use Cases
Schulamt / Institutional Communication
"How has the Schulamt Zürich been portrayed in media over the last 30 days?"
→ news_sentiment_monitor(entity="Schulamt Zürich", language="de", days_back=30)
"Create a weekly media briefing for leadership"
→ news_media_briefing(topics=["Volksschule Zürich", "KI Bildung", "Schuldigitalisierung"])
"What are Swiss media reporting on school digitalisation?"
→ news_search(query="Schuldigitalisierung", language="de", source_country="ch")
KI-Fachgruppe / AI Working Group
"What are the current tech trends in Swiss press this week?"
→ news_trend_radar(category="technology", source_country="ch", language="de")
"How are AI developments in education covered internationally?"
→ news_search(query="AI education classroom", language="en", number=20)
"Compare Swiss and German media coverage of AI regulation"
→ news_search(query="KI Regulierung", source_country="ch", language="de")
→ news_search(query="KI Regulierung", source_country="de", language="de")
City Administration / Location Research
"What is being reported about Zürich school infrastructure?"
→ news_geo_search(location="Zürich", query="Schule")
"Show today's front pages of Swiss newspapers"
→ news_front_pages(source_country="ch")
→ More use cases by audience →
Sentiment Analysis
WorldNewsAPI offers German-language sentiment analysis — rare among news APIs:
| Score | Label | Meaning |
|---|---|---|
| > 0.3 | positiv 😊 | Positive coverage |
| −0.3 to 0.3 | neutral 😐 | Neutral / factual coverage |
| < −0.3 | negativ 😟 | Critical / negative coverage |
⚠️ Sentiment is only available for German (de) and English (en).
Safety, Limits & Responsible Use
Read-Only Operation
12 of the 15 tools carry readOnlyHint: true. All 9 monitoring tools (search,
headlines, sentiment, briefing, article, sources, front_pages, trend, geo) are
fully read-only and issue GET requests to WorldNewsAPI only. The 3 exceptions
are local-only operations: news_alert_create and news_alert_delete (write/
delete ~/.news-monitor-mcp/alerts.json) and news_cache_clear (clears
in-memory cache). None of the 15 tools modify any external data source.
API Rate Limits
| Constraint | WorldNewsAPI Free Tier | Paid Plans |
|---|---|---|
| Calls/month | 1,000 | Up to 1M |
| Articles/call | 10 | Up to 100 |
| Historical depth | 30 days | Extended |
| Timeout per call | 30 seconds | 30 seconds |
The TTL cache (v0.2+) reduces redundant calls by up to 80%.
Data Privacy
- No personal data stored: The server holds no persistent user data. Cache entries are in-memory and reset on server restart.
- No profiling: The server retrieves publicly published journalism only. It is not designed for surveillance or personal profiling.
- Alert data: Alert configurations are stored locally in
~/.news-monitor-mcp/alerts.json— on your machine only, never transmitted.
Responsible Use
- Query public news only — do not use as a profiling tool for individuals.
- Sentiment scores reflect algorithmic analysis of journalistic tone, not verified editorial judgements.
- Results depend on WorldNewsAPI's indexing; Swiss regional media may be less well-covered than national outlets.
Terms of Service
Users must comply with:
This MCP server is an independent open-source project and is not affiliated with WorldNewsAPI.
Synergies with Other MCP Servers
news-monitor-mcp can be combined with other servers in the portfolio:
| Combination | Use Case |
|---|---|
+ fedlex-mcp |
Law meets discourse: legal framework + media coverage |
+ global-education-mcp |
OECD stats + current media context |
+ srgssr-mcp |
Swiss public media + international news comparison |
+ swiss-environment-mcp |
Environmental data + media reporting |
+ swiss-statistics-mcp |
BFS statistics + current media narrative |
+ zurich-opendata-mcp |
City data + local media coverage |
Changelog
See CHANGELOG.md
Security & Compliance
- Report vulnerabilities privately: see SECURITY.md
- Swiss public-sector deployment: see
docs/isds-klassifikation.mdfor the ISDS / Schutzbedarfsfeststellung - Swiss data protection (revDSG) — duties, profiling, retention, drittlandtransfer:
docs/privacy-dsg.md - Audit history:
audits/
License
MIT License — see LICENSE
Author
Hayal Oezkan · malkreide
Credits & Related Projects
- Data: WorldNewsAPI – global news data with sentiment analysis
- Protocol: Model Context Protocol – Anthropic / Linux Foundation
- Related: swiss-culture-mcp – MCP server for Swiss cultural heritage data
- Related: srgssr-mcp – MCP server for SRG SSR Swiss public media
- Portfolio: Swiss Public Data MCP Portfolio
<!-- mcp-name: io.github.malkreide/news-monitor-mcp -->
<!-- BEGIN GENERATED: install -->
Installation
Run via uv's uvx — no clone or manual install needed. Add to your MCP client config (mcpServers for Claude Desktop, Cursor and Windsurf; use a top-level servers key for VS Code in .vscode/mcp.json):
{
"mcpServers": {
"news-monitor-mcp": {
"command": "uvx",
"args": [
"news-monitor-mcp"
]
}
}
}
<!-- END GENERATED: install -->
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。