WhatsHot
This server is a read-only, structured API and data aggregation service that provides access to current and historical trending data from over 330 sources, including hotlists, real-time news flashes, gold prices, and RSS feeds. It supports multiple interfaces: RESTful HTTP API, CLI, and MCP.
List all available sources (
list_sources) without network requests.Get source details (
get_source_schema) describing boards and parameters.Fetch current data (
fetch_current): real-time board from a source; optionally limit results, specify board type. Not persisted.Query historical data (
query_history): cursor-paginated retrieval of persisted items filtered by source, board, kind, and time.Search historical content (
search_history): full-text search across titles, descriptions, and content, returning attributable evidence.Get trend series (
get_trend_series): time-series rank and hot-value trends for a specific item with bucket options (10m, 1h, 6h, 1d).Storage stats (
get_storage_stats): counts and freshness of DuckDB history storage.
All tools are read-only, non-destructive, and idempotent. Historical features require the daemon (port 6690) with persistence enabled; otherwise they return HISTORY_DISABLED. The service also offers caching (in-memory or Redis), flexible output formats (JSON, RSS, table, etc.), and an extensible architecture that can be embedded in other projects.
Fetches trending hot lists from Bilibili via the WhatsHot API, CLI, and MCP tools.
Serves as the local persistent history database for the WhatsHot service, storing captured data for historical queries, search, and trend analysis.
The underlying Python web framework powering the WhatsHot API service.
Provides optional shared response caching across multiple API instances.
Aggregates RSS and RSSHub feeds and can output data as RSS 2.0 feeds from the same endpoints.
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., "@WhatsHotwhat are the top trending topics 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·什么火了
WhatsHot API 是热榜、实时快讯、金价和 RSS/RSSHub 来源的开源聚合核心。它提供
330+ 个自动发现路由、JSON/RSS 输出、双层缓存、CLI,以及供独立
whatshot-mcp 使用的 Backend Contract。
能力边界
能力 | 说明 |
聚合路由 | 热榜、快讯、金价与 RSS/RSSHub 来源 |
Core HTTP API | 站点元信息、榜单数据、JSON 和 RSS 2.0 |
Fetch Service | CLI、Scheduler、HTTP API 和 Backend Contract 共用的抓取路径 |
缓存 | Redis + 进程内 TTL,Redis 不可用时自动降级 |
Scheduler | 仅采集显式配置的站点和 board |
DuckDB 历史库 | 本地历史、关键词搜索、趋势和覆盖信息 |
Backend Contract v1 | 独立 MCP 连接的版本化只读 HTTP 契约 |
Core 不包含 MCP Server,也不直接连接 PostgreSQL。
Related MCP server: TrendRadar
运行进程
端口 | 命令 | 职责 |
|
| Core API、JSON、RSS、响应缓存 |
|
| Scheduler、DuckDB、 |
两个进程互不依赖。只消费聚合 API 时启动 6688;使用定时采集、历史数据或
独立 MCP 的本地 Backend 时启动 6690。
安装与启动
要求 Python 3.12+ 和 uv。
启动 Core API:
uv sync
uv run python -m whats_hot_api启动 daemon:
cp config.example.toml config.toml
uv sync --extra daemon
uv run whatshot config validate -f json
uv run whatshot daemon健康检查:
curl http://127.0.0.1:6688/all
curl http://127.0.0.1:6690/internal/v1/health
curl http://127.0.0.1:6690/api/v1/capabilitiesCore HTTP API
每个路由提供元信息端点和数据端点:
GET /weibo
GET /weibo/hot
GET /bilibili/1
GET /acfun/1?range=WEEK
GET /all
GET /categories通用查询参数:
?rss=true 输出 RSS 2.0
?cache=false 跳过旧缓存并刷新
?cache=only 只读缓存,未命中返回 404
?limit=10 限制条目数响应示例:
{
"code": 200,
"name": "weibo",
"title": "微博",
"type": "热搜榜",
"total": 50,
"updateTime": "2026-08-16T12:00:00Z",
"fromCache": true,
"data": [
{
"id": "1",
"title": "热搜标题",
"hot": 999999,
"url": "https://example.com"
}
]
}金价路由使用原生报价口径;币种和单位属于每条报价,Core 不做汇率或重量换算:
GET /lukfook/mainland
GET /lukfook/hong-kong
GET /chow-taifook-hk/hot
GET /beijing-rtj/hot{
"id": "gold-jewellery",
"title": "999.9饰金",
"metal": "gold",
"quotes": [
{
"quoteType": "retail_sell",
"label": "销售价",
"price": 1319.5,
"currency": "HKD",
"unit": "gram",
"sourceQuoteTime": "2026-08-10T18:28:12+08:00",
"sourceQuoteTimeTrusted": true
}
]
}metal 可区分 gold / silver / platinum / palladium。sellPrice /
recyclePrice 暂时保留给旧客户端,但只会映射人民币/克报价。历史金价
序列按 board + item + quoteType + currency + unit 分开保存。
缓存配置
Core API 从 .env 读取缓存和上游请求配置:
变量 | 默认值 | 说明 |
|
| Core API 端口 |
|
| 热榜缓存秒数 |
|
| 快讯缓存秒数 |
|
| 上游超时毫秒数 |
|
| 留空时只用内存缓存 |
| 空 | RSSHub 实例列表 |
| 空 | 按域名关键词匹配的代理 JSON |
修改 .env 后重启 6688。
daemon 配置
daemon 从本地 config.toml 读取设置。该文件由 config.example.toml 复制,已被
Git 忽略。
[daemon]
bind = "127.0.0.1"
port = 6690
state_path = "data/state"
[storage]
enabled = true
path = "data/whatshot.duckdb"
retention_days = 180
query_timeout_seconds = 5
cursor_ttl_seconds = 86400
checkpoint_on_shutdown = true
[scheduler]
enabled = true
max_fetch_concurrency = 4
writer_queue_size = 32
[backend_api]
max_result_items = 200
default_history_days = 7
max_history_days = 365默认不采集任何来源。增加采集任务:
[[scheduler.jobs]]
id = "weibo-hot"
site = "weibo"
type = "hot"
interval = "10m"
limit = 50
enabled = true
run_on_start = true6690 是 DuckDB 的唯一 owner。不得让其他进程直接打开同一数据库写入,也不要把
内部 Control API 直接暴露到公网。
Backend Contract v1
daemon 为独立 whatshot-mcp 提供:
GET /api/v1/capabilities
GET /api/v1/sources
GET /api/v1/sources/{site}
POST /api/v1/current
POST /api/v1/current/batch
GET /api/v1/history
GET /api/v1/history/search
GET /api/v1/history/trends
GET /api/v1/coveragestorage.enabled=false 时只声明 core-read;启用历史存储后同时声明
history-read。Backend Contract 不提供 Scheduler trigger、数据库路径或写操作。
独立 MCP 的默认配置:
[backend]
url = "http://127.0.0.1:6690/api/v1"AI 客户端连接 MCP 服务的 http://127.0.0.1:6691/mcp,不能把 6690 当作 MCP
endpoint。
CLI
实时读取不需要启动任何服务:
uv run whatshot list -f json
uv run whatshot weibo hot -f json
uv run whatshot weibo hot --cache only历史和 Scheduler 子命令通过正在运行的 daemon Control API 调用:
uv run whatshot history query --site weibo --board hot
uv run whatshot history search 关键词 --site weibo
uv run whatshot scheduler status -f json
uv run whatshot scheduler trigger weibo-hot -f jsonCLI 不直接打开 DuckDB。
作为核心库嵌入
扩展项目通过 App Factory 注入配置、路由和生命周期钩子:
from whats_hot_api.app import create_app
from whats_hot_api.config import Settings
class ExtSettings(Settings):
MY_CUSTOM_KEY: str = ""
app = create_app(
settings=ExtSettings(),
extra_routers=[my_router],
extra_startup=[my_startup],
extra_shutdown=[my_shutdown],
extra_route_packages=["my_ext.routes"],
title="My Extended API",
)新增路由
在 whats_hot_api/routes/<category>/ 下增加模块,并导出:
ROUTE_NAME = "example"
ROUTE_META = {
"name": "example",
"title": "Example",
"description": "Example source",
"link": "https://example.com",
"params": None,
}
async def handle_route(request, no_cache):
...分类子包的 __init__.py 导出 CATEGORY 和 CATEGORY_LABEL。路由由 registry
递归发现,不维护手工路由表。
测试
uv run pytest
uv run pytest tests/test_backend_contract_api.py -v
uv run pytest tests/test_daemon.py -v变更 Backend Contract 时,还必须使用相邻 whatshot-mcp/contracts 制品运行
Contract 测试。
安全边界
Core 数据路由只读。
daemon 默认只绑定 loopback。
Backend Contract 不接受任意 URL、SQL、文件路径或 Token 参数。
DuckDB 单写者由 owner lock 保证。
Redis 不可用时自动降级,不影响基本 API。
License
MIT。第三方来源和授权说明见 THIRD_PARTY_NOTICES.md。
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 concern: source discovery, schema introspection, live fetching, history querying, searching, trend analysis, and storage stats. The main potential confusion is between query_history and search_history, but the descriptions make clear that querying returns persisted items with pagination while searching targets content and returns attributable evidence, which differentiates them sufficiently.
Names mostly follow a verb_noun pattern with clear action prefixes (list_, get_, fetch_, query_, search_, get_). There's a minor deviation with get_source_schema vs fetch_current where 'fetch' and 'get' use different verbs for similar acquisition actions, but this is arguably intentional given that fetch_current accesses the network while get_source_schema is local.
Seven tools is within the ideal 3-15 range and each tool appears to earn its place by covering a distinct dimension of the domain: discovery, introspection, live fetch, history retrieval, search, analytics, and storage management. No redundant or filler tools.
The surface covers the full lifecycle: source discovery, schema understanding, live fetching, persistence querying, search, trend analytics, and storage management. Minor gaps exist—such as the absence of explicit history write/capture control (though fetch_current implies an upstream capture mechanism) and possibly pagination/sampling controls for trend series—but no obvious dead ends that would cause agent failures.
Maintenance
Related MCP Connectors
MCP server aggregating hot-search boards from 8 Chinese platforms (Weibo, Zhihu, Bilibili, Douyin).
All HasData scraping tools in one MCP server: Google, TikTok, Instagram, maps, e-commerce and more.
One MCP server for 180+ live web-data APIs returning clean JSON from sites that block scrapers.
Read-only MCP server for wafergraph.com's semiconductor & AI supply-chain data: 30 tools, no auth.
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 aggregator for real-time hot topics and news from major social and financial platforms like Zhihu, Bilibili, and Wall Street News. It features an MCP server that allows AI models to fetch and analyze trending information for automated insights.17GPL 3.0
- 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
- FlicenseAqualityDmaintenanceMCP server for fetching daily hot lists from 30+ sources with built-in caching and batch requests.55 npm1-