Coverage is the headline — every entity, full CRUD — but the interesting design choice is the outbox. Exporting a document writes it to a shared volume and hands back a path, so a mail server on the other side of that volume can attach the file while the bytes never enter the conversation. Mount the volume into both containers or the export is unreachable outside the container that wrote it.
A server over the Paperless-ngx API covering every entity type in the archive: documents, tags, correspondents, document types, storage paths and custom fields. It exists so "tag all 2024 invoices" is one instruction rather than an afternoon in the web UI.
- 43 tools in total, with full create-read-update-delete on every entity type
- paperless_documents_search does full-text search with filters; paperless_documents_get returns one document with all its metadata
- paperless_documents_upload takes base64 and paperless_documents_upload_from_path takes a file path; paperless_documents_reprocess re-runs OCR
- paperless_documents_bulk_update edits many documents in one call — bulk operations default to dry-run
- paperless_tags_create sets colour, matching rules and a hierarchical parent; paperless_tags_update can change or clear that parent
- paperless_custom_fields_create defines your own metadata as string, date, number or monetary, and paperless_custom_fields_assign attaches a value to a document
- paperless_documents_export_to_outbox writes a document's bytes to a shared directory and returns the path, so another tool can attach the file without the content passing through the model's context
- paperless_ping and paperless_capabilities answer whether the connection and token actually work
A Paperless-ngx instance and an API token from its Django admin, supplied as PAPERLESS_BASE_URL and PAPERLESS_API_TOKEN. The quickest route is the container at ghcr.io/barryw/paperlessmcp with Streamable HTTP on port 5000 at /mcp; from source it needs the .NET 10 SDK and runs with --stdio. HTTP_TIMEOUT_SECONDS defaults to 30 and is worth raising if large full-text searches time out.
One command plus a key — docker run -d --name paperless-mcp --restart unless-stopped -e PAPERLESS_BASE_URL=https://your-paperless.example.com -e PAPERLESS_API_TOKEN=your-token-here -p 5000:5000 -v paperless-outbox:/home/mcp/outbox ghcr.io/barryw/paperlessmcp:vX.Y.Z, then supply credentials
