关于 news-monitor-mcp
news-monitor-mcp 连接 AI 助手与 WorldNewsAPI,用于新闻搜索和媒体监测。它支持德语和英语情绪分析、简报、趋势检测、地理位置搜索及持久化提醒;使用时需要 API 密钥。
主要功能
- 01跨国家和语言的全文搜索
- 02德语和英语情绪分析
- 03按国家和语言查看头条
- 04多主题媒体简报
- 05新闻趋势与地理位置搜索
- 06持久化提醒管理
适用场景
- 01监测某机构或主题的媒体报道
- 02制作每周多主题媒体简报
- 03跟踪德语或英语新闻中的情绪倾向
- 04为关键词、报道量或情绪变化创建提醒
MCP 相关
向 MCP 客户端提供基于 WorldNewsAPI 的新闻搜索、分析、简报、趋势、地理搜索和提醒工具。该服务需要 WorldNewsAPI 密钥。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
🇨🇭 属于 瑞士公共数据 MCP 组合
📰 news-monitor-mcp
用于通过 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
| # | 工具 | 描述 |
|---|---|---|
| 1 | news_search | 在 150 多个国家进行全文新闻搜索 |
| 2 | news_top_headlines | 按国家和语言获取头条新闻 |
| 3 | news_sentiment_monitor | 分析实体或主题的情绪 |
| 4 | news_media_briefing | 多主题周报 |
| 5 | news_retrieve_article | 按 ID 获取完整文章 |
| 6 | news_search_sources | 按名称/国家查找可用新闻来源 |
| 7 | news_front_pages | 数字报纸头版——需要付费套餐,见下文 |
| 8 | news_trend_radar | 按国家检测基于类别的趋势 |
| 9 | news_geo_search | 搜索特定地点的新闻 |
| 10 | news_alert_create | 创建持久提醒(情绪/数量/关键词) |
| 11 | news_alert_list | 列出已配置的提醒及其状态 |
| 12 | news_alert_check | 根据当前数据评估提醒 |
| 13 | news_alert_delete | 永久删除提醒 |
| 14 | news_cache_stats | 按类型查看缓存命中率和条目数 |
| 15 | news_cache_clear | 清除缓存(全部或按工具类型) |
演示

"创建一份媒体简报,主题包括:教育中的 AI、苏黎世小学、学校数字化"
数据源
| 来源 | API 类型 | 内容 |
|---|---|---|
| WorldNewsAPI | REST JSON | 150 多个国家、50 多种语言、全文、情绪分析 |
前置条件
- Python 3.11+
uv或pip- 来自 worldnewsapi.com/console 的 API 密钥(提供免费套餐)
安装
# 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_TRANSPORT | stdio | 传输方式:stdio 或 streamable_http |
MCP_HOST | 127.0.0.1 | HTTP 绑定主机。仅在容器内使用 0.0.0.0。 |
MCP_PORT | 8000 | HTTP 传输端口 |
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_LEVEL | INFO | 日志级别: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_DAYS | 90 | 服务启动时删除超过此天数的提醒(隐私默认设置见 docs/privacy-dsg.md)。设为 0 可禁用保留期限。 |
MCP_CACHE_MAX_PER_TYPE | 1000 | 每种工具类型的最大缓存条目数。超出时,会逐出该类型中最近最少使用的条目。设为 0 可取消上限(缓存将无限增长——仅适用于短生命周期进程)。 |
MCP_CACHE_SWEEP_SECONDS | 300 | 后台任务从缓存中删除 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(推荐):
- 将仓库推送到 GitHub 或在 GitHub 上 Fork
- 在 render.com 上:New Web Service → 连接 GitHub 仓库
- 在 Render 控制面板中设置以下环境变量:
WORLD_NEWS_API_KEY— 你的 WorldNewsAPI 密钥MCP_BEARER_TOKEN— 上面生成的令牌MCP_HOST=0.0.0.0— 在容器内绑定到所有接口MCP_ALLOWED_ORIGINS=https://claude.ai(可选,建议设置)
- 在 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 中并不常见:
| Score | Label | Meaning |
|---|---|---|
| > 0.3 | positiv 😊 | 正面报道 |
| −0.3 to 0.3 | neutral 😐 | 中性/事实性报道 |
| < −0.3 | negativ 😟 | 批判性/负面报道 |
⚠️ 情感分析仅支持德语(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 速率限制
| Constraint | WorldNewsAPI Free Tier | Paid 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-mcp | OECD 统计数据 + 当前媒体背景 |
+ srgssr-mcp | 瑞士公共媒体 + 国际新闻对比 |
+ swiss-environment-mcp | 环境数据 + 媒体报道 |
+ swiss-statistics-mcp | BFS 统计数据 + 当前媒体叙事 |
+ zurich-opendata-mcp | 城市数据 + 本地媒体报道 |
更新日志
请参阅 CHANGELOG.md
贡献
请参阅 CONTRIBUTING.md(Deutsch)。
安全与合规
- 私下报告漏洞:请参阅 SECURITY.md
- 瑞士公共部门部署:请参阅
docs/isds-klassifikation.md中的 ISDS / Schutzbedarfsfeststellung - 瑞士数据保护(revDSG)——职责、分析、保留期限、第三国数据传输:
docs/privacy-dsg.md - 审计历史:
audits/
许可证
MIT 许可证——请参阅 LICENSE
作者
Hayal Oezkan · malkreide
致谢与相关项目
- 数据: WorldNewsAPI – 全球新闻数据及情感分析
- 协议: Model Context Protocol – Anthropic / Linux Foundation
- 相关项目: swiss-culture-mcp – 瑞士文化遗产数据 MCP 服务
- 相关项目: srgssr-mcp – 面向 SRG SSR 瑞士公共媒体的 MCP 服务
- 项目组合: Swiss Public Data MCP Portfolio
安装
通过 uv 的 uvx 运行——无需克隆或手动安装。将其添加到 MCP 客户端配置中(Claude Desktop、Cursor 和 Windsurf 使用 mcpServers;VS Code 在 .vscode/mcp.json 中使用顶层 servers 键):
{
"mcpServers": {
"news-monitor-mcp": {
"command": "uvx",
"args": [
"news-monitor-mcp"
]
}
}
}
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。