mcpField
R
refigure

refigure

本地服务
github.com/HelgDemidov生产力03 周前更新

关于 refigure

refigure 将 DOCX 和 XLSX 转为 Markdown,面向文档处理流程及可调用 MCP 工具的 Agent。它直接提取 OOXML 图表数据,并可选用 VLM 解读缺少原生数据的复合图形。

主要功能

  1. 01提取 OOXML 原生图表数据
  2. 02保留复合图形位置标记
  3. 03可选 VLM 解读图形
  4. 04提供 Python 库和命令行
  5. 05支持批量转换及逐文件隔离
  6. 06附带 MCP 工具、资源和提示词

适用场景

  1. 01将 DOCX 报告转为 Markdown
  2. 02从 XLSX 图表提取数据
  3. 03批量转换文档并单独处理失败
  4. 04让 MCP 客户端调用文档转换

MCP 相关

refigure-mcp 通过 stdio 或带令牌认证的 Streamable HTTP 暴露 DOCX、XLSX 和批量转换工具。它还提供转换资源及帮助客户端选择工具和 VLM 设置的提示词。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"helgdemidov-refigure": {
"command": "uvx",
"args": [
"refigure"
]
}
}
}
启动命令uvx refigure

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypirefigure0.3.5

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

refigure

图表转换后,图表数据依然完整。

CI Coverage License: Apache 2.0 Python 3.10+ PyPI Docker MCP Registry Claude Desktop AllMCPs Verified

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 不仅能还原真实内容,还能生成真正可渲染的图表,而不只是还原文本:

一张真实的 docx 图片(没有原生图表数据的密集无线技术旭日图),通过 refigure.docx.convert(use_vlm=True) 转换为丰富的 VLM 生成描述,以及真正渲染出来的 mermaid 思维导图,采用放射状布局,而不是通用流程图结构生成的难以阅读的扁平长条

原生图表数据提取 — 提取真实的 OOXML numCache,不是截图,也不是 OCR:

一张真实的 xlsx 柱状图,通过 refigure.xlsx.convert() 转换为 Markdown,同时展示 LLM 读取的原始文本,以及将相同数据重新渲染成的图表

相同的提取方式,也适用于 DOCX — Word 也会嵌入原生图表,不只有 Excel;无论哪种格式,refigure 读取的都是相同的 OOXML 缓存数据:

一张来自欧盟劳动力平台调查的真实 docx 饼图,通过 refigure.docx.convert() 转换为 Markdown,同时展示 LLM 读取的原始文本(mermaid 代码围栏 + 数据表),以及将相同数据重新渲染成的图表

组合图形 — 即使图形本身无法渲染,也能保留位置且不丢失任何内容(目前没有其他工具能做到这一点——参见 Docling issue #1287, 该问题已开放超过 1 年):

一张真实的 docx 组合图形(refigure.docx.convert() 无法渲染的分组图表),转换为带位置信息且无损的标记,并保留图形自身的标题/图例文本

快速开始

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.xlsxXLSX 原生图表——同一工作簿中的 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 as io.github.HelgDemidov/refigure. refigure-md is 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

Apache-2.0 — see LICENSE and NOTICE.

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。