Librarian

io.github.Terobyte由 GitHub 账号 Terobyte 发布v0.1.1更新于 Oct 24, 2026

Deterministic ebook-to-markdown pipeline with MCP tools to browse, search, and read your books.

已验证STDIO仅桌面文件与存储知识与记忆

概览

AI 生成的概览

本地 MCP 服务器,把电子书转成干净的 Markdown 章节,让助手离线浏览、搜索、阅读书库并核对引文。

可以做什么
列出书库中的书籍,以及某本书的章节(含 token 数与摘要),并给出书籍元数据与入库质量指标。在全书库范围内对章节、标题和作者做全文检索并返回片段。按范围或按 token 预算读取章节,使内容适配模型上下文窗口。核对引文是否出自某本书,或在整个书库中定位出处,返回 exact、close、distorted、not_found 等判定。
适用场景
适合在本地保存电子书库、希望助手依据这些书作答、在 token 预算内取出合适章节,或检查自己给出的引文是否确实出现在原文中。适用于无需向量嵌入和 API 密钥的离线、可复现检索。
运行要求
作为本地 stdio 进程运行,从 PyPI 包 librarian-cli 安装(例如 uv tool install 或 pipx)。书库根目录由环境变量 LIB_HOME 或 --library 选项指定,默认 ./library。书籍需先用命令行工具入库。安装和运行都不需要网络、API 密钥或账号。
安装前请注意
MCP 工具为只读,但命令行可执行入库、重建和删除书籍,应避免让助手触达这些破坏性命令。不绕过 DRM,来源合法性由用户负责。不支持 NFS、SMB 等网络文件系统。命令行提示目前为俄语,且服务器启动时依赖 FTS5 搜索索引。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Librarian,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

📚 librarian

[CI] [PyPI] [Python versions] [License] [MCP registry]

Turn any ebook into clean, token-counted Markdown chapters — let Claude read your bookshelf over MCP and catch it misquoting your books. Deterministic RAG: no embeddings, no network, no API keys.

[demo]

Any input format — FB2, EPUB, DOCX, HTML, TXT/MD, text-layer PDF — becomes a directory of clean chapters with token counts. No network, no LLM, no randomness: the same input always produces byte-identical output.

Install

uv tool install librarian-cli# or: pipx install librarian-cli

