mcpField
N
news-monitor-mcp

news-monitor-mcp

本地服务
github.com搜索与检索05 周前更新

关于 news-monitor-mcp

news-monitor-mcp 连接 AI 助手与 WorldNewsAPI,用于新闻搜索和媒体监测。它支持德语和英语情绪分析、简报、趋势检测、地理位置搜索及持久化提醒;使用时需要 API 密钥。

主要功能

  1. 01跨国家和语言的全文搜索
  2. 02德语和英语情绪分析
  3. 03按国家和语言查看头条
  4. 04多主题媒体简报
  5. 05新闻趋势与地理位置搜索
  6. 06持久化提醒管理

适用场景

  1. 01监测某机构或主题的媒体报道
  2. 02制作每周多主题媒体简报
  3. 03跟踪德语或英语新闻中的情绪倾向
  4. 04为关键词、报道量或情绪变化创建提醒

MCP 相关

向 MCP 客户端提供基于 WorldNewsAPI 的新闻搜索、分析、简报、趋势、地理搜索和提醒工具。该服务需要 WorldNewsAPI 密钥。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"malkreide-news-monitor": {
"command": "uvx",
"args": [
"news-monitor-mcp"
]
}
}
}
启动命令uvx news-monitor-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypinews-monitor-mcp0.4.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

🇨🇭 属于 瑞士公共数据 MCP 组合

📰 news-monitor-mcp

Version License: MIT Python 3.11+ MCP Data Source CI

用于通过 WorldNewsAPI 监控全球新闻、分析媒体和追踪情绪的 MCP 服务——覆盖 150 多个国家的全文搜索、德语/英语情绪分析、头条新闻、GL 简报、报纸头版和地理搜索。需要 API 密钥。

🇩🇪 德语版本


概览

news-monitor-mcp 可将任何 AI 助手转变为主动的媒体情报 Agent。该服务将 Claude 等大模型与全球新闻数据相连:从瑞士机构声誉监测,到每周领导层简报和跨类别趋势检测。

数据源: WorldNewsAPI(worldnewsapi.com)——唯一提供德语情绪分析的免费新闻 API。

需要 API 密钥。 在 worldnewsapi.com/console 获取免费密钥——免费套餐:每天 50 点,无需信用卡,但需要添加指向 worldnewsapi.com 的反向链接(截至 2026-08-14 检查)。

代表性演示查询: "过去 30 天里,苏黎世教育局在媒体上是如何呈现的?整体情绪如何?"


功能

  • 🔍 全文搜索 – 覆盖 150 多个国家、50 多种语言,支持布尔查询和精确短语匹配
  • 📊 情绪分析 – 仅支持德语和英语(WorldNewsAPI 的独特功能);分数范围从 −1(负面)到 +1(正面)
  • 📰 头条新闻 – 按国家和语言聚类,并按报道来源数量排序
  • 📋 媒体简报 – 多主题周报,包含情绪概览,适用于 GL/领导层更新
  • 🗞️ 报纸头版 – 提供 125 个国家 6,000 多种出版物的数字版封面
  • 📡 趋势雷达 – 按国家检测基于类别的趋势(政治、技术、教育等)
  • 📍 地理搜索 – 搜索特定地点的新闻(苏黎世、伯尔尼、巴塞尔、苏黎世州等)
  • ☁️ 双传输方式 – 为 Claude Desktop 提供 stdio,为云部署提供 Streamable HTTP
#工具描述
1news_search在 150 多个国家进行全文新闻搜索
2news_top_headlines按国家和语言获取头条新闻
3news_sentiment_monitor分析实体或主题的情绪
4news_media_briefing多主题周报
5news_retrieve_article按 ID 获取完整文章
6news_search_sources按名称/国家查找可用新闻来源
7news_front_pages数字报纸头版——需要付费套餐,见下文
8news_trend_radar按国家检测基于类别的趋势
9news_geo_search搜索特定地点的新闻
10news_alert_create创建持久提醒(情绪/数量/关键词)
11news_alert_list列出已配置的提醒及其状态
12news_alert_check根据当前数据评估提醒
13news_alert_delete永久删除提醒
14news_cache_stats按类型查看缓存命中率和条目数
15news_cache_clear清除缓存(全部或按工具类型)

演示

媒体简报演示

