Pdf(paper) Figures Extraction Mcp Serever について
Figure Extractor API and MCP Serverは、PDFFigures 2.0を使って学術PDFから図、キャプション、表などを抽出します。研究分析やRAGなどのアプリケーションやワークフローでの利用を想定しています。
主な機能
- 01PDFから図と表を抽出
- 02ローカルおよびリモートPDFに対応
- 03構造化JSONで結果を返却
- 04抽出統計の提供
- 05PDF解析の可視化
活用シーン
- 01研究図表を使ったデータセット作成
- 02文献レビュー用の図表整理
- 03教材用図表の収集
MCP 対応
FastMCPサーバーは`/mcp`エンドポイントを通じて`extract_figures_from_pdf`ツールを公開し、PDF URLを受け取り、抽出した図と表を構造化JSONで返します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Figure Extractor API と MCP サーバー
この FastAPI ベースのサービスを使って、PDF ドキュメントから図表を抽出できます。Figure Extractor API と MCP サーバーは、Allen Institute for AI が開発した堅牢な図表抽出システム PDFFigures 2.0 の HTTP インターフェースをシンプルに提供します。
この API ラッパーは、特に検索拡張生成(RAG)アプリケーションをはじめ、さまざまなアプリケーションやワークフローに統合するのに適しています。
FastMCP を利用する MCP サーバーは、PDF 抽出機能を MCP ツールとして公開します。これにより、抽出サービスを自動的に呼び出せる AI エージェントやワークフローとシームレスに統合できます。
- サーバーは
extract_figures_from_pdfツールをホストしており、/mcpエンドポイントへの HTTP リクエストを介して呼び出せます。このツールは PDF の URL を受け取り、ドキュメントを処理して、抽出した図表を構造化された JSON 形式で返します。
MCP サーバーのデフォルト URL:
http://localhost:5001/mcp
PDFFigures 2.0 について
この API サービスは、Allen Institute for AI による Scala ベースのプロジェクト、PDFFigures 2.0 を基盤としています。PDFFigures 2.0 は、コンピューターサイエンス分野の学術文書から図、キャプション、表、セクションタイトルを抽出するために特別に設計されています。元となる研究は、学術論文「PDFFigures 2.0: Mining Figures from Research Papers」(Clark and Divvala、2016)で説明されています。論文はこちらで、PDFFigures 2.0 のウェブサイトもご覧いただけます。
┌─────────────────┐ ┌──────────────────┐ ┌────────────────┐
│ Your App │ HTTP │ Figure Extractor │ JNI │ PDFFigures │
│ (Any Language) │──────► API & MCP Server│──────► 2.0 │
│ │ │ Python(FastAPI) │ │ (Scala/JVM) │
└─────────────────┘ └──────────────────┘ └────────────────┘
機能
- PDF からの図表の抽出
- ローカルおよびリモートの PDF ファイルに対応
- 抽出した表や図の統計情報
- 簡単にデプロイできる Docker サポート
- PDF 解析の可視化オプション
FastMCP ツール
このプロジェクトには、PDF 抽出サービスをプログラムから呼び出せる FastMCP ツールが追加されました。extract_figures_from_pdf ツールを使用すると、URL を指定して PDF から図を抽出できます。
使用例
-
機械学習データセットの作成 臨床試験レポートや研究論文から視覚データを抽出して、医用画像解析や AI モデルのトレーニングデータセットを構築できます。これにより、医療診断における機械学習アルゴリズムのトレーニング用に、研究者が図表を効率的に集約できます。
-
臨床研究データのマイニング 医学研究論文から図表を自動的に抽出してカタログ化し、治療効果グラフ、患者転帰チャート、実験結果図などの重要な視覚情報を収集できます。システマティックレビューやメタアナリシスを支援します。
-
学術文献レビューと教育 学術出版物から包括的な視覚資料ライブラリをすばやく作成できます。研究者や教育者は、教材を作成したり、研究手法を比較したり、科学分野全体の視覚的な傾向を追跡したりできます。
Docker によるデプロイ
抽出サーバーをビルドして起動します。
docker build -t pdffigures2 .
docker run -d -p 5001:5001 pdffigures2
イメージのサイズは約 286MBです。Alpine ベース、最小限の jlink JRE、pip のクリーンアップにより最適化されています。
| 指標 | オリジナル | 最適化後 | 変化 |
|---|---|---|---|
| ベースイメージ | slim | alpine | -70MB |
| JRE | apt | jlink | +42MB |
| pip パッケージ | オリジナル | クリーンアップ済み | -24MB |
| システムパッケージ | apt | apk | -12MB |
| イメージサイズ | 452MB | 286MB | -166MB(-37%) |
API のテスト
-
http://localhost:5001/docsを開いて、API ドキュメントを確認します。 -
curlを使って、PDF の URL からの抽出をテストします。curl -X POST http://localhost:5001/api/extract \ -F "pdf_url=https://example.com/sample.pdf"
Agent Skill(非 MCP)
抽出サーバーを呼び出し、レンダリングされた図をローカルにダウンロードする API クライアントです。MCP に対応していないエージェント環境向けに設計されています。
# Copy config and point to the server
cp .env.example .env
# (edit .env if the server is remote)
# Run extraction against a local PDF
skills/pdffigures2/scripts/pdffigures2 paper.pdf -o ./extracted/
スクリプトは PDF を PDFFIGURES2_API_URL に POST し、レンダリングされた各図をダウンロードして、構造化された JSON の概要を標準出力に表示します。エージェント向けのドキュメント全文については、skills/pdffigures2/SKILL.md を参照してください。
使い方
PDF から図と表を抽出する
/api/extract エンドポイントは、PDF ファイルのアップロードと PDF の URL の両方に対応するようになりました。
API の使用
/api/extract に POST リクエストを送信できます。次のいずれかを指定してください。
- PDF を含む
file(multipart/form-data)。 - PDF の URL を含む
pdf_url(form-data)。
API は、完全な renderURL パスを含む、抽出された図と表の JSON レスポンスを返します。
JSON レスポンスの例(簡潔にするため、imageText は省略しています):
[
{
"caption": "TABLE III CMAPSS DATASET ATTRIBUTES",
"captionBoundary": {
"x1": 113.12599182128906,
"x2": 225.1184844970703,
"y1": 116.80506896972656,
"y2": 130.57305908203125
},
"figType": "Table",
"imageText": [
"Required", "fan", "conversion", "speed", "rpm", "High-pressure", "turbines", "cool", "air", "flow",
"lbm/s", "Low-pressure", "turbines", "cool", "air", "flow", "lbm/s", "Bleed", "enthalpy", "-", "Required"
],
"name": "III",
"page": 5,
"regionBoundary": {
"x1": 46.8,
"x2": 291.12,
"y1": 140.88,
"y2": 385.91999999999996
},
"renderDpi": 300,
"renderURL": "http://localhost:5001/resources/4-TableIII-1.png"
},
{
"caption": "Fig. 3. Agentic AI implementation with Google ADK.",
"captionBoundary": {
"x1": 335.4129943847656,
"x2": 516.9002685546875,
"y1": 228.6050567626953,
"y2": 233.40704345703125
},
"figType": "Figure",
"imageText": [],
"name": "3",
"page": 5,
"regionBoundary": {
"x1": 302.88,
"x2": 549.12,
"y1": 86.88,
"y2": 216
},
"renderDpi": 300,
"renderURL": "http://localhost:5001/resources/4-Figure3-1.png"
},
{
"caption": "TABLE I COMPARISON BETWEEN AI AGENTS AND AGENTIC AI",
"captionBoundary": {
"x1": 204.9189910888672,
"x2": 390.3569641113281,
"y1": 54.10902404785156,
"y2": 67.87701416015625
},
"figType": "Table",
"imageText": [
"pert", "systems", "LLM-based", "agents,", "multi-agent", "coordination,", "intent-based", "workflows", "Task",
"Scope", "Focused", "on", "short-term,", "well-defined", "tasks", "Oriented", "toward", "long-term,", "dynamic,",
],
"name": "I",
"page": 2,
"regionBoundary": {
"x1": 51.839999999999996,
"x2": 543.12,
"y1": 77.75999999999999,
"y2": 217.92
},
"renderDpi": 300,
"renderURL": "http://localhost:5001/resources/4-TableI-1.png"
},
{
"caption": "Fig. 1. Traditional AI Agent vs. Agentic AI",
"captionBoundary": {
"x1": 224.30499267578125,
"x2": 370.9708251953125,
"y1": 448.1660461425781,
"y2": 452.968017578125
},
"figType": "Figure",
"imageText": [],
"name": "1",
"page": 2,
"regionBoundary": {
"x1": 45.839999999999996,
"x2": 549.12,
"y1": 230.88,
"y2": 436.08
},
"renderDpi": 300,
"renderURL": "http://localhost:5001/resources/4-Figure1-1.png"
},
{
"caption": "TABLE IV SUMMARY OF ENGINE MAINTENANCE ACTIONS",
"captionBoundary": {
"x1": 215.99301147460938,
"x2": 379.2913513183594,
"y1": 54.10902404785156,
"y2": 67.87701416015625
},
"figType": "Table",
"imageText": [
"#", "Engines", "RUL", "Range", "Recommended", "Action", "Priority", "Cost", "(USD)", "Labor", "Hours", "Assigned",
"Staff", "Scheduled", "Time", "15", "82–124", "MONITOR", "low", "0", "0", "[jr", "mechanic]", "Within", "7", "days"
],
"name": "IV",
"page": 7,
"regionBoundary": {
"x1": 48.96,
"x2": 549.12,
"y1": 77.75999999999999,
"y2": 135.12
},
"renderDpi": 300,
"renderURL": "http://localhost:5001/resources/4-TableIV-1.png"
},
{
"caption": "TABLE II KEY COMPONENTS OF INTENTION PROCESSING",
"captionBoundary": {
"x1": 345.09295654296875,
"x2": 507.22100830078125,
"y1": 417.8482666015625,
"y2": 431.6162414550781
},
"figType": "Table",
"imageText": [
"Targets", "Specify", "the", "resources", "or", "entities", "to", "which", "the", "intent", "applies.", "Can", "be",
"defined", "statically", "(explicit", "list)", "or", "dynamically", "(using", "filters", "or", "criteria).", "Context"
],
"name": "II",
"page": 3,
"regionBoundary": {
"x1": 302.88,
"x2": 549.12,
"y1": 441.84,
"y2": 677.04
},
"renderDpi": 300,
"renderURL": "http://localhost:5001/resources/4-TableII-1.png"
},
{
"caption": "Fig. 2. Proposed framework for Industry 5.0 applying intent-based and Agentic AI.",
"captionBoundary": {
"x1": 159.51600646972656,
"x2": 435.7596435546875,
"y1": 288.3310241699219,
"y2": 293.13299560546875
},
"figType": "Figure",
"imageText": [],
"name": "2",
"page": 4,
"regionBoundary": {
"x1": 45.839999999999996,
"x2": 549.12,
"y1": 49.68,
"y2": 276
},
"renderDpi": 300,
"renderURL": "http://localhost:5001/resources/4-Figure2-1.png"
}
]
開発環境のセットアップ
コードを変更する場合や、Docker を使わずにローカルで実行する場合は、リポジトリをクローンしてください。
git clone https://github.com/vlln/pdffigures-mcp-server.git
cd pdffigures-mcp-server
figure_extractor.py でテストする
figure_extractor.py は、稼働中の API サーバーに対して抽出をテストするための CLI ツールです。ローカルの PDF を API に送信し、抽出された図をダウンロードします。
# Start the server first (via Docker or uvicorn), then:
python figure_extractor.py <path-to-pdf> --output_dir ./output
オプション:
--output_dir— ダウンロードした図の保存先ディレクトリ(デフォルト:./output)--url— カスタム API エンドポイント(デフォルト:http://localhost:5001/api/extract)
アプリの構成
project/
├── Dockerfile # Multi-stage Alpine image (server + jlink JRE + pdffigures2 JAR)
├── .dockerignore
├── .env.example # Example config for the Agent Skill
├── app/ # FastAPI web service code
│ ├── __init__.py
│ ├── app.py # API endpoints and MCP Server
│ ├── service.py # Runs pdffigures2 JAR via subprocess
│ └── utils.py # File I/O helpers
├── skills/ # Agent Skills (non-MCP alternative)
│ └── pdffigures2/ # API client wrapper for pdffigures2
├── figure_extractor.py # CLI tool for testing extraction
└── README.md
謝辞
このプロジェクトは、Huang-lab/figure-extractor のフォークです。元の作者の皆様の取り組みに感謝いたします。
ライセンス
このプロジェクトは Apache License 2.0 のもとでライセンスされています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。