mcpField
P
PDF Triage

PDF Triage

ローカル
github.com/vishalmeena2211生産性012 週間前に更新

PDF Triage について

PDF Triageは、AIツールからローカルPDFを扱うためのMCPサーバーです。抽出前に分類し、信頼性の低いテキストを示し、出力を制限して、アクセス先を指定ディレクトリ内に保ちます。

主な機能

  1. 01抽出前のPDF分類
  2. 02疑わしいテキストの警告
  3. 03Markdownと表の抽出
  4. 04PDFテキストの検索
  5. 05出力制限とパスの制限

活用シーン

  1. 01PDFのテキスト抽出可否の確認
  2. 02ローカルPDF内の語句検索
  3. 03長さを抑えたテキストや表の抽出
  4. 04文字化けしたPDFテキストへの依存回避

MCP 対応

分類、検索、テキスト抽出、表抽出を行う4つの `pdf_*` ツールをMCPクライアントに提供します。設定した `--root` ディレクトリ内のパスだけを読み取ります。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"vishalmeena2211-pdf-triage": {
"command": "npx",
"args": [
"-y",
"pdf-triage-mcp"
],
"env": {
"PDF_TRIAGE_LOG_LEVEL": "<PDF_TRIAGE_LOG_LEVEL>",
"PDF_TRIAGE_MAX_CHARS": "<PDF_TRIAGE_MAX_CHARS>",
"PDF_TRIAGE_MAX_FILE_BYTES": "<PDF_TRIAGE_MAX_FILE_BYTES>"
}
}
}
}
起動コマンドnpx -y pdf-triage-mcp
設定が必要な環境変数
PDF_TRIAGE_LOG_LEVELMinimum severity written to stderr. Defaults to info.
PDF_TRIAGE_MAX_CHARSDefault truncation ceiling for tool responses, in characters. Guards the caller's context window. Defaults to 40000.
PDF_TRIAGE_MAX_FILE_BYTESLargest PDF the server will read, in bytes. The parser buffers whole files rather than streaming. Defaults to 104857600 (100 MB).

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

パッケージ
npmpdf-triage-mcp0.1.2

ツール

4

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
pathstringはい許可されたルートからの相対パス、または .pdf ファイルの絶対パス

詳細

pdf-triage-mcp

npm CI MCP Registry License: MIT

あらゆる AI ツールがローカルの PDF を読み取れるようにする MCP サーバーです。アップロードも、OCR の料金も不要で、役に立たないデータを黙って返すこともありません。

@firecrawl/pdf-inspector を基盤にしています(Rust 製、ML モデルや外部サービスは不要です)。

┌─ pdf_classify ──→  text_based · 0.98 · 12 pages · 0 need OCR   ~20ms
├─ pdf_search  ──→  "invoice total" found on p4, p9              ~150ms
├─ pdf_extract ──→  clean Markdown, truncated to your budget     ~150ms
└─ pdf_tables  ──→  just the pipe tables, no prose               ~150ms

目次


これが必要な理由

多くの PDF ツールには、共通の失敗パターンがあります。抽出が実際に成功したかどうかにかかわらず、自信ありげなテキストを返すことです。 壊れた CID フォント、置換暗号のエンコーディング、テキストレイヤーのないスキャンページでは、もっともらしい出力が得られ、その問題に気付くのは後続の処理に進んでから、あるいはまったく気付かないこともあります。

pdf-inspector は、失敗したことを認識する能力に優れています。マッピングされていない CID を推測せずに U+FFFD を出力し、自身の出力に対して置換暗号の検出を実行し、抽出したテキストの英数字が 50% を下回ると、ドキュメントをスキャン済みとして再分類します。しかし、結果オブジェクトにこれらの検出結果を報告するところで止まってしまい、多くのラッパーはそれらを破棄します。

このサーバーは、それらの情報を活用します。 すべての応答には信頼性を示す情報がコンテンツより先に含まれるため、モデルは最初にそれを読み取ります。

> [!WARNING] ENCODING ISSUES DETECTED. The text layer decoded to suspicious
> output — typically a garbled CID font or a substitution-cipher encoding
> where letter frequencies match natural language but the letters themselves
> are wrong. Treat all extracted text here as unreliable and prefer OCR.

---

# Quarterly Report
...

