@shuji-bonji/pdf-reader-mcp 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/LICENSE +21 -0
  3. package/README.ja.md +190 -0
  4. package/README.md +206 -0
  5. package/dist/constants.d.ts +22 -0
  6. package/dist/constants.d.ts.map +1 -0
  7. package/dist/constants.js +23 -0
  8. package/dist/constants.js.map +1 -0
  9. package/dist/index.d.ts +9 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +35 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/schemas/common.d.ts +14 -0
  14. package/dist/schemas/common.d.ts.map +1 -0
  15. package/dist/schemas/common.js +26 -0
  16. package/dist/schemas/common.js.map +1 -0
  17. package/dist/schemas/tier1.d.ts +104 -0
  18. package/dist/schemas/tier1.d.ts.map +1 -0
  19. package/dist/schemas/tier1.js +77 -0
  20. package/dist/schemas/tier1.js.map +1 -0
  21. package/dist/schemas/tier2.d.ts +68 -0
  22. package/dist/schemas/tier2.d.ts.map +1 -0
  23. package/dist/schemas/tier2.js +42 -0
  24. package/dist/schemas/tier2.js.map +1 -0
  25. package/dist/schemas/tier3.d.ts +44 -0
  26. package/dist/schemas/tier3.d.ts.map +1 -0
  27. package/dist/schemas/tier3.js +28 -0
  28. package/dist/schemas/tier3.js.map +1 -0
  29. package/dist/services/pdfjs-service.d.ts +65 -0
  30. package/dist/services/pdfjs-service.d.ts.map +1 -0
  31. package/dist/services/pdfjs-service.js +520 -0
  32. package/dist/services/pdfjs-service.js.map +1 -0
  33. package/dist/services/pdflib-service.d.ts +35 -0
  34. package/dist/services/pdflib-service.d.ts.map +1 -0
  35. package/dist/services/pdflib-service.js +318 -0
  36. package/dist/services/pdflib-service.js.map +1 -0
  37. package/dist/services/url-fetcher.d.ts +8 -0
  38. package/dist/services/url-fetcher.d.ts.map +1 -0
  39. package/dist/services/url-fetcher.js +40 -0
  40. package/dist/services/url-fetcher.js.map +1 -0
  41. package/dist/services/validation-service.d.ts +49 -0
  42. package/dist/services/validation-service.d.ts.map +1 -0
  43. package/dist/services/validation-service.js +670 -0
  44. package/dist/services/validation-service.js.map +1 -0
  45. package/dist/tools/index.d.ts +10 -0
  46. package/dist/tools/index.d.ts.map +1 -0
  47. package/dist/tools/index.js +46 -0
  48. package/dist/tools/index.js.map +1 -0
  49. package/dist/tools/tier1/get-metadata.d.ts +6 -0
  50. package/dist/tools/tier1/get-metadata.d.ts.map +1 -0
  51. package/dist/tools/tier1/get-metadata.js +49 -0
  52. package/dist/tools/tier1/get-metadata.js.map +1 -0
  53. package/dist/tools/tier1/get-page-count.d.ts +6 -0
  54. package/dist/tools/tier1/get-page-count.d.ts.map +1 -0
  55. package/dist/tools/tier1/get-page-count.js +50 -0
  56. package/dist/tools/tier1/get-page-count.js.map +1 -0
  57. package/dist/tools/tier1/read-images.d.ts +6 -0
  58. package/dist/tools/tier1/read-images.d.ts.map +1 -0
  59. package/dist/tools/tier1/read-images.js +79 -0
  60. package/dist/tools/tier1/read-images.js.map +1 -0
  61. package/dist/tools/tier1/read-text.d.ts +6 -0
  62. package/dist/tools/tier1/read-text.d.ts.map +1 -0
  63. package/dist/tools/tier1/read-text.js +57 -0
  64. package/dist/tools/tier1/read-text.js.map +1 -0
  65. package/dist/tools/tier1/read-url.d.ts +6 -0
  66. package/dist/tools/tier1/read-url.d.ts.map +1 -0
  67. package/dist/tools/tier1/read-url.js +64 -0
  68. package/dist/tools/tier1/read-url.js.map +1 -0
  69. package/dist/tools/tier1/search-text.d.ts +6 -0
  70. package/dist/tools/tier1/search-text.d.ts.map +1 -0
  71. package/dist/tools/tier1/search-text.js +62 -0
  72. package/dist/tools/tier1/search-text.js.map +1 -0
  73. package/dist/tools/tier1/summarize.d.ts +6 -0
  74. package/dist/tools/tier1/summarize.d.ts.map +1 -0
  75. package/dist/tools/tier1/summarize.js +70 -0
  76. package/dist/tools/tier1/summarize.js.map +1 -0
  77. package/dist/tools/tier2/inspect-annotations.d.ts +6 -0
  78. package/dist/tools/tier2/inspect-annotations.d.ts.map +1 -0
  79. package/dist/tools/tier2/inspect-annotations.js +47 -0
  80. package/dist/tools/tier2/inspect-annotations.js.map +1 -0
  81. package/dist/tools/tier2/inspect-fonts.d.ts +6 -0
  82. package/dist/tools/tier2/inspect-fonts.d.ts.map +1 -0
  83. package/dist/tools/tier2/inspect-fonts.js +54 -0
  84. package/dist/tools/tier2/inspect-fonts.js.map +1 -0
  85. package/dist/tools/tier2/inspect-signatures.d.ts +6 -0
  86. package/dist/tools/tier2/inspect-signatures.d.ts.map +1 -0
  87. package/dist/tools/tier2/inspect-signatures.js +48 -0
  88. package/dist/tools/tier2/inspect-signatures.js.map +1 -0
  89. package/dist/tools/tier2/inspect-structure.d.ts +6 -0
  90. package/dist/tools/tier2/inspect-structure.d.ts.map +1 -0
  91. package/dist/tools/tier2/inspect-structure.js +46 -0
  92. package/dist/tools/tier2/inspect-structure.js.map +1 -0
  93. package/dist/tools/tier2/inspect-tags.d.ts +6 -0
  94. package/dist/tools/tier2/inspect-tags.d.ts.map +1 -0
  95. package/dist/tools/tier2/inspect-tags.js +46 -0
  96. package/dist/tools/tier2/inspect-tags.js.map +1 -0
  97. package/dist/tools/tier3/compare-structure.d.ts +6 -0
  98. package/dist/tools/tier3/compare-structure.d.ts.map +1 -0
  99. package/dist/tools/tier3/compare-structure.js +47 -0
  100. package/dist/tools/tier3/compare-structure.js.map +1 -0
  101. package/dist/tools/tier3/validate-metadata.d.ts +6 -0
  102. package/dist/tools/tier3/validate-metadata.d.ts.map +1 -0
  103. package/dist/tools/tier3/validate-metadata.js +57 -0
  104. package/dist/tools/tier3/validate-metadata.js.map +1 -0
  105. package/dist/tools/tier3/validate-tagged.d.ts +6 -0
  106. package/dist/tools/tier3/validate-tagged.d.ts.map +1 -0
  107. package/dist/tools/tier3/validate-tagged.js +56 -0
  108. package/dist/tools/tier3/validate-tagged.js.map +1 -0
  109. package/dist/types.d.ts +226 -0
  110. package/dist/types.d.ts.map +1 -0
  111. package/dist/types.js +5 -0
  112. package/dist/types.js.map +1 -0
  113. package/dist/utils/batch-processor.d.ts +60 -0
  114. package/dist/utils/batch-processor.d.ts.map +1 -0
  115. package/dist/utils/batch-processor.js +72 -0
  116. package/dist/utils/batch-processor.js.map +1 -0
  117. package/dist/utils/error-handler.d.ts +23 -0
  118. package/dist/utils/error-handler.d.ts.map +1 -0
  119. package/dist/utils/error-handler.js +76 -0
  120. package/dist/utils/error-handler.js.map +1 -0
  121. package/dist/utils/formatter.d.ts +64 -0
  122. package/dist/utils/formatter.d.ts.map +1 -0
  123. package/dist/utils/formatter.js +379 -0
  124. package/dist/utils/formatter.js.map +1 -0
  125. package/dist/utils/pdf-helpers.d.ts +22 -0
  126. package/dist/utils/pdf-helpers.d.ts.map +1 -0
  127. package/dist/utils/pdf-helpers.js +68 -0
  128. package/dist/utils/pdf-helpers.js.map +1 -0
  129. package/package.json +78 -0
