librarian-cli 是一个将电子书转换为干净、按 token 计数的 Markdown 章节的工具。它支持多种输入格式,包括 FB2、EPUB、DOCX、HTML、TXT/MD 以及文本层 PDF。转换过程无网络、无 LLM、无随机性,同一输入文件始终产生字节级相同的输出,因此摄取过程可复现且可缓存。
主要能力:
- 将任意电子书转换为包含干净章节和 token 计数的目录。
- 内置 stdio MCP 服务器,提供 6 个只读工具:list_books、list_chapters、find、get_chapters、book_info、verify_quote。Claude 可通过这些工具浏览书库目录、搜索、在 token 预算内提取章节,并自行核对引文与原文是否一致。
- 确定性 RAG:无需嵌入、无需网络、无需 API 密钥。
- lib verify 命令:检查引文是否逐字出现在库中。支持书模式(--book <id>)和书架模式(无 --book)。书模式可对单本书进行全扫描,无需搜索索引;书架模式通过 FTS5 候选进行全库归属,要求引文至少包含 5 个实词(停用词不计),否则跳过并返回 verdict: null。
- 评分系统:每本书从五个指标(覆盖率、结构、垃圾、编码、去连字符)获得评分。ok(分数 ≥ 0.90,无硬触发)静默保存;review(0.60 ≤ 分数 < 0.90,或存在触发)保存并警告,可通过 lib doctor <id> 查看详情;failed(分数 < 0.60)不保存。
使用方式:
- 通过 --library <path> 指定书库根目录,或使用 LIB_HOME 环境变量,默认 ./library。
- 数据输出到 stdout,诊断信息输出到 stderr。
- 退出码:0 成功,1 运行时错误,2 用法错误。lib verify 使用 grep 风格语义(与项目通常的“1 = 运行时错误”不同):退出码 1 且 stdout 非空表示“已检查,未确认”;退出码 1 且 stdout 为空表示错误(诊断信息在 stderr)。退出码 0 包含 close 情况,严格 CI 门禁应检查 --json 输出中的 verdict == "exact",而非仅看退出码。
- Claude Desktop 配置:在 claude_desktop_config.json 中配置 MCP 服务器。
适用场景:
- 需要让 Claude 阅读本地电子书库,并确保引文准确。
- 构建离线、确定性的 RAG 系统,无需嵌入和网络。
- 在 CI 中验证引文是否逐字出现在电子书中。
限制:
- PDF:在排版正常的书籍上表现良好;复杂布局可能落入 review。
- 不规避 DRM;来源合法性由用户负责。
- 不支持网络文件系统(NFS/SMB),因为建议锁不可靠。
- 不支持 MOBI/DJVU 和无文本扫描版(v3 候选:OCR、calibre)。
- CLI 消息目前为俄语;英文输出计划中。
- lib verify:不支持跨章节边界的引文(v1);单字替换的 close 判定从约 150 字符的引文起较为现实,更短的引文若替换一字会如实归为 distorted。
- 书架模式(无 --book)需要 FTS5 搜索索引;书模式(--book <id>)在 CLI 中无需索引。lib serve 整体仍需要 FTS5,启动时会同步索引。
- 书模式扫描全书章节文本使用纯 Python,长书可能耗时几秒 CPU;MCP 工具在工作线程中运行,不会阻塞服务器。