"创建一份媒体简报,主题包括:教育中的 AI、苏黎世小学、学校数字化"


数据源

来源API 类型内容
WorldNewsAPIREST JSON150 多个国家、50 多种语言、全文、情绪分析

前置条件


安装

# Recommended: uvx (no install step needed)
uvx news-monitor-mcp

# Alternative: pip
pip install news-monitor-mcp

快速入门

# Start the server (stdio mode for Claude Desktop)
WORLD_NEWS_API_KEY=your-key uvx news-monitor-mcp

在 Claude Desktop 中立即试用:

“显示今天瑞士的头条新闻” “本月德语媒体如何报道 Schulamt Zürich?” “创建一份媒体简报,主题为:Volksschule Zürich、教育中的 AI、学校数字化”


配置

环境变量
变量默认值描述
WORLD_NEWS_API_KEY–必填。 来自 worldnewsapi.com 的 API 密钥
MCP_TRANSPORTstdio传输方式:stdio 或 streamable_http
MCP_HOST127.0.0.1HTTP 绑定主机。仅在容器内使用 0.0.0.0。
MCP_PORT8000HTTP 传输端口
MCP_BEARER_TOKEN–在 --http 模式下必填。 客户端必须在 Authorization: Bearer <token> 中提供 Bearer 令牌。通过 python -c "import secrets; print(secrets.token_urlsafe(32))" 生成。
MCP_ALLOWED_ORIGINS–可选的 Origin 标头 CSV 允许列表(防范 DNS 重绑定)。示例:https://claude.ai。
LOG_LEVELINFO日志级别:DEBUG / INFO / WARNING / ERROR。日志以 JSON 格式输出到 stderr,并自动隐藏 api-key= 查询参数和 Authorization: Bearer 标头中的敏感信息。
NEWS_MONITOR_ALERTS_DIR~/.news-monitor-mcp存放 alerts.json 的目录。父目录不得为符号链接(为防范路径注入,启动时会拒绝此类目录)。文件以 0o600 权限创建,目录以 0o700 权限创建。
NEWS_MONITOR_ALERTS_FILE–(向后兼容) 提醒文件的显式路径。同样会检查符号链接。建议使用 NEWS_MONITOR_ALERTS_DIR。
MCP_ALERT_RETENTION_DAYS90服务启动时删除超过此天数的提醒(隐私默认设置见 docs/privacy-dsg.md)。设为 0 可禁用保留期限。
MCP_CACHE_MAX_PER_TYPE1000每种工具类型的最大缓存条目数。超出时,会逐出该类型中最近最少使用的条目。设为 0 可取消上限(缓存将无限增长——仅适用于短生命周期进程)。
MCP_CACHE_SWEEP_SECONDS300后台任务从缓存中删除 TTL 已过期条目的间隔。设为 0 可禁用清理(调用 news_cache_stats 时仍会延迟清除过期条目)。
Claude Desktop 配置
{
  "mcpServers": {
    "news-monitor": {
      "command": "uvx",
      "args": ["news-monitor-mcp"],
      "env": {
        "WORLD_NEWS_API_KEY": "your-api-key-here"
      }
    }
  }
}

配置文件位置:

  • macOS:~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows:%APPDATA%\Claude\claude_desktop_config.json

重启 Claude Desktop 后,即可使用所有工具。示例查询:

  • “显示今天瑞士的头条新闻”
  • “本月媒体对教育中的 AI 持什么态度?”
  • “创建一份每周简报,主题为:Schulamt Zürich、Volksschule、KI Bildung”
  • “查找过去 14 天所有关于学校数字化的德语文章”
  • “显示今天瑞士报纸的头版”
云端部署(Streamable HTTP)

可通过浏览器中的 claude.ai 使用(例如在没有本地软件的受管工作站上):

必须进行身份验证。 HTTP 传输会拒绝所有未携带有效 Authorization: Bearer <token> 标头的请求。生成一次令牌并妥善保密:

python -c "import secrets; print(secrets.token_urlsafe(32))"