@@ -0,0 +1,379 @@
1
+ /**
2
+ * Response formatting utilities for Markdown and JSON output.
3
+ */
4
+ import { CHARACTER_LIMIT } from '../constants.js';
5
+ /**
6
+ * Truncate text to CHARACTER_LIMIT with a notice.
7
+ */
8
+ export function truncateIfNeeded(text) {
9
+ if (text.length <= CHARACTER_LIMIT) {
10
+ return { text, truncated: false };
11
+ }
12
+ const truncated = text.slice(0, CHARACTER_LIMIT);
13
+ return {
14
+ text: truncated +
15
+ '\n\n---\n⚠️ Response truncated. Use page range parameters to retrieve specific sections.',
16
+ truncated: true,
17
+ };
18
+ }
19
+ /**
20
+ * Format metadata as Markdown.
21
+ */
22
+ export function formatMetadataMarkdown(meta) {
23
+ const lines = ['# PDF Metadata', ''];
24
+ const fields = [
25
+ ['Title', meta.title],
26
+ ['Author', meta.author],
27
+ ['Subject', meta.subject],
28
+ ['Keywords', meta.keywords],
29
+ ['Creator', meta.creator],
30
+ ['Producer', meta.producer],
31
+ ['Creation Date', meta.creationDate],
32
+ ['Modification Date', meta.modificationDate],
33
+ ['Page Count', meta.pageCount],
34
+ ['PDF Version', meta.pdfVersion],
35
+ ['Linearized', meta.isLinearized],
36
+ ['Encrypted', meta.isEncrypted],
37
+ ['Tagged', meta.isTagged],
38
+ ['Has Signatures', meta.hasSignatures],
39
+ ['File Size', formatFileSize(meta.fileSize)],
40
+ ];
41
+ for (const [label, value] of fields) {
42
+ if (value !== null && value !== undefined) {
43
+ const displayValue = typeof value === 'boolean' ? (value ? 'Yes' : 'No') : String(value);
44
+ lines.push(`- **${label}**: ${displayValue}`);
45
+ }
46
+ }
47
+ return lines.join('\n');
48
+ }
49
+ /**
50
+ * Format page texts as Markdown.
51
+ */
52
+ export function formatPageTextsMarkdown(pages) {
53
+ const lines = [];
54
+ for (const page of pages) {
55
+ lines.push(`## Page ${page.page}`, '', page.text, '');
56
+ }
57
+ return lines.join('\n');
58
+ }
59
+ /**
60
+ * Format search results as Markdown.
61
+ */
62
+ export function formatSearchResultMarkdown(result) {
63
+ const lines = [
64
+ `# Search Results: "${result.query}"`,
65
+ '',
66
+ `Found **${result.totalMatches}** match${result.totalMatches !== 1 ? 'es' : ''}`,
67
+ '',
68
+ ];
69
+ for (const match of result.matches) {
70
+ lines.push(`### Page ${match.page}`, '', `> ...${match.contextBefore}**${match.text}**${match.contextAfter}...`, '');
71
+ }
72
+ if (result.truncated) {
73
+ lines.push('---', '⚠️ Results truncated. Use page range parameters to narrow the search.');
74
+ }
75
+ return lines.join('\n');
76
+ }
77
+ /**
78
+ * Format summary as Markdown.
79
+ */
80
+ export function formatSummaryMarkdown(summary) {
81
+ const meta = summary.metadata;
82
+ const lines = [
83
+ `# PDF Summary`,
84
+ '',
85
+ `| Property | Value |`,
86
+ `|---|---|`,
87
+ `| Pages | ${meta.pageCount} |`,
88
+ `| PDF Version | ${meta.pdfVersion ?? 'Unknown'} |`,
89
+ `| File Size | ${formatFileSize(meta.fileSize)} |`,
90
+ `| Tagged | ${meta.isTagged ? 'Yes' : 'No'} |`,
91
+ `| Encrypted | ${meta.isEncrypted ? 'Yes' : 'No'} |`,
92
+ `| Signatures | ${meta.hasSignatures ? 'Yes' : 'No'} |`,
93
+ `| Has Text | ${summary.hasText ? 'Yes' : 'No'} |`,
94
+ `| Images | ${summary.imageCount} |`,
95
+ ];
96
+ if (meta.title)
97
+ lines.push(`| Title | ${meta.title} |`);
98
+ if (meta.author)
99
+ lines.push(`| Author | ${meta.author} |`);
100
+ if (summary.textPreview) {
101
+ lines.push('', '## Text Preview (first page)', '', summary.textPreview);
102
+ }
103
+ return lines.join('\n');
104
+ }
105
+ // ─── Tier 2: Structure analysis formatters ───────────────
106
+ /**
107
+ * Format structure analysis as Markdown.
108
+ */
109
+ export function formatStructureMarkdown(analysis) {
110
+ const lines = ['# PDF Structure Analysis', ''];
111
+ // Catalog
112
+ lines.push('## Catalog Entries', '');
113
+ lines.push('| Key | Type | Value |', '|---|---|---|');
114
+ for (const entry of analysis.catalog) {
115
+ lines.push(`| ${entry.key} | ${entry.type} | ${entry.value} |`);
116
+ }
117
+ // Page tree
118
+ lines.push('', '## Page Tree', '');
119
+ lines.push(`- **Total Pages**: ${analysis.pageTree.totalPages}`);
120
+ if (analysis.pageTree.mediaBoxSamples.length > 0) {
121
+ lines.push('- **MediaBox Samples**:');
122
+ for (const s of analysis.pageTree.mediaBoxSamples) {
123
+ lines.push(` - Page ${s.page}: ${s.width} × ${s.height} pt`);
124
+ }
125
+ }
126
+ // Object stats
127
+ lines.push('', '## Object Statistics', '');
128
+ lines.push(`- **Total Objects**: ${analysis.objectStats.totalObjects}`);
129
+ lines.push(`- **Streams**: ${analysis.objectStats.streamCount}`);
130
+ lines.push('- **By Type**:');
131
+ for (const [type, count] of Object.entries(analysis.objectStats.byType)) {
132
+ lines.push(` - ${type}: ${count}`);
133
+ }
134
+ // Flags
135
+ lines.push('', '## Properties', '');
136
+ lines.push(`- **Encrypted**: ${analysis.isEncrypted ? 'Yes' : 'No'}`);
137
+ if (analysis.pdfVersion) {
138
+ lines.push(`- **Catalog Version**: ${analysis.pdfVersion}`);
139
+ }
140
+ return lines.join('\n');
141
+ }
142
+ /**
143
+ * Format tags analysis as Markdown.
144
+ */
145
+ export function formatTagsMarkdown(analysis) {
146
+ const lines = ['# Tagged PDF Analysis', ''];
147
+ lines.push(`- **Tagged**: ${analysis.isTagged ? 'Yes' : 'No'}`);
148
+ if (!analysis.isTagged || !analysis.rootTag) {
149
+ lines.push('', 'This PDF is not tagged. No structure tree available.');
150
+ return lines.join('\n');
151
+ }
152
+ lines.push(`- **Total Elements**: ${analysis.totalElements}`);
153
+ lines.push(`- **Max Depth**: ${analysis.maxDepth}`);
154
+ // Role counts
155
+ lines.push('', '## Role Distribution', '');
156
+ lines.push('| Role | Count |', '|---|---|');
157
+ const sortedRoles = Object.entries(analysis.roleCounts).sort(([, a], [, b]) => b - a);
158
+ for (const [role, count] of sortedRoles) {
159
+ lines.push(`| ${role} | ${count} |`);
160
+ }
161
+ // Tag tree (limited depth for readability)
162
+ lines.push('', '## Structure Tree', '');
163
+ renderTagTree(analysis.rootTag, lines, 0, 4);
164
+ return lines.join('\n');
165
+ }
166
+ /**
167
+ * Format fonts analysis as Markdown.
168
+ */
169
+ export function formatFontsMarkdown(analysis) {
170
+ const lines = ['# Font Analysis', ''];
171
+ lines.push(`- **Total Fonts**: ${analysis.totalFontCount}`);
172
+ lines.push(`- **Embedded**: ${analysis.embeddedCount}`);
173
+ lines.push(`- **Subset**: ${analysis.subsetCount}`);
174
+ lines.push(`- **Pages Scanned**: ${analysis.pagesScanned}`);
175
+ if (analysis.fonts.length === 0) {
176
+ lines.push('', 'No fonts found in this document.');
177
+ return lines.join('\n');
178
+ }
179
+ lines.push('', '## Font Details', '');
180
+ lines.push('| Name | Type | Encoding | Embedded | Subset | Pages |', '|---|---|---|---|---|---|');
181
+ for (const f of analysis.fonts) {
182
+ const pages = f.pagesUsed.length > 5 ? `${f.pagesUsed.slice(0, 5).join(',')}...` : f.pagesUsed.join(',');
183
+ lines.push(`| ${f.name} | ${f.type} | ${f.encoding ?? '-'} | ${f.isEmbedded ? 'Yes' : 'No'} | ${f.isSubset ? 'Yes' : 'No'} | ${pages} |`);
184
+ }
185
+ return lines.join('\n');
186
+ }
187
+ /**
188
+ * Format annotations analysis as Markdown.
189
+ */
190
+ export function formatAnnotationsMarkdown(analysis) {
191
+ const lines = ['# Annotation Analysis', ''];
192
+ lines.push(`- **Total Annotations**: ${analysis.totalAnnotations}`);
193
+ lines.push(`- **Has Links**: ${analysis.hasLinks ? 'Yes' : 'No'}`);
194
+ lines.push(`- **Has Forms**: ${analysis.hasForms ? 'Yes' : 'No'}`);
195
+ lines.push(`- **Has Markup**: ${analysis.hasMarkup ? 'Yes' : 'No'}`);
196
+ if (analysis.totalAnnotations === 0) {
197
+ lines.push('', 'No annotations found in the specified pages.');
198
+ return lines.join('\n');
199
+ }
200
+ // By subtype
201
+ lines.push('', '## By Type', '');
202
+ lines.push('| Subtype | Count |', '|---|---|');
203
+ const sortedTypes = Object.entries(analysis.bySubtype).sort(([, a], [, b]) => b - a);
204
+ for (const [subtype, count] of sortedTypes) {
205
+ lines.push(`| ${subtype} | ${count} |`);
206
+ }
207
+ // By page
208
+ lines.push('', '## By Page', '');
209
+ lines.push('| Page | Count |', '|---|---|');
210
+ const sortedPages = Object.entries(analysis.byPage)
211
+ .map(([p, c]) => [Number(p), c])
212
+ .sort(([a], [b]) => a - b);
213
+ for (const [page, count] of sortedPages) {
214
+ lines.push(`| ${page} | ${count} |`);
215
+ }
216
+ return lines.join('\n');
217
+ }
218
+ /**
219
+ * Format signatures analysis as Markdown.
220
+ */
221
+ export function formatSignaturesMarkdown(analysis) {
222
+ const lines = ['# Digital Signature Analysis', ''];
223
+ lines.push(`- **Total Signature Fields**: ${analysis.totalFields}`);
224
+ lines.push(`- **Signed**: ${analysis.signedCount}`);
225
+ lines.push(`- **Unsigned**: ${analysis.unsignedCount}`);
226
+ if (analysis.totalFields === 0) {
227
+ lines.push('', 'No signature fields found in this document.');
228
+ lines.push('', `> ${analysis.note}`);
229
+ return lines.join('\n');
230
+ }
231
+ lines.push('', '## Signature Fields', '');
232
+ for (const field of analysis.fields) {
233
+ lines.push(`### ${field.fieldName}`, '');
234
+ lines.push(`- **Signed**: ${field.isSigned ? 'Yes' : 'No'}`);
235
+ if (field.signerName)
236
+ lines.push(`- **Signer**: ${field.signerName}`);
237
+ if (field.reason)
238
+ lines.push(`- **Reason**: ${field.reason}`);
239
+ if (field.location)
240
+ lines.push(`- **Location**: ${field.location}`);
241
+ if (field.signingTime)
242
+ lines.push(`- **Signing Time**: ${field.signingTime}`);
243
+ if (field.filter)
244
+ lines.push(`- **Filter**: ${field.filter}`);
245
+ if (field.subFilter)
246
+ lines.push(`- **SubFilter**: ${field.subFilter}`);
247
+ lines.push('');
248
+ }
249
+ lines.push(`> ${analysis.note}`);
250
+ return lines.join('\n');
251
+ }
252
+ // ─── Internal helpers ────────────────────────────────────
253
+ /**
254
+ * Format file size in human-readable form.
255
+ */
256
+ export function formatFileSize(bytes) {
257
+ if (bytes < 1024)
258
+ return `${bytes} B`;
259
+ if (bytes < 1024 * 1024)
260
+ return `${(bytes / 1024).toFixed(1)} KB`;
261
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
262
+ }
263
+ /**
264
+ * Render tag tree as indented Markdown list (limited depth).
265
+ */
266
+ function renderTagTree(node, lines, depth, maxDepth) {
267
+ if (depth > maxDepth) {
268
+ lines.push(`${' '.repeat(depth)}- ... (truncated at depth ${maxDepth})`);
269
+ return;
270
+ }
271
+ const indent = ' '.repeat(depth);
272
+ const contentSuffix = node.contentCount > 0 ? ` (${node.contentCount} content items)` : '';
273
+ lines.push(`${indent}- **${node.role}**${contentSuffix}`);
274
+ for (const child of node.children) {
275
+ renderTagTree(child, lines, depth + 1, maxDepth);
276
+ }
277
+ }
278
+ // ─── Tier 3: Validation & analysis formatters ─────────────
279
+ const SEVERITY_ICONS = {
280
+ error: '\u274c',
281
+ warning: '\u26a0\ufe0f',
282
+ info: '\u2705',
283
+ };
284
+ /**
285
+ * Format tagged validation results as Markdown.
286
+ */
287
+ export function formatTaggedValidationMarkdown(result) {
288
+ const lines = ['# PDF/UA Tag Validation', ''];
289
+ lines.push(`- **Tagged**: ${result.isTagged ? 'Yes' : 'No'}`);
290
+ lines.push(`- **Checks**: ${result.totalChecks}`);
291
+ lines.push(`- **Passed**: ${result.passed}`);
292
+ lines.push(`- **Failed**: ${result.failed}`);
293
+ lines.push(`- **Warnings**: ${result.warnings}`);
294
+ lines.push('', '## Results', '');
295
+ for (const issue of result.issues) {
296
+ const icon = SEVERITY_ICONS[issue.severity];
297
+ lines.push(`${icon} **[${issue.code}]** ${issue.message}`);
298
+ if (issue.details) {
299
+ lines.push(` > ${issue.details}`);
300
+ }
301
+ lines.push('');
302
+ }
303
+ lines.push('---', '', `**Summary**: ${result.summary}`);
304
+ return lines.join('\n');
305
+ }
306
+ /**
307
+ * Format metadata validation results as Markdown.
308
+ */
309
+ export function formatMetadataValidationMarkdown(result) {
310
+ const lines = ['# Metadata Validation', ''];
311
+ lines.push(`- **Checks**: ${result.totalChecks}`);
312
+ lines.push(`- **Passed**: ${result.passed}`);
313
+ lines.push(`- **Failed**: ${result.failed}`);
314
+ lines.push(`- **Warnings**: ${result.warnings}`);
315
+ // Metadata field presence table
316
+ lines.push('', '## Field Presence', '');
317
+ lines.push('| Field | Present |', '|---|---|');
318
+ const fields = [
319
+ ['Title', result.metadata.hasTitle],
320
+ ['Author', result.metadata.hasAuthor],
321
+ ['Subject', result.metadata.hasSubject],
322
+ ['Keywords', result.metadata.hasKeywords],
323
+ ['Creator', result.metadata.hasCreator],
324
+ ['Producer', result.metadata.hasProducer],
325
+ ['Creation Date', result.metadata.hasCreationDate],
326
+ ['Modification Date', result.metadata.hasModificationDate],
327
+ ];
328
+ for (const [name, present] of fields) {
329
+ lines.push(`| ${name} | ${present ? 'Yes' : 'No'} |`);
330
+ }
331
+ if (result.metadata.pdfVersion) {
332
+ lines.push(`| PDF Version | ${result.metadata.pdfVersion} |`);
333
+ }
334
+ lines.push(`| Tagged | ${result.metadata.isTagged ? 'Yes' : 'No'} |`);
335
+ // Detailed results
336
+ lines.push('', '## Results', '');
337
+ for (const issue of result.issues) {
338
+ const icon = SEVERITY_ICONS[issue.severity];
339
+ lines.push(`${icon} **[${issue.code}]** ${issue.message}`);
340
+ if (issue.details) {
341
+ lines.push(` > ${issue.details}`);
342
+ }
343
+ lines.push('');
344
+ }
345
+ lines.push('---', '', `**Summary**: ${result.summary}`);
346
+ return lines.join('\n');
347
+ }
348
+ /**
349
+ * Format structure comparison results as Markdown.
350
+ */
351
+ export function formatCompareStructureMarkdown(result) {
352
+ const lines = ['# PDF Structure Comparison', ''];
353
+ lines.push(`Comparing **${result.file1}** vs **${result.file2}**`);
354
+ // Property diff table
355
+ lines.push('', '## Property Comparison', '');
356
+ lines.push('| Property | File 1 | File 2 | Status |', '|---|---|---|---|');
357
+ for (const diff of result.diffs) {
358
+ const statusIcon = diff.status === 'match' ? '\u2705' : '\u274c';
359
+ lines.push(`| ${diff.property} | ${diff.file1Value} | ${diff.file2Value} | ${statusIcon} |`);
360
+ }
361
+ // Font comparison
362
+ const fc = result.fontComparison;
363
+ lines.push('', '## Font Comparison', '');
364
+ if (fc.inBoth.length > 0) {
365
+ lines.push(`- **Shared fonts** (${fc.inBoth.length}): ${fc.inBoth.join(', ')}`);
366
+ }
367
+ if (fc.onlyInFile1.length > 0) {
368
+ lines.push(`- **Only in ${result.file1}** (${fc.onlyInFile1.length}): ${fc.onlyInFile1.join(', ')}`);
369
+ }
370
+ if (fc.onlyInFile2.length > 0) {
371
+ lines.push(`- **Only in ${result.file2}** (${fc.onlyInFile2.length}): ${fc.onlyInFile2.join(', ')}`);
372
+ }
373
+ if (fc.inBoth.length === 0 && fc.onlyInFile1.length === 0 && fc.onlyInFile2.length === 0) {
374
+ lines.push('No fonts found in either document.');
375
+ }
376
+ lines.push('', '---', '', `**Summary**: ${result.summary}`);
377
+ return lines.join('\n');
378
+ }
379
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/utils/formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAiBlD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,IAAI,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IACjD,OAAO;QACL,IAAI,EACF,SAAS;YACT,0FAA0F;QAC5F,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAiB;IACtD,MAAM,KAAK,GAAa,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAiD;QAC3D,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;QACrB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;QACzB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;QAC3B,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;QACzB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;QAC3B,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC;QACpC,CAAC,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC;QAC5C,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC;QAC9B,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC;QAChC,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC;QACjC,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;QAC/B,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;QACzB,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC;QACtC,CAAC,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC7C,CAAC;IAEF,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACpC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAM,YAAY,GAAG,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzF,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,YAAY,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAiB;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAoB;IAC7D,MAAM,KAAK,GAAa;QACtB,sBAAsB,MAAM,CAAC,KAAK,GAAG;QACrC,EAAE;QACF,WAAW,MAAM,CAAC,YAAY,WAAW,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QAChF,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CACR,YAAY,KAAK,CAAC,IAAI,EAAE,EACxB,EAAE,EACF,QAAQ,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,YAAY,KAAK,EACtE,EAAE,CACH,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,uEAAuE,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAmB;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC9B,MAAM,KAAK,GAAa;QACtB,eAAe;QACf,EAAE;QACF,sBAAsB;QACtB,WAAW;QACX,aAAa,IAAI,CAAC,SAAS,IAAI;QAC/B,mBAAmB,IAAI,CAAC,UAAU,IAAI,SAAS,IAAI;QACnD,iBAAiB,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI;QAClD,cAAc,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;QAC9C,iBAAiB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;QACpD,kBAAkB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;QACvD,gBAAgB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;QAClD,cAAc,OAAO,CAAC,UAAU,IAAI;KACrC,CAAC;IAEF,IAAI,IAAI,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IACxD,IAAI,IAAI,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAE3D,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,8BAA8B,EAAE,EAAE,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4DAA4D;AAE5D;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAA2B;IACjE,MAAM,KAAK,GAAa,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;IAEzD,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,wBAAwB,EAAE,eAAe,CAAC,CAAC;IACtD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,YAAY;IACZ,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,sBAAsB,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACjE,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,eAAe;IACf,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,wBAAwB,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,kBAAkB,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,QAAQ;IACR,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtE,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,0BAA0B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAsB;IACvD,MAAM,KAAK,GAAa,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAEtD,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEhE,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,sDAAsD,CAAC,CAAC;QACvE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,yBAAyB,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEpD,cAAc;IACd,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACxC,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAuB;IACzD,MAAM,KAAK,GAAa,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAEhD,KAAK,CAAC,IAAI,CAAC,sBAAsB,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IACxD,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,wBAAwB,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IAE5D,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,kCAAkC,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,wDAAwD,EAAE,2BAA2B,CAAC,CAAC;IAClG,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,KAAK,GACT,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7F,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,IAAI,GAAG,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,IAAI,CAC9H,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAA6B;IACrE,MAAM,KAAK,GAAa,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAEtD,KAAK,CAAC,IAAI,CAAC,4BAA4B,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,KAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,KAAK,CAAC,IAAI,CAAC,qBAAqB,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAErE,IAAI,QAAQ,CAAC,gBAAgB,KAAK,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,8CAA8C,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,aAAa;IACb,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACrF,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;SAChD,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAqB,CAAC;SACnD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAA4B;IACnE,MAAM,KAAK,GAAa,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;IAE7D,KAAK,CAAC,IAAI,CAAC,iCAAiC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAExD,IAAI,QAAQ,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,6CAA6C,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,KAAK,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpE,IAAI,KAAK,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9E,IAAI,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAEjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4DAA4D;AAE5D;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,IAAa,EAAE,KAAe,EAAE,KAAa,EAAE,QAAgB;IACpF,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,QAAQ,GAAG,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC,CAAC;IAE1D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,6DAA6D;AAE7D,MAAM,cAAc,GAAG;IACrB,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,cAAc;IACvB,IAAI,EAAE,QAAQ;CACN,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,MAAwB;IACrE,MAAM,KAAK,GAAa,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;IAExD,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEjD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,gBAAgB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAExD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gCAAgC,CAAC,MAA0B;IACzE,MAAM,KAAK,GAAa,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAEtD,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEjD,gCAAgC;IAChC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG;QACb,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACnC,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QACrC,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvC,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QACzC,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvC,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QACzC,CAAC,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;QAClD,CAAC,mBAAmB,EAAE,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAClD,CAAC;IACX,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,CAAC;IAChE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAEtE,mBAAmB;IACnB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,gBAAgB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAExD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,MAA2B;IACxE,MAAM,KAAK,GAAa,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;IAE3D,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,KAAK,WAAW,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAEnE,sBAAsB;IACtB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,yCAAyC,EAAE,mBAAmB,CAAC,CAAC;IAC3E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,UAAU,MAAM,UAAU,IAAI,CAAC,CAAC;IAC/F,CAAC;IAED,kBAAkB;IAClB,MAAM,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;IAEzC,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,MAAM,CAAC,MAAM,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CACR,eAAe,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC,WAAW,CAAC,MAAM,MAAM,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzF,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CACR,eAAe,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC,WAAW,CAAC,MAAM,MAAM,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzF,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzF,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,gBAAgB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAE5D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * PDF-specific utility functions.
3
+ */
4
+ /**
5
+ * Read a PDF file into a Uint8Array with size validation.
6
+ */
7
+ export declare function readPdfFile(filePath: string): Promise<Uint8Array>;
8
+ /**
9
+ * Get file size without reading the whole file.
10
+ */
11
+ export declare function getFileSize(filePath: string): Promise<number>;
12
+ /**
13
+ * Parse a page range string like "1-5" or "3" into an array of 1-based page numbers.
14
+ * Returns null if no range specified (meaning "all pages").
15
+ */
16
+ export declare function parsePageRange(pages: string | undefined, totalPages: number): number[] | null;
17
+ /**
18
+ * Resolve page numbers from a page range string.
19
+ * If no range is specified, returns all pages [1..totalPages].
20
+ */
21
+ export declare function resolvePageNumbers(pages: string | undefined, totalPages: number): number[];
22
+ //# sourceMappingURL=pdf-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/pdf-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAcvE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CA2C7F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1F"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * PDF-specific utility functions.
3
+ */
4
+ import { readFile, stat } from 'node:fs/promises';
5
+ import { MAX_FILE_SIZE } from '../constants.js';
6
+ import { PdfReaderError, validatePdfPath } from './error-handler.js';
7
+ /**
8
+ * Read a PDF file into a Uint8Array with size validation.
9
+ */
10
+ export async function readPdfFile(filePath) {
11
+ validatePdfPath(filePath);
12
+ const fileStats = await stat(filePath);
13
+ if (fileStats.size > MAX_FILE_SIZE) {
14
+ throw new PdfReaderError(`File size (${(fileStats.size / 1024 / 1024).toFixed(1)}MB) exceeds the 50MB limit.`, 'FILE_TOO_LARGE', 'Split the PDF into smaller parts before processing.');
15
+ }
16
+ const buffer = await readFile(filePath);
17
+ return new Uint8Array(buffer);
18
+ }
19
+ /**
20
+ * Get file size without reading the whole file.
21
+ */
22
+ export async function getFileSize(filePath) {
23
+ const fileStats = await stat(filePath);
24
+ return fileStats.size;
25
+ }
26
+ /**
27
+ * Parse a page range string like "1-5" or "3" into an array of 1-based page numbers.
28
+ * Returns null if no range specified (meaning "all pages").
29
+ */
30
+ export function parsePageRange(pages, totalPages) {
31
+ if (!pages)
32
+ return null;
33
+ const result = [];
34
+ const parts = pages.split(',');
35
+ for (const part of parts) {
36
+ const trimmed = part.trim();
37
+ if (trimmed.includes('-')) {
38
+ const [startStr, endStr] = trimmed.split('-');
39
+ const start = parseInt(startStr, 10);
40
+ const end = parseInt(endStr, 10);
41
+ if (Number.isNaN(start) || Number.isNaN(end)) {
42
+ throw new PdfReaderError(`Invalid page range: "${trimmed}"`, 'INVALID_PAGE_RANGE', 'Use format like "1-5", "3", or "1,3,5-7".');
43
+ }
44
+ if (start < 1 || end > totalPages) {
45
+ throw new PdfReaderError(`Page range "${trimmed}" is out of bounds (document has ${totalPages} pages)`, 'INVALID_PAGE_RANGE', `Specify pages between 1 and ${totalPages}.`);
46
+ }
47
+ for (let i = start; i <= end; i++) {
48
+ result.push(i);
49
+ }
50
+ }
51
+ else {
52
+ const pageNum = parseInt(trimmed, 10);
53
+ if (Number.isNaN(pageNum) || pageNum < 1 || pageNum > totalPages) {
54
+ throw new PdfReaderError(`Invalid page number: ${trimmed} (document has ${totalPages} pages)`, 'INVALID_PAGE_NUMBER', `Specify a page between 1 and ${totalPages}.`);
55
+ }
56
+ result.push(pageNum);
57
+ }
58
+ }
59
+ return [...new Set(result)].sort((a, b) => a - b);
60
+ }
61
+ /**
62
+ * Resolve page numbers from a page range string.
63
+ * If no range is specified, returns all pages [1..totalPages].
64
+ */
65
+ export function resolvePageNumbers(pages, totalPages) {
66
+ return parsePageRange(pages, totalPages) ?? Array.from({ length: totalPages }, (_, i) => i + 1);
67
+ }
68
+ //# sourceMappingURL=pdf-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-helpers.js","sourceRoot":"","sources":["../../src/utils/pdf-helpers.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@shuji-bonji/pdf-reader-mcp",
3
+ "version": "0.2.0",
4
+ "description": "MCP server for PDF structure analysis - read, inspect, and validate PDF internals",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "exports": {
8
+ ".": "./dist/index.js"
9
+ },
10
+ "bin": {
11
+ "pdf-reader-mcp": "dist/index.js"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "README.md",
16
+ "README.ja.md",
17
+ "CHANGELOG.md",
18
+ "LICENSE"
19
+ ],
20
+ "scripts": {
21
+ "start": "node dist/index.js",
22
+ "dev": "tsx watch src/index.ts",
23
+ "build": "tsc",
24
+ "clean": "rm -rf dist",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest",
27
+ "test:e2e": "vitest run --config tests/e2e/vitest.config.ts",
28
+ "test:e2e:watch": "vitest --config tests/e2e/vitest.config.ts",
29
+ "test:fixtures": "tsx tests/fixtures/create-test-pdf.ts && tsx tests/fixtures/create-e2e-fixtures.ts",
30
+ "lint": "biome lint ./src ./tests",
31
+ "lint:fix": "biome lint --fix ./src ./tests",
32
+ "format": "biome format ./src ./tests",
33
+ "format:fix": "biome format --write ./src ./tests",
34
+ "check": "biome check ./src ./tests",
35
+ "check:fix": "biome check --fix ./src ./tests",
36
+ "typecheck": "tsc --noEmit"
37
+ },
38
+ "engines": {
39
+ "node": ">=18"
40
+ },
41
+ "keywords": [
42
+ "mcp",
43
+ "mcp-server",
44
+ "pdf",
45
+ "pdf-reader",
46
+ "pdf-structure",
47
+ "pdf-analysis",
48
+ "pdf-validation",
49
+ "tagged-pdf",
50
+ "pdf-ua",
51
+ "digital-signatures",
52
+ "model-context-protocol",
53
+ "ai-tools"
54
+ ],
55
+ "author": "shuji-bonji",
56
+ "license": "MIT",
57
+ "repository": {
58
+ "type": "git",
59
+ "url": "git+https://github.com/shuji-bonji/pdf-reader-mcp.git"
60
+ },
61
+ "homepage": "https://github.com/shuji-bonji/pdf-reader-mcp#readme",
62
+ "bugs": {
63
+ "url": "https://github.com/shuji-bonji/pdf-reader-mcp/issues"
64
+ },
65
+ "dependencies": {
66
+ "@modelcontextprotocol/sdk": "^1.6.1",
67
+ "pdf-lib": "^1.17.1",
68
+ "pdfjs-dist": "^4.9.155",
69
+ "zod": "^3.23.8"
70
+ },
71
+ "devDependencies": {
72
+ "@biomejs/biome": "^2.3.14",
73
+ "@types/node": "^22.10.0",
74
+ "tsx": "^4.19.2",
75
+ "typescript": "^5.7.2",
76
+ "vitest": "^3.0.0"
77
+ }
78
+ }