Pdf Toolkit Mcp について
Pdf Toolkit Mcp は、PDF の読み取り、作成、編集、保護を行う TypeScript ネイティブの MCP サーバーです。スキャンページの画像化や、フォーム項目を維持したページ操作に対応し、ネイティブ依存なしで文書ワークフローを扱えます。
主な機能
- 01PDF テキストの抽出、検索、比較
- 02Markdown とテンプレートから PDF を作成
- 03PDF フォームの入力とフラット化
- 04ページの結合、分割、並べ替え、回転
- 05PDF の暗号化と QR コードや透かしの追加
- 06スキャンページを画像としてレンダリング
活用シーン
- 01Markdown レポートを整形済み PDF に変換
- 02画像レンダリングでスキャン文書を読み取り
- 03フォーム項目を保って PDF を結合または分割
- 04AES-256 暗号化で PDF を保護
MCP 対応
MCP クライアントに PDF の読み取り、作成、変換、レンダリング、セキュリティ用ツールを公開します。ガイド付きプロンプトとテンプレート一覧リソースも提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
22掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| filePath | string | はい | PDF ファイルの絶対パス |
| pages | string | いいえ | ページ範囲。例:'1-5' または '1,3,5'。デフォルトは最初の 10 ページです。 |
詳細
PDF Toolkit MCP
💼 フリーランスでの MCP/AI 統合作業を承っています — @aryansalian03 への DM、または aryanbv.com からご連絡ください。
あらゆる MCP クライアントで使える、PDF の書き込みに対応したツールキットです。PDF の読み取り、作成、レンダリング、変換、保護を行う 22 個のツールを提供します。ビジョンモデルがスキャン文書を読み取れるようにページを画像にレンダリングする機能、Markdown や構造化データから PDF を作成する機能、AES-256 暗号化、フォームフィールドを維持したまま行える結合・分割操作などが含まれます。ネイティブ依存関係はないため、単一の npx コマンドでローカル実行できます。
npx -y @aryanbv/pdf-toolkit-mcp
設定ファイル、API キー、Docker、コンパイラーは不要で、オフラインでも動作します。
概要
MCP 向け PDF サーバーの多くは読み取り専用です。このサーバーは書き込みにも対応しています。Markdown や構造化データから文書を作成し、フォームへの入力とフラット化、ページ構造の並べ替え、AES-256 暗号化の適用を、ネイティブのビルドツールチェーンなしで行えます。
知っておくと便利な点をいくつか紹介します。
- スキャン文書を読み取れます。
pdf_render_pagesはページを画像にラスタライズするため、ビジョンに対応したモデルで、テキストレイヤーのないスキャン PDF や画像のみの PDF を読み取れます。 - 結合、分割、並べ替え、削除の際に、AcroForm フィールドを削除せずに維持します。入力元の間で名前が重複する場合は、入力元ごとに名前空間を分けます。また、呼び出しのたびに、維持、名前変更、削除した項目を報告します。
- 暗号化には、従来の RC4 方式ではなく、qpdf による AES-256 を使用します。
- すべてのエンジンは WASM またはプレーンな JavaScript で構成されているため、
npxは Node 20 以降の Windows、macOS、Linux で、node-gyp、canvas バインディング、ビルド済みバイナリなしで動作します。 - エラーには安定したコードが付与され、スタックトレースは内部にとどまります。ページ外への配置は無言で切り取られるのではなく拒否され、大きなレスポンスは JSON を壊さずに切り詰められます。
クライアントの設定
Claude Desktop
claude_desktop_config.json に追加します。
{
"mcpServers": {
"pdf-toolkit": {
"command": "npx",
"args": ["-y", "@aryanbv/pdf-toolkit-mcp"]
}
}
}
Claude Code
claude mcp add pdf-toolkit -- npx -y @aryanbv/pdf-toolkit-mcp
Cursor
.cursor/mcp.json(プロジェクト)または ~/.cursor/mcp.json(グローバル)に追加します。
{
"mcpServers": {
"pdf-toolkit": {
"command": "npx",
"args": ["-y", "@aryanbv/pdf-toolkit-mcp"]
}
}
}
VS Code(GitHub Copilot)
VS Code では "mcpServers" ではなく "servers" を使います。他のクライアントの設定をコピーすると、エラーが表示されずに失敗します。また、Agent モード対応の GitHub Copilot 拡張機能が必要です。
.vscode/mcp.json に追加します。
{
"servers": {
"pdf-toolkit": {
"command": "npx",
"args": ["-y", "@aryanbv/pdf-toolkit-mcp"]
}
}
}
Windsurf
~/.codeium/windsurf/mcp_config.json に追加します。
{
"mcpServers": {
"pdf-toolkit": {
"command": "npx",
"args": ["-y", "@aryanbv/pdf-toolkit-mcp"]
}
}
}
接続後は、自然な言葉でやりたいことを依頼すると、クライアントがツールを選択し、引数を設定します。以下の JSON ブロックには、各ツールが受け取る引数を参考として示しています。
ツール
| カテゴリ | ツール | 説明 |
|---|---|---|
| 読み取り | pdf_extract_text | PDF ページからテキストを抽出します(デフォルトでは最初の 10 ページ) |
pdf_get_metadata | タイトル、著者、件名、ページ数、日付、作成ソフト、ファイルサイズを取得します | |
pdf_get_form_fields | フォームフィールド(テキスト、チェックボックス、ドロップダウン、ラジオグループ、リストボックス、ボタン、署名)を、名前、種類、値、必須状態とともに一覧表示します | |
pdf_to_markdown | PDF を読み取り順の Markdown に変換します(段組みの分類、見出しの推定、リストの検出) | |
pdf_search | ページをまたいでテキストを検索し、前後のスニペットとページ番号を返します(既定ではリテラル検索、大文字小文字を区別しません) | |
pdf_compare | 2 つの PDF のページ単位のテキスト差分を表示します | |
| 編集 | pdf_merge | 複数の PDF を 1 つに結合します(フォームフィールドを保持) |
pdf_split | ページ範囲を新しい PDF に抽出します(フォームフィールドを保持) | |
pdf_delete_pages | ページ範囲を削除し、残りのページを保持します(フォームフィールドを保持) | |
pdf_reorder_pages | 任意の順序にページを並べ替えます。重複も可能です(フォームフィールドを保持) | |
pdf_rotate_pages | ページを 90 度、180 度、または 270 度回転します | |
pdf_flatten | フォームフィールドの値を静的コンテンツに固定します(操作機能は削除されます) | |
pdf_encrypt | ユーザーパスワードと所有者パスワードによる AES-256 パスワード保護 | |
pdf_add_page_numbers | ページ番号を追加します(位置、形式、開始番号、サイズを設定可能。回転に対応) | |
pdf_embed_qr_code | QR コードまたはバーコードを埋め込みます(QR、Code128、DataMatrix、EAN-13、PDF417、Aztec。回転に対応) | |
| 作成 | pdf_create | プレーンテキストから PDF を作成します(ページサイズは A4、Letter、Legal。fontPath で非ラテン文字に対応) |
pdf_create_from_markdown | Markdown からリッチな PDF を作成します:見出し、表、リスト、コード、引用(A4、Letter、Legal) | |
pdf_create_from_template | 名前付きテンプレート(請求書、レポート、手紙)から PDF を作成します | |
pdf_fill_form | フォームフィールド(テキスト、チェックボックス、ドロップダウン、ラジオグループ、リストボックス)に入力します(fontPath で非ラテン文字に対応) | |
pdf_add_watermark | ページに斜めのテキスト透かしを追加します | |
pdf_embed_image | PNG または JPEG 画像をページに埋め込みます | |
| レンダリング | pdf_render_pages | ページを PNG または JPEG ファイルにレンダリングするか、ビジョンモデルが直接読み取れるインライン画像を返します |
Markdown から PDF を作成
Markdown を 1 回の呼び出しで複数ページの PDF に変換します。CommonMark と GFM に対応しており、見出し、太字と斜体、表、番号付きリストと箇条書き、フェンス付きコード、引用を @react-pdf/renderer でレンダリングします。
「この Markdown レポートから PDF を作成してください。」
pdf_create_from_markdown の引数:
{
"markdown": "# Quarterly Report\n\nRevenue grew **23% YoY**.\n\n| Region | Q1 2025 | Q1 2026 |\n|--------|---------|--------|\n| Americas | $1.2M | $1.5M |\n| EMEA | $800K | $960K |\n\n## Key Wins\n\n1. 12 new enterprise contracts\n2. Churn down to 3.1%",
"outputPath": "/path/to/report.pdf",
"pageSize": "Letter"
}
表の列幅は内容に合わせて調整され、配置も反映されます。ネストされたリストはインデントされ、長いコード行は折り返されます。後からページ番号を pdf_add_page_numbers で追加できます。
テンプレート
invoice、report、letter のテンプレートを使って、構造化データからドキュメントを生成します。
「Riverbend Outfitters の請求書を作成してください。」
pdf_create_from_template の引数:
{
"templateName": "invoice",
"data": {
"companyName": "Northpoint Design",
"clientName": "Riverbend Outfitters",
"invoiceNumber": "2026-0042",
"invoiceDate": "2026-04-01",
"items": [
{ "description": "Website redesign", "quantity": 40, "unitPrice": 150 },
{ "description": "Annual hosting", "quantity": 1, "unitPrice": 299 }
],
"taxRate": 18,
"currency": "USD",
"paymentTerms": "Net 30"
},
"outputPath": "/path/to/invoice.pdf"
}
invoice テンプレートの省略可能な currency には、ISO コードまたは記号を指定できます。WinAnsi で安全に扱える記号($ € £ ¥)はグリフとしてレンダリングされます。INR、KRW、TRY のように Helvetica で描画できないコードは、ISO コードのラベル(INR 20.00)にフォールバックするため、どの通貨でもエラーなく使用できます。pdf-toolkit://templates リソースには、すべてのテンプレートと、それぞれが受け付けるフィールドが記載されています。
スキャン PDF と画像のみの PDF を読み取る(ビジョン)
多くの PDF はテキストレイヤーのないスキャンです。pdf_render_pages はページをラスタライズするため、ビジョン機能を備えたクライアントで読み取れます。
「このスキャンされた契約書を読んでください。」
インラインモードでは、モデルが直接読み取るページ画像が返されます(最大 5 ページ。コンテキストウィンドウを保護するため、DPI は自動的に上限が設定されます)。
{ "filePath": "/path/to/scanned.pdf", "inline": true }
または、画像ファイルをディスクに書き出します(デフォルトは 150 DPI、先頭から 50 ページ、PNG)。
{
"filePath": "/path/to/scanned.pdf",
"pages": "1-3",
"dpi": 200,
"format": "jpeg",
"outputDir": "/path/to/output"
}
PDF を Markdown に変換
「report.pdf を Markdown に変換して、要約できるようにしてください。」
pdf_to_markdown はテキストの位置から読み取り順序を再構成します。最大 2 列のコンテンツ(および全幅のタイトルとフッターの帯)をグループ化し、フォントサイズから見出しを推定して、リストを検出します。きれいなデジタル PDF で最もよく機能します。スキャンには pdf_render_pages を使用してください。デフォルトでは最初の 10 ページを返します。
{ "filePath": "/path/to/report.pdf", "pages": "1-5" }
検索と比較
「contract.pdf 内で『indemnification』が出てくる箇所をすべて見つけてください。」
pdf_search の引数:
{
"filePath": "/path/to/contract.pdf",
"query": "indemnification",
"caseSensitive": false
}
各一致箇所は、ページ番号と前後の抜粋とともに返されます。デフォルトでは、大文字と小文字を区別しないリテラル文字列検索です。大文字と小文字を正確に区別するには、caseSensitive: true を設定してください。攻撃者が用意したパターンによって壊滅的なバックトラッキング(ReDoS)が発生する可能性があり、シングルスレッドの JavaScript では確実に中断できないため、正規表現検索は意図的に除外しています。安全な正規表現は今後のリリースで対応する予定です。
「v1.pdf と v2.pdf では何が変わりましたか?」
pdf_compare の引数:
{ "filePathA": "/path/to/v1.pdf", "filePathB": "/path/to/v2.pdf" }
ページごとのテキスト差分(added と removed)を報告し、テキストが一致する場合は identical: true を設定します。差分はテキストのみを対象とするため、視覚的な変更だけの場合は検出されません。
フォームを維持したまま結合、分割、削除、フラット化
ページの結合、分割、並べ替え、削除では AcroForm フィールドが維持されます。入力間で名前が重複する場合は、入力元ごとに名前空間が分けられます。各ツールは { preserved, renamed, dropped } を返します。renamed は { from, to } のペアのリストです(名前が変更されたフィールドは、以後 to の名前で指定してください)。これらのツールと pdf_flatten は、flattened ブール値も返します。
「この 3 つのフォームを結合して、結果をフラット化してください。」
pdf_merge の引数:
{
"filePaths": ["/path/a.pdf", "/path/b.pdf", "/path/c.pdf"],
"outputPath": "/path/merged.pdf",
"flatten": true
}
「report.pdf から 2 ページ目と 5 ページ目を削除してください。」
pdf_delete_pages の引数:
{
"filePath": "/path/report.pdf",
"pages": "2,5",
"outputPath": "/path/trimmed.pdf"
}
既存フォームの値を静的コンテンツに変換するには、pdf_flatten を単独で使用します。出力パスは入力と異なる必要があります。
暗号化
「report.pdf をパスワード『secure123』で暗号化してください。」
暗号化方式は AES-256 です。アクセスを細かく制御するには、ユーザー(開く)パスワードと所有者(編集)パスワードを別々に設定します。省略した場合、所有者パスワードはユーザーパスワードがデフォルトになります。
pdf_encrypt の引数:
{
"filePath": "/path/report.pdf",
"outputPath": "/path/report-encrypted.pdf",
"userPassword": "secure123",
"ownerPassword": "admin456"
}
QR コードとバーコード
「1 ページ目に、ウェブサイトへのリンクを含む QR コードを追加してください。」
pdf_embed_qr_code は、QR Code、Code128、DataMatrix、EAN-13、PDF417、Aztec に対応しています。位置とサイズを設定でき、シンボルの縦横比は維持されます。配置は回転を考慮し、ページ外への配置は切り抜かずに拒否されます。
ガイド付きプロンプト
このサーバーには、クライアント向けに複数ステップのワークフローを実行する 5 つの MCP プロンプトが含まれています。
| プロンプト | 引数 | 処理内容 |
|---|---|---|
create-invoice | company_name, client_name, invoice_number, items(任意で currency, tax_rate, due_date, company_address, client_address, payment_terms, notes も指定可能) | 明細項目を解析し、pdf_create_from_template の呼び出しを作成します |
fill-form | pdf_path | pdf_get_form_fields でフィールドを検出し、pdf_fill_form で入力します |
read-scanned-pdf | pdf_path | テキスト抽出を試し、失敗した場合はインラインの pdf_render_pages による視覚的な読み取りに切り替えます |
pdf-to-markdown | pdf_path | Markdown に変換し、必要に応じて要約します |
merge-and-flatten | pdf_paths, output_path | 複数の PDF を結合し、フォームフィールドをフラット化します |
リソース
pdf-toolkit://templates は、pdf_create_from_template で利用できるテンプレートと、それぞれが受け付けるフィールドを一覧にした JSON リソースです。
普通の言葉で試す
- 「この Markdown レポートから PDF を作成してください」
- 「Riverbend Outfitters 宛てに、コンサルティング 10 時間、時給 $150 の請求書を作成してください」
- 「january.pdf と february.pdf を q1-combined.pdf に結合してください」
- 「この PDF を Markdown に変換して、要約できるようにしてください」
- 「このスキャン PDF を読み取れるようにレンダリングしてください」
- 「contract.pdf から 'termination' を検索してください」
- 「draft-v1.pdf と draft-v2.pdf を比較してください」
- 「application.pdf の Name フィールドに 'John Doe' を入力してください」
- 「draft.pdf に CONFIDENTIAL の透かしを追加してください」
- 「financials.pdf を AES-256 のパスワード 'budget2026' で暗号化してください」
- 「表紙に URL を含む QR コードを埋め込んでください」
- 「report.pdf のページを 3,1,2 の順に並べ替えてください」
エラーと出力の仕様
- コード付きエラー。 検証エラーや読み込みエラーが発生すると、安定したコードを持つ
PdfErrorがスローされ、Error [CODE]: messageとして通知されます(例:FILE_NOT_FOUND、NOT_A_PDF、PAGE_OUT_OF_RANGE、ENCRYPTED_PDF、RESOURCE_LIMIT)。クライアントはメッセージ本文を解析する代わりにコードに応じた処理を実行でき、スタックトレースが漏えいすることはありません。 - 書き込みツールの出力。 書き込みツールは
outputPathにファイルを作成し、MCP にはファイル内容の型がないため、そのパスとサイズをテキストで返します。outputPathには既存ファイルも指定でき、その場合は上書きされるため、残しておきたいファイルと衝突しないパスを選んでください。 - JSON に安全な切り詰め。 応答は 25,000 文字までに制限されます。オブジェクトのペイロードは、トークンの途中で切れた文字列ではなく、有効な
{ truncated, note, preview }エンベロープとして返されるため、クライアントのJSON.parseが失敗することはありません。
既知の制限事項
- 結合、分割、並べ替え、削除。 フォームフィールドは保持されます。名前が衝突した場合は名前空間が付与され、
renamedに{ from, to }のペアとして報告されます。安全に再構築できない特殊なフォームは、処理を失敗させるのではなく、droppedに報告されます。 - テキスト抽出。 PDF のストリーム順で返され、視覚的な読み取り順ではありません。読み取り順が重要な場合は
pdf_to_markdownを使用してください。生のpdf_extract_textでは、複数列のレイアウトが入り交じることがあります。 - PDF から Markdown への変換。 最大 2 列のコンテンツを再構成します(全幅のタイトル帯とフッター帯を含む)。3 列以上のページは、単一列の読み取り順にフォールバックします。クリーンなデジタル PDF で最も適切に動作します。表形式のコンテンツは Markdown の表に再構成されず、読み取り順に配置されたテキストとして出力されます。
- Markdown から PDF への変換。 CommonMark と GFM に対応しています(見出し、太字と斜体、リンク、リスト、表、フェンス付きコード、引用、水平線)。生の HTML、タスクリストのチェックボックスの状態、脚注、コードのシンタックスハイライトには対応していません。
- 比較。 テキストのみを差分比較します。テキストに影響しない視覚的な変更やレイアウトの変更は検出されません。
- 画像の埋め込み。 JPEG と PNG のみです。ページ外への配置は、暗黙に切り取られるのではなく、コード付きエラーとして拒否されます。
- フォント。 組み込みフォントは Latin 文字のみ(WinAnsi)に対応しています。アラビア語、CJK、デーヴァナーガリーなどの非 Latin 文字を使用する場合は、
.ttfまたは.otfファイルをfontPath経由でpdf_fill_formまたはpdf_createに渡してください。Markdown とテンプレート PDF では、デフォルトで Helvetica が使用されます。
技術スタック
複数のエンジンを使用する設計です。各エンジンは純粋な WASM または JavaScript で構成されています。
| エンジン | 役割 |
|---|---|
| @pdfme/pdf-lib | 既存 PDF の操作:結合、分割、回転、透かし、フォーム、画像、QR コード、フラット化 |
| @react-pdf/renderer + remark | Markdown とテンプレートからの PDF 作成。表やコードブロックにも対応 |
| unpdf (pdf.js) | テキスト抽出、メタデータ、読み取り順の Markdown 用の位置付きテキスト |
| @hyzyla/pdfium (WASM) | 画像認識用にページを画像へレンダリング |
| @neslinesli93/qpdf-wasm (WASM) | AES-256 暗号化 |
| @bwip-js/node | QR コードとバーコード |
要件
- Node.js 20 以降。Node 18 と 20.x 系はサポート終了のため、Node 22 または 24 LTS を推奨します。
開発
npm install # install dependencies
npm run build # compile TypeScript
npm test # run the vitest suite (160 tests)
npm run test:cov # tests with coverage
npm run lint # ESLint
npm run format # Prettier
npm run inspect # MCP Inspector (requires Node >= 22.7.5)
アーキテクチャとコントリビューションに関する注意事項については、CLAUDE.md を参照してください。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。