Skip to main content
Glama

weread-mcp

把腾讯官方的 WeChatReading Skills 转成一个 基于 URL(SSE)的 MCP Server,用 MCP Python SDK v2 实现。

官方 skills 是给「能读 Markdown + 会自己发 HTTP 请求」的 Agent 用的;转成 MCP Server 之后, 任何 MCP 客户端(Claude Desktop / Claude Code / Cherry Studio / 自建 Agent…)都可以直接连一个 URL 使用, 接口参数由服务端校验,字段口径写进了工具说明里。

MCP Client ──SSE──▶ weread-mcp ──HTTPS──▶ https://i.weread.qq.com/api/agent/gateway

能力一览

19 个工具,覆盖官方全部 7 类能力:

工具

网关接口

说明

search_books

/store/search

书城搜索,scope 区分电子书/网文/听书/作者/全文/书单/公众号/文章

get_book_info

/book/info

书籍详情

get_book_chapters

/book/chapterinfo

章节目录(拿 chapterUid

get_reading_progress

/book/getprogress

阅读进度与累计时长

get_shelf

/shelf/sync

书架(电子书 + 专辑/有声书 + 文章收藏)

list_notebooks

/user/notebooks

笔记本概览,游标分页

get_book_highlights

/book/bookmarklist

我的划线内容

get_my_reviews

/review/list/mine

我的想法与点评

get_chapter_underlines

/book/underlines

章节划线热度(无文本)

get_best_highlights

/book/bestbookmarks

热门划线(含原文与人数)

get_highlight_reviews

/book/readreviews

某条划线下面的想法

get_review_detail

/review/single

单条想法详情

get_read_stats

/readdata/detail

阅读时长/天数/排行/偏好

list_book_reviews

/review/list

书籍公开点评

recommend_books

/book/recommend

为你推荐

similar_books

/book/similar

相似书推荐

get_reading_overview

组合调用

书架 + 最近 5 本进度 + 笔记概览(对应官方 profile.md 工作流)

list_gateway_apis

/_list

网关接口清单

call_gateway

任意

兜底:直调某个还没有专用工具的接口

另外把官方能力文档原样作为 MCP 资源 暴露,模型需要核对字段口径时可以直接读:

weread://skills            # 总纲(SKILL.md)
weread://skills/search     weread://skills/book      weread://skills/shelf
weread://skills/notes      weread://skills/readdata  weread://skills/review
weread://skills/discover   weread://skills/profile

不只是接口透传

官方文档里那些「一读就懂、一写就错」的口径,这里都固化进了服务端:

  • 书架数量books.length + albums.length + (mp 非空 ? 1 : 0) 算好放在 _computed 里, 专辑/有声书不会被漏掉;公开/私密数量同样遍历实际条目计算。

  • 笔记数量reviewCount + noteCount + bookmarkCount 算好并降序排序, 不会把 noteCount(划线条数)当成总笔记数。

  • 阅读时长单位是秒,服务端直接给出「X小时Y分钟」文案,并区分「自然日均」与「阅读日均」。

  • 阅读进度 progress 是 0-100 整数,服务端给出 progressText(带 %)和 finished 判定。

  • 参数平铺:业务参数一律平铺到 body 顶层,绝不会包进 params(官方文档里分页失效的头号原因)。

  • skill_version 每次自动上报;网关返回 upgrade_info 时会告警并原样透传给模型。

Related MCP server: wxauto-mcp-sse

与官方 weread-skills 怎么选

两者调用的是同一个微信读书网关,数据完全一样。区别在于谁来发请求、谁来保证口径正确: 官方 skills 是给 Agent 读的说明书,由模型自己读文档、拼 curl、解析 JSON; 本项目把这些工作写进了代码,模型只需要选工具、填参数。

官方 weread-skills

weread-mcp(本项目)

形态

9 份 Markdown 文档

Python MCP Server

一次提问的流程

读 SKILL.md → 读子文档 → shell 里拼 curl → 自己解析、计数

调一个工具,参数由代码校验,计数由代码算好

模型往返

通常 3~4 轮

通常 1 轮

运行前提

客户端能执行 shell,且网络能访问 i.weread.qq.com

任意 MCP 客户端,不需要 shell

后台常驻

stdio 模式下 1 个 Python 进程(空闲约几十 MB 内存,不主动发请求)

磁盘占用

约 70 KB

源码约 200 KB + 依赖约 45 MB

上下文开销

平时几乎为 0;用到时读文档,每次约 3~8 千 token

19 个工具定义约 1 万 token 量级;客户端一次性加载时每次对话都占,支持按需加载的客户端则小得多

口径正确性

依赖模型遵守文档里的「必须 / 禁止」规则

参数平铺、版本上报、书架与笔记计数、时长换算都在代码里强制执行

API Key

放在 agent 可执行命令的 shell 环境变量中

只存在于服务端进程,模型接触不到

跨客户端 / 共享

需要支持 Agent Skills 的客户端

任意 MCP 客户端;SSE / Streamable HTTP 模式下可通过 URL 多人共用

维护

腾讯官方维护,网关通过 upgrade_info 提示升级

社区维护,官方接口变化需要跟进更新

一个实测例子:官方 book.md/book/getprogressrecordReadingTime 描述为累计阅读时长, 但真实回包里该字段通常为 0,累计时长实际在 readingTime。严格照文档执行的模型会回答「读了 0 分钟」; 本项目在代码里做了修正(见 tools.py 中的 _reading_seconds)。

什么时候选哪个

  • 选 weread-mcp:经常使用;在意回答的准确性和响应速度;想在 Claude Desktop、Cursor、Cherry Studio 等多个客户端里用; 或者需要部署成一个 URL 给多人共用。

  • 选官方 skills:偶尔用一下;不想常驻进程、不想装 Python 依赖;已经在用 Claude Code 等能执行 shell 的 Agent; 希望由官方负责维护与升级。

  • 两者可以同时安装,不会冲突,但模型可能不确定该用哪个,建议只启用其中一个。 不常用时也可以在客户端里临时关闭本 MCP,省下固定的上下文开销。

快速开始

1. 获取 API Key

前往 https://weread.qq.com/r/weread-skills 获取 API Key(格式 wrk-xxxxxxxx)。 Key 绑定用户身份(vid),所有需要身份的接口会自动注入,无需传 vid。

2. 安装依赖

uv sync
cp .env.example .env    # 把 WEREAD_API_KEY 填进去

3. 启动(SSE)

uv run weread-mcp                          # 默认 127.0.0.1:8000
uv run weread-mcp --host 0.0.0.0 --port 8000

启动后:

MCP endpoint : http://127.0.0.1:8000/sse
health check : http://127.0.0.1:8000/healthz

也可以用 uv run python -m weread_mcpuv run main.py

4. 在 MCP 客户端里配置

支持 URL 的客户端(Claude Desktop / Claude Code 等):

{
  "mcpServers": {
    "weread": {
      "type": "sse",
      "url": "http://127.0.0.1:8000/sse"
    }
  }
}

Claude Code 一行搞定:

claude mcp add --transport sse weread http://127.0.0.1:8000/sse

只支持 stdio 的老客户端:

{
  "mcpServers": {
    "weread": {
      "command": "uv",
      "args": ["--directory", "/path/to/weread-mcp", "run", "weread-mcp", "--transport", "stdio"],
      "env": { "WEREAD_API_KEY": "wrk-xxxxxxxx" }
    }
  }
}

传输方式

传输

启动参数

端点

说明

SSE

--transport sse(默认)

GET /sse + POST /messages/

题目要求的 URL 方式,兼容性最好

Streamable HTTP

--transport streamable-http

/mcp

MCP 新版标准传输,可配 --json-response / --stateless

stdio

--transport stdio

本地子进程方式

SSE 是 MCP 规范中的 legacy 传输,新客户端建议用 Streamable HTTP;两者本服务都支持,切换只改一个参数。

监听 127.0.0.1 时 SDK 会自动开启 DNS rebinding 防护;对外暴露(--host 0.0.0.0)时请自行放在 反向代理/鉴权网关后面,并用 /healthz 做健康检查。

部署为 HTTPS 远程服务(Notion 等云端 Agent)

Notion 自定义 Agent 这类云端客户端,是从它们自己的服务器来连你的 MCP,所以需要一个公网可访问的 HTTPS 地址。 部署后的安全模型:

Notion ──HTTPS + 访问令牌──▶ 反向代理 / 隧道 ──▶ weread-mcp ──WEREAD_API_KEY──▶ 微信读书网关
  • 微信读书 API Key 只存在于服务端(环境变量或云平台 Secrets),不会发给客户端,也不会出现在任何工具的返回结果里。

  • 客户端拿到的是另一枚「访问令牌」,与微信读书 Key 完全无关。万一泄露,换一枚即可,微信读书 Key 不受影响。

  • 没有访问令牌的请求一律返回 401/healthz 保持公开,方便做健康检查。

1. 生成访问令牌

openssl rand -hex 32

2. 启动服务(推荐 Streamable HTTP)

export WEREAD_MCP_AUTH_TOKEN=<上一步生成的令牌>
export WEREAD_ALLOW_CLIENT_API_KEY=false        # 单人使用时关闭,只用服务端的 Key
uv run weread-mcp --transport streamable-http --host 127.0.0.1 --port 8000 \
  --allowed-host weread.example.com

--allowed-host 填对外的域名。服务监听 127.0.0.1 时,SDK 默认只接受 Host: localhost, 经反向代理或隧道转发来的请求带的是公网域名,不加这一项会被 421 Invalid Host header 拒绝。

3. 提供 HTTPS(三选一)

方式

适合

要点

Cloudflare Tunnel

不想买服务器,电脑常开

需要一个托管在 Cloudflare 的域名,免费

VPS + Caddy

长期稳定运行

Caddy 自动申请和续期证书

云平台(Render / Railway / Fly.io 等)

免运维

平台自带 HTTPS,Key 和令牌放进平台的 Secrets

Cloudflare Tunnel

brew install cloudflared
cloudflared tunnel login
cloudflared tunnel create weread
cloudflared tunnel route dns weread weread.example.com

~/.cloudflared/config.yml

tunnel: weread
credentials-file: /Users/<你>/.cloudflared/<TUNNEL-UUID>.json
ingress:
  - hostname: weread.example.com
    service: http://127.0.0.1:8000
  - service: http_status:404
cloudflared tunnel run weread

只想临时试一下,可以用 cloudflared tunnel --url http://127.0.0.1:8000,它会分配一个随机的 *.trycloudflare.com 地址。此时 --allowed-host 要填这个随机域名,而且每次重启都会变。

VPS + Caddy/etc/caddy/Caddyfile

weread.example.com {
    reverse_proxy 127.0.0.1:8000
}

云平台:启动命令用 uv run weread-mcp --transport streamable-http --host 0.0.0.0 --port $PORT, 在平台的环境变量 / Secrets 里设置 WEREAD_API_KEYWEREAD_MCP_AUTH_TOKEN。 监听 0.0.0.0 时 SDK 不做 Host 校验,可以不配 --allowed-host

4. 验证

curl https://weread.example.com/healthz                  # 200,且 "auth_required": true
curl -X POST https://weread.example.com/mcp -i | head -1  # 不带令牌:401

5. 在 Notion 中添加

  1. 需要 Notion Business / Enterprise 套餐,且工作区管理员已开启「自定义 MCP 服务器」

  2. 打开自定义 Agent → Settings → Tools & Access → Add connection → Custom MCP server

  3. URL 填 https://weread.example.com/mcp

  4. 认证选择请求头方式:Authorization: Bearer <访问令牌>(或 X-API-Key: <访问令牌>

其他支持「URL + 自定义请求头」的云端客户端配置方法相同。 Claude 网页版的自定义连接器目前只支持 OAuth,不能填写请求头,所以不适用这种令牌方式; 在 Claude 里建议继续用本地 stdio。

安全清单

  • 访问令牌只放在请求头里,不要拼进 URL,否则会被写进各级访问日志

  • WEREAD_MCP_AUTH_TOKENWEREAD_API_KEY 都不要提交进 git(.env 已在 .gitignore 中)

  • 需要吊销访问时,改掉 WEREAD_MCP_AUTH_TOKEN 并重启服务即可

  • 本服务的全部工具都是只读的,不会修改你的书架或笔记

多用户部署:Key 由客户端携带

服务端不配 WEREAD_API_KEY 时,每个客户端用请求头带自己的 Key:

Authorization: Bearer wrk-xxxxxxxx
# 或
X-WeRead-Api-Key: wrk-xxxxxxxx

启用了访问令牌(WEREAD_MCP_AUTH_TOKEN)时,Authorization 头用于承载访问令牌, 此时只能用 X-WeRead-Api-Key 携带微信读书 Key。

请求头优先级高于服务端环境变量。不想让客户端覆盖时设 WEREAD_ALLOW_CLIENT_API_KEY=false

配置项

全部可用环境变量或命令行参数设置,命令行优先,详见 .env.exampleweread-mcp --help

环境变量

默认值

说明

WEREAD_API_KEY

服务端默认 API Key

WEREAD_MCP_TRANSPORT

sse

sse / streamable-http / stdio

WEREAD_MCP_HOST / WEREAD_MCP_PORT

127.0.0.1 / 8000

监听地址

WEREAD_MCP_SSE_PATH / WEREAD_MCP_MESSAGE_PATH

/sse / /messages/

SSE 路径

WEREAD_MCP_HTTP_PATH

/mcp

Streamable HTTP 路径

WEREAD_ALLOW_CLIENT_API_KEY

true

是否允许请求头覆盖 Key

WEREAD_SKILL_VERSION

1.0.4

上报给网关的 skill 版本

WEREAD_REQUEST_TIMEOUT

30

网关请求超时(秒)

WEREAD_MCP_LOG_LEVEL

INFO

日志级别

WEREAD_MCP_AUTH_TOKEN

MCP 访问令牌,公网部署必设(至少 16 位)

WEREAD_MCP_ALLOWED_HOSTS

反向代理 / 隧道对外的域名,逗号分隔

项目结构

src/weread_mcp/
├── cli.py        # 命令行入口与传输选择
├── config.py     # 环境变量 / 参数配置
├── http_app.py   # HTTP 传输组装:访问令牌鉴权、Host 白名单
├── gateway.py    # Agent API Gateway 客户端(鉴权、参数平铺、错误归一化)
├── server.py     # MCPServer 构造、lifespan、instructions、/healthz
├── tools.py      # 19 个工具,docstring 即模型看到的口径说明
├── resources.py  # weread://skills/... 资源
└── skills/       # 官方能力文档(Apache-2.0,原样内置,见 NOTICE)
tests/
├── test_gateway.py  # 参数平铺、errcode、Key 处理
├── test_tools.py    # 内存 MCP 客户端跑通全部工具与口径计算
├── test_sse.py      # 真起 uvicorn,用 MCP 客户端通过 URL 连接
├── test_remote.py   # 公网部署:令牌鉴权、Host 白名单、令牌与微信读书 Key 隔离
└── test_cli.py      # 参数覆盖

测试

uv run pytest

test_sse.py 会在随机端口起一个真实的 HTTP 服务,用 MCP 客户端走 SSE 连上来调用工具, 网关请求被 mock,不会真的打到微信读书。

说明

  • 升级官方 skills 时:替换 src/weread_mcp/skills/*.md,并把 WEREAD_SKILL_VERSION 改成新的 version(或直接改 config.py 里的 DEFAULT_SKILL_VERSION); 如果网关新增了接口,用 list_gateway_apis 查看后在 tools.py 里补一个工具即可。

  • 本项目与腾讯官方无从属关系;内置文档版权与许可见 NOTICELICENSE

许可证:Apache-2.0

Available Tools

19 tools
call_gateway调用任意网关接口A
Read-only

直连网关的兜底工具:当某个接口还没有对应的专用工具时使用。

    本工具会自动补上 `skill_version` 与鉴权头,并把 `params` 平铺到 body 顶层。
    能用专用工具时优先用专用工具——它们的说明里带有字段口径与避坑规则。
    
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo业务参数,会被平铺到请求体顶层(不要再嵌套 params/data/body)
api_nameYes接口名,如 /store/search,可用 list_gateway_apis 查询

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

注释已提供readOnlyHint=true和destructiveHint=false,描述了安全轮廓。描述在此之上额外披露了行为:会自动补上skill_version与鉴权头,并把params平铺到body顶层。这些信息超出注释,有助于代理理解调用时的内部处理。没有矛盾,虽然未提及错误处理或返回格式,但输出模式已存在,此分数合理。

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

描述分两段,第一句直接说明用途和适用条件,第二句解释自动行为和优先级建议。每个句子都有价值,无冗余,关键信息前置,结构清晰。

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

该工具是一个通用网关调用,复杂度中等。描述已涵盖使用场景、行为细节(自动补头和扁平化)、参数说明(通过schema),并有输出模式存在。缺少的信息如返回格式由输出模式补充,代理可以正确调用,因此完整。

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

参数schema覆盖率为100%,模式本身已包含两个参数的描述(api_name的示例和params的平铺说明)。描述文本没有添加超出schema的额外语义,仅重申了平铺行为,与schema描述一致。由于schema已充分说明,基线为3,描述未额外增值。

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

描述明确说明这是一个直连网关的兜底工具,用于当某个接口没有对应专用工具时。动词'直连'和资源'网关'清晰,与兄弟工具(如get_book_info等专用工具)形成明确区分,指出它是备用选项而非首选。目的非常清晰且能区分于其他工具。

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

描述明确给出了使用时机:'当某个接口还没有对应的专用工具时使用',并明确指示'能用专用工具时优先用专用工具',还说明专用工具的优点(字段口径与避坑规则)。这提供了明确的when和when-not,以及替代方案,没有任何推断空间。

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_best_highlights热门划线A
Read-only

获取书籍/章节的热门划线(/book/bestbookmarks),含划线原文 markText 和划线人数 items[].totalCount,按热度排序。

    服务端固定返回前 20 条,不支持分页。
    `items[].range` 可以传给 `get_highlight_reviews`,查看该条划线下面的想法。
    
ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes书籍 ID
synckeyNo增量同步 key,默认 0
chapter_uidNo章节 UID,0 表示全书(默认);按章节查时来自 get_book_chapters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the existing readOnlyHint=true and destructiveHint=false annotations, the description adds valuable behavioral details: fixed 20-item response, no pagination, sorting by popularity, and the exact returned fields (`markText`, `items[].totalCount`). This materially helps an agent predict behavior and is consistent with 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states the core purpose and fields, and the second explains critical server-side limits. The cross-reference to `get_highlight_reviews` adds useful integration guidance with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations, full schema coverage, and presence of an output schema, this description is nearly complete. It adds the critical no-pagination and top-20 behavior plus a cross-tool usage hint. The only missing element is an explicit comparison with sibling highlight tools, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters are already fully documented in the schema (100% coverage), so the baseline is appropriate. The description does not add meaningful input-parameter semantics beyond what the schema already provides; its `items[].range` mention concerns output, not parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: '获取书籍/章节的热门划线' with the endpoint `/book/bestbookmarks`, and clarifies it is sorted by popularity. However, it does not explicitly contrast itself with sibling tools like `get_book_highlights` or `get_chapter_underlines`, so differentiation is left mostly to the name and inferred meaning of '热门'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides operational context but no explicit when-to-use versus alternatives. It mentions that the server always returns the top 20 items, does not support pagination, and that `items[].range` can be passed to `get_highlight_reviews`; the choice of when to use this tool instead of a sibling is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_book_chapters章节目录A
Read-only

获取书籍章节目录(/book/chapterinfo)。

    `chapters[].level` 是目录层级(1=一级标题),展示时按层级缩进并标注字数与付费状态
    (`price=0` 免费、`paid=1` 已购买)。

    `chapters[].chapterUid` 是 `get_chapter_underlines` / `get_best_highlights` /
    `get_highlight_reviews` 的入参,需要按章节查划线时先用本工具取得。
    
ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes书籍 ID

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context about the output: chapters[].level indicates hierarchy, price=0 is free, paid=1 is purchased, and chapterUid is a required input for three named sibling tools. This goes beyond annotations and enriches the agent's understanding of the return structure and downstream usage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and every sentence carries useful information, but the formatting with line breaks and backticks makes it slightly dense. It is still front-loaded with the core purpose, followed by field semantics and cross-tool usage, so it largely earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single parameter, read-only annotations, an output schema, and a clear cross-tool dependency chain, the description is complete. It explains the meaning of key fields, how to interpret payment status, and why chapterUid matters, leaving no obvious gap for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage and describes book_id as '书籍 ID', so the description need not repeat it. The description does not add any extra meaning about the parameter itself, earning the baseline score of 3 for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with '获取书籍章节目录' (get book chapter table of contents), clearly identifying a specific verb and resource. It further specifies the intended use as a prerequisite for calling get_chapter_underlines, get_best_highlights, and get_highlight_reviews, distinguishing it from the listed sibling tools and giving an agent clear grounds for selection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: '需要按章节查划线时先用本工具取得' (when looking up underlines by chapter, first obtain chapterUid with this tool). This names dependent sibling tools and gives a concrete conditional, providing strong usage guidance beyond mere purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_book_highlights我的划线A
Read-only

获取我在某本书里的划线内容(/book/bookmarklist)。

    接口已自动过滤书签(type=0),只返回划线(type=1);书签内容当前无法导出,
    书签**数量**见 `list_notebooks` 的 `bookmarkCount`。

    用 `chapters[].chapterUid` / `title` 把 `updated[]` 里的划线按章节分组展示,
    原文用引用格式 `>` 标注,`createTime` 转 `YYYY-MM-DD`。

    用户说「导出这本书的所有笔记」时,必须同时调用本工具和 `get_my_reviews`,
    只返回划线是不完整的。
    
ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes书籍 ID

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses that bookmarks (type=0) are automatically filtered out, only highlights (type=1) are returned, and bookmark content is currently unavailable for export. This is material behavioral context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core purpose appears first, followed by filtering behavior, formatting instructions, and sibling-tool coordination. Every sentence adds value without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, single-parameter tool with an output schema, the description is complete: it explains what is filtered, how results should be grouped and formatted, the bookmark limitation, and the required pairing with get_my_reviews for full note export.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter book_id is already fully documented in the schema with '书籍 ID' (100% schema coverage). The description only refers to '某本书' and adds no additional semantic detail, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with '获取我在某本书里的划线内容' (get my highlights in a book), a specific verb+resource statement. It further clarifies that only highlights (type=1) are returned, not bookmarks, which distinguishes it from related note/review tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: for '导出这本书的所有笔记', the tool must be combined with get_my_reviews. It also states bookmarks cannot be exported and their count is available via list_notebooks, providing clear exclusions and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_book_info书籍详情A
Read-only

获取书籍基本信息(/book/info):书名、作者、译者、简介、分类、出版社、 出版时间、ISBN、字数、评分(newRating 为百分制)等。

    回包若含 `deepLink`,展示为 `[打开阅读]({deepLink})`。
    失败时回复:暂时无法获取书籍信息,请稍后再试~
    
ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes书籍 ID,来自 search_books 等接口的 bookId

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, lowering the bar for safety disclosure. The description adds meaningful behavioral detail: the exact endpoint, the percent scale for newRating, how to render deepLink as a markdown link, and the fallback user message on failure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: it opens with the core purpose, then covers response rendering, then failure behavior. Every sentence carries useful information, though the field list is slightly dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and read-only annotations, the description covers the essential behavioral extras: endpoint, display rule, and error fallback. The main gap is the lack of explicit sibling differentiation, but that is minor for such a simple read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter book_id is already described in the schema with its source ('来自 search_books 等接口的 bookId'). The description itself adds no parameter-level detail, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('获取'), a clear resource ('/book/info'), and a precise scope: basic book information including title, author, translator, description, category, publisher, ISBN, word count, and rating scale. This is sufficient to distinguish get_book_info from sibling tools like get_book_chapters or get_book_highlights.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool — when basic book details are needed — and the schema notes that book_id comes from search_books, which hints at a workflow. However, there is no explicit guidance about when not to use it or which sibling tool to prefer for alternative needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_chapter_underlines章节划线热度A
Read-only

获取某章节内每条划线的热度统计(/book/underlines)。

    只有人数/得分/位置范围,**不含划线文本**,用于展示「X人划线」标签。
    需要划线原文请用 `get_best_highlights`。
    
ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes书籍 ID
synckeyNo增量同步 key,默认 0
chapter_uidYes章节 UID,来自 get_book_chapters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds valuable behavioral context beyond that: it specifies the output contains only counts/scores/position ranges and explicitly excludes underline text, which is a behavioral trait not captured by annotations. It doesn't mention pagination or rate limits, but given the annotation coverage and the tool's simplicity, this is a solid disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It uses a bullet point to separate the core purpose from the exclusion and the alternative. Every sentence earns its place: the endpoint, the output scope, the use case, and the sibling tool reference. No fluff or redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the return values are already defined and need no explanation. The description covers the purpose, what the tool does and does not return, and when to use an alternative. It doesn't discuss edge cases like empty chapters or pagination, but for a simple read-only statistics tool, these are minor. The description is complete for an agent to decide whether to call this tool and what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters (book_id, chapter_uid, synckey) are already documented in the input schema. The description doesn't add significant parameter-specific semantics beyond what the schema provides; it only ties the tool's purpose to the chapter parameter implicitly. The schema already includes helpful notes like '章节 UID,来自 get_book_chapters' for chapter_uid. Baseline 3 is appropriate since the schema carries the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: '获取某章节内每条划线的热度统计' (get heat statistics for each underline in a chapter), names the endpoint `/book/underlines`, and explicitly states what it returns (count/score/position range) and what it excludes (text). It also differentiates from the sibling `get_best_highlights` by noting the alternative for original text. This is specific and distinguishes it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: it is for displaying the 'X people underlined' label ('用于展示「X人划线」标签') and directly tells the agent to use `get_best_highlights` when original text is needed ('需要划线原文请用 get_best_highlights'). This clearly defines when to use this tool versus the alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_highlight_reviews划线下的想法A
Read-only

获取指定划线范围下面的想法/评论(/book/readreviews)。

    本工具会把 `ranges` 组装成网关要求的 `reviews` 数组
    (这是少数允许作为数组传入的业务字段)。

    回包 `reviews[].pageReviews[].review` 里有 `abstract`(划线原文)、
    `content`(想法内容)、`author`、`createTime`。
    需要单条想法的完整详情(含评论/点赞)时再调 `get_review_detail`。
    
ParametersJSON Schema
NameRequiredDescriptionDefault
countNo每个 range 拉取的想法数量,服务端上限 20
rangesYes要查询的划线位置范围列表,如 ["393-401"],取自 get_best_highlights 返回的 items[].range
book_idYes书籍 ID
max_idxNo翻页偏移,默认 0
synckeyNo翻页游标,默认 0
chapter_uidYes章节 UID

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare `readOnlyHint=true` and `destructiveHint=false`, so the safety profile is conveyed. The description adds value by explaining the request assembly (reviews array transformation), the response structure (abstract, content, author, createTime), and the pagination-related parameters (max_idx, synckey). No contradiction with annotations. It does not mention rate limits or error behaviors, but those are not mandated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a few sentences that front-load the core purpose, then add essential assembly and response details, and end with the sibling routing. It avoids fluff and remains readable, though it could be slightly more compact by merging some clauses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (6 params, no nested objects) and the existence of an output schema that documents return structure, the description is complete. It covers the request construction, response fields, and provides an alternative tool pointer. Missing explicit error handling or edge cases, but these are not critical for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with every parameter documented (ranges source and format, count limits, pagination fields). The tool description adds no extra parameter meaning beyond what the schema already provides. Baseline of 3 is appropriate because the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (获取/fetch), a clear resource (指定划线范围下面的想法/评论), and the API endpoint (`/book/readreviews`). It explicitly contrasts with `get_review_detail` for single-review detail, and lists the response fields. This distinguishes it from sibling tools like `get_best_highlights` and `get_my_reviews`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states a clear condition for using `get_review_detail` instead (when single-thought complete details including comments/likes are needed). It also implies `ranges` come from `get_best_highlights`. However, it does not explicitly exclude other sibling tools or explain when this tool is preferable over `get_my_reviews` or `list_book_reviews`, leaving some ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_my_reviews我的想法与点评A
Read-only

获取我在某本书里的个人想法与点评(/review/list/mine), 包含划线想法、章节点评和整本书评。

    - `reviews[].review.abstract` / `range` 是条件字段:只有能定位到原文的想法才有值;
      有值时按「原文 + 想法」展示,整本书评/章节点评可能没有。
    - `star` 为评分(0-5,-1=无评分),`chapterName` 仅章节点评有值。
    - 翻页:`hasMore=1` 时把回包的 `synckey` 传回本工具。

    与 `get_book_highlights` 配合才是完整的「单本书笔记内容」。
    
ParametersJSON Schema
NameRequiredDescriptionDefault
countNo每页数量,默认 20
book_idYes书籍 ID(网关参数名为 bookid)
synckeyNo翻页游标,首次传 0

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a read-only, non-destructive operation, and the description adds substantial behavioral detail beyond that: conditional fields (abstract/range only when locatable), star value semantics, chapterName being populated only for chapter comments, and pagination behavior via hasMore/synckey. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a purpose sentence followed by precise bullet points. Every sentence adds needed information: endpoint, content scope, field conditions, star/chapterName semantics, pagination, and sibling relationship. It is compact given the complexity of the response semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only paginated tool that has an output schema, the description covers what an agent needs: what the tool returns, how conditional fields behave, pagination mechanics, and how it fits with get_book_highlights. The output schema and annotations handle the remaining structural detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining how synckey should be used for pagination (pass back the returned synckey when hasMore=1), which is not meaningfully captured by the schema alone. It does not overly repeat parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: getting personal thoughts and reviews within a book via /review/list/mine, and enumerates the included content types (划线想法, 章节点评, 整本书评). It also names get_book_highlights as the complement, helping differentiate it from the broader set of sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context by noting that pairing with get_book_highlights yields the complete single-book note content. However, it does not explicitly state when not to use this tool or which sibling alternatives (e.g., list_book_reviews, get_review_detail) should be chosen instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reading_overview阅读概况A
Read-only

一次性汇总用户阅读概况(对应官方 profile.md 的工作流): 书架总览 + 最近阅读的前 N 本电子书进度 + 笔记概览。

    内部依次调用 `/shelf/sync`、按 `readUpdateTime` 降序取前 N 本调 `/book/getprogress`、
    再调 `/user/notebooks`。只对 `books[]` 里的电子书查进度,不对 `albums[]` 专辑调用。

    书架为空时回复:你的书架还没有书哦,要不要去发现页看看推荐?
    失败时回复:阅读概况暂时无法获取,请稍后再试~
    
ParametersJSON Schema
NameRequiredDescriptionDefault
recent_book_limitNo查询阅读进度的最近书籍数量,默认 5(避免大书架产生过多调用)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only and non-destructive, and the description adds substantial behavior beyond that: the internal sequence of API calls, the sort order by readUpdateTime, the ebook-only scope, and exact user-facing responses for empty-shelf and failure cases. This gives the agent a rich, accurate model of what happens when the tool is invoked.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: purpose first, then internal behavior, then scope constraints, then edge-case responses. Every sentence contributes operational knowledge, and there is no filler or repetition of annotation information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter orchestrating tool with an output schema, the description is complete: it explains what is aggregated, how the limit is used, which resources are excluded, and how failures/empty states are handled. The agent has everything needed to invoke it correctly and set expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes recent_book_limit with a default and purpose, so the baseline is 3. The description adds meaningful context by explaining that this limit controls how many ebooks get progress queries, sorted by readUpdateTime, and that its default avoids excessive calls on large shelves—value beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('一次性汇总用户阅读概况'), and enumerates the exact components: shelf overview, recent N ebook progress, and notes overview. It also distinguishes itself from sibling per-resource tools like get_shelf, get_reading_progress, and list_notebooks by framing itself as the aggregate profile workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly communicates that this tool is the one-shot 'profile.md' workflow for a complete reading overview, which implies it should be chosen over calling individual sibling tools separately. It also gives a scoping rule (only ebooks in books[], not albums), but it does not explicitly name alternatives or say when NOT to use it, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reading_progress阅读进度A
Read-only

获取某本书的阅读进度(/book/getprogress)。

    关键口径:
    - `book.progress` 是 0-100 的**整数百分比**,1 表示 1%(不是 100%);展示必须带 `%`。
      只有 `progress=100` 且存在 `book.finishTime` 才代表读完。
    - 累计阅读时长看 `book.readingTime`(秒),展示转「X小时Y分钟」。
      `book.recordReadingTime` 是朗读/记录类时长,普通阅读通常为 0,**不要**拿它当阅读时长。
    - `book.updateTime` / `book.finishTime` 是 Unix 时间戳,展示转 `YYYY-MM-DD`。

    返回中的 `_computed` 是本服务端按上述规则算好的展示值。
    
ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes书籍 ID

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

注释已声明readOnlyHint=true,描述进一步补充了数据解释规则:progress为0-100整数百分比、finishTime条件、readingTime与recordReadingTime的区别、时间戳转换,以及_computed字段的预计算含义,这些远超注释提供的信息,且未与注释矛盾。

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

描述采用分点结构,信息密集但每个要点都有价值(进度、时长、时间戳、计算字段),没有冗余。稍长但针对复杂语义是合理的。

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

尽管存在输出schema,描述仍解释了关键字段的语义和转换规则,确保agent能正确解读数据。覆盖了所有可能误用的点(如百分比、时间单位),完整无缺。

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

book_id在schema中已有描述(书籍ID),覆盖率为100%,描述未额外解释参数格式或用法,但基于schema已足够,基线3分。

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

描述明确说明“获取某本书的阅读进度”,动词+资源清晰,且与兄弟工具(如get_read_stats、get_reading_overview)在语义上区分明显,因为它专注于单本书的进度细节。

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

描述未提及何时使用该工具而非其他替代品,也未说明排除条件。虽然从名称和上下文中可推断用途,但没有显式指导,agent可能需要自行判断。

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_read_stats阅读统计A
Read-only

获取个人阅读统计(/readdata/detail):时长、天数、排行、偏好分析。

    **单位与口径(极易出错,必须遵守)**:
    - `totalReadTime` 是该周期总阅读/收听时长,单位**秒**,禁止当成分钟或小时;
      统计总时长优先用它,`readTimes` 只用于明细或交叉校验。
    - `dayAverageReadTime` 是按**自然日**平均的秒数,分母不是 `readDays`;
      需要「阅读日均」要自己用 `totalReadTime / readDays` 算并说明。
    - `readDays` 是有效阅读天数(单日满 1 分钟)。
    - `compare` 是与上一周期日均的比例,0.2 表示约增长 20%。
    - `preferAuthor[].readTime` 是格式化字符串(如「5小时30分钟」),不是秒。
    - `preferTime` 是 24 小时时段分布(秒),顺序从 6 点开始到次日 5 点,不是从 0 点。

    本接口只支持固定自然周期,不能传任意起止日期。跨区间要组合:
    整年用 `annually` 逐年查询并累加,整月用 `monthly`;边界不完整时优先用
    `dailyReadTimes` 做日级扣减,没有日级明细就用月级近似并在回答中说明口径。

    `_computed` 里给出了换算好的「X小时Y分钟」文案。
    失败时回复:阅读数据暂时无法获取,请稍后再试~
    
ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo统计维度:weekly=本周,monthly=本月(默认),annually=本年,overall=总计monthly
base_timeNo基准时间戳,0=当前周期。服务端会归一化到周期起点(周一/月初/年初);查历史就传该周期内任一 Unix 时间戳;overall 固定为 0。

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already state readOnlyHint=true, destructiveHint=false, and openWorldHint=true. The description adds critical behavioral details: it warns that 'dayAverageReadTime' uses a natural-day denominator, not 'readDays', and that 'preferAuthor[].readTime' is a formatted string, not seconds. It also explains the time distribution order and the limitation on date ranges. These details go beyond the annotations and are essential for correct interpretation of results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with clear headers (units, periods, computed, failure). It front-loads the most critical warnings about units and periods. Every sentence serves a purpose, either clarifying semantics, providing computation guidance, or specifying error handling. It is comprehensive yet organized, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple fields with non-obvious units, fixed-period limitations, and cross-period combination logic), the description is complete. It addresses all potential pitfalls, provides alternative strategies for periods not covered, and even gives guidance on failure responses. The output schema exists, so return values need not be described in detail, but the description covers semantics that the schema cannot convey.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides comprehensive descriptions for both 'mode' and 'base_time', with enum values and default behavior. The description adds extra context about 'base_time' (normalization to period start) and emphasizes unit pitfalls that are not in the schema. Since schema coverage is 100%, the description's added value is moderate but significant for error prevention, warranting a score above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('获取' = get) and resource ('个人阅读统计' = personal reading stats), and identifies the endpoint. It distinguishes itself from sibling tools like 'get_reading_overview' or 'get_reading_progress' by focusing on statistical aggregates. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use and when-not-to-use guidance. It states that this tool only supports fixed natural periods and cannot accept arbitrary start/end dates, and it gives concrete alternatives for cross-period queries (using 'annually' for whole years, 'monthly' for months, and 'dailyReadTimes' for boundary adjustments). It also warns about units and provides failure response guidance, making usage conditions crystal clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_review_detail想法详情A
Read-only

获取单条想法的完整详情(/review/single),含内容、作者、评论与点赞。

ParametersJSON Schema
NameRequiredDescriptionDefault
synckeyNo增量同步 key,默认 0
review_idYes想法/评论 ID
likes_countNo拉取点赞数量,默认 10
comments_countNo拉取评论数量,默认 10
likes_directionNo点赞排序方向:0=倒序
comments_directionNo评论排序方向:0=倒序,1=正序

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds the endpoint path and mentions that it returns content, author, comments, and likes, which provides some context. However, it doesn't disclose behavioral traits such as pagination behavior for comments/likes, how `synckey` affects the response, or whether the tool returns partial data if optional parameters are omitted. These are not critical but could be useful given the complexity of the parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is efficient and front-loaded: it starts with the main purpose (获取单条想法的完整详情), includes the endpoint, and lists the key contents. No filler or redundant information. Every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a read-only tool with a rich output schema. It states the purpose, and the output schema (though not shown in the context) likely details the return structure, so the description needn't explain return values. However, given the tool has 6 parameters and includes pagination controls (likes_direction, comments_direction), the description could have noted the sorting/pagination behavior to help agents set appropriate parameters. The annotations cover safety, so the main gap is a lack of guidance on parameter usage, but it's not critical for a simple fetch.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters with descriptions. The description adds no parameter-specific information; it only mentions that it includes comments and likes, which maps to `comments_count` and `likes_count`. The baseline is 3 because the schema handles parameter semantics well, and the description doesn't need to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb '获取' (get) and the resource '单条想法的完整详情' (single review's complete details), including the endpoint path `/review/single`. It lists the key contents (内容、作者、评论与点赞), which helps distinguish it from sibling tools like `get_my_reviews` that list multiple reviews. However, it doesn't explicitly mention that this is not the same as listing reviews, so it slightly lacks sibling differentiation beyond the singular vs plural framing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when a single review's detail is needed, but it doesn't explicitly state when to use this tool versus the sibling tools like `get_my_reviews` or `get_best_highlights`. It provides no exclusions or conditions. The 'single' in the description and the fact that it requires a `review_id` hint at the use case, but that guidance is implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_shelf我的书架A
Read-only

获取当前用户书架(/shelf/sync,无参数,身份由 API Key 决定)。

    数量口径(**强制**):
    - 书架条目总数 = `books.length + albums.length + (mp 非空 ? 1 : 0)`;
      `albums[]` 是专辑/有声书,在书架里同样按「书」管理,必须计入总数,
      不能用「另外还有」把专辑或文章收藏排除在总数之外。
    - 「电子书数」才用 `bookCount` / `books.length`。
    - 私密阅读数 = `books[].secret==1` + `albums[].albumInfoExtra.secret==1` + (`mp` 非空 ? 1 : 0)。
    - 不要遍历 `books` 逐个调 `get_book_info` 去判断有声书,直接用 `albums`。

    本服务端已按上述公式把结果算好放在 `_computed` 字段里,直接引用即可。
    失败时回复:书架信息暂时没拉到,请稍后再试~
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only and non-destructive. The description adds useful behavior: the server has precomputed `_computed` fields, the counting formula is mandated, and a specific failure response is provided. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average, but every section earns its place: purpose, forced counting semantics, optimization guidance, and failure behavior. The bullet structure keeps it scannable, though it is slightly dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read-only tool with an output schema and safety annotations, the description is complete. It covers the endpoint, authentication model, exact counting semantics, recommends against inefficient sibling calls, and specifies the failure message.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100%, so the baseline is 4. The description reinforces this by explicitly stating '无参数' and explains that authentication is handled via the API key, which is useful context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: '获取当前用户书架' and gives the endpoint `/shelf/sync`. It clearly distinguishes this shelf-level operation from the sibling tools that retrieve individual books, highlights, or reading progress.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says the tool has no parameters and that identity comes from the API key. It also gives a direct usage rule: do not iterate `books` and call `get_book_info` to detect audiobooks; use `albums` instead. This is clear when-to-use and when-not-to guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_book_reviews书籍公开点评A
Read-only

获取书籍的公开点评/review/list)——其他读者的评价, 不是个人笔记(个人笔记用 get_my_reviews)。

    结构注意:存在双层嵌套,点评内容在 `reviews[].review.review.content`、
    `...star`、`...author.name`、`...book.title`。

    评分换算:20=⭐,40=⭐⭐,60=⭐⭐⭐,80=⭐⭐⭐⭐,100=⭐⭐⭐⭐⭐。
    长点评截取前 200 字并提示可展开;`createTime` 转 `YYYY-MM-DD`。
    无结果回复:这本书暂时还没有公开点评哦~
    
ParametersJSON Schema
NameRequiredDescriptionDefault
countNo每页数量,默认 20
book_idYes书籍 ID
max_idxNo翻页偏移:上一页最后一条的 idx
synckeyNo翻页游标,首次 0
review_list_typeNo筛选类型:0=全部(默认),1=推荐,2=不行/差评,3=最新,4=一般

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, and the description adds substantial behavioral details: nested response structure, star-rating conversion, truncation of long reviews, date formatting, and the exact no-result message. This goes well beyond what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by concise, useful behavioral notes. Every section adds distinct value, with no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with a fully documented schema and output schema present, the description covers the essential extras: response nesting, formatting transformations, truncation behavior, and fallback message. There are no meaningful gaps for an agent to call and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters including defaults, enums, and pagination semantics. The description adds no additional parameter-level meaning; it focuses on response behavior instead, which is fine but not above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches public book reviews, explicitly distinguishes them from personal notes, and names the alternative get_my_reviews. The verb (获取) and resource (书籍公开点评) are specific and match the tool name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says this is for other readers' reviews, not personal notes, and points to get_my_reviews as the correct alternative for personal notes. This gives the agent a clear when-to-use and when-not-to-use rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_gateway_apis网关接口清单A
Read-only

列出微信读书网关当前可用的全部接口及参数定义({"api_name": "/_list"})。

    用于排查「某个能力是否还存在 / 参数是否变化」,日常问答不需要调用。
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

注解已声明 readOnlyHint=true、openWorldHint=true、destructiveHint=false,描述没有与之矛盾。描述补充了“当前可用”这一动态性信息,并说明该工具是用于检查能力存在性和参数变化,但未进一步说明返回内容的结构特点或可能的体积问题。在注解已覆盖安全画像的情况下,这是可接受的中间水平。

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

描述仅两句话,第一句直接说明工具行为和资源,第二句给出使用场景与排除场景,信息密度高、无冗余。内嵌的 JSON 示例虽简短但具有实际参考价值,整体结构清晰且关键信息前置。

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

该工具无参数、有输出 schema、注解已覆盖只读与开放世界语义,描述又补充了使用时机和排除场景,代理无需额外推测即可正确调用。复杂度低,现有描述已构成完整调用上下文。

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

该工具参数数量为 0,schema 覆盖率为 100%,参数语义主要由 schema 承担。描述中给出的 `{"api_name": "/_list"}` 作为调用示例增加了上下文,说明该工具本身如何触发清单返回,虽未涉及参数说明,但对零参数工具来说已足够。

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

描述以明确动词“列出”指出资源是“微信读书网关当前可用的全部接口及参数定义”,并给出调用示例 `{"api_name": "/_list"}`,让代理能准确理解工具作用。与 call_gateway 等兄弟工具相比,它明显是“接口清单”而非具体业务查询,具有区分度。

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

描述明确给出使用场景“用于排查某个能力是否还存在 / 参数是否变化”,并明确说明“日常问答不需要调用”,具备明确的 when 与 when-not 指引。但没有直接点名替代工具(如 call_gateway 或具体查询类工具),因此未达到最高分。

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_notebooks笔记本概览A
Read-only

列出所有有笔记的书(/user/notebooks)。

    字段口径:
    - `books[].noteCount` 是**划线(高亮原文)条数**,不是该书总笔记数。
    - 单本书总笔记数 = `reviewCount + noteCount + bookmarkCount`。
    - `reviewCount` 已包含个人点评/书评想法,不要再额外加「点评数」,否则重复计算。
    - 本接口不返回 `highlightCount`;「高亮数/划线数」对应的是 `noteCount`。

    分页只支持游标:首次只传 `count`,`hasMore=1` 时取本页最后一项的 `sort`
    作为下一次的 `last_sort`;**不支持** offset/limit。需要完整排行时循环到 `hasMore=0`。

    `_computed.noteCountByBook` 是本服务端按公式算好并降序排序的结果。
    
ParametersJSON Schema
NameRequiredDescriptionDefault
countNo每页数量,默认 20
last_sortNo翻页游标:上一页 books 最后一项的 sort 值。首页不传。

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, openWorldHint, destructiveHint), the description adds substantial behavioral detail: field semantics (noteCount is highlight count, total notes formula), pagination mechanics, and a note about a computed field. This fully informs the agent about how the tool behaves without contradicting 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: it starts with the core purpose, then uses bullet points to explain field semantics, and ends with pagination details. Every sentence earns its place—there is no fluff. The front-loading of the main action and the logical grouping make it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description does not need to explain return values. It covers all tricky aspects: the distinction between noteCount and total notes, the pagination protocol, and the presence of a computed field. For a tool with two optional parameters, this is fully complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers both parameters (count and last_sort) with descriptions, so schema coverage is 100%. However, the description adds critical usage semantics: how to use last_sort with hasMore, that count is the page size, and that offset/limit are unsupported. This goes beyond the schema, warranting a 4 rather than a baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear, specific action: '列出所有有笔记的书' (list all books with notes) and includes the endpoint. This distinguishes it from siblings like get_shelf or search_books, which have different scopes. The verb+resource is unambiguous and no tautology is present.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on what the tool returns and how to paginate (cursor-only, no offset/limit), but it does not explicitly state when to use this over siblings like get_shelf or search_books. The purpose is self-evident, but there is no exclusionary guidance, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recommend_books为你推荐A
Read-only

基于个人阅读记录的个性化推荐(/book/recommend), 与 App 首页「为你推荐」一致。

    每本书含 `reason`(推荐理由)、`newRating`(0-100)、`readingCount`(在读人数)。
    翻页用最后一条的 `searchIdx` 作为下次的 `max_idx`。
    无结果回复:暂时没有找到合适的推荐,换个关键词试试?
    
ParametersJSON Schema
NameRequiredDescriptionDefault
countNo每页数量,默认 12
max_idxNo翻页偏移:上一页最后一条的 searchIdx

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and destructiveHint annotations, the description usefully discloses output fields (reason, newRating, readingCount), the pagination protocol (using the last item's searchIdx as the next max_idx), and the exact no-results response message. This gives the agent practical behavioral expectations not present in annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and logically structured: purpose first, then output fields, then pagination, then empty-result message. Each segment earns its place, though the pagination detail partially duplicates the schema description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 enumerate return values in full. It still provides the key behaviorally relevant fields, the pagination mechanism, and the no-results phrasing, which is sufficient for an agent to invoke and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with both count and max_idx already described. The description's pagination line essentially restates the max_idx schema description ("上一页最后一条的 searchIdx") rather than adding new meaning, so it stays at the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a personalized recommendation based on personal reading records and explicitly ties it to the App home page feature, giving a specific verb+resource. It does not explicitly name sibling tools, but the purpose is distinct enough from search_books and similar_books that an agent can differentiate it without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (when a personalized recommendation based on reading history is needed) by stating it matches the App home page recommendation. However, it does not explicitly say when not to use it or mention alternatives like search_books or similar_books, leaving the choice to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_books搜索书籍A
Read-only

在微信读书书城搜索(/store/search)。

    用户说书名时先用本工具拿 bookId,再调用其它工具。

    注意:请求参数 `scope` 和回包 `results[].scope` 不是一回事——请求 `scope=10` 时
    电子书分组回包可能是 `scope=17`,**不要**用 `results[].scope == 10` 过滤结果;
    标题为「电子书」或含 `books` 的分组都可以展示。

    翻页:`hasMore=1` 时,用最后一条的 `searchIdx` 作为下一次的 `max_idx`。
    搜索结果只是分页片段,表述用「为您找到」,不要说「共有/一共/总共」。
    空结果时回复:抱歉,没有找到与「{keyword}」相关的结果。
    
ParametersJSON Schema
NameRequiredDescriptionDefault
countNo每页数量。用户没有指定数量时不要传(服务端默认 15)。
scopeNo搜索类型,必须显式传:0=全部(泛搜索),10=电子书(明确找书/要 bookId),16=网文小说,14=微信听书/有声书/专辑/播客,6=作者,12=全文,13=书单,2=公众号,4=文章。
keywordYes搜索关键词。需要先去掉「帮我 / 搜一下 / 有没有」等口语化前后缀,只保留核心检索词;同时给出书名和作者时用区分度更高的词。
max_idxNo翻页偏移:取上一页最后一条的 searchIdx。首页不传。

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: the scope request/response mismatch warning, the pagination contract using searchIdx/max_idx, and the instruction not to claim total counts. It doesn't describe rate limits or auth, but for a read-only search tool the disclosed behaviors are substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, then covers critical caveats. Every sentence earns its place: the scope warning, pagination rule, and empty-result phrasing are all necessary for correct invocation. It is slightly dense but well-organized with line breaks.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a search tool with a rich output schema and full parameter documentation, the description covers the essential operational details: when to use it, how to paginate, how to interpret scope, and how to phrase results. The output schema handles return values, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description adds extra semantic value by explaining the scope mismatch trap and the pagination flow, which are not in the schema. It also clarifies that count should be omitted when the user doesn't specify a number. This goes beyond the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: search the WeRead bookstore via `/store/search`. It also explicitly says to use this tool first to get a bookId when the user mentions a book title, which distinguishes it from sibling tools like get_book_info or recommend_books. The title is in Chinese but the description clarifies the exact endpoint and role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: '用户说书名时先用本工具拿 bookId,再调用其它工具' (when the user says a book title, first use this tool to get bookId, then call other tools). It also provides detailed pagination and response-handling rules, and even specifies what to say for empty results. This is far beyond a minimal usage note.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

similar_books相似书推荐A
Read-only

基于某本书的相似推荐(/book/similar),与 App 书籍详情页「相似推荐」一致。

    底层转发到 `/book/detailinfo?listtypes=2`,要求 count / maxIdx 必须显式传入,
    不能依赖默认值,否则结果异常。

    结果在 `booksimilar.books[].book.bookInfo`,翻页用最后一条的 `idx` 作为 `max_idx`,
    并带上 `booksimilar.sessionId`。
    
ParametersJSON Schema
NameRequiredDescriptionDefault
countNo每页数量,必须显式传,首次推荐传 12
book_idYes书籍 ID
max_idxNo翻页偏移,必须显式传,首次 0;翻页传上一页最后一条的 idx
session_idNo翻页会话 ID:首次不传,之后传回包里的 sessionId

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the safe-read annotations, it discloses the underlying forwarded endpoint `/book/detailinfo?listtypes=2`, warns that `count`/`max_idx` must be explicitly passed or results may be abnormal, and documents the result location and pagination session mechanics. This is meaningful behavioral context not carried by annotations or schema alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences lead with purpose, then add a critical caveat, then explain result shape and pagination. There is no filler, and each clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given annotations, an output schema, and four documented parameters, the description covers everything needed to call correctly: endpoint behavior, mandatory explicit arguments, result location, and the pagination protocol. No practical gap remains for an agent deciding to invoke this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already explains the required explicit values for `count` and `max_idx`, the initial session behavior, and pagination offsets. The description mostly restates these parameter rules while adding the result-path detail, so it provides only modest additional meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns similar-book recommendations based on a given book, matching the app detail page's '相似推荐' section, and even cites the endpoint `/book/similar`. It is specific enough to be identified from siblings, but it does not explicitly contrast itself with related recommendation tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It conveys when to use the tool: whenever similar-book recommendations for a specific book are needed, with semantics aligned to the book detail page. It offers clear context and strong procedural guidance for first call vs pagination, but does not formally state when-not-to-use or name alternatives.

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.

  1. 19 tool updatesv0.1.0
    • First observedcall_gateway
    • First observedget_best_highlights
    • First observedget_book_chapters
    • First observedget_book_highlights
    • First observedget_book_info
    • First observedget_chapter_underlines
    • First observedget_highlight_reviews
    • First observedget_my_reviews
    • First observedget_read_stats
    • First observedget_reading_overview
    • First observedget_reading_progress
    • First observedget_review_detail
    • First observedget_shelf
    • First observedlist_book_reviews
    • First observedlist_gateway_apis
    • First observedlist_notebooks
    • First observedrecommend_books
    • First observedsearch_books
    • First observedsimilar_books

TDQS

A4/5.0

Scored across 19 tools

Disambiguation4/5

Most tools map cleanly to distinct API endpoints or user workflows, but the review/highlight cluster (get_book_highlights, get_best_highlights, get_highlight_reviews, get_my_reviews, list_book_reviews, get_review_detail) creates some overlap risk. The detailed descriptions do a good job of separating them, so misselection should be rare.

Naming Consistency4/5

The dominant get_/list_/search_ snake_case pattern is consistent and readable. Minor deviations exist—recommend_books and similar_books lack a get_/list_ prefix, and get_reading_progress vs get_read_stats uses inconsistent root wording—but these do not seriously hinder prediction.

Tool Count4/5

19 tools is on the heavier side, but each one covers a meaningful facet of the WeChat Reading domain: discovery, shelf, progress, highlights, reviews, stats, and recommendations. The two gateway-level meta tools add some noise but serve a legitimate fallback purpose.

Completeness4/5

The tool surface covers the core read-only workflows well: searching books, viewing shelf/progress, exporting highlights and reviews, pulling reading statistics, and getting recommendations. Mutating actions like adding to shelf or updating progress are absent, but they are likely outside the API's scope, and call_gateway provides a raw escape hatch for missing endpoints.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    F
    maintenance
    An MCP server enabling LLMs to access WeChat Reading bookshelf, notes, highlights, and reviews via tools like get_bookshelf, search_books, and get_book_notes_and_highlights.
    4
    137 npm
    170
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    MCP server for WeChat automation, supporting message sending, chat history retrieval, and contact list management via SSE protocol.
    5
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables SQL queries on WeRead (微信读书) book data by syncing it into DuckDB, with an MCP server for agent-based analysis and cross-source joins.
    MIT