Offline contract: install and runtime need no network (the tokenizer's vocabulary is vendored in the package).

Quick start

lib ingest examples/*.epublib listlib find curiouserlib get <book-id> --budget 3000

Commands

CommandPurpose
lib ingest <files…> [--force] [--no-keep-source] [--config cfg.toml] [--verbose]Process books into the library; prints a file · id · status · score table.
lib list [<book-id>]No argument — all books; with an id — that book's chapters (n, title, tokens, summary).
lib get <book-id> <spec>Print chapters by range (1-3,7) to stdout.
lib get <book-id> --budget N [--from K]Greedily print consecutive chapters from K while the token sum stays ≤ N.
lib find <query> [--limit 10] [--book <id>] [--reindex] [--json]Full-text search across chapters and titles/authors library-wide (bm25, snippets, RU/EN stemming).
lib info <book-id>JSON: book metadata + quality metrics.
lib doctor [<book-id>]No id — books in review and broken directories; with id — that book's report.
lib reingest --all [--config cfg.toml] [--verbose]Rebuild the library from source/ with the current code/config.
lib rm <book-id>Delete a book and rebuild the index.
lib serve [--library <path>]Stdio MCP server over the library.
lib verify "quote" [--book ID] [--json] [--limit N]Check a quote against one book or attribute it across the library.

Library root: --library <path> (or the LIB_HOME env var, default ./library). Data goes to stdout, diagnostics to stderr. Exit codes: 0 success, 1 runtime error, 2 usage error.

Give Claude your bookshelf

librarian-cli ships a built-in stdio MCP server with 6 read-only tools — list_books, list_chapters, find, get_chapters, book_info, verify_quote — so Claude can browse the catalog, search it, pull chapters under a token budget, and check its own quotes against the source on its own: deterministic RAG with no embeddings, no network, and no API keys.

Claude Code:

claude mcp add librarian --env LIB_HOME=$HOME/books -- uvx librarian-cli

Claude Desktop (claude_desktop_config.json):

json
{  "mcpServers": {    "librarian": {      "command": "uvx",      "args": ["librarian-cli"],      "env": { "LIB_HOME": "/path/to/books" }    }  }}

Verify quotes

An MCP server that catches Claude misquoting your books.

lib verify "quote" checks whether a quote actually appears in your library, verbatim — punctuation, case, ё/е, and markdown formatting don't count. Two modes:

  • Book mode (--book <id>): full scan of one book — "does this book actually say this?" Works without the search index.
  • Shelf mode (no --book): attribution across the whole library via FTS5 candidates — "which book is this from?" The quote needs at least 5 significant words (stop words don't count), or the check is skipped with verdict: null.
lib verify "Рукописи не горят" --book bulgakov-master-i-margaritalib verify "рукописи не горят никогда"
verdictmeaning
exactmatches after normalization (punctuation/case/ё/typography don't count)
closesimilarity ≥ 0.95 — near-exact, differences shown as a word-diff
distortedsimilarity ≥ 0.75 — the right place, but the quote is misremembered
not_foundsimilarity < 0.75 — nothing like it in the book/library
nullcheck wasn't run: empty quote, or a short quote without --book

Exit codes (grep-style semantics, a deliberate departure from the project's usual "1 = runtime error" — see docs/MILESTONES.md deviation 38):

exitcasestdout
0exact / close — quote confirmedfull report / JSON
1distorted / not_found — not confirmedfull report / JSON
1runtime error (unknown book id, no search index, locked index)empty
2usage error: empty/short quote (verdict: null), --limit < 1empty (message on stderr)

Script discriminator: exit 1 with non-empty stdout means "checked, not confirmed"; exit 1 with empty stdout means an error (diagnostics went to stderr instead). Exit 0 includes close — a strict CI gate must check verdict == "exact" in the --json output, not the exit code alone.

Quality

Every book gets a score from five metrics (coverage, structure, garbage, encoding, dehyphenation): ok (score ≥ 0.90, no hard triggers) — saved silently; review (0.60 ≤ score < 0.90, or triggers present) — saved with a warning, details via lib doctor <id>; failed (score < 0.60) — not saved. Scans and password-protected PDFs honestly fail (OCR and DRM removal are out of scope).

Determinism

The pipeline has no network access, no LLM calls, and no randomness — the same input file always produces byte-identical output. That makes ingestion reproducible and cacheable, and it's what makes lib serve's RAG deterministic: no embeddings to drift, no model calls to vary between runs.

Limitations

  • PDF: works well on typographically normal books; complex layouts may land in review.
  • DRM is not circumvented; source legality is the user's responsibility.
  • Networked filesystems (NFS/SMB) are not supported (the advisory lock isn't reliable there).
  • MOBI/DJVU and text-less scans are not supported (v3 candidates: OCR, calibre).
  • CLI messages are currently in Russian; English output is planned.
  • lib verify: quotes spanning a chapter boundary are not supported (v1) — the best you'll get is distorted on one half.
  • lib verify: close on a single-word replacement is realistic from ~150 characters of quote; shorter quotes with a replaced word honestly land in distorted — a third of a three-word quote really is a distortion.
  • lib verify shelf mode (no --book) needs the FTS5 search index; book mode (--book <id>) works without it in the CLI. lib serve as a whole still requires FTS5 — it syncs the index at startup regardless of which tool gets called.
  • lib verify in book mode scans the whole chapter text in pure Python; a long book can take a few seconds of CPU. The MCP tool runs it in a worker thread so it doesn't block the rest of the server.

Русская версия

See README.ru.md for the Russian documentation.

来源:README.md,提交 9ad3b3c

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.1最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分