Render.com(推荐):

  1. 将仓库推送到 GitHub 或在 GitHub 上 Fork
  2. 在 render.com 上:New Web Service → 连接 GitHub 仓库
  3. 在 Render 控制面板中设置以下环境变量:
    • WORLD_NEWS_API_KEY — 你的 WorldNewsAPI 密钥
    • MCP_BEARER_TOKEN — 上面生成的令牌
    • MCP_HOST=0.0.0.0 — 在容器内绑定到所有接口
    • MCP_ALLOWED_ORIGINS=https://claude.ai (可选,建议设置)
  4. 在 claude.ai 的 Settings → MCP Servers 中,添加 URL https://your-app.onrender.com/mcp,并将 Bearer 令牌配置为身份验证标头。
# 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
扩展说明

此服务目前是单进程 / 单副本:

  • TTL 缓存驻留在进程内存中(NewsCache)。如果运行多个 Render 或 Kubernetes 副本,每个副本都有自己的缓存,命中率会随副本数量线性下降。
  • 告警会持久化到本地 alerts.json(容器内默认为 /data)。挂载同一个持久卷的多个副本会通过 fcntl.flock 进行串行访问,但要实现真正的集群运行,还需要共享存储(Redis / Postgres)——参见尚未解决的问题 SCALE-STATEFUL。
  • 待确认项(input_required,见 MCP Protocol Version)携带一个 requestState,SDK 使用仅此进程持有的密钥对其进行封装,有效期为 10 分钟。如果重试请求到达另一个副本、在重启后到达,或超过有效期,则会被拒绝,并返回 -32602 Invalid or expired requestState——不会删除任何内容,客户端会再次调用,并再次询问用户。运行多个副本需要共享密钥(在 MCPServer 上设置 request_state_security=),但此服务未进行此项配置。
  • 在 Render Free Tier 上,容器会在闲置约 15 分钟后休眠,并丢失非持久化状态。如果需要在重启后保留告警,请为 /data 挂载 Persistent Disk。使用 Render Free 并启用告警时,必须接受每次唤醒都会丢失缓存这一点。

MCP_CACHE_MAX_PER_TYPE 上限(默认为每种类型 1000 条)和后台清理(MCP_CACHE_SWEEP_SECONDS,默认为 5 分钟)可防止进程内缓存无限增长。

容器镜像

项目包含一个以非 root 用户运行的多阶段 Dockerfile,并在每次 CI 运行时构建。容器内的服务默认使用 --http,绑定到 0.0.0.0:8000,将告警持久化到 /data,并在缺少 MCP_BEARER_TOKEN 时拒绝启动。

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

架构

┌─────────────────┐    ┌──────────────────────────┐    ┌──────────────────────────┐
│  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        │
                       └──────────────────────────┘    └──────────────────────────┘

项目结构

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

MCP 协议版本

此服务通过同一个端点支持两个协议时期。客户端在连接上的第一个请求决定使用哪个时期;之后如果声明使用另一个时期,则会被拒绝。

时期修订版适用对象
initialize 握手2024-11-05 … 2025-11-25当前客户端使用的版本。服务会使用请求指定的修订版作答;如果请求要求更新的版本,则使用上限 2025-11-25 作答。
逐请求封装2026-07-28携带 2026-07-28 _meta 封装的请求会建立现代连接。

两个修订版都固定在 tests/test_protocol_version.py 中,并针对已安装的 SDK 进行断言,因此 Dependabot 升级 mcp 时不会悄然改变任一版本。握手上限通过已组装的 ASGI 堆栈执行实时 initialize 测得,而不是从常量名称推断。

请注意,SDK 的 LATEST_PROTOCOL_VERSION 是现代协议时期的别名,而不是握手时期的别名——仅针对它固定版本,会让当前客户端实际协商的协议时期不受约束地变化。

更新策略。 门禁检查失败时,不要盲目修改常量:请阅读两个修订版之间的规范变更日志,确认服务仍能正常运行,然后一并更新常量、本节、README.de.md 和 CHANGELOG.md。

2026-07-28 中服务端的贡献

