Errorbook MCP
Allows a Hermes agent to manage error book problems, reviews, and generate printable PDFs through MCP tools.
Click on "Install 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., "@Errorbook MCPCreate a review sheet for problems due this week."
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.
Errorbook MCP
Local-first error notebook infrastructure for MCP agents, with FSRS scheduling and printable math PDFs.
Errorbook MCP 是一个可直接接入支持 Model Context Protocol (MCP) 的 agent 的错题管理服务。图片识别由 agent 自己的视觉能力完成;MCP 负责接收结构化题干、稳定编号、去重、复习调度、优先级维护,以及生成带数学公式的打印版 PDF。
核心设计
题目使用不可变编号(例如
EB-2026-000001),编辑不会换号。复习间隔由版本锁定的 FSRS 算法维护;重复答错会缩短间隔并增加错题权重。
用户手动提高优先级会记录为独立事件,并随时间衰减,不会让旧题永久占据队首。
所有关键写操作支持幂等键;agent 重试不会重复录题或重复记一次作答。
每份 PDF 使用题目快照。之后修改题目不会改变已经生成的试卷。
SQLite 默认启用 WAL、外键和写事务,适合本地单用户 agent 并发调用。
Related MCP server: Paper Memory MCP Lite
MCP 能力
类型 | 名称 | 用途 |
Prompt |
| 约束宿主视觉模型忠实转写图片,模糊内容先确认,公式输出为 Markdown + LaTeX |
Tool |
| 校验、去重、记录单题并分配固定编号 |
Tool |
| 按编号读取题目,可选完整复习和优先级历史 |
Tool |
| 按文本、编号、学科、标签、题型、状态和到期时间组合查询 |
Tool |
| 使用 |
Tool |
| 追加真实作答结果并更新 FSRS |
Tool |
| 记录用户明确提出的临时优先级调整 |
Tool |
| 在 active、mastered、archived 之间切换,不硬删除历史 |
Tool |
| 冻结题目快照并生成仅含题目的 A4 错题复习卷 |
Tool |
| 查询导出状态、路径、资源 URI、大小和 SHA-256 |
Tool |
| 列出历史 PDF 文件及其存在状态 |
Tool |
| 删除指定 PDF 导出,不影响题目调度 |
Tool |
| 查看题库、到期积压和学科分布 |
Resource |
| 读取 questions PDF 二进制内容 |
所有有副作用的操作都接收 idempotency_key。建议 agent 使用“用户会话/动作类型/随机 UUID”组成的 8-128 字符键,并在网络重试时保持不变。
记忆与选卷算法
系统明确分开两个问题:FSRS 决定“下一次何时复习”,队列评分决定“本周容量有限时先打印哪些题”。人工优先级不会篡改 FSRS 状态。
复习结果映射如下:
实际结果 | FSRS rating | 行为 |
做错、空白、放弃 | Again | 缩短间隔,错误压力增加 1 |
部分正确、提示后正确 | Hard | 较短间隔,错误压力增加 0.5 |
独立正确 | Good | 正常增长稳定度,错误压力减半 |
明确轻松且无提示 | Easy | 更长间隔,错误压力降为四分之一 |
跳过 | 不评分 | 只留审计事件,不改变卡片状态 |
默认 desired_retention=0.90,使用依赖锁定的 FSRS 6.x 官方实现。普通“答对”必须记为 Good,不能由 agent 擅自升级为 Easy。mastered 题再次做错或部分正确会自动恢复为 active。
近期错误压力按 42 天半衰期衰减并在 6 封顶;人工 boost 按 14 天半衰期衰减并在正负 5 封顶。两者进入评分前都经过 1 - exp(-mass) 饱和,历史错误次数不会线性累加并永久霸榜。
周卷基础分为:
score = 42% 到期紧迫度
+ 22% 近期错误压力
+ 12% FSRS 难度
+ 10% 人工 boost
+ 8% 用户长期 importance到期紧迫度在到期点为 0.5,随逾期连续上升并趋近 1;未来到期则连续下降。默认候选仅包含 active 且在未来七天内到期的题,或仍有有效人工 boost 的题。已到期且创建超过 28 天的题进入 fairness_must_include 必选桶,防止大题库中长期饥饿。PDF 导出是只读查阅操作,不会改变 FSRS、队列优先级或题目数据。返回结果会报告 backlog、必选溢出和按当前卷容量估算的清空周数。
题库过载时算法不能凭空消除工作量:如果每周新增/到期数量长期高于 max_questions,agent 应把返回的 backlog 明确告诉用户,而不是悄悄丢题。
安装
需要 Python 3.11+、uv 和 Chromium 系浏览器。Windows 会自动寻找 Microsoft Edge。
git clone https://github.com/stardustlil/errorbook-mcp.git
Set-Location errorbook-mcp
uv sync --locked
uv run errorbook-mcp环境变量不会自动读取 .env;请在 MCP 客户端配置中直接设置。最小配置示例:
{
"mcpServers": {
"errorbook": {
"command": "uv",
"args": ["--directory", "C:\\path\\to\\errorbook", "run", "errorbook-mcp"],
"env": {
"ERRORBOOK_DATA_DIR": "C:\\path\\to\\errorbook-data",
"ERRORBOOK_TIMEZONE": "Asia/Tokyo"
}
}
}
}Hermes Agent
Hermes Agent v0.18+ 可以通过 stdio 直接加载全部工具。先完成上面的 uv sync --locked,再执行:
hermes mcp add errorbook `
--command ".venv\Scripts\python.exe" `
--connect-timeout 30 `
--env "ERRORBOOK_DATA_DIR=$env:LOCALAPPDATA\errorbook-data" "ERRORBOOK_TIMEZONE=Asia/Tokyo" `
--args -m errorbook_mcp当 Hermes 询问是否启用全部工具时直接回车,然后验证:
hermes mcp test errorbook
hermes mcp list请启动一个新的 Hermes 会话使配置生效。图片 OCR 由 Hermes 当前选择的视觉模型完成,因此该模型必须支持图片输入。
也可以直接运行模块:
uv run python -m errorbook_mcpAgent 录题流程
用户把错题图片上传给具备视觉能力的 agent。
agent 使用 MCP prompt
record_from_image的规则,将图片忠实转写成 Markdown;数学公式使用$...$或$$...$$LaTeX。agent 调用
create_problem。OCR 不清楚的内容不能猜,应先向用户确认。MCP 校验题型和选项,检查重复内容,并分配固定编号。
一个题目只保存规范化后的文本;原始图片仍由宿主应用管理。这样不需要在 MCP 中配置第二套视觉模型或上传凭据。
复习与出卷
做错后调用
record_review(outcome="incorrect");这既保留历史,也会通过 FSRS 自动提前下次复习。用户明确说“提高 EB-2026-000123 的优先级”时调用
adjust_priority。不要用优先级工具伪造一次作答。每周调用
create_review_sheet,默认选择已经到期和未来七天内到期的题目,并生成仅含题目的错题复习卷。工具返回本地绝对路径、SHA-256 和
errorbook://exports/...MCP resource URI。
PDF 将原始 Markdown 转为静态 MathML,再由本机 Edge/Chrome/Chromium 打印,不执行 JavaScript 或 TeX 程序。原始 HTML、外部图片、链接和危险 LaTeX 命令会被拒绝。资源读取时会重新核对 SHA-256;文件被替换或损坏时不会静默返回。
导出使用数据库租约。进程在渲染中退出时,原幂等键会先保持 generating;租约最多五分钟后,同一请求和同一幂等键可从已冻结的题目快照恢复,不会重新选题。导出成功只会保存 PDF 文件和导出记录,不会写回题目或调度状态。
数据与备份
默认数据目录是当前目录下的 data/:
data/
errorbook.sqlite3
exports/
tmp/停止 MCP 服务后,备份整个数据目录即可。不要只复制 SQLite 主文件而遗漏仍在使用中的 WAL 文件。
开发验证
uv sync --extra dev
uv run pytest测试覆盖数据库事务、并发稳定编号、幂等与崩溃恢复、FSRS 状态更新、优先级衰减、公平选卷、MCP stdio 往返、公式安全、PDF 文件完整性和真实浏览器渲染。
构建可分发 wheel:
uv build安全边界
MCP 不读取任意图片路径,也不向外部 OCR 服务发送题目。
题干按纯 Markdown 处理,原始 HTML 被转义;LaTeX 只转换为 MathML,不执行 TeX 命令。
stdio 模式的日志只写入 stderr,避免破坏 MCP 协议帧。
远程 streamable HTTP 部署需要由反向代理提供 TLS、认证和单用户隔离;默认配置面向本地 stdio。
streamable HTTP 模式本身不提供多租户隔离。不要把默认服务直接暴露到公网。
参与项目
开发流程见 CONTRIBUTING.md,架构与一致性边界见 docs/architecture.md。安全问题请按 SECURITY.md 私下报告,不要在公开 issue 中附带真实题目、数据库或访问凭据。
Available Tools
12 toolsadjust_priority调整错题优先级A
仅在用户明确要求提高或降低某编号优先级时调用。delta 为 -5..-1 或 1..5;影响按 14 天半衰期衰减,不会篡改 FSRS 或伪造复习。若用户说又做错了,应调用 record_review。
| Name | Required | Description | Default |
|---|---|---|---|
| delta | Yes | ||
| number | Yes | ||
| reason | Yes | ||
| idempotency_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full transparency burden and delivers useful context: delta range, 14-day half-life decay, and assurance that FSRS is not tampered with or reviews faked. It does not cover edge cases like invalid numbers, but the provided behavior is substantive.
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?
Three sentences, front-loaded with the trigger condition, and every sentence serves a purpose: usage, parameter meaning, or alternative. No wasted words.
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 the low complexity and presence of an output schema, the description covers the core behavior and usage context well. Missing details on idempotency_key usage and edge cases are minor but would strengthen completeness.
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. It explains delta's range and meaning, but the other three parameters (number, reason, idempotency_key) are left undefined beyond their names. This leaves a clear gap in parameter understanding.
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 clearly states the tool adjusts priority of a numbered problem, with the trigger condition '仅在用户明确要求提高或降低某编号优先级时调用'. It explicitly distinguishes itself from sibling record_review, making the purpose unambiguous.
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?
Provides explicit when-to-use guidance ('only when user explicitly requests priority change') and names the alternative tool record_review for the case where the user reports a mistake. This is clear usage differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_problem记录错题A
保存宿主视觉模型已转写并确认的单道题,分配不可变编号并初始化 FSRS。不要把未确认的 OCR 猜测写入题库。幂等键用于安全重试。
| Name | Required | Description | Default |
|---|---|---|---|
| draft | Yes | ||
| idempotency_key | Yes | ||
| duplicate_policy | No | return_existing |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses immutable numbering, FSRS initialization, and safe retry via idempotency key, which are meaningful behavioral traits. It also cautions against unconfirmed writes. It does not cover duplicate_policy semantics or auth, but overall it adds valuable context beyond a bare create operation.
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?
Three sentences with no redundancy. It front-loads the core action and adds warnings and retry context efficiently. Every sentence 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?
The description covers key aspects: saving confirmed data, immutable ID, FSRS initialization, and safe retry. The output schema exists, so return values need no explanation. It omits duplicate_policy semantics, but the schema's enum and default provide some guidance. Overall, it is complete enough for a create tool with a well-defined schema.
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 coverage is 0%, so the description must compensate. It explains idempotency_key's role (safe retry) but provides no additional meaning for draft or duplicate_policy. The draft structure is self-evident from the schema, but the description adds little beyond that, leaving a significant gap for two of three parameters.
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 clearly states the tool saves a confirmed, transcribed single question, assigns an immutable number, and initializes FSRS. This specific verb+resource combination distinguishes it from siblings like update_problem and search_problems.
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?
It explicitly warns not to write unconfirmed OCR guesses, providing a clear when-not-to-use condition. It also implies use for confirmed data and mentions idempotency for safe retries. However, it does not name alternative tools or discuss scenario-based selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_review_sheet生成复习 PDFA
冻结所选题目的当前版本并生成仅含题目的 A4 错题复习卷。scheduled 模式选择已到期、未来 horizon_days 内到期或有人工提升的题;生成试卷本身不会更新 FSRS。
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | ||
| idempotency_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the burden of behavioral disclosure. It usefully reveals that it freezes the current version of selected questions and does not update FSRS. However, it omits other relevant behaviors such as whether it is asynchronous, whether it mutates problem records, or how the returned object relates to the export workflow.
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 only two sentences, front-loaded with the primary purpose and followed by a concise mode-specific detail and side-effect note. Every sentence earns its place with no filler.
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 description covers the core purpose and an important non-mutating behavior, and an output schema exists to document return values. However, given the nested request parameters, lack of annotations, and sibling export/status tools, it does not fully contextualize how this tool fits into the export lifecycle or whether the PDF generation is synchronous.
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. It adds meaning for the `scheduled` mode and `horizon_days`, which is helpful. But it leaves several parameters like `numbers`, `tags`, `subjects`, `max_questions`, and `idempotency_key` unexplained, and the `all_active` and `numbers` modes are not clarified.
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 clearly states the tool's specific action: freezing the current versions of selected problems and generating an A4 review PDF containing only the questions. It also describes the scheduled mode's selection criteria, distinguishing this creation-focused tool from the sibling read/update/export tools.
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 by explaining what scheduled mode selects and noting that generating the sheet does not update FSRS, which hints at a boundary. However, it never explicitly says when to use this tool versus alternatives, nor does it name sibling tools like record_review or mention when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_export删除复习 PDFA
删除指定导出及其 PDF 文件,但不会修改题目、FSRS 或优先级。
| Name | Required | Description | Default |
|---|---|---|---|
| export_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It clearly discloses what is affected ('指定导出及其 PDF 文件') and what is not ('题目、FSRS 或优先级'). This goes beyond the tool name and provides useful context about side effects. However, it does not mention permanence or irreversibility, which is a common expectation for a delete operation, but the deletion is inherently destructive and the scope is well specified.
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 is concise and front-loaded. It states the primary action, the target, and a clear exclusion of unintended effects. Every part earns its place, with no filler or unnecessary detail.
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 is simple (one parameter, no annotations) and an output schema exists, so the description doesn't need to cover return values. However, the description lacks parameter guidance and explicit usage conditions. It covers purpose and side effects adequately, but the 0% parameter coverage creates a gap that the description does not fully fill, making it only minimally complete overall.
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 input schema has one parameter `export_id` with no description, and the schema description coverage is 0%. The description only references '指定导出' (specified export) without explaining the format of `export_id`, how to obtain it, or any constraints. Since the schema provides no information and the description barely adds value, the parameter semantics are weak.
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 explicitly states the tool's function: '删除指定导出及其 PDF 文件' (deletes the specified export and its PDF file). It specifies a clear verb ('delete') and resource ('export/PDF'), and the negative clause '但不会修改题目、FSRS 或优先级' distinguishes it from sibling tools that modify problems or priorities. This makes the purpose unambiguous and distinguished from siblings.
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: use this when you want to remove an export and its PDF. The negative statement about not modifying problems/FSRS/priorities provides some guidance on non-use cases, but it does not explicitly name alternative tools or state 'when not to use'. Guidance is 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.
get_export_status查看 PDF 导出A
按 export_id 获取导出状态、文件路径、资源 URI、大小和 SHA-256。
| Name | Required | Description | Default |
|---|---|---|---|
| export_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden but does disclose the return fields, which is useful. However, it does not elaborate on error behavior, prerequisites, or whether it is a read-only operation.
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 concise sentence that effectively communicates the tool's purpose and key output fields.
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 the tool's low complexity (one parameter) and the presence of an output schema, the description provides sufficient context about what the tool does and what information it returns.
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 coverage is 0% and the description only restates that export_id is used as the key. It does not provide additional context such as where to find the export_id or any format constraints.
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 clearly states the tool's function: retrieving export status and associated metadata (file path, resource URI, size, SHA-256) using an export_id. This distinguishes it from sibling tools like list_exports and delete_export.
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 provided on when to use this tool versus alternatives. The description only states the action, not the context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_library_stats错题本统计A
返回活动、已掌握、已归档、当前到期和七天内到期数量及学科分布。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies a read-only operation by stating it returns data, and it specifies the exact metrics computed, which adds some behavioral context. However, it does not explicitly confirm non-modification, real-time vs. cached data, or any prerequisites, so it falls short of full transparency.
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, tightly constructed sentence that front-loads the verb and lists all returned categories without redundancy. Every phrase earns its place, and it is easy to scan.
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 the absence of parameters and the presence of an output schema, the description sufficiently conveys the tool's scope and return values. It could be more explicit that statistics cover the entire mistake book, but the listed categories and subject distribution provide a solid understanding.
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 zero parameters, and the schema coverage is trivially 100%. With no parameters to describe, the baseline is 4. The description correctly adds no parameter details since none are needed.
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 '返回' (returns) and clearly enumerates the exact statistics provided: counts for active, mastered, archived, currently due, and due within seven days, plus subject distribution. This distinguishes it from sibling tools that manage individual problems or exports.
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 offers no guidance on when to use this tool versus alternatives, nor does it mention any exclusions or alternative tools. Users must infer from the tool name and the nature of the stats that this is for aggregate overviews.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_problem查看错题A
按固定编号精确读取错题;需要分析学习轨迹时可包含完整复习历史。
| Name | Required | Description | Default |
|---|---|---|---|
| number | Yes | ||
| include_history | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It clearly indicates a read operation ('读取') which implies no mutation, and it discloses the optional behavior of including complete review history. It does not explicitly state 'no side effects' or mention permission/rate limits, but for a simple get tool, the description provides sufficient behavioral context without contradiction.
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 compact sentence with two clauses. The main function is front-loaded, and the optional feature is appended concisely. Every phrase earns its place; there is no fluff or repetition.
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?
For a simple retrieval tool with two parameters and an output schema (which covers return details), the description is adequate. It covers the primary action and the only significant optional behavior (history). It does not detail error cases or prerequisites, but these are not critical for a get operation. Sibling tool names provide additional context that this is the single-problem fetch, not a search.
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 schema has 0% description coverage, so the description must compensate. It does so effectively: '固定编号' clarifies that 'number' is a fixed identifier, and '需要分析学习轨迹时可包含完整复习历史' explains the purpose and semantics of 'include_history'. Both parameters receive meaningful context beyond their type/default 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 '读取' (read) with a clear resource '错题' (wrong problem) and method '按固定编号' (by fixed number). It distinguishes itself from sibling tools like search_problems by emphasizing precise retrieval via a fixed identifier, and it adds the optional history inclusion, making the purpose unambiguous.
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 usage context is implied: use this tool when you have a fixed number and need a precise read. It does not explicitly name alternatives or exclusion criteria (e.g., 'use search_problems if you don't know the number'), but the phrasing '按固定编号' signals the precondition. The history clause gives a specific trigger for including history, providing some situational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_exports管理复习 PDFB
列出历史导出文件及其是否仍存在,不会改变题目调度状态。
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It explicitly discloses a key behavioral trait: it does not change scheduling state. It also indicates the output includes existence status. However, it does not mention other potential behaviors such as pagination or performance implications.
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, concise sentence that front-loads the main purpose and adds a useful non-mutation caveat. There is no unnecessary filler or repetition.
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 is simple, but the description leaves gaps: no usage alternatives, no parameter semantics, and only partial return information. The output schema (if present) may cover return details, but the description alone does not make the tool fully self-explanatory.
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 schema provides limit and offset parameters with defaults but no descriptions (0% coverage). The description does not mention pagination or explain how these parameters affect results, leaving the agent to rely on parameter names alone. This is a clear gap for a list operation.
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 clearly states the tool lists historical export files and their existence status, using a specific verb (list) and resource (exports). It is distinct from sibling delete_export and get_export_status in being a plural list, though it does not explicitly name alternatives. The title is broader but the description is precise.
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 versus alternatives is provided. The non-mutation caveat hints at safe usage, but the description does not mention cases where other tools like get_export_status or delete_export would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_review记录复习结果A
追加一次真实复习结果并更新 FSRS。incorrect=做错/空白,partial=部分正确或提示后正确,correct=独立正确,easy=明确轻松,skipped=只记录跳过且不改调度。普通答对应使用 correct,不要自动判为 easy。
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | ||
| number | Yes | ||
| outcome | Yes | ||
| reviewed_at | No | ||
| idempotency_key | Yes | ||
| duration_seconds | No | ||
| response_markdown | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It reveals that the tool mutates FSRS scheduling and that 'skipped' does not modify the schedule. However, it omits other behavioral traits such as idempotency handling, required-field dependencies, or error conditions.
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 packs the core action, outcome semantics, and a usage note without redundancy. It is front-loaded with the primary purpose and uses efficient enumeration.
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 7 parameters, no schema descriptions, and an output schema, so the description needs to cover the essentials for correct invocation. It only addresses the 'outcome' enum and skipped behavior, leaving the remaining six parameters completely unaddressed. This is insufficient for a tool of this complexity.
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 by explaining parameters. It thoroughly defines the 'outcome' enum values, but does not explain the purpose or format of other parameters like 'number', 'idempotency_key', 'reviewed_at', 'duration_seconds', 'response_markdown', or 'notes'. This leaves most parameters underspecified.
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 clearly states the tool's verb and resource: '追加一次真实复习结果并更新 FSRS' (append a real review result and update FSRS). This distinguishes it from sibling tools that handle problems, review sheets, exports, or status changes.
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?
It provides explicit guidance on when to use certain outcome values, e.g., '普通答对应使用 correct,不要自动判为 easy' and explains that 'skipped' only records without altering scheduling. However, it does not explicitly mention when not to use this tool or compare it to alternatives, though the purpose is unique among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_problems查询错题A
按文本、编号、学科、标签、题型、状态或到期时间查询。默认按当前周卷优先级排序,返回各评分分量和原因。
| Name | Required | Description | Default |
|---|---|---|---|
| filters | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for behavioral disclosure. It adds useful context about default sorting and that the response includes scoring components and reasons, which is non-obvious. However, it does not disclose potential side effects (e.g., read-only nature), pagination behavior, or any limitations, leaving some gaps.
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 two concise sentences, front-loaded with the primary action and filters, and adds the key behavioral detail about default ordering and return fields. Every sentence provides value without unnecessary fluff.
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 the tool's complexity (multiple filters, sorting, pagination), the description is somewhat minimal. It covers the main search dimensions and default sort, but doesn't mention limit/offset or other sort options. However, since an output schema is present, not explaining return values is acceptable. The description is adequate but could be more complete for a tool with this many parameters.
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 schema description coverage is 0%, so the description must compensate for parameter meanings. It lists the filter dimensions (text, number, subject, tag, type, status, due time) which maps to most schema properties, but it omits parameters like sort, limit, and offset, and does not explain their usage or formats. Thus, it partially compensates but is not exhaustive.
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 clearly states the tool's purpose: searching for problems (错题) using various criteria like text, number, subject, tag, type, status, or due date. It uses a specific verb '查询' (search) and resource, and distinguishes itself from sibling tools like get_problem by indicating it is a search/filter operation.
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 clear context on when to use this tool: when you need to search problems by any of the listed filters. It also mentions the default sorting behavior (by current week's priority), which is useful context. However, it does not explicitly name alternative tools or state when not to use this tool, so it's slightly 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.
set_problem_status设置错题状态A
将题目标为 active、mastered 或 archived。归档不会删除题目、编号、修订或复习历史。
| Name | Required | Description | Default |
|---|---|---|---|
| number | Yes | ||
| status | Yes | ||
| idempotency_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description's statement that archiving does not delete the problem, number, revision, or review history is a valuable, non-obvious behavioral guarantee. It addresses the destructive/non-destructive concern without contradicting any structured metadata, though it does not discuss other potential side effects.
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, well-structured sentence with no filler. It front-loads the primary action and then adds a key qualifying statement, making it easy to parse and efficient.
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 is simple and has an output schema, so return-value documentation is not needed. However, the description fails to explain the idempotency_key parameter and offers no usage context relative to update_problem, leaving some gaps for an agent preparing a correct invocation.
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 input schema has 0% description coverage, and the description only adds meaning for the 'status' parameter by listing its enum values. The 'number' and 'idempotency_key' parameters remain unexplained, leaving the agent to guess their purpose and format.
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 clearly states the tool's action ('set problem status') and the resource ('problem'), and explicitly lists the three allowed statuses: active, mastered, or archived. This distinguishes it from sibling tools like update_problem or adjust_priority, which focus on different attributes.
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 update_problem, record_review, or other siblings. It only describes what the tool does, not the scenarios that call for it, and offers no exclusions or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_problem修正错题A
修正 OCR 文本、标签等内容。必须传入读取时获得的 expected_version,冲突时重新读取,编号不会改变。
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | ||
| number | Yes | ||
| reason | Yes | ||
| idempotency_key | Yes | ||
| expected_version | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing behavior. It reveals the optimistic concurrency requirement (expected_version), the conflict resolution approach (re-read), and an important invariant ('编号不会改变' - number will not change). This is valuable beyond the schema, though it does not mention potential side effects or idempotency semantics.
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, front-loaded sentence that conveys the core purpose, the critical prerequisite, and a key invariant. Every clause earns its place with no redundancy or fluff.
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 description covers the essential action and concurrency mechanism, and an output schema exists to document return values. However, it omits guidance on constructing the patch object, the purpose of reason/idempotency_key, and partial-update semantics, making it less complete for a tool with 5 required parameters and no annotations.
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%, yet the description only explains one parameter (expected_version) and touches on '编号' (number) without detailing its role. The required parameters reason and idempotency_key are not explained at all, leaving the agent without sufficient understanding of why they are necessary or how to fill them.
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?
Description starts with '修正 OCR 文本、标签等内容' (correct OCR text, tags, etc.), clearly stating the action and target resource. This distinguishes it from sibling create_problem (creation) and get_problem (reading), making the purpose unambiguous.
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?
Provides a clear prerequisite: '必须传入读取时获得的 expected_version' (must pass expected_version obtained when reading), establishing when to use the tool relative to get_problem. It also advises on conflict handling ('冲突时重新读取'), but does not explicitly mention alternatives or when not to use it, so it falls short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct operation: problem CRUD, review recording, priority adjustment, status changes, export management, and statistics. No two tools have overlapping purposes; even get_problem vs search_problems are clearly differentiated by fixed ID vs. criteria-based search.
All tools follow a consistent verb_noun pattern in snake_case, such as create_problem, record_review, list_exports. There are no mixed conventions or vague verbs, making the API highly predictable.
12 tools is well within the ideal range for a domain-specific MCP server. Each tool serves a clear purpose in the error book workflow, from problem creation to review sheets and export management, without unnecessary bloat.
The tool surface covers the full lifecycle: create, read, update, search, review, priority, status, exports, and statistics. Archiving via set_problem_status addresses the absence of deletion, and get_problem can include review history, so there are no critical gaps.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
System-of-record notebook for AI coding agents: pages, datastores, tasks, skills over MCP.
Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Self-hosted AI-native knowledge workspace with hybrid search, GraphRAG, and MCP.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server for AI agents to read, write, and organize notes in a local-first, human-in-the-loop note-taking app.62MIT
- AlicenseNot gradedqualityBmaintenanceLocal-first MCP server for indexing and searching research materials (papers, notes, logs, READMEs) using SQLite FTS, with tools for memory management and evidence retrieval.MIT
- AlicenseNot gradedqualityBmaintenanceA Rust MCP stdio server for durable project-local AI notes, enabling agents to store, search, and manage verified facts, decisions, and conventions.14BSD 3-Clause
- AlicenseBqualityBmaintenanceLocal-first memory server for AI coding agents that stores work sessions, tasks, and durable memories in Markdown files, exposed through MCP tools for session management and memory retrieval.10111MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/stardustlil/errorbook-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server