pdf-porter
Layout-aware PDF to Markdown for Claude — one tool, zero config, five minutes to set up. Uses Docling to preserve tables, multi-column layouts, and document structure that Claude's native PDF ingestion loses.
If you want the full Docling toolset, see docling-mcp by IBM Research. pdf-porter is intentionally minimal: one tool, one job.
Installation
Use with Claude Desktop (recommended)
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"pdf-tools": {
"command": "uvx",
"args": ["pdf-porter"]
}
}
}
Then restart Claude Desktop. The first time Claude calls the tool, Docling will download its model weights (~500MB). Subsequent calls are fast.
Development
git clone https://github.com/benmazzotta/pdf-porter
cd pdf-porter
uv sync --dev
uv run pytest
Tool Reference
pdf_to_markdown
| Parameter | Type | Default | Description |
|---|---|---|---|
path |
str |
— | Path to a PDF on the server’s filesystem |
pdf_base64 |
str |
— | Base64-encoded PDF bytes (use for uploads; see below) |
save_output |
bool |
False |
If True, writes a .md file and returns the output path |
output_dir |
str |
— | Directory for the .md file when save_output=True (e.g. /mnt/user-data/outputs/) |
filename |
str |
— | Original filename hint for base64 mode (e.g. "report.pdf" → output is "report.md") |
You must pass either path or pdf_base64 (not both). Paths under /mnt/user-data/uploads/ (e.g. Claude Desktop uploads) are not visible to the server; for those, pass the file content as pdf_base64 instead.
Returns: Markdown string, or a bare output file path when save_output=True, or "Error: <message>" on failure.
Known Limitations
- First run: Docling downloads model weights (~500MB). You'll see a pause. Subsequent runs are fast.
- Scanned PDFs: OCR mode is not enabled in v0.1. Image-only PDFs will return empty or minimal text.
- Windows: Path handling not validated on Windows.
License
MIT. See LICENSE.
Metadata
Release files for pdf-porter 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pdf_porter-0.2.1.tar.gz | 177.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pdf_porter-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 182.7 kB
Release files / pdf_porter-0.2.1.tar.gz
| Download URL | pdf_porter-0.2.1.tar.gz |
|---|---|
| Size | 177.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
791dfae2116b2358fd6449aeeeabda634dd6dd6df1f27eb3d85f6b29c19f803c
|
|
BLAKE2b-256 checksum How to use checksums |
0936eb4ae932644a2ba3ee2944a63436527b757a9abc53da80d89db4e32769bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.5 {"installer":{"name":"uv","version":"0.10.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / pdf_porter-0.2.1-py3-none-any.whl
| Download URL | pdf_porter-0.2.1-py3-none-any.whl |
|---|---|
| Size | 5.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fbdca6239051d457c0a6eb5eff33a68e1a13f27bf6a9e8301173597407e3475a
|
|
BLAKE2b-256 checksum How to use checksums |
1a384a375f3472ca092614f1c4a734c3d07a6aec4c89ebbb0fef683ec124f4ce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.5 {"installer":{"name":"uv","version":"0.10.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for pdf-porter 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.