The resource caps are the interesting design choice: oversized documents are rejected before any extraction work happens and tool responses are bounded rather than serialised unbounded, which is the difference between a malicious PDF costing you an error and costing you the process. The known-limitations section is equally unusual for being specific — encryption parameters can be configured but the underlying library does not yet serialise the encryption dictionary on write, image extraction returns embedded streams byte-for-byte with no preprocessing, and PyPy and GraalPy are unsupported. Reading encrypted PDFs works.
The MCP server bundled with oxidize-pdf, a Rust-backed PDF library for Python. It covers reading and extraction, document assembly, forms, annotations, encryption and structural analysis, and every path it touches must resolve inside a workspace directory you nominate.
- Reading — `read_pdf` for metadata including page count, version and encryption status, and `extract_text` for all pages or one
- `convert_pdf` — output as markdown, chunks, or a RAG-optimised format, which is the tool that matters if the PDF is destined for a retrieval index
- `manipulate_pdf` — split, merge, rotate, extract pages, reverse and overlay in one tool
- Creation — `create_pdf`, `annotate_pdf` for text annotations and highlights, and `save_pdf` with optional encryption
- `manage_forms` — create, fill, read and validate form fields
- `secure_pdf` — encrypt, check permissions and verify signatures
- `analyze_pdf` — validate structure, detect corruption and check PDF/A compliance; `extract_entities` pulls structured entities from pages
- Resources exposing built-in fonts, standard page sizes, server capabilities, version and the workspace listing
Python 3.10+ on Linux, macOS or Windows; `pip install "oxidize-pdf[mcp]"`, then run `oxidize-mcp` or launch it through `uvx --from "oxidize-pdf[mcp]" oxidize-mcp`. The package is `oxidize-pdf` (0.18.0 in pyproject). Configuration is entirely environment variables: `OXIDIZE_WORKSPACE` is the sandbox root and defaults to `~/Documents/oxidize-mcp`, with `OXIDIZE_ALLOWED_PATHS` for extra directories. Caps are enforced up front — `OXIDIZE_MAX_FILE_SIZE_MB` at 100, `OXIDIZE_MAX_PAGES` at 10000, `OXIDIZE_MAX_OUTPUT_BYTES` and `OXIDIZE_MAX_SESSION_BYTES` at 10485760 each, `OXIDIZE_MAX_SESSIONS` at 10 and `OXIDIZE_SESSION_TIMEOUT` at 3600 seconds. Exceeding one returns an error coded `RESOURCE_LIMIT`. No C dependencies, no Java, no subprocess calls. MIT licensed.
One command — pip install "oxidize-pdf[mcp]"
