关于 Citra
提供的 README 介绍的是 anymd:一款将文档和媒体转换为 Markdown 的本地 Rust MCP 服务及命令行工具。文档未说明 Citra 或其 PDF 问答能力,因此本简介仅依据 README 中的 anymd 功能。
主要功能
- 01将文档和媒体转换为 Markdown
- 02支持 PDF、Office、EPUB、HTML、图像、音频和视频
- 03跨文件、文件夹和网址搜索
- 04检查 PDF 结构、页面和区域
- 05本地运行,提供 OCR 和转录选项
适用场景
- 01为 Agent 工作流整理 PDF 和 Office 文件
- 02搜索合同或研究论文文件夹
- 03将网页文章或目录转换为 Markdown
- 04从扫描页面和媒体中提取文本
MCP 相关
通过 stdio 向 MCP 客户端提供 `outline`、`read`、`search` 和 `inspect` 工具。客户端可读取文件、网址或文件夹,搜索内容并检查 PDF。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
4收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| after | string | 是 | after 文档的本地 PDF 路径。 |
| before | string | 是 | before 文档的本地 PDF 路径。 |
| context_chars | integer|null | 否 | |
| max_file_bytes | integer|null | 否 |
详细介绍
anymd
支持 PDF、Word、PowerPoint、Excel、EPUB、HTML 和网页、图像(OCR)、音频和视频(元数据、字幕、转录文本)。这是一款在本机运行的高速 Rust MCP 服务和命令行工具。无需 API 密钥。
anymd 是与 Sylphx AI parse 相同 crates 的免费本地模式。Sylphx AI parse 是托管式文档解析服务:使用相同的 crates,按页计费托管,适合不想在本地运行的调用方。
安装 · 基准测试 · 工具 · 命令行 · 格式 · 文档 · 专业版
原名 pdf-reader-mcp。从 pdf-reader-mcp 迁移
未经剪辑的真实终端录屏(asciinema + agg,脚本)。最后一条命令是 Claude Code 通过 anymd MCP 服务根据 PDF 作答。
npx -y @sylphx/anymd setup # add anymd to every MCP client on this machine
npx -y @sylphx/anymd report.pdf > report.md # or convert from the shell
为什么选择 anymd
-
快速。 原生 Rust 按页并行转换。在 38 份基准测试文档上,anymd 总耗时 11.5 s;docling 耗时 2,432.4 s(慢 212 倍),markitdown 耗时 75.6 s(慢 7 倍);marker 转换其中 30 份耗时 7,104.5 s,而 anymd 转换同样 30 份只需 4.64 s(快 1,532 倍)。
-
精准。 布局引擎根据字形间距重建单词,按阅读顺序排列双栏论文,并还原表格,包括无边框表格。文本与印刷内容完全一致,不会粘连单词,也不会打乱分栏。
-
节省 token。 页面以 Markdown 返回,带有 `` 引用锚点、小型 front-matter 标头和紧凑表格。token 预算和游标可确保大型文档在 Agent 的上下文范围内。
-
一次调用支持所有格式。 一个工具即可读取下方列出的所有格式。它还接受网页 URL 和整个目录,
search可搜索其中的所有内容。 -
本地且私密。 不会上传任何内容。OCR 使用已安装的本地 doc-VLM 模型或 tesseract;转录使用 ffmpeg 和内置的 Qwen3-ASR。设置 OCR 和下载 ASR 模型都需要明确同意。
安装
只需一条命令,即可将 anymd 添加到本机上的所有 MCP 客户端(Claude Code、Codex、Cursor、VS Code、Claude Desktop、Windsurf、Gemini CLI):
npx -y @sylphx/anymd setup # --dry-run to preview, --remove to undo
或者手动添加:所有 MCP 客户端都运行相同的命令 npx -y @sylphx/anymd。唯一要求是 Node 18+;npm 会为你的平台安装原生二进制文件。
Claude Code
claude mcp add anymd -- npx -y @sylphx/anymd
也可以通过 anymd 技能作为插件安装:运行 /plugin marketplace add SylphxAI/anymd,然后运行 /plugin install anymd@anymd。
Codex
codex mcp add anymd -- npx -y @sylphx/anymd
或者添加到 ~/.codex/config.toml:
[mcp_servers.anymd]
command = "npx"
args = ["-y", "@sylphx/anymd"]
Cursor
或者添加到 .cursor/mcp.json:
{ "mcpServers": { "anymd": { "command": "npx", "args": ["-y", "@sylphx/anymd"] } } }
VS Code
点击一次即可安装到 VS Code,也可以在终端中运行:
code --add-mcp '{"name":"anymd","command":"npx","args":["-y","@sylphx/anymd"]}'
或者添加到 .vscode/mcp.json:
{ "servers": { "anymd": { "type": "stdio", "command": "npx", "args": ["-y", "@sylphx/anymd"] } } }
Claude Desktop
一键安装:从最新版本下载 anymd-<version>.mcpb 并打开。或者手动安装:
将内容添加到 claude_desktop_config.json(设置 → 开发者 → 编辑配置):
{ "mcpServers": { "anymd": { "command": "npx", "args": ["-y", "@sylphx/anymd"] } } }
Windsurf、Zed、Cline 及其他客户端
任何通过 stdio 使用 MCP 的客户端:命令为 npx,参数为 ["-y", "@sylphx/anymd"]。若要将服务限制在单个文件夹内,请添加 --allow-dir=/path/to/docs。
仅使用 CLI
npm install -g @sylphx/anymd # or run it once with: npx -y @sylphx/anymd <file>
Python wheel 包含相同的预构建二进制文件,并从发布后的首个版本起在 PyPI 上以 anymd 的名称提供。
Windows:winget install Sylphx.anymd。macOS 和 Linux:brew install sylphxai/tap/anymd。Scoop:scoop bucket add sylphx https://github.com/SylphxAI/scoop-bucket && scoop install anymd。
Docker(amd64 和 arm64):
docker run --rm -v "$PWD:/data" ghcr.io/sylphxai/anymd report.pdf > report.md
docker run -i --rm ghcr.io/sylphxai/anymd # MCP server on stdio
或者从 crates.io 构建(需要 Rust 1.95+、CMake 和 C++ 编译器;包含 doc-VLM OCR 和本地 ASR):
cargo install anymd
npm、pip 和 Docker 提供预构建二进制文件,而 cargo install 会在你的机器上编译二进制文件。
基准测试
AgentDocBench 是一项面向 Agent 文档转 Markdown 的开放基准测试:涵盖 12 类符合许可证要求的文档(数学论文、双栏论文、财务表格、表单、扫描件、中日韩文字、幻灯片、电子表格、Word、EPUB、HTML),并根据逐字匹配句子、文本 F1、阅读顺序和表格单元格评分,同时统计耗时和输出 token 数。所有工具都在同类 GitHub 托管运行器(4 个 CPU)上运行:
| anymd | docling | kreuzberg | unstructured | markitdown | marker | pdftotext | |
|---|---|---|---|---|---|---|---|
| 总分 | 96.4 | 93.0 | 81.7 | 81.2 | 76.8 | 71.0 | 42.2 |
| 表格单元格 F1 | 92.2 | 89.9 | 38.4 | 38.4 | 57.2 | 60.9 | 0.0 |
| 阅读顺序 | 98.8 | 94.4 | 96.8 | 93.9 | 85.5 | 76.8 | 52.0 |
| 转换的文档数 | 38/38 | 38/38 | 38/38 | 38/38 | 38/38 | 30/38 | 23/38 |
| 所有文档耗时 | 11.5 s | 2,432.4 s | 16.0 s | 346.5 s | 75.6 s | 7,104.5 s | 0.90 s |
生成的排行榜、各类别得分(包括 anymd 表现较差的类别)和评测方法见基准测试指南。语料库、标准答案、适配器和原始结果位于 bench/,而 Benchmark 工作流 会重新运行所有测试;新工具只需一个适配器文件即可加入。
图像和视频提取
图像和视频基准测试 分别涵盖页面图像 OCR 和嵌入式视频字幕:
| 数据集 | anymd | 参考替代方案 |
|---|---|---|
| OmniDocBench v1.6(1,651 张页面图像),总体 ↑ | 21.4(8.1.0,英语 tesseract) | TeleOCR 96.91(作者报告的数据,并非我们在相同运行中测得) |
| MP4 mov_text 测试样本(4 段视频,12 条字幕),文本/起始时间召回率 ↑ | 91.7%(8.5.1,11/12) | FFmpeg 100%(12/12) |
| Matroska SubRip 测试样本(4 段视频,12 条字幕),文本/起始时间召回率 ↑ | 91.7%(8.5.1,11/12) | FFmpeg 100%(12/12) |
图像分数是历史数据,并非当前 OCR 模型的分数。视频分数于 2026-10-08 使用小型自建回归数据集测得,并非来自电影或讲座;anymd 会漏掉在不同时间戳重复出现的字幕。 这些分数衡量的是嵌入式字幕提取,而非视觉理解或 ASR。指南中提供了替代方案选择、局限性、耗时、原始输出和复现测试工具。
MCP 工具
anymd 提供四种工具。
| 工具 | 用途 | 关键参数 |
|---|---|---|
outline | 浏览标题树,查看节点 ID 和单元/Markdown 范围 | source、format(json · tree) |
read | 将文件、URL 或文件夹转换为 Markdown | source、pages("1-5,8")、max_tokens(默认值 20000)、cursor、ocr、images(refs · none)、revisions(markup · accept · reject)、transcript、download_asr_model |
search | 在文件、文件夹和 URL 中查找文本 | query、sources、mode(auto · literal · ranked)、glob、max_results |
inspect | 深入检查 PDF | operation:render_page、extract_regions、ocr_pages、structure(包含几何信息的 JSON)、compare、inspect、cite_check(支持引文和位置,anymd Pro) |
read 的回答如下:
---
source: papers/attention.pdf
title: Attention Is All You Need
pages: 15
showing: pages 1-9
---
# Attention Is All You Need
…
|Model|BLEU EN-DE|BLEU EN-FR|
|-|-|-|
|Transformer (big)|28.4|41.8|
…
search 的回答会为每条命中结果提供一行:
5 matches for "masked language model" (2 files, 31 sections searched)
### papers/bert.pdf (5)
- p.1: …by using a “**masked language model**” (MLM) pre-training objective, inspired by the Cloze task…
- p.2: …In addition to the **masked language model**, we also use a “next sentence prediction” task…
如果没有完全匹配的结果,search 会回退到按 BM25 排序的段落,因此像“how does bidirectional pretraining work”这样的问题仍能找到正确的页面。
CLI
同一个二进制文件也是命令行转换器,类似 MarkItDown,但速度快得多:
anymd report.pdf > report.md # a file
anymd deck.pptx notes.docx budget.xlsx # several files, each with a header
anymd https://example.com/article # a web page (main content only)
cat scan.png | anymd - --ocr # stdin, with OCR
anymd setup ocr # one-time: install the OCR engine and pinned local models (~2 GB)
anymd scan.png --ocr vlm # tables as Markdown, formulas as LaTeX
anymd paper.pdf --pages 1-3 --max-tokens 4000
anymd search "indemnification" contracts/ --glob '*.pdf'
anymd doctor # lists the optional tools anymd found
在 MCP 客户端中不带参数运行(通过管道传入 stdin),或运行 anymd mcp,即可通过 stdio 提供 MCP 服务。
格式
| 输入 | 输出内容 |
|---|---|
按阅读顺序生成 Markdown:标题、段落、列表、表格、上下标、`` 标记,以及以大纲形式呈现的书签。移除页眉和页码。仅含图像的页面在显式设置模型后使用本地 doc-VLM OCR,否则使用已安装的 tesseract。嵌入的图表会保存到 anymd 缓存中,并连同标题标记在原位(images: "refs",默认值)。 | |
Word .docx | 标题、粗体/斜体、链接、嵌套列表、含合并单元格的表格、脚注、以 LaTeX 表示的公式、作为图像文件的嵌入图片,以及以 CriticMarkup 表示的修订和评论 |
PowerPoint .pptx | 按演示文稿顺序,每张幻灯片对应一个部分;包括标题、项目符号、表格、图表数据、演讲者备注,以及作为图像文件的图片 |
Excel .xlsx .xls .ods · CSV/TSV | 每张工作表对应一个表格;日期使用 ISO 字符串;每张工作表最多 2,000 行 |
| EPUB | 按 spine 顺序,每章对应一个部分,另含标题和作者;图片作为图像文件 |
| HTML 和 URL | 仅提取正文:移除导航、Cookie 横幅和侧边栏。解析相对链接,并保留代码的语言。 |
| Markdown、文本、JSON | 原样返回,并添加分页 |
| 图像 | 尺寸和 EXIF 信息(相机、日期、GPS),以及在设置模型后运行的本地 doc-VLM OCR,或已安装的 tesseract |
| 音频 / 视频 | 时长、流、章节、内嵌字幕和外置字幕(通过 ffprobe/ffmpeg)。设置 transcript: true 可获取本地 Qwen3-ASR 转录;download_asr_model: true 会启用转录;仅设置 transcript: true 绝不会下载模型权重。 |
工作原理
对于 PDF,anymd 读取字形位置,而不是文本片段。它根据基线将字形分组为行,因此可以处理上标和下标。单词之间的空格根据字形间距确定,并参考字体大小进行测量,再根据字距调整。具备列感知能力的 XY cut 算法会查找连续文本之间的栏间空白。有绘制线条的表格依据线条识别(两个单元格之间缺少分隔线时,会将它们视为合并单元格);没有线条的表格则依据对齐的空白列识别。换行的单元格文本会保留在原单元格中,堆叠的表头行会合并为一个表头,跨越多列的表头则会保留在每一列中。读者无法看到的文本(不可见文本,或与其所在框背景颜色相同的文本)会被排除。页面会并行处理且彼此隔离,因此单个格式错误的页面不会导致整个文档处理失败。其他格式均使用 Rust 原生解析(zip/XML、calamine、html5ever);整个过程不涉及 Python、LibreOffice 或云服务。
anymd Pro
anymd 核心功能免费且开源(MIT),此前免费的功能不会转移到 Pro。anymd Pro(当前为一次性价格,适用于 8.4.0 起的版本)只为必须展示证据的 Agent 增添两项功能:带精确哈希帧的视频时间轴(inspect 的 video_timeline 和 render_frame,以及 read 和 outline 的 timeline 选项),以及引用核查,用于验证 PDF 中特定页面和位置的引文。许可证离线验证;无需账户。Pro 收入用于支持 anymd 的开发。购买 anymd Pro,付款后即可立即获取:从结账确认页面复制许可证令牌,或通过产品的恢复页面找回。在终端购买:运行 anymd pro buy,即可在浏览器中打开结账页面,并在此设备上将付款转换为许可证令牌,无需复制。查看 anymd Pro。
本地版与托管版
anymd 有两种模式,只有一种在你的机器上运行:
- 本地版(免费、MIT、此仓库)。
anymd二进制文件、MCP 服务、命令行工具以及anymd-core、anymd-pdf和anymd-formatscrate。它在你的机器上进行转换,不会上传任何内容,也不需要 API 密钥。 - 托管版(Sylphx AI parse,按量计费)。 相同的 crate 以发布版本固定,并原样导入,为不想使用本地运行时的 Sylphx AI 调用方提供文档解析服务。调用按页计费,且需要 Sylphx AI 账号。这是付费模式;没有许可证密钥,本地二进制文件中的任何功能也不会因此受到限制。
Sylphx AI parse 不是另一种解析器,也不是分支:托管服务会导入这些 crate,因此此处的修复会同时影响两种模式,它们不会分化成独立的引擎。此仓库中只有免费的本地二进制文件;托管服务则运行在 Sylphx 平台上。
对于导入方,anymd-core、anymd-pdf 和 anymd-formats crate API 在同一主版本内保持稳定:除非升级主版本,否则不会发布破坏性变更,因此服务固定使用的版本会持续正常运行,并会审慎地升级,绝不会因补丁版或次版本发布而被迫升级。
安全性
- 本地优先:除非你传入 URL,否则文档不会离开你的机器;即使传入,也只会获取该 URL。
- URL 获取会屏蔽专用地址和环回地址,并在每次重定向时重新检查,且会固定到解析出的地址。
--allow-dir=<path>(可重复指定)或MCP_PDF_ALLOWED_DIRS会将服务限制在你列出的目录中。- 嵌入的图像只会写入 anymd 自己的缓存目录(
ANYMD_CACHE_DIR,否则使用平台缓存目录),不会写在源文档旁边;超过 50 百万像素的图像将被拒绝。 - 外部工具(tesseract、ffprobe、ffmpeg)均为可选。anymd 会在不使用 shell 的情况下运行它们,并设置超时和输出上限。
如需报告漏洞,请参阅 SECURITY.md。
Sylphx 的其他项目
- repomap:为 AI Agent 提供代码库地图:代码图、搜索、调用路径和变更影响。
- lockdocs:根据 lockfile 提供精确到版本的库文档。本地运行、离线可用、没有速率限制。
- skills:经实战验证的 Claude Code 和 Codex Agent 技能,一条命令即可安装。
- readme-mark:通过一个 URL 生成精美的 README 图像:横幅、徽章、图标和统计卡片。
- Sylphx apps:Sylphx 提供的应用和工具。
了解更多 Sylphx 项目:https://sylphx.com/open-source
Star 历史
许可证
MIT © Sylphx
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。