关于 refigure
refigure 将 DOCX 和 XLSX 转为 Markdown,面向文档处理流程及可调用 MCP 工具的 Agent。它直接提取 OOXML 图表数据,并可选用 VLM 解读缺少原生数据的复合图形。
主要功能
- 01提取 OOXML 原生图表数据
- 02保留复合图形位置标记
- 03可选 VLM 解读图形
- 04提供 Python 库和命令行
- 05支持批量转换及逐文件隔离
- 06附带 MCP 工具、资源和提示词
适用场景
- 01将 DOCX 报告转为 Markdown
- 02从 XLSX 图表提取数据
- 03批量转换文档并单独处理失败
- 04让 MCP 客户端调用文档转换
MCP 相关
refigure-mcp 通过 stdio 或带令牌认证的 Streamable HTTP 暴露 DOCX、XLSX 和批量转换工具。它还提供转换资源及帮助客户端选择工具和 VLM 设置的提示词。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
refigure
图表转换后,图表数据依然完整。
DOCX/XLSX → Markdown,保留图表和信息图中的机器可读数据,而不是让它们在 OCR 或视觉模型处理中丢失:从原生 OOXML 图表数据(numCache/strCache)中还原精确数值,无需调用 GPU 或 VLM,也不会损失精度——这就是默认方式,而非备用方案。
这条默认路径也是基础安装(pip install "refigure[docx,xlsx]")比基于 PyTorch 的替代方案轻约 500 倍(5.6MB,而替代方案有数 GB)的原因——核心转换完全不需要 ML 模型。这个数据反映的是核心架构,而非所有分发格式:Docker 镜像有意增大体积,打包了 VLM 提供方和 LibreOffice,以便开箱即用地处理复合图表(见下文 Docker)。
只有极少数图表完全没有原生数据(例如仪表盘截图)时,才需要 VLM 进行解读——无论采用哪种分发格式,从图表中获取真实数值都不需要 VLM。
提供库、CLI、MCP 服务和一键安装的 Claude Desktop 套件——所有入口都返回保留原生精度的相同结果,不会向 Agent 提供降级后的摘要。
功能
- 原生图表数据提取——直接读取 OOXML
numCache/strCache,图表无需经过栅格化、OCR 或 VLM 步骤,每次都能获取真实数值。 - 组合图形的定位零损失标记(DOCX)——mammoth 原本会将组合形状/信息图静默拆散为互不相连的片段,现在会为其生成清晰的标记,并保留位置和所有标题文字。即使资金充足的现有方案也不具备此功能——参见 Docling issue #1287。
- 可选的 VLM 解读(DOCX 组合图形,
[vlm]扩展包、--vlm/Config(use_vlm=True))——在零损失基础上,为完全没有原生图表数据的图形(例如仪表板截图)提供云端描述和真正渲染的 mermaid 图表(支持 26 种图表类型——流程图、饼图/XY 图、时序图/状态图/ER 图、甘特图/时间线/桑基图/树图等,参见下文的状态)。不依赖特定提供商——默认使用 OpenRouter,也可通过--vlm-provider直接连接 OpenAI/Ollama/vLLM/LM Studio/Anthropic([vlm-direct]扩展包)。--strict会将一种特定故障(系统缺少soffice/LibreOffice 二进制文件)从优雅跳过升级为硬错误;其他所有 VLM 故障仍会降级处理。 - 丰富的类型化结果——
ConversionResult(Markdown + 警告 + 图表/组合图形计数 +vlm_used),而非单纯的字符串。 - 内置 CLI——
refigure控制台命令,以标准输入/输出为先,支持原生批处理模式和类型化退出码(见下文)。 - 内置 MCP 服务——
refigure-mcp控制台命令([mcp]扩展包),支持 stdio 或 Streamable HTTP,提供工具/资源/提示词,支持按文件隔离的批量转换(见下文)。 - Docker 镜像——
ghcr.io/helgdemidov/refigure,两个控制台命令均已加入PATH,并内置soffice/LibreOffice——VLM 组合图形处理路径开箱即用,无需手动安装 LibreOffice。支持多架构——linux/amd64+linux/arm64,兼容原生 Apple Silicon(见下文)。 - 适用于 Claude Desktop 的
.mcpb捆绑包——一键安装,无需终端(仅支持docx+xlsx,见下文)。
演示
可选的 VLM 解读 — 针对完全没有原生图表数据(是截图,而不是 OOXML 图表部件)且没有匹配的 mermaid 结构的图形,例如(a)密集的放射状旭日图——原有的 4 种 mermaid 类型都无法表示它。--vlm 不仅能还原真实内容,还能生成真正可渲染的图表,而不只是还原文本:
原生图表数据提取 — 提取真实的 OOXML numCache,不是截图,也不是 OCR:
相同的提取方式,也适用于 DOCX — Word 也会嵌入原生图表,不只有 Excel;无论哪种格式,refigure 读取的都是相同的 OOXML 缓存数据:
组合图形 — 即使图形本身无法渲染,也能保留位置且不丢失任何内容(目前没有其他工具能做到这一点——参见 Docling issue #1287, 该问题已开放超过 1 年):
快速开始
pip install "refigure[docx,xlsx]"
refigure report.docx # markdown to stdout
from refigure.docx import convert
result = convert("report.docx")
print(result.markdown)
print(f"{result.charts_found} charts, {result.groups_found} composite figures")
也可以通过 uv/uvx 使用,无需永久安装:
uvx --from "refigure[docx,xlsx]" refigure report.docx
对于图表引擎无法独立重建的组合图形,可选用 VLM 解读(参见上方的功能介绍):
pip install "refigure[docx,vlm]"
export OPENROUTER_API_KEY=... # or --vlm-api-key-file/--vlm-provider
refigure report.docx --vlm # needs the system soffice/LibreOffice binary too
安装与使用
一个转换器,四种运行方式——选择最适合你工作流的方式。点击标题可展开。
CLI — 控制台命令,以 stdin/stdout 为主,支持原生批处理模式
refigure 会安装一个控制台命令——它只是对程序化调用的同一个
convert() 的轻量封装,不包含独立逻辑:
refigure report.docx # markdown to stdout
refigure report.docx -o report.md # markdown to a file
cat report.docx | refigure --format docx # stdin, format hint required
refigure reports/ -o out/ # batch: directory, walked recursively
refigure a.docx b.xlsx -o out/ # batch: 2+ explicit sources
批处理模式(2 个或更多源文件,或单个目录)需要使用 -o DIR;默认情况下,即使某个源文件失败,也会继续处理(使用 --fail-fast 则会在第一个源文件失败时中止),并始终向 stderr 打印摘要(N/M converted, K failed)。--json 会输出完整结果——包括 markdown、图表/分组数量和警告——而不是纯 markdown。-v/-q 用于控制详细程度;--strict 会传递给 Python API 使用的同一个 Config.strict。
退出代码:
| Code | 含义 |
|---|---|
| 0 | 成功 |
| 1 | 批处理模式:1 个或更多源文件处理失败(默认继续处理) |
| 2 | 用法错误(参数/标志无效) |
| 3 | 输入不是有效的对应格式文档 |
| 4 | 输入不是有效/安全的归档文件 |
| 5 | 未安装该格式的扩展([docx]/[xlsx]) |
| 6 | 意外的内部错误 |
MCP 服务 — 供直接使用该协议的 Agent/IDE 使用
`refigure-mcp` — 将相同的转换器作为 [MCP](https://modelcontextprotocol.io) 服务提供,供直接使用该协议、而非调用 CLI 或导入库的 Agent/IDE 使用。已列入官方 [MCP Registry](https://registry.modelcontextprotocol.io/?q=refigure),名称为 `io.github.HelgDemidov/refigure`:pip install "refigure[mcp,docx,xlsx]"
refigure-mcp # stdio — the MCP client launches it
{
"mcpServers": {
"refigure": { "command": "refigure-mcp" }
}
}
也可以让客户端改用 uvx,完全无需永久安装:
{
"mcpServers": {
"refigure": {
"command": "uvx",
"args": ["--from", "refigure[mcp,docx,xlsx,vlm-direct]", "refigure-mcp"]
}
}
}
refigure[full] 是 refigure[mcp,docx,xlsx,vlm-direct] 的快捷方式——一个 extras 字符串,即可启用所有工具、两种格式和所有 VLM 提供方。
三个工具——convert_docx、convert_xlsx 和 convert_batch(一次调用处理多个文件:某个文件出错时会单独报告,不会中止其余文件)——仅在实际安装了对应格式的 extra 时注册。use_vlm/--vlm-provider 等选项的用法与 CLI 相同。若结果过大,无法内联返回,则会将其存储起来,并作为 refigure://conversion/{id} 资源返回,而不会让工具响应膨胀。两个提示词(ingest_for_rag、explain_conversion_warnings)可帮助客户端为任务选择合适的工具和 VLM 设置。
Streamable HTTP 默认关闭,仅用于共享/远程部署——必须启用承载令牌身份验证,不可省略:
echo "sk-... = alice" > tokens.txt
refigure-mcp --transport http --mcp-auth-token-file tokens.txt
HTTP 会自动实施按调用方限速(防止令牌泄露或失控使用导致运营方承担费用),并在配置了 2 个或更多调用方时应用公平性软上限;refigure-mcp --help 涵盖所有调优标志(并发数、超时、资源存储限制、批次大小、VLM 上限)。
Docker — 一个镜像,CLI 和 MCP 服务均已加入 PATH,并内置 soffice
一个镜像,同时提供两种接口——refigure 和 refigure-mcp 已在 PATH 中,无需在 CLI/MCP 构建之间二选一。与 pip/uvx 相比,这种方式的独有优势是:VLM 复合图路径所需的系统 soffice/LibreOffice 二进制文件已内置,无需手动安装。提供多架构清单(linux/amd64 + linux/arm64)——docker pull 会自动选择正确的镜像层,Apple Silicon 设备也不例外。
docker pull ghcr.io/helgdemidov/refigure:latest
为确保可复现,请固定到确切版本,而非使用 :latest,例如 :0.3.4。可查看软件包页面了解可用标签。
软件包页面的 OS/Arch 标签页除了真实的 linux/amd64/linux/arm64 条目外,还会列出 unknown/unknown——这是构建来源/SBOM 证明(此镜像为每个平台发布的 in-toto + SPDX 元数据),并不意味着镜像损坏或不可信。GHCR 自己的界面不会标注证明清单,这是注册表软件包页面视图的一个已知且广受报告的限制,与本项目无关。
CLI,通过绑定挂载(镜像的工作目录已是 /data):
docker run --rm -v "$PWD:/data:ro" ghcr.io/helgdemidov/refigure:latest \
refigure /data/report.docx
MCP,stdio——客户端自行启动容器:
{
"mcpServers": {
"refigure": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/helgdemidov/refigure:latest", "refigure-mcp"]
}
}
}
MCP,Streamable HTTP——这里必须指定 --mcp-http-host 0.0.0.0,不可省略:默认的 127.0.0.1 绑定地址无法通过 -p 端口发布访问(Docker 的 NAT 会连接容器的外部网络接口,而非其环回接口),因此不加此标志的“直观”调用会悄无声息地始终得不到响应:
echo "sk-... = alice" > tokens.txt
docker run --rm -p 8000:8000 -v "$PWD/tokens.txt:/data/tokens.txt:ro" \
ghcr.io/helgdemidov/refigure:latest \
refigure-mcp --transport http --mcp-http-host 0.0.0.0 \
--mcp-auth-token-file /data/tokens.txt
Claude Desktop(.mcpb) — 下载、双击,完成
面向非技术用户的最简单安装方式:下载、双击,完成——无需终端,也无需 pip/uvx/docker。仅支持 docx+xlsx 转换(不含 VLM——这需要 [vlm] extra,因此本安装包特意不包含);首次启动时会通过 uv 从 PyPI 全新解析依赖,使用的机制与 uvx 底层相同,只需点击一次,无需填写配置片段。
下载 refigure.mcpb — 使用 Claude Desktop 打开即可安装。
真实 convert() 输出的精选摘录(每份不超过 200 行),取自真实且采用开放许可的文档——即流水线会摄取的实际 Markdown,而非截图或精挑细选的一行内容。每个文件的标题都注明其来源、许可和署名;删节部分会在文中标明,绝不会为了凑篇幅而编造内容。
| 来源 | 展示内容 | 输出 |
|---|---|---|
hackair-d7.7-pilot-evaluation.docx | 原生图表提取——真实调查表格和 xychart-beta 条形图 | examples/hackair-native-charts.md |
swd2018-254-marine-litter-ia-annex.docx | 如实回退——未通过渲染验证的图表会降级为简洁表格,另有 2 个复合图零损失标记 | examples/swd2018-combo.md |
govtech-2025-charts.xlsx | XLSX 原生图表——同一工作簿中的 3 种不同类型(xychart-beta/radar-beta/pie) | examples/govtech-xlsx-charts.md |
swd2021-396-platform-work-ia.docx | 原生饼图和长达 23 年的时间序列,采用真实的欧盟调查标签 | examples/swd2021-pie-chart.md |
efsa-trichinella-dashboard-guide.docx | --vlm 解读——从 2 张截图中还原出一张条形图和一张 UI 流程图,数据均为真实数字 | examples/efsa-trichinella-vlm.md |
在 GitHub 上打开其中任意一个文件,就能直接看到两种视图:原始
```mermaid fence an LLM/RAG pipeline would read, and its native
GitHub rendering — no extra step, that's GitHub's own Markdown support.
Status
- Validated against 27 real documents (15 DOCX + 12 XLSX) — 407 native
charts found (400 rendered), 35 composite figures recovered as
positioned zero-loss markers. Full provenance:
tests/integration/fixtures/manifest.yaml. - Tested: CI gates on a combined unit+integration coverage floor of 95%.
- Published as
v0.3.4— PyPI (trusted publishing, no stored tokens), GHCR, and the official MCP Registry asio.github.HelgDemidov/refigure.refigure-mdis a reserved alternate name, not an active release.
Extracted from a working document-analysis pipeline (a government AI-policy research corpus), not built from scratch for this release.
VLM interpretation of composite figures the chart engine can't reconstruct
is fully implemented and tested, not a stub — [vlm] extra,
provider-agnostic (direct OpenAI/Anthropic via [vlm-direct]), also needs
the system soffice/LibreOffice binary.
Mermaid-diagram recognition depends on diagram type and on what the source figure actually contains:
- Common types (flowcharts, pie/xy charts) are picked reliably.
- More specialized ones need an unambiguous visual cue on the source figure.
- Not every figure produces a diagram — a plain-text description is an honest fallback, not a failure.
PDF is out of scope, on purpose — a boundary, not a gap. PDF has no
equivalent of OOXML's cached chart data (numCache/strCache) for any
mainstream chart generator, so the native, rasterize-free extraction this
project is built on doesn't transfer to it — confirmed by research into
PDF's own structure and how leading PDF converters handle charts today,
not assumed. For mixed-format corpora, route by extension instead of
expecting one tool to cover everything:
import refigure.docx
import refigure.xlsx
if path.suffix == ".pdf":
markdown = docling_convert(path) # or any PDF-capable converter
elif path.suffix == ".docx":
markdown = refigure.docx.convert(path).markdown
else:
markdown = refigure.xlsx.convert(path).markdown
Use Docling or MarkItDown for PDF, refigure for DOCX/XLSX where the chart data actually survives in the file.
License
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。