PDF SPEC MCP Server について
PDF SPEC MCP Serverは、ISO 32000などのPDF関連仕様への構造化アクセスをLLMに提供します。条項の検索、要求事項の抽出、PDFバージョンの比較を行う開発者や標準研究者向けです。仕様を参照するもので、PDFファイルの検査や適合性判定は行いません。
主な機能
- 01対応する仕様書の検出
- 02セクション構造と内容の閲覧
- 03仕様書全文の検索
- 04規範的要求事項と定義の抽出
- 05表の抽出とPDFバージョン比較
- 06検索インデックスのディスクキャッシュ
活用シーン
- 01PDF標準の条項を検索
- 02規範的要求事項の表現を確認
- 03仕様書内の用語定義を参照
- 04PDF 1.7とPDF 2.0の構造を比較
MCP 対応
仕様書の検出、閲覧、検索、抽出、比較を行うツールをMCPクライアントに提供します。仕様書PDFは利用者がローカルに用意する必要があり、サーバーはPDFの適合性を検査しません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
8掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| category | string | いいえ | カテゴリで絞り込みます(standard、ts、pdfua、guide、appnote)。 |
詳細
PDF SPEC MCP サーバー
ISO 32000(PDF)仕様書に構造化されたアクセスを提供する MCP(Model Context Protocol)サーバーです。明確に定義されたツールを通じて、LLM が PDF 仕様を参照、検索、分析できるようにします。
重要
これは仕様のリファレンスであり、ルールエンジンではありません。 ISO 32000 の条項、表、定義、
shall/should/may要件のテキストを取得して構造化します。PDF ファイルを調べることはなく、ドキュメントが何らかの規格に適合しているかどうかを判断することもできません。 適合性の判定には pdf-verify-mcp (validate_conformance/evaluate_policy)を使用してください。次の3つの異なる概念が混同されるため、この区別は重要です。 宣言 — ファイルが自分自身について記したラベル(メタデータの「私は PDF/A です」など)。そう記載されていても、証拠にはなりません/ 適合性 — ファイルが実際に規格を満たしているかどうか。完全に証明する方法はなく、規則に違反している箇所を見つけることしかできません/ 検証 — バリデーター(veraPDF など)が、実装しているチェック項目に照らして報告する内容です。合格は「この検査では失敗しなかった」という意味であり、「ファイルが規格に適合している」という意味ではありません。 ここで
shallを読むと、規格が何を要求しているかはわかりますが、ファイルがその要求を満たしているかどうかはわかりません。検索結果が何もない場合は、「該当する要件がない」ではなく、「回答できない」という意味です。 ISO 19005(PDF/A)と ETSI PAdES はこのコーパスの対象外です。
list_specs→coverage.gapsを参照してください。
PDF 関連の各サーバーが行うこと/行わないこと
| サーバー | 行うこと | 行わないこと |
|---|---|---|
| pdf-spec-mcp(このサーバー) | PDF 関連文書17件から要件を検索、取得、抽出します | ルールエンジンではありません。 ビジネスルールの定義、PDF ファイルの検査、スキーマの検証は行いません。ISO 19005(PDF/A)はコーパスに含まれません |
| pdf-reader-mcp | テキスト/表/構造ツリー/フォント/注釈/画像/署名のフィールドを抽出します | 暗号を検証しません。 増分更新履歴の読み取り、オブジェクト ID と座標の対応付け、OCR は行いません |
| pdf-writer-mcp | 作成、ページ操作、タグ付け、フォーム、注釈、メタデータ、添付ファイル、PDF/A-3b の骨組みの作成を行います | 署名はしません。 ファイルを規格に適合させることはできません。記載できるのはラベルであり、適合性ではありません |
| pdf-verify-mcp | veraPDF に委任した適合性検証、暗号署名の検証、改ざんの検出、ポリシー判定を行います | ファイルが規格に適合していることを証明するものではありません(規則に違反している箇所を見つけることしかできません)。署名者の身元を保証しません。内容が真実かどうかも判断しません |
重要
PDF 仕様書ファイルは、このパッケージに含まれていません。 PDF 仕様書を別途入手し、ローカルディレクトリに配置する必要があります。
ダウンロード先: PDF Association — スポンサー付き規格
詳細は「セットアップ」を参照してください。
機能
- 複数仕様への対応 — PDF 関連文書(ISO 32000-2、PDF/UA、Tagged PDF ガイドなど)を最大 17 件まで自動検出して管理します
- 構造化コンテンツの抽出 — 任意のセクションから見出し、段落、リスト、表、注記を抽出します
- 全文検索 — セクションを考慮したコンテキストスニペット付きのキーワード検索
- 要求事項の抽出 — ISO の慣例に従い、規範的な表現(shall / must / may)を抽出します
- 定義の検索 — 「Terms and definitions」条項(ISO 32000-2 の条項 3、ISO 32000-1 の条項 4)から用語の定義を取得します
- 表の抽出 — ヘッダーを統合しながら複数ページにまたがる表を検出します
- バージョン比較 — PDF 1.7 と PDF 2.0 のセクション構造を比較します
- 並行処理数の制限 — 大きな文書のページを並列処理します
- ディスク上のインデックスキャッシュ — 検索インデックスと要求事項の全件スキャンは PDF ごとに一度だけ構築され、以降のすべてのプロセスで再利用されます(ISO 32000-2:約 6 秒 → 約 0.2 秒)
アーキテクチャ
graph LR
subgraph Client["MCP Client"]
LLM["LLM<br/>(Claude, etc.)"]
end
subgraph Server["PDF Spec MCP Server"]
direction TB
MCP["MCP Server<br/>index.ts"]
subgraph Tools["Tools Layer"]
direction LR
T1["list_specs"]
T2["get_structure"]
T3["get_section"]
T4["search_spec"]
T5["get_requirements"]
T6["get_definitions"]
T7["get_tables"]
T8["compare_versions"]
end
subgraph Services["Services Layer"]
direction LR
REG["Registry<br/>Auto-discovery"]
LOADER["Loader<br/>LRU Cache"]
SVC["PDFService<br/>Orchestration"]
CMP["CompareService<br/>Version Diff"]
end
subgraph Extractors["Extractors"]
direction LR
OUTLINE["OutlineResolver<br/>TOC & Section Index"]
CONTENT["ContentExtractor<br/>Structured Extraction"]
SEARCH["SearchIndex<br/>Full-text Search"]
REQ["RequirementExtractor"]
DEF["DefinitionExtractor"]
end
subgraph Utils["Utils"]
direction LR
CACHE["LRU Cache"]
CONC["Concurrency"]
VALID["Validation"]
end
end
subgraph PDFs["PDF Spec Files (obtained separately)"]
direction LR
PDF1["ISO 32000-2<br/>(PDF 2.0)"]
PDF2["ISO 32000-1<br/>(PDF 1.7)"]
PDF3["TS 32001–32005<br/>PDF/UA, etc."]
end
LLM <-->|"stdio / JSON-RPC"| MCP
MCP --> Tools
Tools --> Services
Services --> Extractors
Services --> Utils
LOADER --> PDFs
REG -->|"Filename pattern<br/>auto-discovery"| PDFs
style Client fill:#e8f4f8,stroke:#2196F3
style PDFs fill:#fff3e0,stroke:#FF9800
style Tools fill:#e8f5e9,stroke:#4CAF50
style Services fill:#f3e5f5,stroke:#9C27B0
style Extractors fill:#fce4ec,stroke:#E91E63
style Utils fill:#f5f5f5,stroke:#9E9E9E
レイヤーの概要
| レイヤー | 責務 |
|---|---|
| Tools | MCP ツールのスキーマ定義とハンドラー(入力検証) |
| Services | ビジネスロジック(PDF レジストリ、ローダー、オーケストレーション) |
| Extractors | PDF からの情報抽出(目次、コンテンツ、検索、要求事項、定義) |
| Utils | 共通ユーティリティ(キャッシュ、並行処理、検証) |
セットアップ
1. PDF 仕様ファイルを入手する
警告
PDF 仕様書は著作権で保護された文書であり、このパッケージには含まれていません。 以下のソースからダウンロードし、ローカルディレクトリに配置してください。
| 文書 | 入手先 |
|---|---|
| ISO 32000-2 (PDF 2.0) | PDF Association |
| ISO 32000-1 (PDF 1.7) | Adobe (無料) |
| TS 32001–32005、PDF/UA など | PDF Association — スポンサー提供規格 |
以下の 17 ファイルすべてに対応しています。すべてを用意する必要はありません。必要な仕様のみ配置してください(最低限、ISO 32000-2 を推奨します)。
pdf-specs/
│
│ ── Standards ─────────────────────────────
├── ISO_32000-2_sponsored_EC3.pdf # iso32000-2 : PDF 2.0 EC3 (recommended; falls back to -ec2.pdf)
├── ISO_32000-2-2020_sponsored.pdf # iso32000-2-2020 : PDF 2.0 original
├── PDF32000_2008.pdf # pdf17 : PDF 1.7 (for version comparison)
├── pdfreference1.7old.pdf # pdf17old : Adobe PDF Reference 1.7
│
│ ── Technical Specifications (TS) ─────────
├── ISO_TS_32001-2022_sponsored_EC3.pdf # ts32001 : Hash extensions (SHA-3)
├── ISO_TS_32002-2022_sponsored_EC3.pdf # ts32002 : Digital signature extensions (ECC/PAdES)
├── ISO_TS_32003-2023_sponsored.pdf # ts32003 : AES-GCM encryption
├── ISO-TS-32004-2024_sponsored.pdf # ts32004 : Integrity protection
├── ISO-TS-32005-2023-sponsored.pdf # ts32005 : Namespace mapping
│
│ ── PDF/UA (Accessibility) ────────────────
├── ISO-14289-1-2014-sponsored.pdf # pdfua1 : PDF/UA-1
├── ISO-14289-2-2024-sponsored.pdf # pdfua2 : PDF/UA-2
│
│ ── Guides ────────────────────────────────
├── Tagged-PDF-Best-Practice-Guide.pdf # tagged-bpg : Tagged PDF Best Practice
├── Well-Tagged-PDF-WTPDF-1.0.pdf # wtpdf : Well-Tagged PDF
├── PDF-Declarations.pdf # declarations: PDF Declarations
│
│ ── Application Notes ─────────────────────
├── PDF20_AN001-BPC.pdf # an001 : Black Point Compensation
├── PDF20_AN002-AF.pdf # an002 : Associated Files
└── PDF20_AN003-ObjectMetadataLocations.pdf # an003 : Object Metadata
2. インストール
このパッケージには、MCP クライアントから起動することを想定した CLI バイナリ(pdf-spec-mcp)が含まれています。
手動でインストールする必要はありません。次の手順に示すように、MCP クライアントで npx @shuji-bonji/pdf-spec-mcp@latest を指定するだけです。
シェルから直接実行する場合(デバッグなど)は、次のようにします。
PDF_SPEC_DIR=/path/to/pdf-specs npx -y @shuji-bonji/pdf-spec-mcp@latest
または、グローバルにインストールすることもできます(任意)。
npm install -g @shuji-bonji/pdf-spec-mcp
PDF_SPEC_DIR=/path/to/pdf-specs pdf-spec-mcp
3. MCP クライアントを設定する
環境変数
| 変数 | 説明 | デフォルト |
|---|---|---|
PDF_SPEC_DIR | PDF 仕様ファイルを含むディレクトリ | (必須) |
PDF_SPEC_CACHE_DIR | ディスク上のインデックスキャッシュの保存先(インデックスキャッシュを参照) | ${XDG_CACHE_HOME:-~/.cache}/pdf-spec-mcp |
PDF_SPEC_CACHE | off に設定すると、インデックスキャッシュの読み書きを無効にします | on |
Claude Desktop
claude_desktop_config.json に追加します:
{
"mcpServers": {
"pdf-spec": {
"command": "npx",
"args": ["-y", "@shuji-bonji/pdf-spec-mcp@latest"],
"env": {
"PDF_SPEC_DIR": "/path/to/pdf-specs"
}
}
}
}
重要
@latestを使用するか、バージョンを固定してください。 バージョンを指定せずにnpx -y <pkg>を実行すると、初回にキャッシュされたものがそのまま実行されます。-yはインストール確認を省略するだけで、更新は確認しません。 バージョンを指定しない場合、数か月前のリリースがそのまま実行されることがあります。@latestを指定すると、npx は起動のたびにレジストリを確認します。再現性を確保したい場合は、代わりに@0.4.0のようにバージョンを固定してください。 古いキャッシュを消去するには、rm -rf ~/.npm/_npxを実行します。
Cursor / VS Code
.cursor/mcp.json または VS Code の MCP 設定に追加します:
{
"mcpServers": {
"pdf-spec": {
"command": "npx",
"args": ["-y", "@shuji-bonji/pdf-spec-mcp@latest"],
"env": {
"PDF_SPEC_DIR": "/path/to/pdf-specs"
}
}
}
}
Claude Code のプラグインとしてインストールした場合
プラグインのマニフェスト(.claude-plugin/plugin.json)では "PDF_SPEC_DIR": "${PDF_SPEC_DIR}" が宣言されており、ホスト側でこの参照を置換することを前提としています。すべてのホストが対応しているわけではありません:
| ホスト | プラグインの env 内にある ${VAR} を展開するか | 代わりに絶対パスを指定する場所 |
|---|---|---|
| Claude Code(ターミナル) | はい | — |
| Grok Build 1.0.30 | いいえ | ~/.grok/config.toml、[mcp_servers.pdf-spec] |
| Claude Desktop、このコンピューターにリンクされたクラウドセッション(プラグインツール) | いいえ | デスクトップアプリが読み込むローカル MCP 設定 |
参照がそのまま渡された場合、すべてのツールは REGISTRY_ERROR を返します。そのメッセージは PDF_SPEC_DIR is the unexpanded text "${PDF_SPEC_DIR}" で始まり、最初の next_actions エントリは set_absolute_path_in_host_config です。これはホスト設定の問題であり、ディレクトリが見つからないわけではありません。ホスト独自の設定に絶対パスを記述し、再起動してください。ホスト別の手順については、https://shuji-bonji.github.io/pdf-agent-stack/reference/env-vars を参照してください。
インデックスキャッシュ
仕様書の全ページを走査する操作が 2 つあります。仕様書に対する最初の search_spec では全文インデックスが構築されます(ISO 32000-2 は 1023 ページで、ノート PC では約 6 秒かかります)。section を指定しない get_requirements では、すべてのセクションが走査されます(約 11 秒かかります)。それ以外の操作では必要なページだけを開くため、1 秒もかからずに回答します。
0.5.0 以降、この 2 つの処理結果は初回の構築後にディスクへ書き込まれ、その後の各プロセスで読み込まれます。セッションごとにサーバーを 1 つ起動する MCP クライアントでも、毎回インデックスを構築する必要はありません。2 つ目のプロセスでは、バイト単位で同一のインデックスを使って、同じ search_spec に約 0.2 秒、要件の全件走査に約 0.02 秒で回答します。
- 場所:
${PDF_SPEC_CACHE_DIR:-${XDG_CACHE_HOME:-~/.cache}/pdf-spec-mcp}/v1/<version>/<spec>.<kind>.<sha256[0:16]>.json。 17 件すべての仕様書を合わせると、パッケージのバージョンごとに約 18 MB です。 - キー: パッケージのバージョン、
pdfjs-distのバージョン、仕様書 ID、PDF の SHA-256 です。PDF が差し替えられた場合、サーバーがアップグレードされた場合、または pdfjs がアップグレードされた場合はキャッシュがミスし、再構築されます。古いバージョンのエントリはそのまま残ります(別のインストールで引き続き使われる場合があるためです)。--clear-cacheを指定するとすべて削除されます。 - 失敗してもエラーにはならず、キャッシュミスとして扱われます: 読み取れないファイル、途中で切れたファイル、または別形式のファイルは再構築されます。書き込みできないディレクトリについては stderr に一度だけ報告され、サーバーはキャッシュを使わずに処理を続行します。
- このキャッシュは お使いの PDF から生成され、コンピューター内に保存されます。 パッケージには含まれず、再配布してはなりません。仕様書には著作権があります。
検索処理は変わりません。同じコードで、同じメモリ内の構造を検索します。変わるのは、構造の取得元(構築するか、読み込むか)だけです。
キャッシュを事前に構築する
キャッシュはツールからアクセスされるたびに、仕様書ごとに遅延して生成されます。インストール後、アップグレード後、または cron から、すべての仕様書を事前に読み込むには、CLI を実行します(ツールと同じコードパスを使い、仕様書を順番に処理して終了します):
PDF_SPEC_DIR=/path/to/pdf-specs npx -y @shuji-bonji/pdf-spec-mcp@latest --build-cache
# --spec=iso32000-2,pdf17 only these specs
# --force rebuild even when a valid entry exists
npx -y @shuji-bonji/pdf-spec-mcp@latest --cache-info # directory, key, entries
npx -y @shuji-bonji/pdf-spec-mcp@latest --clear-cache # remove the directory
17 件の仕様書全体の構築には、ノート PC で約 1 分かかります。
利用可能なツール
すべてのツールでは、特定の仕様を対象にするための省略可能な spec パラメーターを受け付けます(デフォルトは iso32000-2)。
| ツール | 説明 |
|---|---|
list_specs | 検出されたすべての PDF 仕様とメタデータを一覧表示します |
get_structure | 設定可能な深さでセクション階層(目次)を取得します |
get_section | 特定のセクションの構造化コンテンツを取得します |
search_spec | 仕様全体を対象に全文キーワード検索を行います |
get_requirements | 規範的要件(shall/must/may)を抽出します |
get_definitions | 用語の定義を検索します |
get_tables | セクションから表の構造を抽出します |
compare_versions | PDF 1.7 と PDF 2.0 のセクション構造を比較します |
list_specs — 仕様の確認
利用可能な仕様ドキュメントをすべて一覧表示します。返された ID を、他のツールの spec パラメーターに指定してください。
// List all specs
{ }
// Filter by category
{ "category": "ts" } // Technical specs only
{ "category": "pdfua" } // PDF/UA only
{ "category": "guide" } // Guide documents only
get_structure — 目次
仕様のセクション階層(目次ツリー)を取得します。
// PDF 2.0 top-level sections only
{ "max_depth": 1 }
// Expand to 2 levels
{ "max_depth": 2 }
// TS 32002 (Digital Signatures) full structure
{ "spec": "ts32002" }
// PDF/UA-2 structure
{ "spec": "pdfua2", "max_depth": 2 }
get_section — セクションの内容
特定のセクションの構造化コンテンツ(見出し、段落、リスト、表、注記)を取得します。
親セクションを指定すると、その前文に続いて、すべてのサブセクションがドキュメント内の順序で含まれるサブツリー全体が返されます。最上位の条項は非常に大きくなる場合があるため、できるだけ具体的なセクション番号を指定してください。
すべての回答には pageRange と boundary が含まれます。boundary は、コンテンツの各端がどのように切り取られたかを示します。
boundary.start | 意味 |
|---|---|
heading | セクション独自の見出しが見つかりました。最初のページにある見出しより前のテキストは除外されています |
page | 見出しが見つかりませんでした。コンテンツは最初のページの先頭から始まり、前のセクションの末尾が含まれる場合があります |
boundary.end | 意味 |
|---|---|
heading | 次のセクションの見出しで切り取られています |
page | 最後のページまでコンテンツが含まれています。次のセクションは後のページから始まります |
page_shared | 次のセクションは最後のページから始まりますが、その見出しは見つかりませんでした。次のセクションのテキストが含まれる場合があります |
next_page_unclaimed | 次のセクションは次のページから始まりますが、そのページで見出しは見つかりませんでした。そのページにあるこのセクションの末尾は含まれません |
document | ドキュメントの最後のセクションです |
heading / heading、heading / page、heading / document 以外の組み合わせは、ページの境界で切り取られたことを示します。コンテンツをそのまま利用する前に、隣接するセクションも確認してください。親セクションの場合、start は親セクション自身の境界を、end は最後の子孫セクションの境界を示します。
// PDF 2.0 Section 7.3.4.2 (Literal Strings)
{ "section": "7.3.4.2" }
// PDF 2.0 Annex A
{ "section": "Annex A" }
// TS 32002 Section 5
{ "spec": "ts32002", "section": "5" }
// PDF/UA-2 Section 8 (Tagged PDF)
{ "spec": "pdfua2", "section": "8" }
search_spec — 全文検索
セクションを考慮したコンテキストスニペットを使って、仕様全体を検索します。仕様に対する最初の呼び出しではインデックスが構築されます(数秒かかります)。その後、インデックスはディスクにキャッシュされます(インデックスキャッシュを参照)。
// Search PDF 2.0 for "digital signature"
{ "query": "digital signature" }
// Limit results
{ "query": "font", "max_results": 5 }
// Search within TS 32002
{ "spec": "ts32002", "query": "CMS" }
get_requirements — 規範的要件
ISO の規則に従って、規範的要件(shall/must/may)を抽出します。
sectionsCutByPage は、ページの境界でコンテンツが切り取られた対象範囲内のセクションを一覧表示します(get_section の boundary を参照)。これらのセクションの要件には、隣接セクションの文が含まれたり、末尾が欠落したりする場合があります。対象範囲内のすべてのセクションが見出しの位置で切り取られている場合は空になります。
// All requirements in section 12.8
{ "section": "12.8" }
// Only "shall" requirements
{ "section": "12.8", "level": "shall" }
// Only "shall not" requirements
{ "section": "7.3", "level": "shall not" }
// PDF/UA-2 requirements
{ "spec": "pdfua2", "section": "8", "level": "shall" }
get_definitions — 用語の定義
「Terms and definitions」条項から用語の定義を検索します。ISO 32000-2 の条項 3(71 語)、ISO 32000-1/pdf17 の条項 4(48 語)が対象です。各結果の section は、ドキュメントに印刷されている番号(3.12、4.11)です。
// Search for "font" definitions
{ "term": "font" }
// List all definitions
{ }
// PDF/UA definitions
{ "spec": "pdfua2", "term": "artifact" }
get_tables — 表の抽出
セクションから表の構造(ヘッダー、行、キャプション)を抽出します。複数ページにまたがる表は自動的に結合されます。
応答には pageRange(表の読み取り元ページ)と boundary(get_section を参照)が含まれます。totalTables: 0 は、そのページに Table 要素が見つからなかったことを意味します。ページの途中で切れた boundary がある場合、該当ページだけではセクション全体を網羅していない可能性があります。
// All tables in section 7.3.4.2 (Table 3 — Escape sequences)
{ "section": "7.3.4.2" }
// Specific table only (0-based index)
{ "section": "7.3.4.2", "table_index": 0 }
// TS spec tables
{ "spec": "ts32002", "section": "5" }
compare_versions — バージョンの比較
PDF 1.7(ISO 32000-1)と PDF 2.0(ISO 32000-2)のセクション構造を比較します。タイトルに基づく自動照合を使用して、一致、追加、削除されたセクションを検出します。
メモ
このツールを使用するには、PDF 1.7(
PDF32000_2008.pdf)と PDF 2.0 の両方のファイルをPDF_SPEC_DIRに配置する必要があります。
// Diff section 12.8 (Digital Signatures)
{ "section": "12.8" }
// Compare all top-level sections
{ }
サポート対象の仕様
サーバーは、ファイル名のパターンマッチングによって PDF_SPEC_DIR 内の PDF ファイルを自動検出します。
| カテゴリ | 仕様 ID | ドキュメント |
|---|---|---|
| 標準 | iso32000-2、iso32000-2-2020、pdf17、pdf17old | ISO 32000-2(PDF 2.0)、ISO 32000-1(PDF 1.7) |
| 技術仕様 | ts32001 – ts32005 | ハッシュ、デジタル署名、AES-GCM、整合性、名前空間 |
| PDF/UA | pdfua1、pdfua2 | アクセシビリティ(ISO 14289-1、14289-2) |
| ガイド | tagged-bpg、wtpdf、declarations | タグ付き PDF、タグ付けに関する優れた指針、宣言 |
| アプリケーションノート | an001 – an003 | BPC、関連ファイル、オブジェクトメタデータ |
ディレクトリ構成
src/
├── index.ts # Entry point: MCP server on stdio, or the cache CLI
├── cli.ts # --build-cache / --clear-cache / --cache-info
├── config.ts # Configuration & spec patterns
├── errors.ts # Error hierarchy (PDFSpecError → sub-classes)
├── services/
│ ├── pdf-registry.ts # Auto-discovery of PDF files
│ ├── pdf-loader.ts # PDF loading with LRU cache
│ ├── pdf-service.ts # Orchestration layer
│ ├── index-store.ts # On-disk cache for the search / requirements indexes
│ ├── compare-service.ts # Version comparison
│ ├── outline-resolver.ts # Section index builder
│ ├── content-extractor.ts # Structured content extraction
│ ├── search-index.ts # Full-text search index
│ ├── requirement-extractor.ts
│ └── definition-extractor.ts
├── tools/
│ ├── definitions.ts # MCP tool schemas
│ └── handlers.ts # Tool implementations
├── types/
│ └── index.ts # Shared type definitions
└── utils/
├── concurrency.ts # mapConcurrent (bounded Promise.all)
├── text.ts # Text normalization
├── cache.ts # LRU cache
├── file-hash.ts # SHA-256 of a PDF (index cache key)
├── validation.ts # Input validation
└── logger.ts # Structured logger
開発
git clone https://github.com/shuji-bonji/pdf-spec-mcp.git
cd pdf-spec-mcp
npm install
npm run build
# Unit tests
npm run test
# E2E tests (requires PDF files in ./pdf-spec/)
npm run test:e2e
# Lint & format
npm run lint
npm run format:check
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。