SDK 携带信封、server/discover 和错误代码。通过 tests/test_spec_2026_07_28.py 中组装好的 ASGI 堆栈进行测量后发现,有三件事它无法独自做好:

  • 身份信息。 没有握手时,serverInfo 会出现在 server/discover 和每个结果的 _meta 中。它过去携带的是 "version": "";现在会标明版本(取自软件包元数据)、标题、描述和网站。
  • 两个时代都没有会话。 规范移除了 Mcp-Session-Id(SEP-2567)。现在,HTTP 传输对握手客户端也以无状态模式运行:此服务端不保留任何连接状态——警报通过作为工具参数传入的服务端生成 ID 寻址,缓存则在整个进程范围内共享。会话不再将客户端固定到某个进程;仍会产生这种效果的因素列于扩展说明下。
  • 通过 input_required 进行人工确认(SEP-2322),用于两个有破坏性的工具 news_alert_delete 和 news_cache_clear。当 2026-07-28 客户端声明支持表单征询时,服务端会询问用户,并且只根据用户的回答采取操作——模型设置 confirm=true 不再能跳过询问。不支持表单征询的客户端以及所有握手客户端,仍保持原有的 confirm 流程不变。

有意保持不变的部分:server/discover 仍会列出 prompts 和 resources 能力,因为 MCPServer 会无条件注册这两个处理程序;两个列表都是空的。


测试

# Unit + contract tests (no network) — this is what CI runs
PYTHONPATH=src pytest tests/ -m "not live"

# Live tests. The route check needs no key; the data tests skip without one.
PYTHONPATH=src pytest tests/ -m "live"

# Re-record the route inventory (writes tests/fixtures/ + PROVENANCE.md)
PYTHONPATH=src python scripts/record_fixtures.py

256 项测试——249 项离线测试、7 项实时测试(其中 2 项不需要 API 密钥)。

实时测试每天于 06:17 UTC 通过 .github/workflows/live-tests.yml 运行,而不是在推送时运行:它们测量的是源站,而源站的变化独立于此仓库。

三项实时测试从未运行

直到 2026-08-08,仓库的三项实时测试都带有 @pytest.mark.live,却没有 @pytest.mark.asyncio。在 pytest-asyncio 的严格默认模式下,这并不意味着“跳过”,而是意味着 async def functions are not natively supported。它们从未执行过,任何运行 -m live 的人都会得到三个与源站毫无关系的错误。CI 会排除 -m live,所以没有任何报告提及这个问题。

现在,asyncio_mode = "auto" 会避免因忘记标记而导致这种情况。

而且即使运行了,也不会有太大帮助:

assert "Volksschule" in result or "Ergebnisse" in result

第二个分支与工具自身的结果标题相符,因此这个析取条件不可能失败。assert "Top-Schlagzeilen" in result 和 assert "Sentiment" in result 同样只匹配了模板。现在,三项测试都会断言某些可能失败的内容;未设置密钥时会跳过而不是失败——“红灯”应该表示出了问题,而不是表示你没有密钥。

无需密钥时能验证什么,不能验证什么

tests/fixtures/api_routen.json 记录了工具构造的五个路径在无密钥时测得的状态码和内容类型。网关会先匹配路由,再进行身份验证:

路径响应
服务端构造的五个路径401,application/json
随意编造的路径(对照项)404,text/html

因此,401 表示“此路由存在”。如果没有对照项,它只能表示“我收到了 401”——但这并非必然:此项目组合中的其他地方,epl.bag.admin.ch 对编造的路径也会返回 401。因此,记录器会在每次运行时重新测量对照项,并在它不再具有区分能力时中止。

**仍待解决,并已在 PROVENANCE.md 中标明:**服务端发送的查询参数名称是否正确。无论参数为何,API 都会返回 401,因此没有密钥就无法验证。在同一项目组合的 global-education-mcp 中,恰恰出现过这种问题——两个筛选参数因未知参数收到 HTTP 200 并被丢弃而悄然失效。这项检查仍待完成,并非已经完成。

空结果与响应格式变化

data.get("news", []) 会将两种截然不同的情况一概视为“来源未找到任何内容”和“来源的响应方式与我们的假设不同”。第二种情况会变成“0 条结果”——看似完整、合理、格式正确,却是错的。这并非假设:在 global-education-mcp 中,响应封装字段已被重命名,因此所有答案都返回为空,而 128 项测试仍然全部通过。

articles_of() 现在会读取响应封装字段。空的 news 仍然是空列表——这是来源明确表示的结果。缺少 news 并不代表新闻为空,而是响应格式有问题,因此会按此报告。


示例用例

Schulamt / 机构沟通
"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 工作组
"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")
城市管理 / 地点研究
"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")

→ 按受众查看更多用例 →


情感分析

