refigure について
refigure は、文書処理パイプラインや MCP ツールを使うエージェント向けに、DOCX と XLSX を Markdown に変換します。OOXML のチャートデータを直接抽出し、ネイティブデータのない複合図には任意で VLM を利用できます。
主な機能
- 01OOXML のチャートデータを抽出
- 02複合図の位置付きマーカーを保持
- 03VLM による図の解釈に対応
- 04Python ライブラリと CLI を提供
- 05ファイル単位で分離した一括変換
- 06MCP ツール、リソース、プロンプトを搭載
活用シーン
- 01DOCX レポートを Markdown に変換
- 02XLSX からチャートデータを抽出
- 03失敗を個別処理しながら文書を一括変換
- 04MCP クライアントから文書変換を実行
MCP 対応
refigure-mcp は、stdio または認証付き Streamable HTTP で DOCX、XLSX、一括変換ツールを公開します。変換リソースに加え、ツールや VLM 設定の選択を支援するプロンプトも提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
refigure
図表を損なわないコンバーター。
DOCX/XLSX → グラフやインフォグラフィックをOCRやビジョンモデルに頼らず、機械可読なまま保持するMarkdown。ネイティブの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バンドルとして提供されます。どの形態でも、エージェント向けに劣化した要約ではなく、ネイティブの忠実度を保った同じ出力を返します。
特長
- チャートデータのネイティブ抽出 — OOXML の
numCache/strCacheを直接読み取ります。チャートのラスタライズ/OCR/VLM 処理は不要で、常に実際の数値を取得します。 - 複合図版向けの位置情報付きゼロロスマーカー(DOCX) — 通常なら mammoth が何も通知せずに分断してしまうグループ化された図形やインフォグラフィックも、位置情報とキャプションテキストを保持した明確なマーカーに変換します。十分な資金を持つ既存製品にもない機能です。Docling issue #1287 をご覧ください。
- 任意の VLM による解釈(DOCX 複合図版、
[vlm]エクストラ、--vlm/Config(use_vlm=True)) — ゼロロスの基盤に加えて、ネイティブのチャートデータがまったくない図版(例:ダッシュボードのスクリーンショット)を対象に、クラウドによる説明と実際に描画された mermaid 図を生成します(フローチャート、円グラフ/XY グラフ、シーケンス図/状態図/ER 図、ガントチャート/タイムライン/サンキーチャート/ツリーマップなど、26 種類の図に対応。詳細は「ステータス」をご覧ください)。プロバイダーを選ばず利用でき、デフォルトは OpenRouter です。また、--vlm-provider([vlm-direct]エクストラ)を使って OpenAI/Ollama/vLLM/LM Studio/Anthropic に直接接続できます。--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 は実際の内容を復元するだけでなく、復元されたテキストを出力するだけではなく、本当にレンダリング可能な図を生成します。
ネイティブのチャートデータ抽出 — スクリーンショットでも OCR でもなく、実際の OOXML numCache を使用します。
同じ抽出を DOCX からも実行 — Word にもネイティブのチャートが埋め込まれています。Excel だけではありません。refigure はどちらの形式でも同じキャッシュ済み OOXML データを読み取ります。
複合図 — 図自体をレンダリングできない場合でも、位置を保ったまま情報を一切失わずに処理します(これを行う既存ツールはありません。1年以上未解決のままのDocling issue #1287を参照してください)。
クイックスタート
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 解釈については、「Features」を参照してください。
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
インストールと使い方
1つのコンバーターを4通りの方法で実行できます。パイプラインに合った方法を選んでください。 見出しをクリックすると展開します。
CLI — コンソールコマンド、標準入力/標準出力を中心とした設計、ネイティブのバッチモード
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 を指定すると、最初の失敗時に中断します)。また、標準エラー出力に常に要約(N/M converted, K failed)を表示します。--json を指定すると、Markdown に加え、チャート/グループの件数と警告を含む完全な結果がプレーンな Markdown の代わりに出力されます。-v/-q で詳細度を設定できます。--strict は Python API が使うものと同じ Config.strict に渡されます。
終了コード:
| コード | 意味 |
|---|---|
| 0 | 成功 |
| 1 | バッチモード:1つ以上のソースで失敗(デフォルトでは処理を続行) |
| 2 | 使用方法のエラー(引数/フラグが不正) |
| 3 | 入力が、その形式の有効なドキュメントではありません |
| 4 | 入力が、有効かつ安全なアーカイブではありません |
| 5 | その形式の追加機能([docx]/[xlsx])がインストールされていません |
| 6 | 予期しない内部エラー |
MCP サーバー — プロトコルを直接扱うエージェント/IDE 向け
`refigure-mcp` — 同じコンバーターを[MCP](https://modelcontextprotocol.io)サーバーとして提供します。CLI を呼び出したりライブラリをインポートしたりせず、プロトコルを直接扱うエージェント/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]の省略形です。すべてのツール、両方の形式、すべてのVLMプロバイダーを、1つのエクストラ指定で利用できます。
3つのツール、convert_docx、convert_xlsx、convert_batch(1回の呼び出しで複数ファイルを処理します。1つのファイルでエラーが起きても、そのファイルのエラーだけを報告し、残りの処理は中断しません)は、それぞれ対応する形式のエクストラが実際にインストールされている場合にのみ登録されます。use_vlm/--vlm-providerなどはCLIと同じように動作します。結果が大きすぎてインラインで返せない場合は、ツールの応答を膨らませる代わりに保存され、refigure://conversion/{id}リソースとして返されます。2つのプロンプト(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 — 1つのイメージにCLIとMCPサーバーの両方を含み、どちらもPATHに設定済み。sofficeも組み込み済みです
1つのイメージで両方を利用できます。refigureとrefigure-mcpはすでにPATHに設定されているため、CLI用とMCP用のビルドを別々に選ぶ必要はありません。この形式がpip/uvxより優れている唯一の点は、どちらにもないシステムのsoffice/LibreOfficeバイナリが組み込まれていることです。これにより、VLMの複合図パスに必要なバイナリを手動でインストールする必要がありません。マルチアーキテクチャマニフェスト(linux/amd64+linux/arm64)に対応しており、Apple Siliconでもdocker pullが適切なレイヤーを自動的に選択します。
docker pull ghcr.io/helgdemidov/refigure:latest
再現性を確保するには、:latestの代わりに正確なバージョン(例::0.3.4)を指定してください。利用可能なタグについてはパッケージページをご覧ください。
パッケージページのOS/Archタブには、実際のlinux/amd64/linux/arm64のエントリーと並んでunknown/unknownも表示されます。これはビルドの来歴/SBOM証明(このイメージが各プラットフォーム向けに公開するin-toto+SPDXメタデータ)であり、壊れたイメージや信頼できないイメージを意味するものではありません。GHCR自体のUIが証明マニフェストを表示しないのは、レジストリのパッケージビューで広く知られ、報告されている制限であり、このプロジェクトとは関係ありません。
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]エクストラが必要なため、このバンドルには意図的に含めていません)。初回起動時にuvを介してPyPIから依存関係を新たに解決します。これはuvxが内部で使用するものと同じ仕組みですが、設定スニペットではなくワンクリックで実行できます。
refigure.mcpbをダウンロード — Claude Desktopで開くとインストールできます。
実際にオープンライセンスで公開されている文書を使った、実際の convert() 出力の抜粋(各200行以下)です。スクリーンショットでも、都合よく選んだ一行でもなく、パイプラインが取り込む実際の Markdown です。各ファイルのヘッダーに、出典、ライセンス、帰属表示を記載しています。省略した箇所にはインラインで印を付けており、内容を埋めるために捏造したものではありません。
| Source | Demonstrates | Output |
|---|---|---|
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 のネイティブグラフ — 1つのブックから3種類のグラフ(xychart-beta/radar-beta/pie)を出力 | examples/govtech-xlsx-charts.md |
swd2021-396-platform-work-ia.docx | ネイティブの円グラフと23年間の時系列データ、実際のEU調査のラベル | 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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。