ここから、3 つの設計ルールが導かれます。

  1. 抽出の前に分類する。 pdf_classify は約 20ms で実行され、そもそも抽出を試みる価値があるかどうかを判定します。
  2. すべての出力に上限を設ける。 300 ページの PDF は簡単に 50 万トークンに達します。すべての出力はデフォルトで切り詰められ、代わりにページを指定して取得する方法が案内されます。
  3. すべてのパスを制限する。 信頼できないドキュメントを読んだばかりのモデルが、~/.ssh/id_rsa も読めるように誘導されてはなりません。モデルの判断に委ねず、コードで強制します。

インストール

インストールは不要です。 以下の設定はすべて、公開済みパッケージを npm から直接実行します。

npx -y pdf-triage-mcp --root /path/to/your/documents

MCP クライアントが代わりに実行するため、設定を貼り付けるだけで使えます。まずは動作することを確認してください。

npx -y pdf-triage-mcp --version

Node 20 以上が必要です。 npm の pdf-triage-mcp と、MCP Registry の io.github.vishalmeena2211/pdf-triage-mcp として公開されています。

ソースから実行する場合(開発用)
git clone https://github.com/vishalmeena2211/pdf-triage-mcp.git
cd pdf-triage-mcp
npm install
npm run build
node dist/index.js --root ~/Documents

続いて、以下のいずれかの設定で npx の実行部分を "command": "node", "args": ["/absolute/path/to/dist/index.js", ...] に置き換えてください。


AI ツールへの接続

以下の設定は、1 つの値を除いてすべてそのまま使えます。

  • /Users/me/Documents — サーバーが読み取りを許可されるディレクトリに置き換えてください。変更が必要なのはこれだけです。

絶対パスを使用してください。ほとんどのクライアントでは ~ は展開されません。複数のディレクトリを指定する場合は、--root を繰り返してください。

PATH に関する注意点。以下のすべての GUI クライアントに当てはまります。 デスクトップアプリは最小限の環境でサーバーを起動するため、ターミナルでは動作していても、単独の npx が見つからず失敗することがよくあります。サーバーが起動しない場合は、絶対パスに置き換えてください。which npx で確認できます(Apple Silicon では通常 /opt/homebrew/bin/npx、Intel 版 macOS では /usr/local/bin/npx です)。

-y を指定する理由。 npx のインストール確認プロンプトをスキップします。指定しない場合、初回実行時に MCP クライアントが入力できない確認待ちで停止することがあります。サーバーは起動したように見えても、その後タイムアウトが通知されないまま発生します。

1. Claude Desktop

設定ファイル

OSパス
macOS~/Library/Application Support/Claude/claude_desktop_config.json
Windows%APPDATA%\Claude\claude_desktop_config.json
Linux~/.config/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "pdf-triage": {
      "command": "npx",
      "args": [
        "-y", "pdf-triage-mcp",
        "--root", "/Users/me/Documents"
      ]
    }
  }
}

確認方法: Claude Desktop を完全に終了してから再起動してください(ウィンドウを閉じるだけではありません)。チャット入力欄の近くにツールアイコンが表示されます。クリックして、4 つの pdf_* ツールが一覧にあることを確認してください。

ログ:~/Library/Logs/Claude/mcp*.log(macOS)、%APPDATA%\Claude\logs\mcp*.log(Windows)。

ドキュメント

2. Claude Code

CLI — 最も簡単な方法です。 -- 区切り文字は必須です。その後に続くすべての内容がサーバーコマンドになります。

# Just you, this project (default)
claude mcp add pdf-triage -- npx -y pdf-triage-mcp --root /Users/me/Documents

# Just you, every project
claude mcp add --scope user pdf-triage -- npx -y pdf-triage-mcp --root /Users/me/Documents

# Shared with your team, writes .mcp.json to the repo
claude mcp add --scope project pdf-triage -- npx -y pdf-triage-mcp --root /Users/me/Documents

または、プロジェクトルートの .mcp.json を直接編集します。

{
  "mcpServers": {
    "pdf-triage": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y", "pdf-triage-mcp",
        "--root", "/Users/me/Documents"
      ]
    }
  }
}
スコープ保存先共有
local(デフォルト)~/.claude.json のこのプロジェクトの項目いいえ
user~/.claude.json のトップレベルいいえ
projectリポジトリルートの .mcp.jsonはい(git 経由)

確認方法: claude mcp list → ✔ Connected が表示されていることを確認します。プロジェクトスコープのサーバーは初回使用時に承認が必要です。セッション内で /mcp を実行してください。

ドキュメント

3. Cursor

設定ファイル: .cursor/mcp.json(プロジェクト)または ~/.cursor/mcp.json(グローバル)。競合する場合はプロジェクト側が優先されます。

