mcp-paperless-ngx
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PAPERLESS_URL | No | Base URL the server talks to. | |
| PAPERLESS_TOKEN | No | API token. PAPERLESS_API_KEY also works. | |
| PAPERLESS_API_KEY | No | Alternative to PAPERLESS_TOKEN: API token. | |
| PAPERLESS_HEADERS | No | Extra request headers, as JSON ({"X-Auth":"…"}) or 'Name: value, Name: value'. Needed behind forward-auth proxies such as Authentik or Authelia. | |
| PAPERLESS_TOOLSETS | No | Comma-separated toolsets, or 'all'. Defaults to documents,metadata,customfields,views,sharing,workflows,system. | |
| PAPERLESS_READ_ONLY | No | Expose only tools that cannot change anything. Default false. | false |
| PAPERLESS_PUBLIC_URL | No | URL used when building links for the user, if the instance is reachable under a different name from outside. Defaults to PAPERLESS_URL. | |
| PAPERLESS_TIMEOUT_MS | No | Request timeout. Default 60000. | 60000 |
| PAPERLESS_API_VERSION | No | REST API version sent in the Accept header. Default 10. | 10 |
| PAPERLESS_DOWNLOAD_DIR | No | Where downloaded files are written. Defaults to system temp. | |
| PAPERLESS_MAX_PAGE_SIZE | No | Hard ceiling on list page sizes, whatever the model asks for. Default 100. | 100 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_documentsA | Find documents by full-text search, metadata filters, or both. This is the main entry point for every 'which documents ...' question. Returns a compact summary per document (id, title, IDs of correspondent/type/tags, dates) — NOT the OCR text, which would flood the context. Use get_document_content for the text of a specific document. |
| get_documentA | Fetch one document's metadata by ID: title, correspondent, type, tags, dates, custom fields, notes and available versions. Does not include the OCR text unless include_content is set. |
| get_document_contentA | Return the OCR/extracted text of one document. Deliberately a separate tool: this is the most expensive thing you can pull from Paperless, so fetch it only for documents you have already narrowed down. Supports offset/limit for long documents. |
| update_documentA | Change metadata on a single document. Only the fields you pass are modified. Pass numeric IDs for correspondent, document_type and storage_path — resolve names via get_metadata_overview first. Setting |
| delete_documentA | Move a document to the trash. It stays recoverable until the trash is emptied or the retention period expires. Always confirm with the user before deleting anything. |
| get_document_metadataA | Technical file metadata for a document: checksums, byte sizes, MIME type, stored filename, whether an archived PDF/A version exists, and embedded PDF metadata. Not the Paperless tags/correspondent — use get_document for those. |
| get_document_historyA | Audit trail of changes to a document — who changed which field, and when. Requires audit logging to be enabled on the instance. Returns the most recent entries first; raise |
| get_document_suggestionsA | Paperless' own suggestions for a document — correspondents, tags, document types and dates its classifier considers likely. Useful as a starting point when triaging, but the suggestions are only as good as the trained model; verify before applying. |
| get_document_ai_suggestionsA | Suggestions from the instance's configured LLM backend (Paperless-ngx 3.x, only if AI features are enabled server-side). Returns 404 or an error when AI is disabled — that is expected, not a bug. |
| get_next_asnA | The next free archive serial number, for filing a physical document alongside its scan. |
| get_selection_dataA | For a set of document IDs, return how many of them carry each tag, correspondent, document type and storage path. Answers 'what is in this pile?' in one call instead of fetching every document. |
| bulk_edit_documentsA | Apply one operation to many documents at once. Far cheaper than looping update_document, and the only way to add or remove individual tags without replacing the whole tag list. Methods: set_correspondent, set_document_type, set_storage_path, add_tag, remove_tag, modify_tags, modify_custom_fields, set_permissions, reprocess, delete, rotate, merge, split, delete_pages, edit_pdf, remove_password. The destructive methods (delete, delete_pages, split/merge with delete_originals) need explicit user confirmation first. |
| merge_documentsA | Merge several documents into one new PDF, in the order given. The originals stay unless delete_originals is set. Runs asynchronously — poll the returned task with get_task. |
| rotate_documentsA | Rotate every page of the given documents clockwise by 90, 180 or 270 degrees. |
| edit_pdfA | Reorder, rotate, remove or split out pages of a single document, producing a new document. |
| remove_pdf_passwordA | Decrypt password-protected PDFs so Paperless can OCR them. The password is sent to your Paperless instance over its API; only use it against an instance you control. |
| reprocess_documentsA | Re-run OCR and the archive generation for the given documents, e.g. after changing OCR settings. Queued asynchronously; the documents keep their metadata. |
| delete_documentsA | Move several documents to the trash at once. Recoverable until the trash is emptied. Requires explicit user confirmation — list what will be deleted before calling this. |
| download_documentA | Save a document's file to disk on the machine running this MCP server and return the path. Files are written to PAPERLESS_DOWNLOAD_DIR (defaults to the system temp directory). The bytes are deliberately not returned inline — a PDF as base64 would consume the entire context. |
| get_document_thumbnailA | Return the document's thumbnail image inline so it can actually be looked at. Useful for confirming what a document is without reading its whole OCR text. |
| bulk_download_documentsA | Download several documents as one zip archive, written to the download directory. Returns the archive path, not its contents. |
| upload_documentA | Hand a file to Paperless for consumption. Provide either |
| email_documentsA | Send one or more documents by email from the Paperless instance. This sends real mail to real people — only call it after the user has confirmed the recipients, subject and body. |
| list_document_notesA | Notes attached to a document, with authors and timestamps. Notes hold context the OCR text does not contain — worth reading before drawing conclusions about a document. |
| create_document_noteA | Attach a free-text note to a document. Use this to record context that belongs with the document rather than in the conversation — why it was kept, what was agreed, what to do next. |
| delete_document_noteA | Remove a note from a document. Not recoverable. |
| list_tagsA | List tags. Tags are the primary way documents are categorised, and can be nested via |
| get_tagA | Fetch a single tag by ID, with all fields. |
| create_tagA | Create a new tag. Check list_tags first: near-duplicate entries are hard to merge later. |
| update_tagA | Partially update a tag. Only the fields you pass are changed; omitted fields keep their current value. |
| delete_tagA | Permanently delete a tag. Documents are not deleted, but they lose this assignment and it cannot be restored. Confirm with the user first. |
| list_correspondentsA | List correspondents. A correspondent is the sender or counterparty a document came from. Returns id, name and document_count for each. Call this before creating anything — reusing an existing correspondent is almost always correct. |
| get_correspondentA | Fetch a single correspondent by ID, with all fields. |
| create_correspondentA | Create a new correspondent. Check list_correspondents first: near-duplicate entries are hard to merge later. |
| update_correspondentA | Partially update a correspondent. Only the fields you pass are changed; omitted fields keep their current value. |
| delete_correspondentA | Permanently delete a correspondent. Documents are not deleted, but they lose this assignment and it cannot be restored. Confirm with the user first. |
| list_document_typesA | List document types. A document type says what kind of document it is (invoice, contract, payslip). Returns id, name and document_count for each. Call this before creating anything — reusing an existing document type is almost always correct. |
| get_document_typeA | Fetch a single document type by ID, with all fields. |
| create_document_typeA | Create a new document type. Check list_document_types first: near-duplicate entries are hard to merge later. |
| update_document_typeA | Partially update a document type. Only the fields you pass are changed; omitted fields keep their current value. |
| delete_document_typeA | Permanently delete a document type. Documents are not deleted, but they lose this assignment and it cannot be restored. Confirm with the user first. |
| list_storage_pathsA | List storage paths. A storage path is a filename template controlling where Paperless stores the file on disk. Returns id, name and document_count for each. Call this before creating anything — reusing an existing storage path is almost always correct. |
| get_storage_pathA | Fetch a single storage path by ID, with all fields. |
| create_storage_pathA | Create a new storage path. Check list_storage_paths first: near-duplicate entries are hard to merge later. |
| update_storage_pathA | Partially update a storage path. Only the fields you pass are changed; omitted fields keep their current value. |
| delete_storage_pathA | Permanently delete a storage path. Documents are not deleted, but they lose this assignment and it cannot be restored. Confirm with the user first. |
| test_storage_pathA | Render a storage path template against an existing document to see the resulting file path. Use this to validate a template before saving it. |
| bulk_edit_metadata_objectsA | Delete or set permissions on many tags, correspondents, document types or storage paths at once. Deletion here is permanent — confirm with the user before calling it. |
| get_metadata_overviewA | One compact snapshot of all tags, correspondents, document types and storage paths with their IDs and document counts. Cheaper than four separate list calls and the right first step before filing or triaging documents. |
| list_custom_fieldsA | Custom fields defined on this instance, with their IDs, data types and how many documents use them. You need the IDs before you can read or write custom field values on a document. |
| get_custom_fieldB | One custom field definition including its select options, if any. |
| create_custom_fieldA | Define a new custom field. The data type cannot be changed afterwards, so pick it deliberately. |
| update_custom_fieldA | Rename a custom field or adjust its extra_data (e.g. add select options). Changing data_type is not supported by Paperless. |
| delete_custom_fieldA | Delete a custom field definition and every value stored in it, across all documents. This cannot be undone — confirm with the user, and check document_count first. |
| list_saved_viewsA | Saved views are the filter presets the user built in the Paperless web UI. Reading them is the fastest way to learn how this person actually organises their archive — check here before inventing your own filters. |
| get_saved_viewA | One saved view including its filter rules, so you can reproduce it as a search. |
| create_saved_viewA | Save a filter preset that shows up in the user's Paperless sidebar. filter_rules use the web UI's numeric rule types — copy the shape from an existing view via get_saved_view rather than guessing. |
| update_saved_viewA | Change a saved view's name, sorting, visibility or filter rules. |
| delete_saved_viewA | Remove a saved view. Documents are unaffected. |
| list_share_linksA | Every share link on the instance, with its slug, target document and expiry. Share links are publicly reachable without login — treat this list as security-relevant. |
| list_document_share_linksB | Existing share links for one document — check this before creating another. |
| create_share_linkA | Create a public, unauthenticated URL for a document. Anyone holding the link can read the document until it expires. Always confirm with the user before creating one, and set an expiration unless they explicitly asked for a permanent link. |
| delete_share_linkA | Revoke a share link immediately. Anyone still holding the URL loses access at once; the document itself is untouched. |
| list_share_link_bundlesB | Share link bundles (Paperless-ngx 3.x) expose several documents behind a single public link. |
| create_share_link_bundleA | Publish several documents behind one public link. Same warning as create_share_link: this is publicly reachable without authentication. Confirm first and prefer a finite expiration. |
| delete_share_link_bundleA | Revoke a share link bundle immediately. Every document in the bundle stops being publicly reachable; the documents themselves are untouched. |
| list_workflowsA | Automation rules on this instance, each with its triggers and actions inlined. Read these before changing filing behaviour — a workflow may already be doing what the user is asking you to do by hand. |
| get_workflowA | One workflow with its full trigger and action definitions. |
| create_workflowA | Create an automation rule. Workflows run automatically against future documents, so a mistake here silently mis-files everything that arrives afterwards. Read an existing workflow with get_workflow to copy the exact shape, and confirm the rule with the user before creating it. Trigger object. type: 1=consumption started, 2=document added, 3=document updated, 4=scheduled. Common fields: sources (1=consume folder, 2=API upload, 3=mail fetch), filter_filename, filter_path, filter_mailrule, match + matching_algorithm, filter_has_tags / filter_has_all_tags / filter_has_not_tags, filter_has_any_correspondents, filter_has_any_document_types, filter_custom_field_query, and for scheduled triggers schedule_offset_days, schedule_is_recurring, schedule_recurring_interval_days, schedule_date_field (added|created|modified|custom_field). Action object. type: 1=assignment, 2=removal, 3=email, 4=webhook, 5=..., 6=... Assignment actions use assign_title, assign_tags, assign_correspondent, assign_document_type, assign_storage_path, assign_owner, assign_view_users/groups, assign_custom_fields. Removal actions use the remove_* counterparts. Email and webhook actions nest their own config object. |
| update_workflowA | Update a workflow. Passing |
| delete_workflowA | Delete an automation rule permanently. Consider update_workflow with enabled:false instead. |
| list_workflow_triggersB | Trigger definitions across all workflows. Useful for auditing what fires when. |
| list_workflow_actionsA | Action definitions across all workflows. Useful for auditing what gets assigned automatically. |
| global_searchA | Search across every object type at once — documents, tags, correspondents, document types, storage paths, saved views, users, groups, mail rules, custom fields and workflows. Returns at most three hits per type, so use it to locate things by name when you do not yet know which kind of object you are looking for. For document searches, search_documents is better. |
| search_autocompleteA | Completions for a partial search term, ranked by importance in the full-text index. Helpful when the user's spelling of a name or term may not match what is in the archive. |
| get_statisticsA | Totals for the archive: document count, inbox count, characters, file type breakdown. A cheap orientation call at the start of a session. |
| get_server_statusA | Instance health: Paperless version, database and index status, whether Redis and the task workers are reachable, and whether the search index is up to date. |
| list_tasksA | Background tasks — consumption, merges, reprocessing — with their state and result. This is where an upload's outcome shows up, including the ID of the document it created. |
| get_taskA | One background task by database ID, including its result. Use this to find out whether an upload or merge actually succeeded. |
| get_active_tasksA | Tasks executing right now. Tells you whether the instance is busy. |
| acknowledge_tasksA | Mark finished or failed tasks as acknowledged so they stop showing in the UI. |
| list_trashA | Documents in the trash, with the date each was deleted and when it will be purged for good. |
| restore_from_trashA | Bring deleted documents back. The safe counterpart to delete_document. |
| empty_trashA | Permanently destroy trashed documents. There is no recovery after this — the files are gone. Never call this without the user explicitly asking for it in the current conversation, and list what is in the trash first. |
| get_remote_versionA | The latest Paperless-ngx release, and whether an update is available. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| triage_inbox | Work through untriaged documents: propose a title, correspondent, type and tags for each, then apply only what the user approves. |
| find_document | Locate a specific document from a vague description, without flooding the context. |
| audit_sharing | Review every publicly reachable share link and flag the risky ones. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 85 tools
Most CRUD tool families are clearly separated by resource type, but bulk_edit_documents overlaps with rotate_documents, merge_documents, edit_pdf, reprocess_documents, and delete_documents by exposing the same operations as methods. get_document with include_content also partially duplicates get_document_content, so an agent must read descriptions carefully to pick the right tool.
Nearly every tool follows the verb_noun snake_case pattern, with predictable list/get/create/update/delete families for each resource type. Minor exceptions like global_search and search_autocomplete still fit the general verb-first style and do not create confusion.
85 tools is an extreme surface for an MCP server, far beyond the practical range for agent tool selection. Even for a broad domain like Paperless-ngx, this exceeds the 50+ threshold that constitutes an extreme mismatch.
The server covers nearly the entire Paperless lifecycle: document search, content retrieval, metadata editing, OCR reprocessing, merging, trash management, share links, workflows, tasks, and full CRUD for all metadata objects. Minor gaps remain, such as no note update tool, no share-link update tool, and no direct user or mail-rule management.