Are you the author? Sign in to claim
PDF Filler for Claude Desktop (using Claude Desktop Extensions)
The local PDF workflow for Claude Desktop and MCP hosts: fill, sign, merge, split, extract, render, and analyze PDFs with local file operations.
Instead of just opening a PDF, PDF Tools lets Claude fetch PDF URLs to your machine, inspect documents visually, fill forms, save reusable profiles, add signature/date zones, merge and split files, reorganize pages visually, extract structured data, and return document content to your chosen MCP host for analysis.
This package targets Claude Desktop and other local MCP hosts today. It does not yet include a remote connector for Claude Cowork / web-hosted Claude.
.mcpb from Releases.mcpb file to install it in Claude DesktopThe extension is also available in the Claude Extensions directory.
Claude Desktop settings include an Allowed PDF Directories field. By default,
PDF Tools can access ~/Documents, ~/Downloads, and ~/Desktop. Add any other
folder you want Claude to use before asking it to read, fill, sign, merge, or save
PDFs there. Saved profiles and signatures live in the extension's private local
store and do not need to be added manually.
{
"mcpServers": {
"pdf-tools": {
"command": "node",
"args": ["/full/path/to/PDF-Tools/server/index.js"]
}
}
}
Claude already knows how to read PDFs in limited ways. PDF Tools goes much further:
fill_pdf, read_pdf_fields, bulk_fill_from_csv, and reusable profilesText, images, and metadata returned by PDF Tools may be processed by Claude or another MCP host. Your host and model provider's data terms apply to that content, so the complete workflow is not necessarily zero egress.
PDF Tools does not currently bundle an OCR engine. Text reads use the PDF.js
text layer. If the selected read_pdf_content result contains no text, the tool
may return a rendered image of page 1 for vision-capable host/model inspection.
Page and region rendering produces raster images, not recognized text. A mixed
text/raster PDF, or raster pages after page 1, may therefore contain content the
broad text read does not recognize. Optional local OCR remains a planned
improvement rather than a shipped capability.
display_pdffetch_pdf_from_urllist_pdfsread_pdf_contentread_pdf_pagesread_pdf_layoutconvert_pdf_to_markdownrender_pdf_pagerender_pdf_regionsearch_pdf_textget_pdf_resource_uriread_pdf_fieldsfill_pdfbulk_fill_from_csvsave_profileload_profilelist_profilesfill_with_profilevalidate_pdfdetect_signature_zonesadd_signature_fieldprepare_signing_packetcreate_signaturelist_signaturesload_signatureapply_signatureapply_textmerge_pdfssplit_pdfrotate_pdf_pagesreorder_pdf_pagesapply_page_planextract_to_csvget_pdf_identityget_pdf_infoget_page_analysisget_active_documentset_active_documentget_pdf_resource_uriread_pdf_bytesreveal_in_findergit clone https://github.com/Open-Document-Alliance/PDF-Tools
cd PDF-Tools
npm ci
npm run build:mcpb
PDF-Tools/
├── server/index.js # MCP server entry point
├── server/helpers.js # Shared helper functions
├── ui/ # Interactive viewer source (TypeScript)
├── dist-ui/ # Built viewer (single-file HTML)
├── test/ # Unit tests (Vitest)
├── manifest.json # Extension metadata
├── manifest.mcpb.json # MCPB packaging manifest
├── package-for-friend.js # Share-bundle packaging script
└── docs/ # Maintainer and release docs
npm install
npm run dev:ui
npm run smoke:ui-dev
npm run smoke:ui-sign
npm run smoke:ui-inspect
npm run smoke:ui-preview-zone
npm run smoke:ui-draw
npm run smoke:mcpb -- pdf-toolkit-mcp.mcpb
npm run build:ui
npm run build:mcpb
npm test
node server/index.js
node package-for-friend.js
npm run dev:ui starts the Vite viewer with a mocked ext-apps host and a real local MCP subprocess behind /__dev__/tool.
http://127.0.0.1:5173/?pdf_path=example-fw9.pdf?pdf_path=/absolute/path/to/file.pdfnpm run build:ui still produces the production single-file viewer for packagingnpm run smoke:ui-dev starts the dev server on a throwaway port, verifies the HTML loads, and round-trips a real display_pdf tool call through /__dev__/toolnpm run smoke:ui-sign boots the dev server, opens a real browser session with agent-browser, switches to sign mode, and verifies a sign-panel interaction opens a signing modalnpm run smoke:ui-inspect boots the dev server, opens a real browser session with agent-browser, switches to sign mode, arms inspect-region, drags a rectangle, and verifies the region preview modal opensnpm run smoke:ui-preview-zone boots the dev server, opens a real browser session, drives inspect-region, creates a zone from the preview modal, and verifies the sign modal opens on that new custom zonenpm run smoke:ui-draw boots the dev server, opens the draw-signature modal in a real browser session, sketches a small stroke, fills the save fields, and verifies the modal closes after savingdocs/MAINTAINERS.md — architecture and operationsdocs/RELEASE.md — release checklistdocs/SUPPORT.md — issue triage@modelcontextprotocol/sdkMIT
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases
Official GitHub integration for repos, issues, PRs, and CI/CD workflows