MCP server for layout-aware PDF to Markdown conversion via Docling
Project description
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pdf_porter-0.2.1.tar.gz.
File metadata
- Download URL: pdf_porter-0.2.1.tar.gz
- Upload date:
- Size: 177.6 kB
- Tags: Source
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
791dfae2116b2358fd6449aeeeabda634dd6dd6df1f27eb3d85f6b29c19f803c
|
|
| MD5 |
dc64550cd303d8948ca59bc5ee5c5a24
|
|
| BLAKE2b-256 |
0936eb4ae932644a2ba3ee2944a63436527b757a9abc53da80d89db4e32769bd
|
File details
Details for the file pdf_porter-0.2.1-py3-none-any.whl.
File metadata
- Download URL: pdf_porter-0.2.1-py3-none-any.whl
- Upload date:
- Size: 5.1 kB
- Tags: Python 3
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fbdca6239051d457c0a6eb5eff33a68e1a13f27bf6a9e8301173597407e3475a
|
|
| MD5 |
1ef4956cca9b4d871326f18df17356ef
|
|
| BLAKE2b-256 |
1a384a375f3472ca092614f1c4a734c3d07a6aec4c89ebbb0fef683ec124f4ce
|