mcpField
P
Pdf(paper) Figures Extraction Mcp Serever

Pdf(paper) Figures Extraction Mcp Serever

ローカル
github.com/vllnデータ・分析924 週間前に更新

Pdf(paper) Figures Extraction Mcp Serever について

Figure Extractor API and MCP Serverは、PDFFigures 2.0を使って学術PDFから図、キャプション、表などを抽出します。研究分析やRAGなどのアプリケーションやワークフローでの利用を想定しています。

主な機能

  1. 01PDFから図と表を抽出
  2. 02ローカルおよびリモートPDFに対応
  3. 03構造化JSONで結果を返却
  4. 04抽出統計の提供
  5. 05PDF解析の可視化

活用シーン

  1. 01研究図表を使ったデータセット作成
  2. 02文献レビュー用の図表整理
  3. 03教材用図表の収集

MCP 対応

FastMCPサーバーは`/mcp`エンドポイントを通じて`extract_figures_from_pdf`ツールを公開し、PDF URLを受け取り、抽出した図と表を構造化JSONで返します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"pdffigures": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"build"
]
}
}
}
起動コマンドdocker run -i --rm build

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocibuild

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

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

mcp_tool_use
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 から図を抽出できます。

使用例

  1. 機械学習データセットの作成 臨床試験レポートや研究論文から視覚データを抽出して、医用画像解析や AI モデルのトレーニングデータセットを構築できます。これにより、医療診断における機械学習アルゴリズムのトレーニング用に、研究者が図表を効率的に集約できます。

  2. 臨床研究データのマイニング 医学研究論文から図表を自動的に抽出してカタログ化し、治療効果グラフ、患者転帰チャート、実験結果図などの重要な視覚情報を収集できます。システマティックレビューやメタアナリシスを支援します。

  3. 学術文献レビューと教育 学術出版物から包括的な視覚資料ライブラリをすばやく作成できます。研究者や教育者は、教材を作成したり、研究手法を比較したり、科学分野全体の視覚的な傾向を追跡したりできます。

Docker によるデプロイ

抽出サーバーをビルドして起動します。

docker build -t pdffigures2 .
docker run -d -p 5001:5001 pdffigures2

イメージのサイズは約 286MBです。Alpine ベース、最小限の jlink JRE、pip のクリーンアップにより最適化されています。

指標オリジナル最適化後変化
ベースイメージslimalpine-70MB
JREaptjlink+42MB
pip パッケージオリジナルクリーンアップ済み-24MB
システムパッケージaptapk-12MB
イメージサイズ452MB286MB-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 のもとでライセンスされています。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。