{
  "mcpServers": {
    "pdf-triage": {
      "command": "npx",
      "args": [
        "-y", "pdf-triage-mcp",
        "--root", "/Users/me/Documents"
      ]
    }
  }
}

確認方法: Cursor はホットリロードするため、再起動は不要です。Cursor Settings → Tools & MCP を開き、pdf-triage の横に緑色のドットが表示されていることを確認してください。

ドキュメント

4. Windsurf

設定ファイル: ~/.codeium/windsurf/mcp_config.json(macOS/Linux)、%USERPROFILE%\.codeium\windsurf\mcp_config.json(Windows)。

初回起動時には作成されないため、見つからない場合は自分で作成してください。

{
  "mcpServers": {
    "pdf-triage": {
      "command": "npx",
      "args": [
        "-y", "pdf-triage-mcp",
        "--root", "/Users/me/Documents"
      ]
    }
  }
}

確認方法: Windsurf はファイルを監視し、保存時にホットリロードします。次のチャットセッションで Cascade にツールが表示されます。

ドキュメント

5. VS Code + GitHub Copilot

キーは mcpServers ではなく servers です。 Claude Desktop の設定をコピーする際によくある間違いです。

設定ファイル: .vscode/mcp.json(ワークスペース)、またはコマンドパレット → MCP: Open User Configuration(グローバル)。

{
  "servers": {
    "pdf-triage": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y", "pdf-triage-mcp",
        "--root", "/Users/me/Documents"
      ]
    }
  }
}

CLI を使う方法:

code --add-mcp '{"name":"pdf-triage","command":"npx","args":["-y","pdf-triage-mcp","--root","/Users/me/Documents"]}'

確認方法: MCP ツールは Agent モードでのみ動作します。Copilot Chat で Ask/Edit から Agent に切り替え、Configure Tools をクリックして、pdf_* ツールが表示されることを確認してください。ファイルを初めて追加した後は、VS Code を再起動してください。

ドキュメント

6. Zed

**キーは mcpServers ではなく context_servers です。**また、command は文字列ではなく、ネストされたオブジェクトです。

設定ファイル: ~/.config/zed/settings.json(macOS/Linux)、%APPDATA%\Zed\settings.json(Windows)。コマンドパレット → zed: open settings。

{
  "context_servers": {
    "pdf-triage": {
      "source": "custom",
      "command": {
        "path": "npx",
        "args": [
          "-y", "pdf-triage-mcp",
          "--root", "/Users/me/Documents"
        ],
        "env": {}
      }
    }
  }
}

この形式を Zed のバージョンが受け付けない場合は、ネスト形式より前のバージョンです。代わりに、サーバーオブジェクトのトップレベルで command、args、env をフラットに指定してみてください。

確認方法: Agent Panel(Cmd+Shift+A)→ 歯車アイコン → MCP Servers。緑色のドットは接続済みを示します。

ドキュメント

7. Cline(VS Code 拡張機能)

設定ファイル — VS Code 本体の設定とは別です。

OSパス
macOS~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json
Windows%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json
Linux~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json
{
  "mcpServers": {
    "pdf-triage": {
      "command": "npx",
      "args": [
        "-y", "pdf-triage-mcp",
        "--root", "/Users/me/Documents"
      ],
      "disabled": false,
      "autoApprove": ["pdf_classify", "pdf_search"]
    }
  }
}

autoApprove を設定すると、一覧にある読み取り専用ツールは確認プロンプトなしで実行されます。

**より簡単な方法:** Cline パネル → MCP サーバーアイコン → **Edit MCP Settings** を選ぶと、このファイルが直接開きます。

確認方法: パネルは自動的に更新されます。サーバーの横に緑色の点が表示されます。

ドキュメント

8. Continue.dev

設定ファイル: ~/.continue/config.yaml(グローバル)または .continue/config.yaml(プロジェクト)。現在は YAML が使われており、config.json は非推奨です。

ここでの mcpServers はオブジェクトではなくリストです。また、YAML ではタブを使わず、スペースを使ってください。

mcpServers:
  - name: pdf-triage
    command: npx
    args:
      - -y
      - pdf-triage-mcp
      - --root
      - /Users/me/Documents

確認方法: 保存すると自動的に再読み込みされます。Continue をエージェントモードに切り替えてください。ほかのモードでは MCP ツールを使用できません。

ドキュメント

9. Google Gemini CLI

CLI:

gemini mcp add pdf-triage npx -y pdf-triage-mcp --root /Users/me/Documents

# global instead of project-scoped
gemini mcp add --scope user pdf-triage npx -y pdf-triage-mcp --root /Users/me/Documents