WorldNewsAPI 提供德语情感分析——这在新闻 API 中并不常见:

ScoreLabelMeaning
> 0.3positiv 😊正面报道
−0.3 to 0.3neutral 😐中性/事实性报道
< −0.3negativ 😟批判性/负面报道

⚠️ 情感分析仅支持德语(de)和英语(en)。


安全、限制与负责任的使用

只读操作

15 个工具中有 12 个带有 readOnlyHint: true。所有 9 个监控工具(search、headlines、sentiment、briefing、article、sources、front_pages、trend、geo)都完全只读,仅向 WorldNewsAPI 发送 GET 请求。3 个例外均为仅限本地的操作:news_alert_create 和 news_alert_delete(写入/删除 ~/.news-monitor-mcp/alerts.json),以及 news_cache_clear(清除内存缓存)。这 15 个工具都不会修改任何外部数据源。

API 速率限制
ConstraintWorldNewsAPI Free TierPaid Plans
配额50 点/天500 – 50,000 点/天
每次调用的文章数最多 100最多 100
历史数据范围30 天更长
每次调用超时30 秒30 秒

配额信息已于 2026-08-14 对照 worldnewsapi.com/pricing 核实。若不注明日期,一年后配额信息就与猜测无异。计划使用此表前,还需了解以下两点:

  • API 按点数而非调用次数计费。请求的成本取决于端点及其选项,因此不存在固定的“每日调用次数”——此前关于每月 1,000 次调用的说法,计量单位和数量级都错了。
  • news_front_pages 在免费计划中不可用。根据 2026-08-14 的实测:/retrieve-front-page 返回 HTTP 403 — This endpoint is not available on the free plan.。使用免费密钥可以访问其他 14 个工具。
  • 每次调用的文章数不取决于计划类型。根据 2026-08-14 的免费计划实测:number=50 返回 50 篇文章,number=100 返回 100 篇,二者均返回 HTTP 200(每次的 available: 13037)。本 README 的早期版本曾声称免费计划限制为 10 篇——这是将本服务自身的默认值(DEFAULT_RESULTS)误认为来源的限制。

TTL 缓存(v0.2+)最多可将重复调用减少 80%。

数据隐私
  • 不存储个人数据: 服务端不会持久存储用户数据。缓存条目仅保存在内存中,并会在服务端重启时清除。
  • 不进行用户画像分析: 服务端仅检索公开发表的新闻报道,不用于监控或个人画像分析。
  • 提醒数据: 提醒配置仅存储在本地的 ~/.news-monitor-mcp/alerts.json 中——只保存在你的设备上,绝不会传输。
负责任的使用
  • 仅查询公开新闻——不要将其用作个人画像分析工具。
  • 情感分数反映的是对新闻报道语气的算法分析,并非经核实的编辑判断。
  • 结果取决于 WorldNewsAPI 的索引情况;与全国性媒体相比,瑞士地区媒体的覆盖可能较少。
服务条款

用户必须遵守:

此 MCP 服务是一个独立的开源项目,与 WorldNewsAPI 无关联。


与其他 MCP 服务的协同

news-monitor-mcp 可与项目组合中的其他服务搭配使用:

组合用例
+ fedlex-mcp法律与舆论相结合:法律框架 + 媒体报道
+ global-education-mcpOECD 统计数据 + 当前媒体背景
+ srgssr-mcp瑞士公共媒体 + 国际新闻对比
+ swiss-environment-mcp环境数据 + 媒体报道
+ swiss-statistics-mcpBFS 统计数据 + 当前媒体叙事
+ zurich-opendata-mcp城市数据 + 本地媒体报道

更新日志

请参阅 CHANGELOG.md


贡献

请参阅 CONTRIBUTING.md(Deutsch)。


安全与合规


许可证

MIT 许可证——请参阅 LICENSE


作者

Hayal Oezkan · malkreide


致谢与相关项目

安装

通过 uv 的 uvx 运行——无需克隆或手动安装。将其添加到 MCP 客户端配置中(Claude Desktop、Cursor 和 Windsurf 使用 mcpServers;VS Code 在 .vscode/mcp.json 中使用顶层 servers 键):

{
  "mcpServers": {
    "news-monitor-mcp": {
      "command": "uvx",
      "args": [
        "news-monitor-mcp"
      ]
    }
  }
}

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。