whatshot-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@whatshot-mcpwhat's trending on Weibo right now?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🔥 WhatsHot API
统一聚合热榜、实时快讯、金价与 RSS 数据,并通过 🌐 API、⌨️ CLI 和 🤖 MCP 提供稳定、易于消费的访问方式。
✨ 项目简介
WhatsHot API 是一个基于 Python 与 FastAPI 构建的开源数据聚合服务,核心覆盖 热榜、实时快讯和金价。它将不同来源的数据抓取、解析并归一化为一致的 数据结构,让网站、机器人、信息面板、研究工具或个人自动化无需分别维护 大量适配逻辑。
项目当前包含 330+ 个自动发现的聚合路由,覆盖热门榜单、滚动快讯、 金价与 RSS/RSSHub 聚合内容。它既可以作为独立 API 服务运行,也可以通过 App Factory 作为核心库嵌入其他 FastAPI 项目。
flowchart TD
sources["🔥 热榜 · 📰 快讯 · 🪙 金价 · 📡 RSS / RSSHub"]
adapters["🧭 自动发现的路由适配器"]
pipeline["⚡ 异步请求<br/>🗄️ 双层缓存<br/>✨ 数据归一化"]
output["📦 JSON API · 📡 RSS 2.0"]
sources --> adapters --> pipeline --> outputRelated MCP server: Biztoc MCP Server
🌟 核心功能
功能 | 说明 |
🗂️ 多类型内容聚合 | 统一处理热榜、实时快讯、金价与 RSS/RSSHub 来源 |
🧭 路由自动发现 | 自动扫描分类目录,新增适配器无需手动登记路由 |
⚡ 异步请求 | 基于 |
🗄️ 只读缓存模式 | 可强制只读缓存,未命中时直接返回,不向上游发起请求 |
📡 JSON / RSS 输出 | 同一数据端点可输出 JSON,也可按需生成 RSS 2.0 |
⌨️ OpenCLI 风格 CLI | 通过 |
🦆 DuckDB 历史库 | 可选的本地分析数据库,支持历史查询、搜索和趋势分析 |
⏱️ 轻量 Scheduler | 只抓取用户显式订阅的站点和 board,负责全部历史写入 |
🤖 MCP v2 | 提供 stdio 和 Streamable HTTP,只暴露结构化只读工具 |
🧩 运行进程与端口
WhatsHot 有两个可以独立启动的进程,分别承担无状态 API 和有状态数据能力:
默认端口 | 启动命令 | 提供的能力 | 是否依赖另一个端口 |
|
| Core HTTP API、JSON、RSS、API 响应缓存 | 不依赖 |
|
| Scheduler、DuckDB、历史查询、MCP、内部 Control API | 不依赖 |
按用途选择需要启动的进程:
使用场景 | 启动 | 启动 |
只通过 HTTP 调用实时热榜、快讯或 RSS | ✅ | ❌ |
只使用 CLI 获取实时数据 | ❌ | ❌ |
使用定时采集或历史查询 | ❌ | ✅ |
使用 MCP 实时或历史工具 | ❌ | ✅ |
同时对外提供 API,并使用历史数据或 MCP | ✅ | ✅ |
Scheduler 和 MCP 的实时抓取直接复用项目内部 Fetch Service,不会通过
6688 转发,因此使用 6690 时不需要额外启动 Core API。反过来,只启动
6688 也不会创建 DuckDB 或启动 Scheduler。6690 是本地控制端口,默认
只绑定 127.0.0.1,不应直接暴露到公网。
🚀 基本使用
基本模式只运行聚合 API:不连接 Redis、不保存历史数据,也不启动
Scheduler、DuckDB 或 MCP。下面的请求使用 cache=false,每次都会实时访问
对应上游。
1. 环境要求
Python 3.12+
2. 直接启动 API
uvx --from . 会从当前源码创建并缓存隔离的工具环境,无需先执行
uv sync:
REDIS_HOST="" \
CACHE_TTL=0 \
HOTLIST_CACHE_TTL=0 \
NEWSFLASH_CACHE_TTL=0 \
USE_LOG_FILE=false \
uvx --from . whats-hot-api也可以把这些变量写入 .env,然后直接运行:
uvx --from . whats-hot-api服务默认监听 http://127.0.0.1:6688。这个入口只启动 Core API,不会创建
DuckDB,也不会定时抓取或保存历史数据;基本模式不需要启动 6690。
6688 可以通过 .env 中的 PORT 修改。
3. 调用 API
先查看全部来源和分类:
curl http://127.0.0.1:6688/all
curl http://127.0.0.1:6688/categories路由规则:
请求 | 作用 |
| 查看全部聚合路由及其分类 |
| 查看按内容类型聚合的路由目录 |
| 获取路由元信息、可用类型和参数,不请求上游 |
| 获取指定类型的榜单或快讯数据 |
例如:
curl http://127.0.0.1:6688/weibo
curl "http://127.0.0.1:6688/weibo/hot?limit=10&cache=false"没有多类型参数的来源统一使用 hot。基本模式常用的查询参数:
参数 | 示例 | 说明 |
|
| 限制返回条目数,范围为 1–200 |
|
| 输出 RSS 2.0 |
响应示例:
{
"code": 200,
"kind": "hotlist",
"name": "example",
"title": "示例榜单",
"type": "热门",
"total": 2,
"fromCache": false,
"updateTime": "2026-07-30T12:00:00Z",
"data": [
{
"id": "1",
"title": "示例内容",
"url": "https://example.com/item/1",
"mobileUrl": "https://example.com/item/1",
"hot": 10000,
"timestamp": 1785412800000
}
]
}其中,条目级 timestamp 统一为 Unix 毫秒时间戳;响应级 updateTime 为本次榜单数据的刷新时间。
🛠️ 进阶使用
进阶能力按需开启。API 进程和 daemon 使用不同的配置文件,修改后需要重启 对应进程:
能力 | 在哪里开启 | 需要启动 | 是否持久化 |
API 响应缓存 | 仓库根目录 | Core API( | 内存不持久化;Redis 可跨进程 |
DuckDB 历史数据 | 本地 | daemon( | 是 |
Scheduler | 本地 | daemon( | 负责写入 DuckDB |
CLI 实时读取 | 无需开启,直接执行 | 无 | 不写数据 |
CLI 历史查询 | 本地 | daemon( | 只读 |
MCP | 本地 | daemon( | 只读 |
1. 开启 API 响应缓存
响应缓存与历史数据是两套独立能力。响应缓存用于降低上游压力,不会形成可 查询的时间序列。
缓存配置写在仓库根目录的 .env,不是 config.toml。首次配置时:
cd /path/to/whats-hot-api
cp .env.example .env然后编辑 ./.env。只使用当前 API 进程的内存缓存时配置:
REDIS_HOST=
CACHE_TTL=1800
HOTLIST_CACHE_TTL=1800
NEWSFLASH_CACHE_TTL=300需要多个 API 实例共享缓存时,再配置 Redis:
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0保存 .env 后,启动或重启 Core API 才会生效:
uvx --from . whats-hot-api缓存服务监听 Core API 的 6688 端口,不需要启动 6690 daemon。也可以用
同名环境变量临时覆盖 .env 中的值。
Redis 不可用时会自动降级为最多 100 条的进程内 TTL 缓存。单次请求可以 显式控制缓存策略:
curl "http://127.0.0.1:6688/weibo/hot?cache=false" # 跳过旧缓存并刷新
curl "http://127.0.0.1:6688/weibo/hot?cache=only" # 只读缓存,未命中返回 4042. 定时保存历史数据
历史数据由轻量 Scheduler 定时抓取并写入 DuckDB。只有 Scheduler 能写库;
普通 API 请求、实时 CLI 和 MCP fetch_current 都不会形成历史记录。
daemon、Scheduler、历史 CLI 和 MCP 统一读取仓库根目录的本地配置:
./config.toml仓库提交 config.example.toml 作为配置模板;config.toml 已加入
.gitignore,可以安全保存本机路径和采集任务。首次使用时创建本地配置:
cp config.example.toml config.toml它们不会各自维护配置文件。在仓库根目录运行命令时会自动发现该文件,后续
命令不需要重复传 --config。配置中的相对路径以 config.toml 所在目录为
基准,不受启动命令所在位置影响。修改 config.toml 后需要重启 6690
daemon 才会生效。
先安装 daemon 所需的 DuckDB 和 MCP 可选依赖:
uv sync --extra daemon检查本地配置:
uv run whatshot config validate -f json新建的本地配置默认不采集任何站点。按需在 config.toml 中加入 job 后,
只有显式列出且 enabled=true 的 job 会被采集:
[storage]
enabled = true
[scheduler]
enabled = true
[[scheduler.jobs]]
id = "weibo-hot"
site = "weibo"
type = "hot"
interval = "10m"
limit = 50
enabled = true启动 daemon:
uv run whatshot daemondaemon 默认监听 127.0.0.1:6690,负责 Scheduler、DuckDB、历史查询
Control API 和 MCP Streamable HTTP。该命令以前台方式持续运行,不返回 shell
提示符是正常现象。daemon 自己完成 Scheduler 和 MCP 所需的实时抓取,不要求
6688 正在运行。请保持这个终端运行,并在另一个终端检查健康状态:
curl http://127.0.0.1:6690/internal/v1/health健康响应中的 history.enabled 和 scheduler.running 应为 true。
scheduler.jobs 为空表示 daemon 工作正常、但当前没有配置采集任务。多个
job 可以并发抓取,但所有 capture 都通过单 writer queue 串行写入。
调度管理:
uv run whatshot scheduler jobs
uv run whatshot scheduler status -f json
uv run whatshot scheduler trigger weibo-hot -f json
uv run whatshot scheduler trigger weibo-hot --no-wait -f json历史查询:
uv run whatshot history query \
--site weibo --board hot --since 2026-07-01T00:00:00Z -f json
uv run whatshot history search "人工智能" \
--site weibo --since 2026-07-01T00:00:00Z -f json
uv run whatshot history trend \
--site weibo --board hot --item-id "条目 ID" --bucket 1h -f json
uv run whatshot history stats -f json默认路径:
类型 | 路径 |
配置 |
|
DuckDB |
|
DuckDB WAL |
|
daemon 状态 |
|
这里的 ./ 都相对于仓库根目录的 config.toml。data/ 已加入
.gitignore,数据库、WAL 和运行状态只保存在本地,不会提交到 Git。
需要把数据持久化到宿主机时,挂载整个仓库 data/ 目录即可,例如容器内
使用:
[storage]
enabled = true
path = "data/whatshot.duckdb"daemon 运行期间,DuckDB 旁边可能出现 whatshot.duckdb.wal,这是正常的
预写日志;应将整个 data/ 挂载到同一个本地目录,并通过正常停止 daemon
完成 checkpoint。
storage.enabled=false 会完全关闭持久化,不创建或打开 DuckDB/WAL。实时
CLI、Core HTTP 和 MCP fetch_current 仍可使用;历史查询返回
HISTORY_DISABLED。关闭存储时不能配置启用状态的 Scheduler job。
下一迭代计划将最近至少 7 天保存在 DuckDB,每天 01:00 把更早的完整自然日
归档为 archive/YYYY/MM/YYYY-MM-DD.parquet,并以单一 data_dir 支持本地
目录或容器 volume 挂载。该归档能力尚未实现。
完整架构、Schema、事务和验收标准见 技术方案。
3. 使用 CLI
基础包已经包含 whatshot 入口。CLI 动态读取 Core 路由目录,不维护第二份
站点清单;使用 uvx --from . 可以直接从当前源码运行。
# 查看站点和参数,不请求上游
uvx --from . whatshot list -f json
uvx --from . whatshot describe bilibili -f yaml
# OpenCLI 风格实时读取,不写入历史库
uvx --from . whatshot weibo hot --limit 10
uvx --from . whatshot bilibili 1 --limit 10 -f json
uvx --from . whatshot acfun 1 --param range=WEEK -f table
# 来源名与 history/config 等内置命令重名时使用无歧义入口
uvx --from . whatshot fetch history hot -f json支持 table、plain、json、jsonl、yaml、markdown 和 csv。
TTY 默认输出 table,管道默认输出 YAML。需要完整响应元数据时使用:
uvx --from . whatshot weibo hot --envelope -f jsonCLI 的实时缓存策略:
uvx --from . whatshot weibo hot --cache prefer
uvx --from . whatshot weibo hot --cache refresh
uvx --from . whatshot weibo hot --cache only成功数据只写 stdout,错误只写 stderr。自动化可以通过
--error-format json 或 yaml 获取结构化错误。history 和 scheduler
子命令通过 Control API 调用正在运行的 daemon,CLI 本身不会打开或写入
DuckDB。
4. 使用 MCP
MCP 使用 Python SDK v2,只提供结构化读取工具:
list_sourcesget_source_schemafetch_currentquery_historysearch_historyget_trend_seriesget_storage_stats
不提供 SQL、历史写入、删除或调度触发工具。
MCP、daemon、Scheduler 和 CLI 复用仓库根目录同一份 config.toml,不要为
MCP 创建第二份业务配置。如果前面已经启动了保存历史数据的 daemon,可以
直接使用 MCP;Claude Code、Codex、Cursor 或 CC Switch 中填写的内容只是
MCP 连接地址。
只需要实时 MCP、不需要 DuckDB 时,在现有 config.toml 中关闭存储和
Scheduler,并确保没有任何 [[scheduler.jobs]]:
[storage]
enabled = false
[scheduler]
enabled = false
[mcp]
enabled = true安装 MCP 依赖,然后用同一份配置校验并启动 daemon:
uv sync --extra mcp
uv run whatshot config validate -f json
uv run whatshot daemon修改配置前如果已有 daemon 正在运行,请先正常停止它,再用新配置重启。 daemon 是前台常驻进程,因此启动后终端不返回提示符是正常现象。
stdio 模式是 daemon 的轻量代理,因此必须先启动 daemon。然后在另一个终端 运行:
uv run whatshot-mcp
# 等价:
uv run whatshot mcpStreamable HTTP 由 daemon 直接提供:
http://127.0.0.1:6690/mcpMCP 客户端应连接 6690/mcp,不要连接 Core API 的 6688。无论使用实时
工具还是历史工具,MCP 都只要求 daemon;不需要另外启动 Core API。
下面四种客户端均推荐连接这个 Streamable HTTP 地址。配置前先确认 daemon 健康:
curl http://127.0.0.1:6690/internal/v1/health如果 storage.enabled=false,实时工具仍可使用,但历史工具会返回
HISTORY_DISABLED。
Claude Code
添加为当前用户的全局 MCP:
claude mcp add \
--transport http \
--scope user \
whatshot \
http://127.0.0.1:6690/mcp
claude mcp list如果希望配置随项目共享,把 --scope user 改为 --scope project。对应的
项目级 .mcp.json 为:
{
"mcpServers": {
"whatshot": {
"type": "http",
"url": "http://127.0.0.1:6690/mcp"
}
}
}进入 Claude Code 后可用 /mcp 检查连接状态。配置格式参考
Claude Code MCP 文档。
Codex
命令行添加:
codex mcp add whatshot --url http://127.0.0.1:6690/mcp
codex mcp list也可以编辑用户级 ~/.codex/config.toml,或在可信项目中使用
.codex/config.toml:
[mcp_servers.whatshot]
url = "http://127.0.0.1:6690/mcp"
enabled = trueCodex CLI、Codex IDE 扩展和同一主机上的 Codex App 共用这份 MCP 配置。
重启客户端后用 /mcp 检查。配置格式参考
Codex MCP 文档。
Cursor
全局配置写入 ~/.cursor/mcp.json;只在当前项目使用时写入
<project>/.cursor/mcp.json:
{
"mcpServers": {
"whatshot": {
"url": "http://127.0.0.1:6690/mcp"
}
}
}重启 Cursor 后,在 Settings → Tools & MCP 中确认 whatshot 已连接。
Cursor Agent CLI 也会读取同一配置,可用以下命令验证:
cursor-agent mcp list
cursor-agent mcp list-tools whatshot配置格式参考 Cursor MCP 文档。
CC Switch
CC Switch 是 MCP 配置管理器,不是独立的 MCP 客户端:
打开顶部 MCP 面板,点击右上角 +;
Preset 选择 Custom;
Server ID 填写
whatshot;Transport Type 选择
http;URL 填写
http://127.0.0.1:6690/mcp;按需打开 Claude 和 Codex App Binding;
保存后重启对应 CLI 或客户端。
CC Switch 会分别同步到 ~/.claude.json 的 mcpServers 和
~/.codex/config.toml 的 [mcp_servers]。当前 CC Switch 不负责同步 Cursor,
因此 Cursor 仍需使用上一节的 mcp.json。操作说明参考
CC Switch MCP Server Management。
stdio 备选方式
四种工具也可以通过本地 stdio 代理连接,但 stdio 代理仍然只会转发到正在
运行的 daemon。把 /absolute/path/to/whats-hot-api 替换为本仓库绝对路径:
{
"mcpServers": {
"whatshot": {
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/whats-hot-api",
"whatshot-mcp"
]
}
}
}Claude Code、Cursor 和 CC Switch 可直接使用这段 JSON 中的 server 定义。 Codex 对应配置为:
[mcp_servers.whatshot]
command = "uv"
args = [
"run",
"--directory",
"/absolute/path/to/whats-hot-api",
"whatshot-mcp",
]默认只绑定 loopback。需要远程访问时,应由反向代理提供 TLS 和认证,不要 直接把 Control API 暴露到公网。
5. API 配置参考
复制 .env.example 后按需修改。未使用的可选能力可以保持为空。
变量 | 默认值 | 说明 |
|
| 服务端口 |
|
| 热榜缓存时长,单位为秒 |
|
| 快讯缓存时长,单位为秒 |
|
| 上游请求超时,单位为毫秒 |
|
| Redis 地址;不可用时自动降级 |
| 空 | RSSHub 实例地址,可填写多个 |
| 空 | 按域名关键词匹配的代理 JSON |
|
| 是否默认输出 RSS |
完整配置项与注释请查看 .env.example。
扩展开发
作为核心库嵌入
create_app() 支持注入自定义配置、Router、生命周期钩子和额外路由包:
from fastapi import APIRouter
from whats_hot_api.app import create_app
from whats_hot_api.config import Settings
class CustomSettings(Settings):
CUSTOM_KEY: str = ""
custom_router = APIRouter(prefix="/api")
app = create_app(
settings=CustomSettings(),
extra_routers=[custom_router],
extra_route_packages=["my_extension.routes"],
title="My WhatsHot Service",
)新增聚合路由
在 whats_hot_api/routes/<category>/ 下新增模块,并导出:
ROUTE_NAME:对外路由名称;ROUTE_META:静态元信息和可用参数;async handle_route(request, no_cache) -> RouterData:数据抓取与解析函数。
注册器会自动发现模块,并生成元信息与数据端点。新增分类时,还需要在 whats_hot_api/routes/_base.py 中登记分类并创建对应子包。
运行测试
uvx 用于普通用户的一次性运行;项目开发和测试需要复用项目环境,因此
这里使用 uv run:
uv run pytest需要访问真实上游的端到端测试默认不会运行;普通测试不会主动访问公网。
安全与使用说明
ALLOWED_DOMAIN使用英文逗号分隔允许的浏览器 Origin;核心服务不会启用携带凭据的 CORS。cache=only适合不允许触发上游请求的公开读取场景。上游接口、字段与可用性可能随时变化,请为生产使用设置合理的缓存、超时、限流与错误处理。
本项目仅对公开信息进行技术性聚合,不代表与任何数据来源存在隶属、授权或合作关系。使用者应自行遵守数据来源的服务条款、robots 规则及所在地区法律法规。
致谢与引用
WhatsHot API 的早期实现、聚合适配器与部分协议解析参考或迁移自以下开源项目。感谢这些项目的作者与贡献者。
以下列表只保留主要项目级引用,不展开到具体数据来源。
项目 | 在本项目中的引用 |
早期 API 设计与聚合路由的 Python/FastAPI 重写基础 | |
RSS/RSSHub 聚合来源、数据结构与适配逻辑参考 | |
RSS 路由生态与聚合能力 | |
公开接口参数、字段映射与适配实现参考 | |
部分令牌生成逻辑的代码来源 |
其他用于接口校验和交叉验证的项目不在此重复展开;涉及代码移植的版权与许可证声明见 Third-Party Notices。
Available Tools
7 toolsfetch_currentBRead-onlyIdempotent
Fetch a current board. This may access the upstream website but never persists a history capture.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | ||
| limit | No | ||
| params | No | ||
| path_type | No | hot |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| site | Yes | |
| type | Yes | |
| items | Yes | |
| title | Yes | |
| boardKey | Yes | |
| fromCache | Yes | |
| observedAt | Yes | |
| updateTime | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context beyond annotations: it explicitly states the tool may access the upstream website (external network dependency) and never persists a history capture (persistence behavior). This is valuable transparency about side effects and network behavior not covered by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. The first sentence states the action; the second adds the key behavioral caveat about upstream access and non-persistence. Every word earns its place, though it could name alternatives to siblings for a more complete picture.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description doesn't need to explain return values. However, 4 parameters with 0% schema description coverage means parameter semantics are entirely undocumented. The tool touches an external website with network implications, and while the constraints are clear (read-only, non-persisting), the parameter meanings and usage patterns are not explained. Adequate for a fetch operation but leaves parameter understanding to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description does not explain any parameters. The description contributes no parameter-level detail. However, there is a rich output schema present, which reduces the burden on parameter documentation somewhat. The schema itself provides names (site, limit, params, path_type) but no semantic meaning, leaving the agent to guess at what 'path_type' or 'params' control.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource: 'Fetch a current board.' It distinguishes from sibling tools by emphasizing 'current' (versus history-oriented tools like query_history, search_history, get_trend_series). However, 'board' is a domain-specific term not otherwise defined, and it doesn't explicitly name alternatives. The purpose is clear but somewhat generic without deeper context about what a 'board' represents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (fetching current data rather than history) by contrasting with the upstream website, which helps distinguish from the history-based siblings. It notes 'may access the upstream website but never persists a history capture,' which clarifies it's a live-fetch operation. However, it doesn't provide explicit when-to-use vs when-not-to-use guidance or name specific alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_source_schemaBRead-onlyIdempotent
Describe one source, its boards, and accepted parameters.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the safe read-only profile is established. The description adds that it reveals boards and accepted parameters but doesn't disclose whether the site must be registered/valid first or what happens for an unknown site identifier.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence that front-loads the core function. It's efficient with no wasted words, though it could arguably add a brief note about the site parameter for no length penalty.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, which relieves the description of explaining return values. With one required parameter, annotations, and an output schema, the description is borderline adequate. The main gap is the undocumented 'site' parameter meaning, which leaves the description slightly incomplete for a tool that exists to explain schemas.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0% and 1 required parameter, the description provides zero guidance on what the 'site' parameter should contain (e.g., an ID, a name, a label). The description mentions 'a source' but doesn't clarify how 'site' maps to a source or where to obtain valid site values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb (Describe) with a clear resource scope (one source, its boards, and accepted parameters). It distinguishes itself somewhat from sibling list_sources by focusing on a single source's detailed schema rather than enumerating sources, though it doesn't explicitly name the sibling or contrast with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys this is for exploring a specific source's structure (boards and parameters), which implies it should be used when you need details about one source rather than listing all sources. However, it doesn't explicitly state when to use this vs list_sources, or mention the required site parameter context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_storage_statsARead-onlyIdempotent
Return local history storage counts and freshness.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| enabled | No | |
| captures | No | |
| goldRows | No | |
| hotlistRows | No | |
| newsflashItems | No | |
| latestObservedAt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered by annotations. The description adds the 'local history storage' scope context, which is useful. However, it doesn't clarify what 'freshness' measures or how it relates to source data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, efficient sentence with zero wasted words. Perfectly sized for a zero-parameter read-only stats tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Has an output schema, so return values are documented elsewhere. Zero parameters mean no param ambiguity. The tool is simple enough that a one-sentence description with rich annotations (read-only, idempotent, non-destructive) is nearly complete. Slight deduction for not hinting at what 'freshness' means or when it's useful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and with no params, the baseline is 4. The description appropriately explains what is returned (storage counts and freshness) without any parameter burden to carry. Nothing is missing here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Return local history storage counts and freshness'), clearly indicating what data is retrieved. It doesn't explicitly differentiate itself from siblings like list_sources or get_source_schema, but the subject matter (storage stats) is distinct enough to be understood.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. No mention of what 'storage counts' refers to or when checking storage vs querying history would be appropriate. Sibling tools like list_sources and query_history exist, but no comparison is offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trend_seriesCRead-onlyIdempotent
Get rank and hot-value trends for one historical item.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | ||
| since | No | ||
| until | No | ||
| bucket | No | 1h | |
| item_id | Yes | ||
| board_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| site | Yes | |
| bucket | Yes | |
| itemId | Yes | |
| series | Yes | |
| boardKey | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds minimal behavioral context—'rank and hot-value trends' hints at the return shape but not at time-bucket granularity or how since/until defaults behave. There's no contradiction, but the description doesn't substantially enrich beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that front-loads the core purpose. It's appropriately concise with no filler. However, it's so terse that it sacrifices informative content—a slightly longer description that covers time-range parameters would be more valuable without risking verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 6 parameters with 0% schema coverage, but an output schema exists, which somewhat offsets the need to explain return values. For a trend-series tool with time-range and bucketing parameters, the description omits critical information about how since/until/bucket shape the data. The single-sentence coverage of 'rank and hot-value trends for one historical item' is plausible but leaves the time-domain semantics unexplained, making this marginally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the full burden of parameter meaning. It mentions 'rank and hot-value trends' and a single historical item (implying site, board_key, item_id), but it fails to explain the time-related parameters (site, since, until, bucket). The 'bucket' enum ('10m','1h','6h','1d') is structural but its effect on the returned series isn't described. The description only loosely covers the three required params and none of the optional ones.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Get rank and hot-value trends') for a single historical item. It's reasonably clear, but 'for one historical item' is vague—it doesn't clarify whether 'item' refers to a product, a search term, or another entity. The description doesn't explicitly differentiate from siblings like query_history or search_history, though 'trends for one item' hints at a narrow single-item scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives. Siblings include query_history and search_history, which likely relate to the same data domain, yet no distinguishing phrase or exclusion is given. The description implies a use case (viewing historical trend series) but provides no context on prerequisites, such as needing a board_key and item_id obtained from another tool first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sourcesARead-onlyIdempotent
List all discoverable WhatsHot sources without network access.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| sources | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds 'without network access' as behavioral context beyond the annotations, which is genuinely useful. But the annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description contributes the offline/local nature of the operation but little else.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that states the purpose and the key behavioral constraint (no network access). Zero wasted words; every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple zero-parameter tool that lists sources. Given the rich annotations (read-only, idempotent, non-destructive), an output schema exists for return values, and there are no parameters to document, the description covers what's needed. It could perhaps mention what 'WhatsHot sources' consists of or how many there might be, but the description is adequate for a simple list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters, the schema provides no parameter information, so the baseline of 4 applies. The description correctly indicates there's nothing to configure - it's a simple listing operation. No parameter documentation burden exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description has a clear verb+resource ('List all discoverable WhatsHot sources'). It distinguishes from siblings by explicitly noting 'without network access', which separates it from tools like fetch_current or get_trend_series that likely make network requests. It doesn't strongly differentiate from get_source_schema but the scope is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without network access' implies this is a safe, offline listing operation, which provides some usage context. However, there's no explicit statement of when to use this vs. alternatives like get_source_schema, nor any exclusions or prerequisites mentioned. It's implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_historyCRead-onlyIdempotent
Query persisted historical items with cursor pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| site | No | ||
| limit | No | ||
| since | No | ||
| until | No | ||
| cursor | No | ||
| board_key | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| truncated | Yes | |
| nextCursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe read operation. The description adds 'persisted historical items' and 'cursor pagination' context, which is useful. However, it does not describe the return format, how cursors are obtained (e.g., from previous responses), or the meaning of the output. With annotations covering the safety profile, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single-sentence description is concise and avoids verbose filler. However, it is brief to the point of under-specification rather than tight-but-complete, warranting a minor deduction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters with 0% schema description coverage, the tool needs substantial documentation to be usable. The description fails to explain parameter semantics, filtering behavior, cursor usage mechanics, or how this differs from sibling search_history. Despite having an output schema, the 0% parameter coverage and sibling ambiguity leave significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries full burden for parameter meaning, but it adds nothing about the 7 parameters. The mention of 'kind' and 'cursor' exists in the schema but the description never explains their purpose, valid values, or interactions. The since/until date filters and board_key are entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Query persisted historical items with cursor pagination.' This gives a clear verb+resource (query historical items) and mentions pagination via cursor. However, it does not specify what 'historical items' are or how it differs from sibling tool search_history, which sounds like it does something similar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus search_history, fetch_current, or other siblings. The presence of sibling search_history strongly suggests a similar purpose that should be disambiguated, but no distinction is provided. Context around kind/site/board_key filtering is entirely absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_historyBRead-onlyIdempotent
Search persisted titles, descriptions, and newsflash content. Returns attributable evidence, not free-form summaries.
| Name | Required | Description | Default |
|---|---|---|---|
| site | No | ||
| limit | No | ||
| since | No | ||
| until | No | ||
| cursor | No | ||
| keyword | Yes | ||
| board_key | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| truncated | Yes | |
| nextCursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safe read nature is established. The description adds value by noting the output contract — 'attributable evidence, not free-form summaries' — which tells the agent what kind of result to expect and that it should not treat results as synthesized summaries. This is meaningful behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short line, front-loaded with the core action and ends with a valuable contrastive note. Every word earns its place. It's appropriately concise for a search tool, though it could be slightly more informative without becoming bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema and 7 parameters with rich structural metadata (date-time formats, cursor for pagination, nullable fields). The description covers the search-scope and output-nature aspects but remains thin given the tool's complexity — pagination semantics (cursor), date filtering (since/until), and site/board filtering are entirely unexplained. The output schema helps but the description still under-serves the filtering and pagination dimensions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for explaining the 7 parameters. It fails to do so — none of keyword, site, limit, since, until, cursor, or board_key are explained in the description. The only hint is that the tool searches across 'titles, descriptions, and newsflash content' and that keyword is required. With 7 parameters at 0% coverage, this is a notable gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the verb+resource ('Search persisted titles, descriptions, and newsflash content') and adds the distinctive 'attributable evidence, not free-form summaries' qualifier, which differentiates search_history from query_history. However, it's relatively terse and doesn't fully clarify how this differs from the closely named sibling 'query_history' — the differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus its siblings. Given siblings like 'query_history' and 'fetch_current', there is no statement about what scenarios call for search_history specifically, nor exclusions. The agent receives no help choosing among the closely related search/query tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.0- First observed
fetch_current - First observed
get_source_schema - First observed
get_storage_stats - First observed
get_trend_series - First observed
list_sources - First observed
query_history - First observed
search_history
TDQS
Scored across 7 tools
Each tool targets a distinct aspect: source schema, current fetch, history query, source listing, history search, trend series, and storage stats. The two history-related tools (query_history and search_history) are clearly separated by their operation styles (pagination vs. text search with evidence).
All tool names follow a consistent verb_noun pattern in snake_case (e.g., get_source_schema, fetch_current, query_history, list_sources). The verbs are semantically appropriate for each action, and there are no camelCase or mixed conventions.
Seven tools is well within the ideal range for a focused server. Each tool addresses a core need in the domain without redundancy or bloat, making the set easy to navigate.
The server covers a comprehensive read-only workflow: discover sources, understand schemas, fetch current data, query/search history, retrieve trends, and monitor storage. The only minor gap is the absence of a tool to explicitly persist new history captures, but this may be handled externally or by design.
Maintenance
Related MCP Connectors
MCP server aggregating hot-search boards from 8 Chinese platforms (Weibo, Zhihu, Bilibili, Douyin).
One MCP server for 180+ live web-data APIs returning clean JSON from sites that block scrapers.
MCP server for the Seline Analytics API
Hosted MCP server for Xweather weather data: conditions, forecasts, alerts, and more.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA modern multi-platform hot news aggregation server based on FastMCP that supports real-time hot topics data collection from 13+ major platforms including Zhihu, Weibo, Baidu, and Bilibili.3MIT
- AlicenseAqualityDmaintenanceAn MCP server that provides access to the Biztoc API for retrieving latest business news, trending topic clusters, and source-specific stories. It enables users to search the news index from the last 14 days and track real-time news wires.5MIT
- AlicenseNot gradedqualityDmaintenanceA Python-based MCP server that aggregates real-time trending topics and news from over 30 sources including social media, technology, and finance platforms. It enables AI applications to retrieve the latest hot searches and news from major services like Weibo, Baidu, and IT Home through a unified interface.31MIT
- FlicenseBqualityFmaintenanceA read-only MCP server that provides access to financial news, Wall Street Bets sentiment analysis, and detailed options data from sellthenews.org. It enables LLMs to retrieve real-time news feeds, search historical data, and analyze options chains or Greek exposure for specific tickers.5-