pdf-mcp
PDF tools for Claude — an MCP server, CLI, and Claude Code skill for reading and writing PDF files.
Stack: Mozilla PDF.js (pdfjs-dist) for text extraction · pdf-lib for creating and manipulating PDFs · @modelcontextprotocol/sdk for the MCP server.
No build step — plain JavaScript ESM, runs directly with Node.js 18+.
MCP Server
Setup
Clone the repo and link it globally so pdf-mcp is on your PATH:
git clone https://github.com/angshuman/pdf-mcp.git
cd pdf-mcp
npm install
npm link # registers the pdf-mcp command globally
Claude Code:
claude mcp add pdf-mcp -- pdf-mcp
Claude Desktop — add to %APPDATA%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"pdf-mcp": {
"command": "pdf-mcp"
}
}
}
If you'd rather not use npm link, point directly at the script:
claude mcp add pdf-mcp -- node /path/to/pdf-mcp/src/server.js
{
"mcpServers": {
"pdf-mcp": {
"command": "node",
"args": ["/path/to/pdf-mcp/src/server.js"]
}
}
}
Tools
| Tool | Description |
|---|---|
pdf_read | Extract text from a PDF. Optional page param for a single page (1-based). |
pdf_info | Get metadata: page count, title, author, file size, dates. |
pdf_write | Create a new PDF from plain text. Supports title, author, font_size. |
pdf_merge | Merge an ordered list of PDFs into one file. |
pdf_extract_pages | Pull specific pages (1-based array) into a new PDF. |
pdf_split | Split a PDF into one file per page in an output directory. |
pdf_page_to_image | Render a single page to a PNG or JPEG image. |
pdf_to_images | Render every page to image files in a directory. |
CLI
Install
npm install
npm link # makes pdf-tool available globally
Usage
# Extract text
pdf-tool read report.pdf
pdf-tool read report.pdf --page 3
pdf-tool read report.pdf --out extracted.txt
# Show metadata
pdf-tool info report.pdf
# Create a PDF from a text file or stdin
pdf-tool write out.pdf --in content.txt --title "My Doc" --author "Jane"
cat content.txt | pdf-tool write out.pdf
# Merge PDFs
pdf-tool merge combined.pdf a.pdf b.pdf c.pdf
# Extract specific pages (1-based, comma-separated)
pdf-tool extract input.pdf output.pdf 1,3,5
# Split into individual page files
pdf-tool split input.pdf ./pages/
# Render a single page to an image (PNG or JPEG)
pdf-tool image input.pdf page1.png --page 1
pdf-tool image input.pdf page1.jpg --page 1 --scale 3
# Render all pages to images in a directory
pdf-tool images input.pdf ./images/
pdf-tool images input.pdf ./images/ --format jpeg --scale 1.5
Scale controls DPI: 1.0 = 72 DPI · 2.0 = 144 DPI (default) · 3.0 = 216 DPI
Claude Code Skill
The /pdf slash command is in .claude/commands/pdf.md and is available automatically within this project.
/pdf read ./report.pdf
/pdf write ./out.pdf summarize the meeting notes
/pdf merge ./combined.pdf a.pdf b.pdf
/pdf extract ./in.pdf ./out.pdf 1,3,5
/pdf split ./in.pdf ./pages/
Tests
Uses the Node.js built-in test runner — no extra dependencies.
npm test
40 tests across 8 suites covering all operations: write, read, info, merge, extract pages, split, page-to-image, and pdf-to-images.
Notes
- pdfjs-dist emits stderr warnings about
LiberationSans.ttfand glyph paths when rendering PDFs that use non-embedded standard Type1 fonts (Helvetica, Times, etc.). These are cosmetic — text extraction is unaffected, and image rendering works correctly for PDFs with embedded fonts (the common case for PDFs from Word, Adobe, Google Docs, etc.). - All file paths passed to the MCP tools and CLI can be absolute or relative to the current working directory.
- Page numbers are always 1-based in both the MCP tools and CLI.