* fix(pdf-server): stub DOMMatrix/ImageData/Path2D for npx without @napi-rs/canvas
pdfjs-dist/legacy/build/pdf.mjs does `new DOMMatrix()` at module scope.
Its own polyfill loads @napi-rs/canvas (an optionalDependency), but npx
frequently misses the platform-native binary (npm/cli#4828), so the
server crashed on `npx @modelcontextprotocol/server-pdf --stdio`:
ReferenceError: DOMMatrix is not defined
at pdfjs-dist/legacy/build/pdf.mjs:17078
The server only uses pdfjs for text/metadata/form-field extraction —
never canvas rendering — so no-op stubs suffice and avoid shipping
~130MB of native binaries.
The polyfill is a separate ESM module kept --external in the bun bundle
so it executes before pdfjs's hoisted static import; inlined body code
would run too late.
Broken since 1.3.0 (#506). Thanks to Bryan Thompson for the analysis
and fix shape from the npm-to-mcpb pipeline.
* fix(pdf-server): MCPB bundle missing runtime deps + display_name with spaces
`mcpb pack` zips whatever is on disk; in this monorepo all runtime deps
are hoisted to root node_modules, so the published .mcpb shipped without
pdfjs-dist/ajv/express/etc. and crashed on import in Claude Desktop.
build-mcpb.mjs stages dist/ + manifest into a clean temp dir, runs a
non-workspace `npm install --omit=dev --omit=optional` (the new
DOMMatrix polyfill makes @napi-rs/canvas's ~130MB of native binaries
unnecessary), syncs manifest.version to package.json, then packs.
Result: 12.3MB / 38.8MB unpacked, full MCP handshake + tools/list pass.
Also rename display_name "PDF (By Anthropic)" → "pdf-viewer" — spaces
in display_name break MCP App UI rendering for MCPBs in Claude Desktop.
CI now smoke-tests the extracted bundle starts (`dist/index.js --stdio`
prints "Ready") so a deps-less bundle can't ship again.
* fix(pdf-server): list interact in MCPB manifest tools (was stale since #491)
56 lines
2 KiB
JSON
56 lines
2 KiB
JSON
{
|
|
"name": "@modelcontextprotocol/server-pdf",
|
|
"version": "1.3.2",
|
|
"type": "module",
|
|
"description": "MCP server for loading and extracting text from PDF files with chunked pagination and interactive viewer",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/modelcontextprotocol/ext-apps",
|
|
"directory": "examples/pdf-server"
|
|
},
|
|
"license": "MIT",
|
|
"main": "dist/server.js",
|
|
"files": [
|
|
"dist"
|
|
],
|
|
"scripts": {
|
|
"build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build && tsc -p tsconfig.server.json && bun build pdfjs-polyfill.ts --outdir dist --target node && bun build server.ts --outdir dist --target node --external pdfjs-dist --external \"./pdfjs-polyfill.js\" && bun build main.ts --outfile dist/index.js --target node --external \"./server.js\" --external pdfjs-dist --banner \"#!/usr/bin/env node\"",
|
|
"watch": "cross-env INPUT=mcp-app.html vite build --watch",
|
|
"serve": "bun --watch main.ts --enable-interact",
|
|
"serve:stdio": "bun main.ts --stdio",
|
|
"start": "cross-env NODE_ENV=development npm run build && npm run serve",
|
|
"start:stdio": "cross-env NODE_ENV=development npm run build 1>&2 && npm run serve:stdio",
|
|
"dev": "cross-env NODE_ENV=development concurrently \"npm run watch\" \"npm run serve\"",
|
|
"prepublishOnly": "npm run build",
|
|
"build:mcpb": "npm run build && node build-mcpb.mjs"
|
|
},
|
|
"dependencies": {
|
|
"@modelcontextprotocol/ext-apps": "^1.0.0",
|
|
"@modelcontextprotocol/sdk": "^1.24.0",
|
|
"cors": "^2.8.5",
|
|
"express": "^5.1.0",
|
|
"pdf-lib": "^1.17.1",
|
|
"pdfjs-dist": "^5.0.0",
|
|
"zod": "^4.1.13"
|
|
},
|
|
"devDependencies": {
|
|
"@types/cors": "^2.8.19",
|
|
"@types/express": "^5.0.0",
|
|
"@types/node": "22.10.0",
|
|
"concurrently": "^9.2.1",
|
|
"cross-env": "^10.1.0",
|
|
"typescript": "^5.9.3",
|
|
"vite": "^6.0.0",
|
|
"vite-plugin-singlefile": "^2.3.0"
|
|
},
|
|
"types": "dist/server.d.ts",
|
|
"exports": {
|
|
".": {
|
|
"types": "./dist/server.d.ts",
|
|
"default": "./dist/server.js"
|
|
}
|
|
},
|
|
"bin": {
|
|
"mcp-pdf-server": "dist/index.js"
|
|
}
|
|
}
|