または ~/.gemini/settings.json(グローバル)/.gemini/settings.json(プロジェクト)を編集します:

{
  "mcpServers": {
    "pdf-triage": {
      "command": "npx",
      "args": [
        "-y", "pdf-triage-mcp",
        "--root", "/Users/me/Documents"
      ],
      "timeout": 30000,
      "trust": false
    }
  }
}

確認方法: gemini セッション内で /mcp を実行すると、サーバーがツール一覧とともに CONNECTED と表示されます。または、シェルから gemini mcp list を実行します。

ドキュメント

10. OpenAI Codex CLI

設定ファイル: ~/.codex/config.toml(グローバル)または .codex/config.toml(プロジェクト)。

TOML 形式で、キーは mcp_servers です。スネークケースを使い、mcpServers は使いません。

[mcp_servers.pdf-triage]
command = "npx"
args = [
  "-y", "pdf-triage-mcp",
  "--root", "/Users/me/Documents"
]
startup_timeout_sec = 20
tool_timeout_sec = 60

確認方法: codex doctor --json で設定の構文を検証できます。ただし、検証されるのは構文のみで、サーバーが実際に起動したことは確認されません。

既知の上流の問題: 複数の Codex CLI バージョンには、stdio サーバーの検証は正常に完了するものの、起動に失敗して TUI に Tools: none と表示されるバグがあります(#3441、#26810)。これは Codex のランタイムのバグであり、設定エラーではありません。

ドキュメント

11. JetBrains AI Assistant / Junie

AI Assistant — IDE から設定するため、編集するファイルはありません。

  1. Settings → Tools → AI Assistant → Model Context Protocol (MCP)
  2. Add → トランスポートに STDIO を選択
  3. 次を貼り付けます:
{
  "mcpServers": {
    "pdf-triage": {
      "command": "npx",
      "args": [
        "-y", "pdf-triage-mcp",
        "--root", "/Users/me/Documents"
      ]
    }
  }
}
  1. OK → Apply

Junie はファイルで設定します — ~/.junie/mcp/mcp.json(グローバル)または .junie/mcp/mcp.json(プロジェクト)。JSON の形式は同じです。

確認方法: MCP 設定パネルの Status 列を確認します。クリックすると、サーバーのツール一覧が表示されます。

ドキュメント

12. LM Studio

設定ファイル: ~/.lmstudio/mcp.json(macOS/Linux)、%USERPROFILE%\.lmstudio\mcp.json(Windows)。

アプリから設定するほうが簡単です:右サイドバー → Program タブ → Install → Edit mcp.json。

{
  "mcpServers": {
    "pdf-triage": {
      "command": "npx",
      "args": [
        "-y", "pdf-triage-mcp",
        "--root", "/Users/me/Documents"
      ]
    }
  }
}

確認方法: 保存すると自動的に再読み込みされます。ツールは Program パネルに表示されます。LM Studio では、モデルが初めてツールを呼び出すときに確認ダイアログが表示されます。

ドキュメント

チートシート
クライアントファイルトップレベルキー再起動が必要?
Claude Desktopclaude_desktop_config.jsonmcpServers完全終了
Claude Code.mcp.json / CLImcpServers不要
Cursor.cursor/mcp.jsonmcpServers不要
Windsurf~/.codeium/windsurf/mcp_config.jsonmcpServers不要
VS Code Copilot.vscode/mcp.jsonservers初回のみ
Zed~/.config/zed/settings.jsoncontext_servers不要
Clinecline_mcp_settings.jsonmcpServers不要
Continue.dev~/.continue/config.yamlmcpServers(リスト)不要
Gemini CLI~/.gemini/settings.jsonmcpServers不要
Codex CLI~/.codex/config.toml[mcp_servers.*]該当なし
JetBrainsIDE の設定 UImcpServers不要
LM Studio~/.lmstudio/mcp.jsonmcpServers不要

形式が異なる3つ: VS Code(servers)、Zed(context_servers とネストされた command)、Codex(TOML の mcp_servers)。それ以外はすべて Claude Desktop と同じ形式をそのまま使用します。


ツール

ツールコスト目的
pdf_classify約20ms種類、信頼度、ページ数、OCRが必要なページを正確に判定します。最初に呼び出してください。
pdf_extract約150msPDF → Markdown。デフォルトでは途中で切り詰められます。pagesで範囲を指定してください。
pdf_search約150msテキストを検索し、ページ情報付きの抜粋を返します。長い文書を調べ始める最も低コストな方法です。
pdf_tables約150msMarkdownのパイプテーブル形式で、表のみを返します。

全パラメーターのリファレンス:docs/TOOLS.md。

初めて扱う文書での想定されるフロー:

pdf_classify → is it text_based with no warnings?
  ├─ yes → pdf_search to locate → pdf_extract with `pages`
  └─ no  → stop; route to OCR

設定

pdf-triage-mcp [options]

  -r, --root <dir>          Directory the server may read. Repeatable. Default: cwd.
      --max-chars <n>       Default truncation ceiling. Default: 40000. Max: 200000.
      --max-file-bytes <n>  Largest PDF to read. Default: 104857600 (100 MB).
      --log-level <level>   debug | info | warn | error | silent. Default: info.
  -h, --help                Show usage.
  -v, --version             Print version.

環境変数での指定:PDF_TRIAGE_ROOTS(プラットフォームのPATH区切り文字で区切ります。macOS/Linuxでは :、Windowsでは ;)、PDF_TRIAGE_MAX_CHARS、PDF_TRIAGE_MAX_FILE_BYTES、PDF_TRIAGE_LOG_LEVEL。フラグは環境変数より優先されます。

ルートは利便性のためではなく、セキュリティ境界です。 動作に必要な最小限のディレクトリのみを許可してください。パスは検証前にシンボリックリンクをたどって解決されるため、ルート内のリンクがルート外を指している場合、たどらずに拒否されます。


エンジンのフォールバック

上流では、次の3つのターゲットに対してのみ、ビルド済みのネイティブバイナリが提供されています:linux-x64-gnu、darwin-arm64、win32-x64-msvc。muslビルドもLinux ARM64ビルドもありません(upstream #216)。そのため、Alpineコンテナー、Gravitonインスタンス、およびほとんどのエッジランタイムでは読み込みに失敗します。

このサーバーはネイティブエンジンを優先し、利用できない場合はどこでも動作するWASMにフォールバックします。機能の違いは明示され、偽装されることはありません:

ネイティブWASM
分類/抽出はいはい
ページ単位の抽出はいいいえ — 例外が発生し、pdf_searchは一致箇所にページ情報が付与されていないことを報告します
pagesの選択はいいいえ — 無視され、レスポンスでその旨が示されます

使用中のエンジンを確認するには、pdf_classifyの報告を確認してください。サーバーの起動時には、ログに engine selected と出力されます。


既知の制限事項

上流から引き継がれた制限事項です。出力を信頼する前に確認してください。

  • RTLスクリプトは正しく処理されません。 アラビア語とヘブライ語は、text_basedとして高い信頼度で報告される一方で、視覚的な順序、つまり逆順で使いものにならない形で返されます(#212)。このサーバーはこれを検出して重大な問題として扱います。積極的に対策している上流の唯一の障害モードです。
  • xrefの復旧には対応していません。 pypdfやpdfiumがエラーを通知せず修復する不正なPDFは、例外を発生させます(#228)。
  • 日本語のCIDFontType0(CFF)サブセットフォントは、無関係なグリフにデコードされる場合があります(#208)。
  • 複数段組みの読み取り順序は、段組みが検出されていても、レイアウトによってはラスタライズ順で出力される場合があります(#219)。
  • 画像はPDFではありません。 スキャンしたJPEGにはテキストレイヤーがありません。そのため、このサーバーは別の形式をPDFとして扱うふりをせず、PDF以外の入力を拒否します。

開発

npm run typecheck    # tsc --noEmit, maximum strictness
npm test             # vitest, 108 tests
npm run test:coverage
npm run build
npm run dev          # tsx, no build step

TypeScriptの設定では、exactOptionalPropertyTypesとnoUncheckedIndexedAccessを含むすべての厳格性フラグが有効になります。上流からのレスポンスはキャストせず、境界でZodを使って検証されます。理由についてはdocs/ARCHITECTURE.mdを参照してください。

クライアント接続のデバッグ:

node dist/index.js --root ~/Documents --log-level debug

トラブルシューティング:docs/TROUBLESHOOTING.md。


ロードマップ

  • pdf_regions — ハイブリッドモデルのパイプライン向けに、bboxで範囲を指定した抽出
  • 視覚的な引用UX向けに {page, bbox} を公開する、位置情報付き項目のツール
  • ネイティブとWASMが同一の正規化済み形式を生成することを検証する統合テスト
  • オプションのOCRアダプターインターフェース。ルーティングの一連の流れをエンドツーエンドで完結

ライセンス

MIT

コメント

MCP は初めてですか?

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

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