Back to Discover

news-monitor-mcp

connector

malkreide

Aggregated news monitoring across Swiss public media RSS feeds

View on GitHub
0 starsSynced Aug 2, 2026

Install to Claude Code

/plugin marketplace add malkreide/news-monitor-mcp

README

πŸ‡¨πŸ‡­ Part of the Swiss Public Data MCP Portfolio

πŸ“° news-monitor-mcp

Version License: MIT Python 3.11+ MCP Data Source CI

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.

πŸ‡©πŸ‡ͺ Deutsche Version


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
#ToolDescription
1news_searchFull-text news search in 150+ countries
2news_top_headlinesTop headlines by country and language
3news_sentiment_monitorSentiment analysis for entity or topic
4news_media_briefingMulti-topic weekly briefing report
5news_retrieve_articleFetch full article by ID
6news_search_sourcesFind available news sources by name/country
7news_front_pagesDigital newspaper front pages
8news_trend_radarCategory-based trend detection per country
9news_geo_searchLocation-specific news search
10news_alert_createCreate a persistent alert (sentiment / volume / keyword)
11news_alert_listList configured alerts with status
12news_alert_checkEvaluate alerts against current data
13news_alert_deletePermanently remove an alert
14news_cache_statsCache hit-rate and entries by type
15news_cache_clearClear cache (entirely or per tool type)

Demo

Media Briefing Demo

"Create a media briefing for: AI in education, Volksschule ZΓΌrich, school digitalisation"


Data Sources

SourceAPI TypeContent
WorldNewsAPIREST JSON150+ countries, 50+ languages, full text, sentiment

Prerequisites


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

VariableDefaultDescription
WORLD_NEWS_API_KEY–Required. API key from worldnewsapi.com
MCP_TRANSPORTstdioTransport: stdio or streamable_http
MCP_HOST127.0.0.1HTTP bind host. Use 0.0.0.0 only inside a container.
MCP_PORT8000Port 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_LEVELINFOLog 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-mcpDirectory 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_DAYS90Alerts 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_TYPE1000Maximum 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_SECONDS300Interval 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):

  1. Push/fork the repository to GitHub
  2. On render.com: New Web Service β†’ connect GitHub repo
  3. Set the following environment variables in the Render dashboard:
    • WORLD_NEWS_API_KEY β€” your WorldNewsAPI key
    • MCP_BEARER_TOKEN β€” the token generated above
    • MCP_HOST=0.0.0.0 β€” bind on all interfaces inside the container
    • MCP_ALLOWED_ORIGINS=https://claude.ai (optional, recommended)
  4. In claude.ai under Settings β†’ MCP Servers, add the URL https://your-app.onrender.com/mcp and 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 /data inside the container). Multiple replicas mounting the same persistent volume serialize via fcntl.flock, but for true cluster operation a shared store (Redis / Postgres) is needed β€” see the open finding SCALE-STATEFUL.
  • On Render Free Tier, the container sleeps after ~15 minutes of inactivity and loses non-persistent state. Attach a Persistent Disk for /data if 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:

ScoreLabelMeaning
> 0.3positiv 😊Positive coverage
βˆ’0.3 to 0.3neutral 😐Neutral / factual coverage
< βˆ’0.3negativ 😟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

ConstraintWorldNewsAPI Free TierPaid Plans
Calls/month1,000Up to 1M
Articles/call10Up to 100
Historical depth30 daysExtended
Timeout per call30 seconds30 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:

CombinationUse Case
+ fedlex-mcpLaw meets discourse: legal framework + media coverage
+ global-education-mcpOECD stats + current media context
+ srgssr-mcpSwiss public media + international news comparison
+ swiss-environment-mcpEnvironmental data + media reporting
+ swiss-statistics-mcpBFS statistics + current media narrative
+ zurich-opendata-mcpCity data + local media coverage

Changelog

See CHANGELOG.md


Contributing

See CONTRIBUTING.md (Deutsch).


Security & Compliance


License

MIT License β€” see LICENSE


Author

Hayal Oezkan Β· malkreide


Credits & Related Projects

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"
      ]
    }
  }
}

Rendered live from malkreide/news-monitor-mcp's GitHub README β€” not stored, always reflects the source repo.

1 Install Method

NameDescriptionCategorySource
pypi packageInstall via pypi (stdio transport)mcp-servernews-monitor-mcp

0 Comments

Login required
Log in to post a comment or update on this repo.

No comments yet β€” be the first to share an update.