PDF Triage について
PDF Triageは、AIツールからローカルPDFを扱うためのMCPサーバーです。抽出前に分類し、信頼性の低いテキストを示し、出力を制限して、アクセス先を指定ディレクトリ内に保ちます。
主な機能
- 01抽出前のPDF分類
- 02疑わしいテキストの警告
- 03Markdownと表の抽出
- 04PDFテキストの検索
- 05出力制限とパスの制限
活用シーン
- 01PDFのテキスト抽出可否の確認
- 02ローカルPDF内の語句検索
- 03長さを抑えたテキストや表の抽出
- 04文字化けしたPDFテキストへの依存回避
MCP 対応
分類、検索、テキスト抽出、表抽出を行う4つの `pdf_*` ツールをMCPクライアントに提供します。設定した `--root` ディレクトリ内のパスだけを読み取ります。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y pdf-triage-mcpPDF_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
4掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| path | string | はい | 許可されたルートからの相対パス、または .pdf ファイルの絶対パス |
詳細
pdf-triage-mcp
あらゆる 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
目次
- これが必要な理由
- インストール
- AI ツールへの接続 — 12 クライアント
- ツール
- 設定
- エンジンのフォールバック
- 既知の制限事項
- 開発
これが必要な理由
多くの 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 つの設計ルールが導かれます。
- 抽出の前に分類する。
pdf_classifyは約 20ms で実行され、そもそも抽出を試みる価値があるかどうかを判定します。 - すべての出力に上限を設ける。 300 ページの PDF は簡単に 50 万トークンに達します。すべての出力はデフォルトで切り詰められ、代わりにページを指定して取得する方法が案内されます。
- すべてのパスを制限する。 信頼できないドキュメントを読んだばかりのモデルが、
~/.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 を設定すると、一覧にある読み取り専用ツールは確認プロンプトなしで実行されます。
確認方法: パネルは自動的に更新されます。サーバーの横に緑色の点が表示されます。
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 から設定するため、編集するファイルはありません。
- Settings → Tools → AI Assistant → Model Context Protocol (MCP)
- Add → トランスポートに STDIO を選択
- 次を貼り付けます:
{
"mcpServers": {
"pdf-triage": {
"command": "npx",
"args": [
"-y", "pdf-triage-mcp",
"--root", "/Users/me/Documents"
]
}
}
}
- 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 Desktop | claude_desktop_config.json | mcpServers | 完全終了 |
| Claude Code | .mcp.json / CLI | mcpServers | 不要 |
| Cursor | .cursor/mcp.json | mcpServers | 不要 |
| Windsurf | ~/.codeium/windsurf/mcp_config.json | mcpServers | 不要 |
| VS Code Copilot | .vscode/mcp.json | servers | 初回のみ |
| Zed | ~/.config/zed/settings.json | context_servers | 不要 |
| Cline | cline_mcp_settings.json | mcpServers | 不要 |
| Continue.dev | ~/.continue/config.yaml | mcpServers(リスト) | 不要 |
| Gemini CLI | ~/.gemini/settings.json | mcpServers | 不要 |
| Codex CLI | ~/.codex/config.toml | [mcp_servers.*] | 該当なし |
| JetBrains | IDE の設定 UI | mcpServers | 不要 |
| LM Studio | ~/.lmstudio/mcp.json | mcpServers | 不要 |
形式が異なる3つ: VS Code(servers)、Zed(context_servers とネストされた command)、Codex(TOML の mcp_servers)。それ以外はすべて Claude Desktop と同じ形式をそのまま使用します。
ツール
| ツール | コスト | 目的 |
|---|---|---|
pdf_classify | 約20ms | 種類、信頼度、ページ数、OCRが必要なページを正確に判定します。最初に呼び出してください。 |
pdf_extract | 約150ms | PDF → Markdown。デフォルトでは途中で切り詰められます。pagesで範囲を指定してください。 |
pdf_search | 約150ms | テキストを検索し、ページ情報付きの抜粋を返します。長い文書を調べ始める最も低コストな方法です。 |
pdf_tables | 約150ms | Markdownのパイプテーブル形式で、表のみを返します。 |
全パラメーターのリファレンス: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
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。