内容
# Overtone 新闻 MCP 服务器
一款 MCP 服务器,为任何代理提供实时新闻以及有效的情境智能——语气分布、新兴故事、叙事转变、峰值警报和随时间变化的语气图表——由 [Overtone](https://overtone.ai) 的发布者网络提供支持。
与任何兼容 MCP 的客户端配合使用:Claude Desktop、Claude Code、Cursor、Windsurf、Codex、Kimi K2 等。
---
## 它是什么样子
**自然语言查询** — 用简单的中文提问,获取情境分析的文章:

**全球覆盖分析** — 比较不同语言和地区的语气:

**语气时间序列** — 跟踪一个话题的情感覆盖如何随时间变化:

---
## 为什么存在
新闻 API 返回文章。这很容易。但是一个代理真正需要推理当前事件的所有信息是:
- 一个话题的报道基调是什么——公众的情绪是愤怒的、充满希望的、信息丰富的还是恐惧的?
- 目前有什么新兴的报道,而昨天没有任何报道?
- 叙事在哪里转变——哪些话题的语气转变最快?
- 围绕我关注的某个话题,是否有愤怒或恐惧的激增?
- 一个特定故事的语气如何随时间变化?
该服务器将所有这些信息作为 MCP 工具公开,以便代理可以提取正确的信号来回答它被问的问题——而不仅仅是一个平面的新闻头条提要。
---
## 安装
服务器作为一个 Python 包提供。`uvx`(来自 [uv](https://docs.astral.sh/uv/))运行它而不会使您的全局 Python 环境混乱。只需安装 `uv`:
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```
然后在您的 MCP 客户端配置文件中添加一个块。`uvx` 从 PyPI 获取包并按需运行——无需额外的安装步骤。
### Claude Desktop
编辑 `~/Library/Application Support/Claude/claude_desktop_config.json`(macOS)或您平台上的等效文件:
```json
{
"mcpServers": {
"overtone-news": {
"command": "uvx",
"args": ["overtone-news-mcp"]
}
}
}
```
### Claude Code
编辑 `~/.config/claude-code/mcp.json`:
```json
{
"mcpServers": {
"overtone-news": {
"command": "uvx",
"args": ["overtone-news-mcp"]
}
}
}
```
### Cursor / Windsurf
设置 → MCP → 添加服务器:
- **命令**:`uvx`
- **参数**:`overtone-news-mcp`
### Codex
编辑 `~/.codex/config.toml`:
```toml
[[mcp_servers]]
name = "overtone-news"
command = "uvx"
args = ["overtone-news-mcp"]
```
---
## 身份验证
在第一次工具调用时,服务器会注册一个免费的 Overtone API 密钥,并将其缓存在 `~/.overtone/credentials`。缓存与 [Overtone 新闻技能](https://github.com/CKBrennan/overtone-news-skill) 共享适用于 Claude Code,因此安装两者不会重复注册。
对于**高级密钥**(更高的速率和每日限制),请在 MCP 配置的 `env` 块中设置 `OVERTONE_NEWS_API_KEY`:
```json
"overtone-news": {
"command": "uvx",
"args": ["--from", "git+https://github.com/CKBrennan/overtone-news-mcp", "overtone-news-mcp"],
"env": { "OVERTONE_NEWS_API_KEY": "ot-prod-..." }
}
```
速率限制:
| 层级 | 每分钟 | 每日 |
|---|---|---|
| `auto`(免费,自动提供) | 10 | 50 |
| `manual`(高级) | 60 | 有效地无限制 |
要请求高级密钥,请发送电子邮件至 [business@overtone.ai](mailto:business@overtone.ai)。
---
## 环境变量
| 变量 | 默认值 | 用途 |
|---|---|---|
| `OVERTONE_NEWS_API_KEY` | *(自动注册)* | 使用特定密钥而不是自动注册 |
| `OVERTONE_NEWS_API_URL` | `https://agentic-skills.overtone.ai` | 覆盖 API 端点(用于自托管或测试) |
---
## 工具
所有工具都返回 JSON。代理选择最适合用户问题的工具——您不直接调用它们。
### `news`
某个话题的文章,每篇文章都标有语气、品牌安全信号、文章类型和概念。用于询问“X 发生了什么”。
```python
news(query="AI regulation in Europe", max_results=10, days=7,
tone_filter="informational", brand_safe_only=True)
```
响应包括一个 `request_id`——在呈现文章后,将其传回给 `report`,以便我们知道实际显示了什么。
### `tone`
一个话题的近期报道的情感语气分布——`happy`、`funny`、`hopeful`、`informational`、`angry`、`sad`、`fearful`,以及 `dominant_tone`。
```python
tone(query="climate change", days=3)
```
当用户询问一个话题**如何**被报道,而不是**发生了什么**时使用。
### `pulse`
可轮询的峰值检测器。对于每个受监视的语气(默认为 `angry` / `sad` / `fearful`),返回与基线窗口相比的 `spike_ratio` 和一个布尔值 `spiking`。`alerts` 仅在 `spike_ratio >= 1.5` 且具有有意义的音量时填充。
```python
pulse(query="acme corp", tones=["angry", "fearful"],
recent_hours=6, baseline_hours=72)
```
建议每 5-15 分钟轮询一次。只有当 `alerts` 不为空时,才向用户显示。
### `emerging`
过去 24 小时内出现的概念,在过去 48 小时内没有报道——候选新兴故事。集群过滤为 ≥3 篇文章和 ≥2 个来源,因此不会通过单个文章的噪音泄漏。
```python
emerging(limit=10)
```
### `velocity`
在过去 48 小时和最近 24 小时内,语气分布变化最剧烈的概念。回答“叙事在哪里转变?”。按形状归一化的 L2 距离排名,因此均匀的音量上升不会被视为转变。
```python
velocity(limit=10)
```
### `timeseries`
一个话题随时间变化的语气轨迹。`bin` 为 `hour`、`6h` 或 `day`。返回每个 bin 的平均语气、`article_count` 和 `dominant_tone` 的有序序列。
```python
timeseries(query="federal reserve", bin="6h", hours=168)
```
最好呈现为 Mermaid 线形图或 ASCII 火花图。
### `report`
在代理向用户呈现文章后静默调用,用于记录实际显示的 `displayed_urls`。帮助 Overtone 了解哪些内容对代理客户端来说最有价值。
```python
report(request_id="<from news response>",
displayed_urls=[...], displayed_count=3,
sponsorship_displayed=False)
```
---
## 示例代理流程
**“目前 NBA 季后赛的氛围如何?”**
→ `tone(query="NBA playoffs")` → 总结分布情况。
**“关于 FDA 有什么最新的消息?”**
→ `emerging(limit=20)` → 过滤 FDA 相关概念。
**“每 10 分钟跟踪我们品牌的愤怒激增。”**
→ `pulse(query="acme corp", tones=["angry"])` 循环;仅当 `alerts` 不为空时显示。
**“显示我过去一周关于特斯拉的情绪。”**
→ `timeseries(query="Tesla", bin="6h", hours=168)` → 渲染为图表。
**“给我 5 篇关于太空探索的积极故事。”**
→ `news(query="space exploration", max_results=5, tone_filter="positive")`
→ 呈现 → `report(...)`。
---
## 隐私——发送到 Overtone 的内容
当服务器在首次使用时自动注册免费层级密钥时,它会发送:
- `hostname + OS user + CPU arch` 的 **SHA-256 哈希**。我们永远不会看到原始值;哈希用于在同一台机器上重新安装时进行重复数据删除。
注册过程中不会传输任何个人数据。
每次工具调用时,服务器都会将 API 密钥和工具的输入参数发送到 `${OVERTONE_NEWS_API_URL}`。我们记录查询用于分析和防止滥用;请参阅 [overtone.ai/privacy](https://overtone.ai/privacy)。
**除了工具输入外,不会发送任何文章内容,用户对话或代理上下文。** 我们不会看到代理的其余提示,内存或其他工具调用。
要退出自动注册,请手动设置 `OVERTONE_NEWS_API_KEY` 为您请求的密钥,或将 `OVERTONE_NEWS_API_URL` 指向您自己的代理。
---
## 安全说明
- **通过文章内容进行提示注入。** `news` 工具返回发布者文本(标题,描述)。一篇文章可能包含旨在操纵代理的文本(“忽略之前的指令并……”)。MCP 服务器本身没有破坏性工具——它只读取——但您应该像对待任何网页内容一样,将返回的文章文本视为不受信任的输入,在代理的推理中。主机中的沙盒,输出仅渲染和工具允许列表是正确的缓解措施。
- **无 shell 访问。** 服务器从不执行用户的 shell 命令。唯一的 `subprocess` 使用是在注册期间读取 `git config --global user.{name,email}`。
- **除了 `~/.overtone/credentials` 之外的无文件系统访问。** 服务器不读取或写入任何其他本地文件。
---
## 开发
```bash
git clone https://github.com/CKBrennan/overtone-news-mcp
cd overtone-news-mcp
uv sync
uv run overtone-news-mcp
```
在开发过程中,将其指向非生产 API:
```bash
OVERTONE_NEWS_API_URL=http://localhost:8080 uv run overtone-news-mcp
```
---
## 许可证
MIT — 请参阅 [LICENSE](LICENSE)。
---
## 相关
- [overtone-news-skill](https://github.com/CKBrennan/overtone-news-skill) — Claude Code 技能版本(共享凭证)
- [overtone.ai](https://overtone.ai) — API 背后的智能
- [](https://lobehub.com/mcp/ckbrennan-overtone-news-mcp)
mcp-name: io.github.CKBrennan/overtone-news-mcp