MochiuWiki : SUSE, EC, PCB
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
MCPサーバ - PDFのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
MCPサーバ - PDF
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == 本ページでは、AIアシスタントがPDFファイルの読み取り、解析、操作を可能にする2つのMCPサーバについて記述する。<br> <br> * PDF Reader MCPサーバ *: PDFファイルからのテキスト抽出、メタデータ取得、ページ操作等の読み取りに特化したMCPサーバである。 * PDF-Tools MCPサーバ *: PDFの読み取りに加えて、フォーム入力 (fill)、CSV一括入力、プロファイル管理、バリデーション等の書き込み系の機能を持つMCPサーバである。 <br> 読み取り専用の用途にはPDF Reader MCPサーバ、フォーム入力や比較が必要な用途にはPDF-Tools MCPサーバを使用する。<br> 両サーバはStandard I/O (STDIO) トランスポートを使用してローカル環境で動作し、Claude Desktop、Claude Code、Cursor等のMCPクライアントと統合することができる。<br> <br> <center> {| class="wikitable" |+ 2つのMCPサーバの比較 |- ! 機能 !! PDF Reader MCP !! PDF-Tools MCP |- | テキスト抽出 || Yes || Yes |- | メタデータ取得 || Yes || No |- | キーワード検索 || Yes || No |- | テーブルデータ抽出 || Yes (一部実装) || Yes |- | フォームフィールド読み取り || No || Yes |- | フォーム入力 (fill) || No || Yes |- | CSVからの一括フォーム入力 || No || Yes |- | プロファイル管理 || No || Yes |- | フォームバリデーション || No || Yes |- | PDFデータのCSV出力 || No || Yes |- | ドキュメント比較 || No || Yes |- | パスワード保護PDF対応 || No || Yes |- | OCR対応 || No || Yes |- | ページ数取得 || Yes || No |- | ブックマーク構造取得 || Yes || No |} </center> <br><br> = PDF Reader MCPサーバ = ==== PDF Reader MCPの概要 ==== PDF Reader MCPサーバは、AIアシスタントがPDFファイルの読み取り、解析、操作を可能にするMCP (Model Context Protocol) サーバである。<br> このMCPを使用することにより、Claude等のLLMがPDFドキュメントのテキスト抽出、メタデータ取得、ページ操作等を実行することができる。<br> <br> PDF Reader MCPサーバは、以下に示すような機能を提供する。<br> * PDFファイルからのテキスト抽出 * PDFメタデータの取得 (タイトル、著者、作成日等) * ページ数やドキュメント構造の取得 * 複数PDFファイルの同時処理 * ページ範囲指定によるテキスト抽出 * PDFテーブルデータの抽出 (一部実装) <br> PDF Reader MCPサーバは、Standard I/O (STDIO) トランスポートを使用してローカル環境で動作する。<br> これにより、Claude Desktop、Claude Code、Cursor等のMCPクライアントと統合することができる。<br> <br> ==== PDF Reader MCPの機能 ==== ===== テキスト抽出 ===== * PDFドキュメント全体からのテキスト抽出 * 指定ページ範囲からのテキスト抽出 * フォーマット保持オプション * マルチカラム対応 * レイアウト解析 <br> ===== メタデータ処理 ===== * ドキュメントタイトル * 著者情報 * 作成日時 * 修正日時 * PDFバージョン * ページ数 * ファイルサイズ <br> ===== ページ操作 ===== * 個別ページへのアクセス * ページ範囲指定 * ページ数の取得 * ページサイズ情報 <br> ===== 高度な機能 ===== * テーブルデータの抽出 * 画像情報の取得 * リンクとアノテーションの解析 * ブックマーク構造の取得 <br> ==== PDF Reader MCPの動作要件 ==== ===== システム要件 ===== * Node.js 18以上 * Python 3.8以上 (Pythonを使用するの場合) <br> ===== 必須ライブラリ ===== Node.jsを使用する場合<br> * pdf-parse >= 1.1.1 * pdf-lib >= 1.17.1 * pdfjs-dist >= 3.0.0 <br> Pythonを使用する場合<br> * PyPDF2 >= 3.0.0 * pdfplumber >= 0.9.0 * PyMuPDF (fitz) >= 1.22.0 * fastmcp >= 0.1.0 <br> ==== PDF Reader MCPのインストール ==== ===== Linux ===== ====== 依存関係のインストール ====== まず、必要な環境をインストールする。<br> # RHEL sudo dnf install curl wget git gcc-c++ make python3 python3-pip nodejs npm unzip # SUSE sudo zypper install curl wget git gcc-c++ make python3 python3-pip nodejs npm unzip # Debian sudo apt install curl wget git build-essential python3 python3-pip nodejs npm unzip <br> ====== Node.jsのインストール ====== Node.jsの最新版をインストールする場合は、NodeSourceリポジトリを使用する。<br> curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - <br> # RHEL sudo dnf install nodejs # SUSE sudo zypper install nodejs # Debian sudo apt install nodejs <br> ====== Bunのインストール ====== Bunをインストールする。<br> curl -fsSL https://bun.com/install | bash <br> ~/.profileファイル等に、環境変数 <code>PATH</code> を設定する。<br> <syntaxhighlight lang="sh"> export PATH="$BUN_INSTALL/bin:$PATH" </syntaxhighlight> <br> または、下記のURLからバンドル版をダウンロードする。<br> * https://github.com/oven-sh/bun/releases/latest/download/bun-linux-x64.zip <br> ダウンロードしたファイルを解凍する。<br> 必要ならば、解凍したファイルを任意のディレクトリに配置する。<br> unzip bun-linux-x64.zip mv bun-linux-x64 <任意のディレクトリ> <br> ~/.profileファイル等に、環境変数 <code>PATH</code> を設定する。<br> <syntaxhighlight lang="sh"> export PATH="/<Bunのインストールディレクトリ>/bin:$PATH" </syntaxhighlight> <br> ====== PDF Reader MCPのインストール ====== PDF Reader MCPをダウンロードする。<br> git clone https://github.com/SylphxAI/pdf-reader-mcp.git cd pdf-reader-mcp <br> Node.jsを使用する場合、依存関係をインストールする。<br> npm install # エラーが表示される場合 rm -rf node_modules package-lock.json npm install --ignore-scripts npm run build # または npm install -g @sylphx/pdf-reader-mcp <br> Pythonを使用する場合、仮想環境を作成して依存関係をインストールする。<br> python3 -m venv venv # Bash / Zshの場合 source venv/bin/activate # Fishの場合 source venv/bin/activate.fish # 依存関係のインストール pip install -r requirements.txt <br> ===== Windows ===== [https://nodejs.org/ Node.jsの公式Webサイト]からNode.jsをダウンロードしてインストールする。<br> <br> [https://git-scm.com/ Git for Windowsの公式Webサイト]からインストーラをダウンロードしてインストールする。<br> <br> PowerShellまたはコマンドプロンプトを開いて、PDF Reader MCPをダウンロードする。<br> git clone https://github.com/SylphxAI/pdf-reader-mcp.git cd pdf-reader-mcp <br> PDF Reader MCPの依存関係をインストールする。<br> npm install <br> ==== PDF Reader MCPのプロジェクト構造 ==== PDF Reader MCPサーバのプロジェクト構造を以下に示す。<br> <br> pdf-reader-mcp/ ├── README.md # プロジェクトドキュメント ├── package.json # Node.js依存関係 (Node.js実装) ├── requirements.txt # Python依存関係 (Python実装) ├── tsconfig.json # TypeScript設定 (Node.js実装) ├── .env.example # 環境設定の例 ├── src/ # ソースコード (Node.js実装) │ ├── index.ts # メインエントリーポイント │ ├── tools/ # ツール実装 │ │ ├── read_pdf.ts │ │ ├── get_metadata.ts │ │ ├── get_page_count.ts │ │ ├── search_pdf.ts │ │ └── extract_table.ts │ └── utils/ # ユーティリティ関数 │ ├── file_validator.ts │ ├── path_resolver.ts │ └── error_handler.ts ├── server.py # メインサーバ (Python実装) ├── tools/ # ツール実装 (Python実装) │ ├── __init__.py │ ├── read_pdf.py │ ├── metadata.py │ ├── search.py │ └── tables.py ├── utils/ # ユーティリティ (Python実装) │ ├── __init__.py │ ├── validators.py │ └── security.py ├── tests/ # テスト │ ├── test_read_pdf.py │ ├── test_metadata.py │ └── test_security.py └── docs/ # ドキュメント ├── API.md ├── USAGE.md └── TROUBLESHOOTING.md <br> ==== PDF Reader MCPのクライアント接続設定 ==== ===== Claude Desktopからの接続 ===== Claude Desktopの設定ファイルを編集する。<br> <br> 設定ファイルの場所は、以下の通りである。<br> * Linux *: ~/.config/Claude/claude_desktop_config.json * Windows *: %APPDATA%\Claude\claude_desktop_config.json <br> Node.jsを使用する場合の設定を以下に示す。<br> <syntaxhighlight lang="json"> { "mcpServers": { "pdf-reader": { "command": "node", "args": [ "/<任意のディレクトリ>/pdf-reader-mcp/dist/index.js" ], "env": { "NODE_ENV": "production" } } } } </syntaxhighlight> <br> または、<code>npm install -g @sylphx/pdf-reader-mcp</code> コマンドを実行してインストールした場合は、以下に示す設定を行う。<br> <syntaxhighlight lang="json"> { "mcpServers": { "pdf-reader": { "command": "npx", "args": ["@sylphx/pdf-reader-mcp"] } } } </syntaxhighlight> <br> Pythonを使用する場合の設定を以下に示す。<br> <syntaxhighlight lang="json"> { "mcpServers": { "pdf-reader": { "command": "/<任意のディレクトリ>/pdf-reader-mcp/venv/bin/python", "args": [ "/<任意のディレクトリ>/pdf-reader-mcp/server.py" ] } } } </syntaxhighlight> <br> Windows環境の場合、パスを適切に変更する。<br> <syntaxhighlight lang="json"> { "mcpServers": { "pdf-reader": { "command": "node", "args": [ "C:\\<任意のディレクトリ>\\pdf-reader-mcp\\dist\\index.js" ] } } } </syntaxhighlight> <br> Claude Desktopを再起動して、PDF Reader MCPサーバが利用可能であることを確認する。<br> <br> ===== Clineからの接続 ===== Clineの設定ファイルを編集する。<br> # Linux ~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json # Windows %APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json <br> 設定内容はClaude Desktopと同じフォーマットを使用する。<br> <br> ===== Cursorからの接続 ===== Cursorのグローバル設定ファイルを編集する。<br> # Linux ~/.cursor/mcp.json # Windows %USERPROFILE%\.cursor\mcp.json # MacOS ~/.cursor/mcp.json <br> 設定内容を以下に示す。<br> <syntaxhighlight lang="json"> { "mcpServers": { "pdf-reader": { "command": "node", "args": ["/path/to/pdf-reader-mcp/dist/index.js"], "autoApprove": [], "disabled": false, "timeout": 60, "transportType": "stdio" } } } </syntaxhighlight> <br> または、プロジェクト固有の設定として .cursor/mcp.jsonファイルをプロジェクトディレクトリに配置する。<br> <br> ===== Claude Codeからの接続 ===== Claude Codeは、カレントディレクトリ内のMCPサーバを自動的に検出するため、追加の設定は不要である。<br> <br> ==== PDF Reader MCPの利用可能なツール ==== ===== read_pdf ===== PDFファイル全体または指定ページ範囲からテキストを抽出する。<br> <br> <center> {| class="wikitable" |+ パラメータ |- ! パラメータ !! 型 !! 必須 !! 説明 |- | file_path || string || 必須 || PDFファイルの絶対パスまたは相対パス |- | start_page || integer || オプション || 開始ページ番号 (1から始まる) |- | end_page || integer || オプション || 終了ページ番号 (1から始まる) |} </center> <br> * 使用例 *: <syntaxhighlight lang="text"> # PDFファイル全体を読み取る 「/path/to/document.pdf」のPDFファイルを読み取ってください。 # ページ範囲を指定して読み取る 「/path/to/document.pdf」の5ページから10ページまでを読み取ってください。 </syntaxhighlight> *: <br> * 戻り値の例 *: <syntaxhighlight lang="json"> { "text": "抽出されたテキストの内容...", "pages": 6, "file": "/path/to/document.pdf" } </syntaxhighlight> <br> ===== get_pdf_metadata ===== PDFファイルのメタデータを取得する。<br> <br> <center> {| class="wikitable" |+ パラメータ |- ! パラメータ !! 型 !! 必須 !! 説明 |- | file_path || string || 必須 || PDFファイルの絶対パスまたは相対パス |} </center> <br> * 使用例 *: <pre>「/path/to/document.pdf」のメタデータを取得してください。</pre> *: <br> * 戻り値の例 *: <syntaxhighlight lang="json"> { "title": "Document Title", "author": "Author Name", "subject": "Document Subject", "creator": "PDF Creator", "producer": "PDF Producer", "creation_date": "2024-01-15T10:30:00Z", "modification_date": "2024-01-20T15:45:00Z", "page_count": 42, "pdf_version": "1.7", "file_size": 1024576 } </syntaxhighlight> <br> ===== get_pdf_page_count ===== PDFファイルの総ページ数を取得する。<br> <br> <center> {| class="wikitable" |+ パラメータ |- ! パラメータ !! 型 !! 必須 !! 説明 |- | file_path || string || 必須 || PDFファイルの絶対パスまたは相対パス |} </center> <br> * 使用例 *: <pre>「/path/to/document.pdf」のページ数を教えてください。</pre> *: <br> * 戻り値の例 *: <syntaxhighlight lang="json"> { "page_count": 42, "file": "/path/to/document.pdf" } </syntaxhighlight> <br> ===== extract_pdf_table ===== PDFファイルからテーブルデータを抽出する。<br> (定義により利用可能性が異なる)<br> <br> <center> {| class="wikitable" |+ パラメータ |- ! パラメータ !! 型 !! 必須 !! 説明 |- | file_path || string || 必須 || PDFファイルの絶対パスまたは相対パス |- | page_number || integer || オプション || テーブルを抽出するページ番号 |- | table_settings || object || オプション || テーブル抽出の詳細設定 |} </center> <br> * 使用例 *: <pre>「/path/to/document.pdf」の3ページ目からテーブルを抽出してください。</pre> <br> ===== search_pdf ===== PDFファイル内でキーワードを検索する。<br> <br> <center> {| class="wikitable" |+ パラメータ |- ! パラメータ !! 型 !! 必須 !! 説明 |- | file_path || string || 必須 || PDFファイルの絶対パスまたは相対パス |- | keyword || string || 必須 || 検索するキーワード |- | case_sensitive || boolean || オプション || 大文字小文字を区別するか (デフォルト : false) |} </center> <br> * 使用例 *: <pre>「/path/to/document.pdf」から「機械学習」というキーワードを検索してください。</pre> *: <br> * 戻り値の例 *: <syntaxhighlight lang="json"> { "matches": [ { "page": 5, "context": "...機械学習アルゴリズムを使用して...", "position": 234 }, { "page": 12, "context": "...機械学習モデルの訓練では...", "position": 567 } ], "total_matches": 2 } </syntaxhighlight> <br> === PDF Reader MCPの使用例 === ===== 基本的なPDF読み取り ===== * 「~/Documents/report.pdf」を読み取ってください。 * 「/home/user/papers/research.pdf」の1ページから5ページまでを読み取ってください。 <br> ===== メタデータ取得 ===== * 「~/Documents/manual.pdf」のメタデータを取得してください。 * 「~/Downloads/invoice.pdf」のページ数を教えてください。 <br> ===== キーワード検索 ===== * 「~/Documents/thesis.pdf」から「機械学習」というキーワードを検索してください。 * 「~/papers/article.pdf」で「neural network」を大文字小文字を区別して検索してください。 <br> ===== テーブル抽出 ===== * 「~/Documents/financial_report.pdf」の3ページ目からテーブルを抽出してください。 * 「~/data/statistics.pdf」からすべてのテーブルを抽出してください。 <br> ===== 複数ファイルの処理 ===== * 以下のPDFファイルを全て読み取って、内容を要約してください。 *: - ~/Documents/chapter1.pdf *: - ~/Documents/chapter2.pdf *: - ~/Documents/chapter3.pdf <br> ==== PDF Reader MCPのトラブルシューティング ==== ===== PDFファイルの読み込みに失敗する ===== * ファイルが存在しないエラー * 読み込み権限エラー * フォーマットエラー <br> 解決方法を以下に示す。<br> * ファイルパスが正しいか確認する *: <pre>ls -la /path/to/file.pdf</pre> * ファイルの読み取り権限があるか確認する *: <pre>chmod 644 /path/to/file.pdf</pre> * PDFファイルが破損していないか確認する *: <pre>pdfinfo /path/to/file.pdf</pre> * PDFのバージョンが古い場合、変換を試みる *: <pre>gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.7 -o output.pdf input.pdf</pre> <br> ===== テキスト抽出が正しく動作しない ===== * 空のテキストが返される * 文字化けが発生する * レイアウトが崩れる <br> 解決方法を以下に示す。<br> * PDFがスキャン画像ベースでないか確認する (OCRが必要) * 異なるライブラリを試す (pdfplumber → PyMuPDF) *: <syntaxhighlight lang="python"> import fitz # PyMuPDF def read_pdf_with_pymupdf(file_path: str) -> str: doc = fitz.open(file_path) text = "" for page in doc: text += page.get_text() return text </syntaxhighlight> <br> また、エンコーディングの問題を確認する<br> <br> ===== メモリ不足エラー ===== * 大きなPDFファイルで処理が停止する * メモリエラーが発生する <br> 解決方法を以下に示す。<br> * ページ単位の処理を実装する * ファイルサイズ制限を設定する * ストリーミング処理を使用する * Python環境のメモリ制限を増やす <br> ==== PDF Reader MCPのパフォーマンスの最適化 ==== ===== ページ単位の処理 ===== 大規模なPDFファイルを処理する場合、ページ単位で処理することでメモリ使用量を削減できる。<br> <br> <syntaxhighlight lang="python"> def read_pdf_streaming(file_path: str, page_size: int = 10): """ストリーミング方式でPDFを読み込む""" path = Path(file_path).resolve() with pdfplumber.open(str(path)) as pdf: total_pages = len(pdf.pages) for start in range(0, total_pages, page_size): end = min(start + page_size, total_pages) batch_text = [] for page_num in range(start, end): page = pdf.pages[page_num] text = page.extract_text() if text: batch_text.append(text) yield { "text": "\n\n".join(batch_text), "pages": f"{start + 1}-{end}", "total_pages": total_pages } </syntaxhighlight> <br> ===== キャッシング ===== 頻繁にアクセスされるPDFファイルのメタデータをキャッシュする。<br> <br> <syntaxhighlight lang="python"> from functools import lru_cache import hashlib def get_file_hash(file_path: str) -> str: """ファイルのハッシュ値を計算する""" hasher = hashlib.md5() with open(file_path, 'rb') as f: buf = f.read(65536) while len(buf) > 0: hasher.update(buf) buf = f.read(65536) return hasher.hexdigest() @lru_cache(maxsize=50) def get_cached_metadata(file_path: str, file_hash: str) -> dict: """キャッシュされたメタデータを取得する""" return get_pdf_metadata(file_path) @mcp.tool() def get_pdf_metadata_cached(file_path: str) -> dict: """キャッシュを使用してメタデータを取得する""" try: file_hash = get_file_hash(file_path) return get_cached_metadata(file_path, file_hash) except Exception as e: return {"error": str(e)} </syntaxhighlight> <br> ===== 並列処理 ===== 複数のPDFファイルを同時に処理する場合、並列処理を使用する。<br> <br> <syntaxhighlight lang="python"> from concurrent.futures import ThreadPoolExecutor, as_completed def process_multiple_pdfs(file_paths: list[str]) -> list[dict]: """複数のPDFファイルを並列処理する""" results = [] with ThreadPoolExecutor(max_workers=4) as executor: future_to_path = { executor.submit(read_pdf, path): path for path in file_paths } for future in as_completed(future_to_path): path = future_to_path[future] try: result = future.result() results.append({ "file": path, "result": result }) except Exception as e: results.append({ "file": path, "error": str(e) }) return results </syntaxhighlight> <br> ==== PDF Reader MCPの高度な機能 ==== ===== OCR統合 ===== スキャンされたPDFファイルからテキストを抽出する場合、OCR機能を統合する。<br> <br> <syntaxhighlight lang="python"> from PIL import Image import pytesseract import pdf2image def extract_text_with_ocr(file_path: str) -> str: """OCRを使用してスキャンPDFからテキストを抽出する""" # PDFを画像に変換 images = pdf2image.convert_from_path(file_path) text_content = [] for image in images: # OCR実行 text = pytesseract.image_to_string(image, lang='jpn+eng') text_content.append(text) return "\n\n".join(text_content) </syntaxhighlight> <br> ===== PDF分割 ===== 大きなPDFファイルを分割する機能を追加する。<br> <br> <syntaxhighlight lang="python"> from PyPDF2 import PdfWriter, PdfReader @mcp.tool() def split_pdf( file_path: str, output_dir: str, pages_per_file: int = 10 ) -> dict: """PDFファイルを複数のファイルに分割する""" try: path = Path(file_path).resolve() output_path = Path(output_dir).resolve() output_path.mkdir(exist_ok=True) reader = PdfReader(str(path)) total_pages = len(reader.pages) file_count = 0 for start in range(0, total_pages, pages_per_file): writer = PdfWriter() end = min(start + pages_per_file, total_pages) for page_num in range(start, end): writer.add_page(reader.pages[page_num]) output_file = output_path / f"split_{file_count + 1}.pdf" with open(output_file, 'wb') as output: writer.write(output) file_count += 1 return { "files_created": file_count, "output_directory": str(output_path) } except Exception as e: return {"error": f"分割エラー: {str(e)}"} </syntaxhighlight> <br> ===== PDF結合 ===== 複数のPDFファイルを結合する機能を追加する。<br> <br> <syntaxhighlight lang="python"> @mcp.tool() def merge_pdfs( file_paths: list[str], output_path: str ) -> dict: """複数のPDFファイルを結合する""" try: writer = PdfWriter() for file_path in file_paths: reader = PdfReader(file_path) for page in reader.pages: writer.add_page(page) with open(output_path, 'wb') as output: writer.write(output) return { "output_file": output_path, "total_pages": len(writer.pages) } except Exception as e: return {"error": f"結合エラー: {str(e)}"} </syntaxhighlight> <br> ===== PDFブックマーク抽出 ===== PDFファイルのブックマーク構造を取得する。<br> <br> <syntaxhighlight lang="python"> @mcp.tool() def get_pdf_bookmarks(file_path: str) -> dict: """PDFファイルのブックマーク構造を取得する""" try: path = Path(file_path).resolve() reader = PdfReader(str(path)) def extract_bookmarks(bookmarks, level=0): result = [] for item in bookmarks: if isinstance(item, list): result.extend(extract_bookmarks(item, level + 1)) else: result.append({ "title": item.title, "page": reader.get_destination_page_number(item) + 1, "level": level }) return result bookmarks = reader.outline if bookmarks: return { "bookmarks": extract_bookmarks(bookmarks) } else: return {"bookmarks": [], "message": "ブックマークが見つかりません"} except Exception as e: return {"error": f"ブックマーク取得エラー: {str(e)}"} </syntaxhighlight> <br><br> = PDF-Tools MCPサーバ = ==== PDF-Tools MCPの概要 ==== PDF-Tools MCPサーバは、AIアシスタントがPDFフォームの入力、解析、比較、データ抽出を可能にするMCP (Model Context Protocol) サーバである。<br> このMCPを使用することにより、Claude等のLLMがPDFフォームへのデータ入力、CSVからの一括入力、プロファイル管理、フォームバリデーション等を実行することができる。<br> <br> PDF-Tools MCPサーバは、以下に示すような機能を提供する。<br> * PDFドキュメントの解析 (300ページ以上に対応) * PDFフォームフィールドの読み取りとデータ入力 * CSVファイルからのPDFフォーム一括入力 * プロファイルの保存と再利用 * 契約書等のPDF比較 * フォームバリデーション (必須フィールドのチェック) * パスワード保護されたPDFの操作 * OCRによるスキャンドキュメントのテキスト抽出 * PDFデータのCSV出力 <br> PDF-Tools MCPサーバは、Standard I/O (STDIO) トランスポートを使用してローカル環境で動作する。<br> これにより、Claude Desktop、Cursor等のMCPクライアントと統合することができる。<br> <br> ==== PDF-Tools MCPの機能 ==== ===== ドキュメント解析 ===== * PDFドキュメント全体のテキスト抽出と解析 * テーブル、テキスト、構造化データの抽出 * スキャンドキュメントのOCR対応 * 300ページ以上の大規模PDFに対応 <br> ===== フォーム操作 ===== * PDFフォームフィールドの一覧取得 * フォームフィールドへのデータ入力 * CSVファイルからの一括フォーム入力 * フォームバリデーション (必須フィールドのチェック) * パスワード保護されたPDFフォームの操作 <br> ===== プロファイル管理 ===== * フォームデータのプロファイル保存 * 保存済みプロファイルの読み込み * プロファイル一覧の表示 * プロファイルを使用したフォーム入力 <br> ===== データ入出力 ===== * PDFデータのCSV出力 * CSVデータからのPDF一括入力 * 契約書等のドキュメント比較 <br> ==== PDF-Tools MCPの動作要件 ==== ===== システム要件 ===== * Node.js 18以上 * npm (Node.jsに付属) <br> ===== 必須ライブラリ ===== * @modelcontextprotocol/sdk (MCP SDK) * pdf-lib (PDF操作) <br> ==== PDF-Tools MCPのインストール ==== ===== Linux ===== ====== リポジトリのクローン ====== PDF-Tools MCPサーバのリポジトリをクローンする。<br> cd ~/Program/MCP_Server/ git clone https://github.com/Open-Document-Alliance/PDF-Tools.git cd PDF-Tools <br> ====== 依存関係のインストール ====== npmを使用して、依存関係をインストールする。<br> npm install <br> ====== ESモジュールエラーの修正 ====== Node.js v22以降の環境では、<u>package.json</u> ファイルに <code>"type": "module"</code> が設定されているが、<br> <u>server/index.js</u> がCommonJS形式の <code>require</code> 関数を使用しているため、以下に示すエラーが発生する場合がある。<br> <br> ReferenceError: require is not defined in ES module scope, you can use import instead <br> この場合、<u>package.json</u> ファイルから <code>"type": "module"</code> の行を削除する。<br> # sedコマンドで該当行を削除する sed -i '/"type": "module"/d' package.json <br> または、テキストエディタで <u>package.json</u> ファイルを開いて、<code>"type": "module"</code> の行を手動で削除する。<br> <br> <u>削除後、前の行末にカンマが残ってJSONが壊れないように注意すること。</u><br> <br> ====== 動作確認 ====== MCP経由のstdio通信で動作するため、以下に示すコマンドで起動して即時エラーが発生しなければ正常である。<br> node server/index.js <br> ===== Windows ===== [https://nodejs.org/ Node.jsの公式Webサイト]からNode.jsをダウンロードしてインストールする。<br> <br> [https://git-scm.com/ Git for Windowsの公式Webサイト]からインストーラをダウンロードしてインストールする。<br> <br> PowerShellまたはコマンドプロンプトを開いて、PDF-Tools MCPをダウンロードする。<br> git clone https://github.com/Open-Document-Alliance/PDF-Tools.git cd PDF-Tools <br> PDF-Tools MCPの依存関係をインストールする。<br> npm install <br> ESモジュールエラーが発生する場合は、テキストエディタで <u>package.json</u> ファイルを開いて、<code>"type": "module"</code> の行を削除する。<br> <br> == PDF-Tools MCPのプロジェクト構造 == PDF-Tools MCPサーバのプロジェクト構造を以下に示す。<br> <br> PDF-Tools/ ├── README.md # プロジェクトドキュメント ├── package.json # Node.js依存関係 ├── manifest.json # Claude Desktop Extension メタデータ ├── manifest.mcpb.json # MCPB パッケージメタデータ ├── icon.png # 拡張機能アイコン ├── index.html # 拡張機能ページ ├── server/ # MCPサーバ実装 │ └── index.js # メインエントリーポイント (12ツール定義) ├── pdf-toolkit-mcp-share/ # Cursor用共有パッケージ ├── docs/ # ドキュメント │ ├── MAINTAINERS.md │ ├── RELEASE.md │ └── SUPPORT.md ├── package-for-friend.js # Cursor用インストーラ生成スクリプト ├── pdf-toolkit-mcp.mcpb # Claude Desktop用パッケージ └── pdf-toolkit-mcp.zip # Cursor用配布パッケージ <br> ==== PDF-Tools MCPのクライアント接続設定 ==== ===== Claude Desktopからの接続 ===== Claude Desktopの設定ファイルを編集する。<br> <br> 設定ファイルの場所は、以下の通りである。<br> * Linux *: ~/.config/Claude/claude_desktop_config.json * Windows *: %APPDATA%\Claude\claude_desktop_config.json <br> 設定内容を以下に示す。<br> <syntaxhighlight lang="json"> { "mcpServers": { "pdf-tools": { "command": "node", "args": [ "/<PDF-Toolsのインストールディレクトリ>/PDF-Tools/server/index.js" ] } } } </syntaxhighlight> <br> Linux環境の設定例を以下に示す。<br> <syntaxhighlight lang="json"> { "mcpServers": { "pdf-tools": { "command": "node", "args": [ "/home/suse/Program/MCP_Server/PDF-Tools/server/index.js" ] } } } </syntaxhighlight> <br> Windows環境の場合、パスを適切に変更する。<br> <syntaxhighlight lang="json"> { "mcpServers": { "pdf-tools": { "command": "node", "args": [ "C:\\<PDF-Toolsのインストールディレクトリ>\\PDF-Tools\\server\\index.js" ] } } } </syntaxhighlight> <br> Claude Desktopを再起動して、PDF-Tools MCPサーバが利用可能であることを確認する。<br> 正常にインストールされた場合、12個のツールが有効になる。<br> <br> ===== Cursorからの接続 ===== Cursorのグローバル設定ファイルを編集する。<br> # Linux ~/.cursor/mcp.json # Windows %USERPROFILE%\.cursor\mcp.json # MacOS ~/.cursor/mcp.json <br> 設定内容を以下に示す。<br> <syntaxhighlight lang="json"> { "mcpServers": { "pdf-filler": { "command": "node", "args": [ "/<PDF-Toolsのインストールディレクトリ>/PDF-Tools/server/index.js" ] } } } </syntaxhighlight> <br> または、Cursor用のインストーラを使用する場合は、以下の手順で行う。<br> # [https://github.com/Open-Document-Alliance/PDF-Tools/releases/latest Releases]からpdf-toolkit-mcp.zipをダウンロードする。 # ダウンロードしたファイルを解凍する。 # ターミナルで<code>./smart-install.sh</code>を実行する。 # Cursorを再起動する。 <br> ==== PDF-Tools MCPの利用可能なツール ==== ===== list_pdfs ===== 指定されたディレクトリ内のPDFファイルを一覧表示する。<br> <br> * 使用例 *: <pre>「~/Documents」フォルダ内のPDFファイルを一覧表示してください。</pre> <br> ===== read_pdf_fields ===== PDFファイルのフォームフィールド情報を抽出する。パスワード保護されたPDFにも対応する。<br> <br> * 使用例 *: <pre>「~/Documents/application.pdf」のフォームフィールドを読み取ってください。</pre> <br> ===== fill_pdf ===== PDFフォームに指定されたデータを入力する。パスワード保護されたPDFにも対応する。<br> <br> * 使用例 *: <pre>「~/Documents/w9.pdf」にJohn Doeという名前を入力して保存してください。</pre> <br> ===== bulk_fill_from_csv ===== CSVファイルのデータを使用して、複数のPDFフォームを一括入力する。<br> <br> * 使用例 *: <pre>「template.pdf」に「employees.csv」のデータを一括入力してください。</pre> <br> ===== save_profile ===== フォームデータを再利用可能なプロファイルとして保存する。<br> <br> * 使用例 *: <pre>名前をJohn Doe、肩書をSoftware Engineerとして「work」プロファイルに保存してください。</pre> <br> ===== load_profile ===== 保存済みのプロファイルを読み込む。<br> <br> ===== list_profiles ===== 保存されているプロファイルの一覧を表示する。<br> <br> ===== fill_with_profile ===== 保存済みプロファイルを使用してPDFフォームに入力する。パスワード保護されたPDFにも対応する。<br> <br> * 使用例 *: <pre>「application.pdf」を「work」プロファイルを使って入力してください。</pre> <br> ===== extract_to_csv ===== PDFファイルからデータを抽出してCSVファイルに出力する。<br> <br> * 使用例 *: <pre>入力済みのPDFファイルからデータを抽出して「summary.csv」に保存してください。</pre> <br> ===== validate_pdf ===== PDFフォームの必須フィールドが入力されているかチェックする。パスワード保護されたPDFにも対応する。<br> <br> * 使用例 *: <pre>「application.pdf」の必須フィールドがすべて入力されているか確認してください。</pre> <br> ===== read_pdf_content ===== PDFファイルの内容を読み取って解析する。<br> テキストベースのPDFとスキャンされたPDFの両方に自動対応する。<br> <br> * 使用例 *: <syntaxhighlight lang="text"> # PDFの内容を読み取る 「/path/to/document.pdf」を読み取ってください。 # PDFの内容を要約する 「/path/to/contract.pdf」の支払い条件について教えてください。 </syntaxhighlight> <br> ===== get_pdf_resource_uri ===== ローカルPDFファイルのリソースURIを生成する。<br> ClaudeがResources APIを通じてPDFを取り込むために使用する。<br> <br> ==== PDF-Tools MCPの使用例 ==== ===== 基本的なPDF読み取り ===== * 「~/Documents/report.pdf」の内容を読み取ってください。 * 「~/Documents/contract.pdf」をMarkdown形式に変換してください。 <br> ===== フォームフィールドの確認と入力 ===== * 「~/Documents/w9.pdf」のフォームフィールドを表示してください。 * 「~/Documents/w9.pdf」に会社名をCompany Name LLC、住所を123 Main St、Tax IDを12-3456789として入力してください。 <br> ===== CSVからの一括入力 ===== * 「template.pdf」に「employees.csv」のデータを一括入力して、「~/filled-forms/」に保存してください。 * ファイル名には「employee_name」カラムの値を使用してください。 <br> ===== プロファイルの活用 ===== * 名前をJohn Doe、肩書をSoftware Engineer、会社をTech Corpとして「work」プロファイルに保存してください。 * 「application.pdf」を「work」プロファイルを使って入力してください。 <br> ===== パスワード保護されたPDF ===== * パスワード「mypassword123」を使って、暗号化されたPDFのフィールドを読み取ってください。 * パスワード「secure456」を使って、保護されたPDFにデータを入力してください。 <br> ==== PDF-Tools MCPのトラブルシューティング ==== ===== ESモジュールエラーが発生する ===== 以下に示すようなエラーメッセージが表示される場合がある。<br> ReferenceError: require is not defined in ES module scope, you can use import instead <br> これは、<code>package.json</code>に<code>"type": "module"</code>が設定されているにもかかわらず、<code>server/index.js</code>がCommonJS形式の<code>require()</code>を使用しているために発生する。<br> <br> 解決方法を以下に示す。<br> * <u>package.json</u> ファイルから <code>"type": "module"</code> の行を削除する *: <pre>sed -i '/"type": "module"/d' package.json</pre> * 削除後、JSONの構文が壊れていないか確認する (末尾のカンマに注意) *: <pre>node -e "JSON.parse(require('fs').readFileSync('package.json'))" && echo "OK"</pre> <br> ===== Node.jsのバージョンが古い ===== Node.js 18以上が必要である。<br> バージョンを確認する。<br> node --version <br> バージョンが18未満の場合は、Node.jsを更新する。<br> <br> ===== npm installが失敗する ===== 依存関係のインストールに失敗する場合は、以下を試す。<br> rm -rf node_modules package-lock.json npm install <br> ===== Claude Desktopでツールが表示されない ===== * 設定ファイル (<u>claude_desktop_config.json</u>) のJSON構文が正しいか確認する。 * <u>server/index.js</u> ファイルのパスが正しいか確認する。 * Claude Desktopを完全に終了して再起動する。 <br><br> = 外部リンク = ==== PDF Reader MCP ==== * [https://github.com/SylphxAI/pdf-reader-mcp PDF Reader MCPのGithub] * [https://glama.ai/mcp/servers/@SylphxAI/pdf-reader-mcp PDF Reader MCP on Glama] <br> ==== PDF-Tools MCP ==== * [https://github.com/Open-Document-Alliance/PDF-Tools PDF-ToolsのGithub] * [https://www.opendocuments.ai/ Open Document Alliance 公式サイト] <br> ==== 共通 ==== * [https://modelcontextprotocol.io/ Model Context Protocol公式サイト] <br><br> #seo: |title=PAGENAME : PDF MCP Servers (PDF Reader / PDF-Tools) | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,MCP,Model Context Protocol,PDF,PDF Reader,PDF Tools,PDF Filler,Document Processing,Claude,AI,Machine Learning,Python,Node.js,TypeScript,PDF Processing,Document Analysis,Form Filling |description=PAGENAME - PDF Reader MCPサーバおよびPDF-Tools MCPサーバに関する包括的なガイド、AIアシスタントによるPDF操作の統合 | This page is PAGENAME in our wiki about PDF MCP servers and AI-powered document processing |image=/resources/assets/MochiuLogo_Single_Blue.png __FORCETOC__ [[カテゴリ:設定]]
MCPサーバ - PDF
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse