Skip to content

pdf-reader-mcp

PDF に何が書かれていて、それがページのどこにあるかを返すサーバーです。
テキスト・表・構造ツリー・フォント・注釈・署名フィールドを取り出し、各要素の描画位置(座標)も返します。返すのは観測した事実だけで、正しいかどうかの判定はしません。

これ 1 台でできること

PDF を読むだけならこのサーバー 1 台で足ります。
「この PDF の内容を要約して」「この表を CSV にして」「どんなフォントが埋め込まれている?」といった用途はすべてここで完結します。

INFO

このMCPサーバーは単純なテキスト抽出と違い、タグ付き PDF なら論理的な読み順で本文を取り出せるため、段組みや表が混じった文書でも順序が崩れません。

さらに「中身に何があるか」だけでなく、それがページのどこに描かれているかも返します。
矩形は pdf-writer-mcpadd_annotationそのまま使える座標系(PDF default user space・左下原点・pt・正規化済み)で返るため、受け渡しの途中で座標系を解釈し直す必要がありません。

問いツール
オブジェクト 27 はどこか」locate_objects
この段落 / この見出し はどこか」extract_structured_textinclude_bbox

Skill 連携でできること

このMCP サーバーは 4 層のうち実体(= 観測された事実)の層にあり、観測した事実だけを返します。 その事実をどこまで読み、読めなかった箇所をどう報告するかは Skill の仕事です。

図中の形は要素の種別を表します(→ 図の読み方)。

Skillこのサーバーの役割必須か
pdf-read読み取りの基盤。どの経路で読むかを Skill が決め、読めなかった箇所を報告させます必須(v0.14.0+ 推奨)
pdf-publish書いた PDF の読み戻し(write → read-back → verify の中段)推奨
pdf-trust署名フィールド構造・タグ・メタデータの観測。変更されたオブジェクトの位置特定任意

改ざん箇所を注釈で指すという作業は、3 つのサーバーを順に接続する流れになります。
pdf-verify の verify_integrity が返したオブジェクト番号を locate_objects に渡すと、ページと矩形が返ります。その矩形は pdf-writer の add_annotation にそのまま渡せます。

できないこと

  • 署名が有効かどうかは言えません。
    inspect_signatures は署名フィールドの構造を読むだけで、暗号学的検証は行いません。
  • 規格に適合しているかは言えません。
    合否を返すのは pdf-verify です。
  • OCR しません。 画素として描かれた文字は読めません。
    テキストが取り出せないページは空文字ではなく、その理由(テキスト層が無い / Unicode への経路を持たないフォントがある / 読めなかった)を報告します。
  • タグ無し PDF の論理読み順は座標から推測しません。
    extract_structured_textisTagged: false を返すだけです。論理読み順が必要なら、先に pdf-writer の ensure_tagged でタグを付与してください。
  • 鍵が導けない暗号化文書は開けません。
    ページ数などの数値は null を返し、一覧を返すツールはエラーになります。

しないこと

  • 暗号検証(→ pdf-verify の verify_signatures
  • 準拠判定(validate_* は deprecated → pdf-verify の validate_conformance
  • 増分更新履歴の分析(→ pdf-verify の verify_integrity

インストール

jsonc
{
  "mcpServers": {
    "pdf-reader": {
      "command": "npx",
      "args": ["-y", "@shuji-bonji/pdf-reader-mcp@latest"],
    },
  },
}

共通引数

ほぼ全ツールが以下を受け取ります。

引数説明
file_path 必須stringローカル PDF の絶対パス
response_formatmarkdown / json出力形式。既定 markdown
pagesstringページ範囲 "1-5" / "3" / "1,3,5-7"。省略時は全ページ(対応ツールのみ)

ツール一覧

引数・型・既定値はツールリファレンスにあります(tools/list から自動生成)。

Tierツール一行説明
1read_text読み順を保ったテキスト抽出(/ActualText 解決)
1read_urlURL の PDF を直接読取
1read_images画像抽出(base64)
1search_text大文字小文字を無視した検索
1get_metadataメタデータ取得
1get_page_countページ数(軽量)
1summarize概観レポート
1render_pageページを PNG / JPEG にラスタライズ(テキストとして読めない文書向け)
2extract_structured_text論理コンテンツ順のテキスト(タグ付き PDF)
2extract_tables<Table> サブツリーの構造化抽出
2inspect_structure内部オブジェクト構造
2inspect_tagsタグ構造ツリーの観測
2inspect_fontsフォントと埋め込み状況
2inspect_annotations注釈の分類・棚卸し
2inspect_signatures署名フィールドの構造観測
2locate_objectsオブジェクト番号 → ページ + 矩形
3compare_structure2 PDF の構造比較
3validate_metadatadeprecated
3validate_taggeddeprecated

使い方の要点

どのツールで本文を取得するかは、先に summarize を呼んで決めます。ページ数だけなら get_page_count のほうが軽いです。各ツールの「プロンプト → 引数 → 返る JSON」は ツールリファレンス の該当ツール末尾にあります。

どのツールで読むかを決める

summarize が返すのは metadata.isTaggedtextExtractability です。本文を取得する経路は、この 2 つで決まります。next は観測から出した提案であって、必ず従う指示ではありません。

ページ上の位置は、本文とは別の経路です。指したいものが段落なのか、オブジェクト番号なのかで、使うツールが分かれます。

本文を取得する

文書ツール理由
タグ付き PDFextract_structured_text論理コンテンツ順(ISO 32000-2 §14.8.2.5 の深さ優先走査)。「H1 のテキストは何か」に答えられるのはこのツールだけです
タグ付き PDF の表extract_tables<TR><TH>/<TD> で構造化します。カーニングの空白は除きます(「消 費 税 法」→「消費税法」)
タグ無しread_textY 座標の順で読みます。段組みは split_columns: 2 / 3 で、X 座標により列を分けます

read_text について、次の 3 点があります。

  • /ActualText の置換(ISO 32000-2 §14.9.4)を、構造要素と Span マーク付きコンテンツの両方で解決します。合字やハイフン処理された語も、画面に見える綴りのまま返ります
  • search_text が探すのも、この同じテキストです。ヒットするのは置換後の綴りです
  • 全角空白でインデントした日本語の帳票では、compact_whitespace: true を付けるとトークンが 20–40% 減ります

テキストとして読めないページは render_page に切り替えます。read_textno_text_layer(スキャン)や not_extractable と報告したページがこれです。ベクタ図形、フォーム、手書き、印影も同じです。

read_images は、ページが埋め込んでいる画像 XObject を取り出すだけです。render_pageページの上にあるものすべてを描きます。描画には WebAssembly の PDFium を使います。テキストを読む pdf.js とは別のエンジンです。壊れたファイルで両者の挙動が違うとき、一方の出力はもう一方の証拠になりません。pages は必須です。指定しない限り、全ページを描くことはありません。

extract_structured_text の出力は、次のとおりです。

  • 要素は role / depth / text / pages を持つ、平坦なリストです。深さ優先の並びと depth の組で、木の形をそのまま表せます
  • ページをまたぐ要素は、1 つの要素のままです。段落は分割しません
  • alttext に混ぜず、別の項目で返します(§14.9.3)。Lbl(箇条書きの記号)も label に分けます
  • Artifact(ページ番号や柱)は除きます

ページ上の位置を取得する

locate_objectsextract_structured_textinclude_bbox: true)は、矩形ごとに basis を付けて返します。どれも {x1, y1, x2, y2} に見えますが、根拠は同じではありません。テキストから測った範囲と、ファイルが宣言した /BBox と、ページ全体を指しているだけの矩形を、同じ精度の座標として使わないでください。区別は各矩形の basis に書いてあります。

extract_structured_textbasis:

basis中身
layout-attribute-bboxファイルが宣言している /BBox(ISO 32000-2 Table 379)。測定値ではない。テキストを持たない要素(画像だけの Figure 等)について言える唯一の根拠
text-extent要素が持つテキストからの実測。ベースライン原点+フォントの ascent/descent = 行ボックスであってグリフ輪郭ではない。画像・ベクター描画は寄与しない

locate_objectsbasis:

basis意味
annotation-rectオブジェクト自身の /Rect正確
page-boxオブジェクトがページ。その crop / media box
page-content-streamオブジェクトがページを描いている。矩形はページ全体であって変更箇所ではない
page-resourceフォント・画像などのリソース。矩形は存在しないrect: null
  • ページをまたぐ要素は、ページごとに矩形が 1 つです。1 つにまとめると、その要素が無いページにも矩形を置くことになります
  • 宣言はそのまま返したうえで、突き合わせます。ページボックス(§7.7.3.3)と、要素自身の本文の両方に照合し、食い違えば boxNote で報告します。ファイル上の宣言は、実測と一致しないことがあります。実例として、Well-Tagged PDF 1.0 の表紙 Figure は /BBox [-32768 -32768 32767 32767](矩形であるべき場所に int16 のセンチネル)を宣言しています
  • 矩形が出せない要素は、幅 0 の矩形を返さず、boxNote で理由を書きます
  • locate_objects に存在しない番号を渡すと found: false です。「座標が分からない」ではありません。リビジョンで解放された番号が差分から渡ってくるため、両者を混ぜると「あるのに位置が不明」と誤ります
  • 暗号化された文書では、座標と型は返しますが /Tnull です(数値と名前は非暗号 = §7.6.2。文字列は暗号文のままです)

独立した正解との突き合わせ

Well-Tagged PDF 1.0Link 構造要素 166 件の実測矩形を、生成者が同じリンクに置いた Link 注釈/Rect 173 件と比較した結果、IoU 中央値は 0.972 で、完全に外れたものは 0 件でした。

「この段落はどこか」と「オブジェクト 27 はどこか」は別の経路

locate_objects はコンテンツストリームについて「ページ全体」までしか言えません。段落・見出し単位で指したいときは extract_structured_textinclude_bbox を使ってください。

署名フィールドを確認する

inspect_signatures は、署名フィールドの数、署名済みと未署名の内訳、各フィールドの詳細(署名者名、理由、場所、署名日時、filter / subFilter)を返します。暗号の検証はしません。署名が数学的に有効かどうかは、pdf-verify-mcp の verify_signaturesverify_integrity が答えます。

使わない 2 つのツール

validate_metadatavalidate_tagged は、次のメジャーバージョンで削除する予定です。どちらも pdf-verify-mcp の validate_conformance が上位互換です。構造ツリーの事実が必要なら inspect_tags(こちらは deprecated ではありません)、メタデータを読むだけなら get_metadata を使ってください。

MIT Licensed