paperless-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PAPERLESS_URL | Yes | URL of your Paperless-NGX instance | http://your-paperless-instance:8000 |
| PAPERLESS_API_KEY | Yes | API token for your Paperless-NGX instance |
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
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| bulk_edit_documentsB | Perform bulk operations on multiple documents. Note: 'remove_tag' removes a tag from specific documents (tag remains in system), while 'delete_tag' permanently deletes a tag from the entire system. ⚠️ WARNING: 'delete' method permanently deletes documents and requires confirmation. |
| post_documentA | Upload a new document to Paperless-NGX with optional metadata like title, correspondent, document type, tags, and custom fields. Provide either 'file' (base64-encoded content) or 'file_path' (absolute path to a file on the server's filesystem). Using file_path avoids base64 encoding overhead for large files. SECURITY: When using file_path, set PAPERLESS_MCP_UPLOAD_PATHS environment variable to restrict uploads to specific directories (colon-separated paths). |
| list_documentsA | List and filter documents with pagination and common Paperless filters such as title search, correspondent, document type, tag, storage path, creation date, archive serial number, and simple custom field filters. Use 'query_documents' for full-text query, structured custom field conditions, or advanced documented /api/documents/ query parameters. IMPORTANT: For queries like 'the last 3 contributions' or when searching by tag, correspondent, document type, or storage path, first use the relevant lookup tool to find the correct ID. Note: Document content is excluded from results by default. Use 'get_document_content' when you need the document text. |
| query_documentsA | Query documents using the full-text query engine plus structured Paperless filters. Use this for complex filtering, custom field conditions, or any documented /api/documents/ query parameters that are not exposed as first-class arguments. Prefer the dedicated top-level arguments where available. custom_field_query supports [field_name_or_id, operator, value] leaves or ['AND'|'OR', [clause1, clause2]] groups. Note: Document content is excluded from results by default. Use 'get_document_content' when you need the document text. |
| get_documentA | Get a specific document by ID with full details including correspondent, document type, tags, and custom fields. Note: Document content is excluded from results by default. Use 'get_document_content' to retrieve content when needed. |
| get_document_contentA | Get the text content of a specific document by ID. Use this when you need to read or analyze the actual document text. |
| search_documentsA | Deprecated compatibility wrapper for full-text document search. Use 'query_documents' with the 'query' argument for new integrations. Note: Document content is excluded from results by default. Use 'get_document_content' to retrieve content when needed. |
| download_documentB | Download a document file by ID. Returns a paperless:// resource URI; read the resource to fetch the file content. |
| get_document_thumbnailB | Get a document thumbnail (image preview) by ID. Returns a paperless:// resource URI; read the resource to fetch the image content. |
| update_documentA | Update a specific document with new values (title, correspondent, document type, storage path, tags, custom fields, and more). Top-level fields you omit are left unchanged. IMPORTANT: custom_fields is the exception — see its parameter description; it replaces the document's entire custom-field set. |
| list_document_notesA | List all notes attached to a document. Notes are free-text comments on a document and are the natural place for an audit trail (e.g. "invoice paid on X from account Y") or progress notes on an action item. |
| create_document_noteA | Add a note to a document. Use this to record an audit trail or progress note directly on the document. Returns the document's full list of notes after the note is added. |
| delete_document_noteA | ⚠️ DESTRUCTIVE: Permanently delete a single note from a document by its note ID. This operation is irreversible. Returns the document's remaining notes. |
| list_tagsB | List all tags. IMPORTANT: When a user query may refer to a tag or document type, you should fetch all tags and all document types up front (with a large enough page_size), cache them for the session, and search locally for matches by name or slug before making further API calls. This reduces redundant requests and handles ambiguity between tags and document types efficiently. |
| create_tagC | Create a new tag with optional color, matching pattern, and matching algorithm for automatic document tagging. |
| update_tagC | Update an existing tag's name, color, matching pattern, or matching algorithm. |
| delete_tagA | ⚠️ DESTRUCTIVE: Permanently delete a tag from the entire system. This will remove the tag from ALL documents that use it. Use with extreme caution. |
| bulk_edit_tagsC | Bulk edit tags. ⚠️ WARNING: 'delete' operation permanently removes tags from the entire system. Use with caution. |
| list_correspondentsC | List all correspondents with optional filtering and pagination. Correspondents represent entities that send or receive documents. |
| get_correspondentA | Get a specific correspondent by ID with full details including matching rules. |
| create_correspondentC | Create a new correspondent with optional matching pattern and algorithm for automatic document assignment. |
| update_correspondentC | Update an existing correspondent's name, matching pattern, or matching algorithm. |
| delete_correspondentA | ⚠️ DESTRUCTIVE: Permanently delete a correspondent from the entire system. This will affect ALL documents that use this correspondent. |
| bulk_edit_correspondentsC | Bulk edit correspondents. ⚠️ WARNING: 'delete' operation permanently removes correspondents from the entire system. |
| list_document_typesA | List all document types. IMPORTANT: When a user query may refer to a document type or tag, you should fetch all document types and all tags up front (with a large enough page_size), cache them for the session, and search locally for matches by name or slug before making further API calls. This reduces redundant requests and handles ambiguity between tags and document types efficiently. |
| get_document_typeB | Get a specific document type by ID with full details including matching rules. |
| create_document_typeC | Create a new document type with optional matching pattern and algorithm for automatic document classification. |
| update_document_typeC | Update an existing document type's name, matching pattern, or matching algorithm. |
| delete_document_typeB | ⚠️ DESTRUCTIVE: Permanently delete a document type from the entire system. This will affect ALL documents that use this type. |
| bulk_edit_document_typesB | Bulk edit document types. ⚠️ WARNING: 'delete' operation permanently removes document types from the entire system. |
| list_custom_fieldsA | List all custom fields. IMPORTANT: When a user query may refer to a custom field, you should fetch all custom fields up front (with a large enough page_size), cache them for the session, and search locally for matches by name before making further API calls. This reduces redundant requests and handles ambiguity efficiently. |
| get_custom_fieldB | Get a specific custom field by ID with full details including data type and extra configuration. |
| create_custom_fieldC | Create a new custom field with a specified data type (string, url, date, boolean, integer, float, monetary, documentlink, or select). For monetary fields, values must use currency code prefix format (e.g., USD10.00, GBP123.45) — NOT trailing symbol format (e.g., 10.00$). |
| update_custom_fieldC | Update an existing custom field's name, data type, or extra configuration data. |
| delete_custom_fieldA | ⚠️ DESTRUCTIVE: Permanently delete a custom field from the entire system. This will remove the field from ALL documents that use it. |
| bulk_edit_custom_fieldsB | Bulk edit custom fields. ⚠️ WARNING: 'delete' operation permanently removes custom fields from the entire system. |
| list_mail_accountsB | List Paperless mail accounts for selecting the account ID needed by mail rules. Does not expose account passwords. |
| get_mail_accountA | Get one Paperless mail account by ID. Password/token fields are redacted if the server returns them. |
| process_mail_accountB | Manually run Paperless mail processing for one account. This can consume matching mails according to enabled Paperless mail rules. |
| list_mail_rulesC | List Paperless mail rules with optional pagination. |
| get_mail_ruleB | Get one Paperless mail rule by ID. |
| create_mail_ruleB | Create a Paperless mail rule. Use list_mail_accounts first to choose account. Prefer attachment-only rules for invoices unless the full mail must be archived. |
| update_mail_ruleB | Patch an existing Paperless mail rule. Only supplied fields are changed. |
| delete_mail_ruleB | Delete one Paperless mail rule. This changes future mail ingestion behavior but does not delete documents. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 44 tools
Most tools target a distinct resource+action, and descriptions clearly differentiate get_document (metadata) vs get_document_content vs get_document_thumbnail vs download_document. However, the document-listing trio (list_documents, query_documents, and the deprecated search_documents) overlaps, forcing the agent to reason about which to pick even though the descriptions do explain the boundary.
The set follows a strong verb_noun convention (list_/get_/create_/update_/delete_/bulk_edit_ + resource) applied uniformly across tags, correspondents, document types, and custom fields. The only notable deviation is post_document (instead of create_document), a minor inconsistency in an otherwise predictable scheme.
At 44 tools this is heavy, well above the typical 3-15 sweet spot, though the breadth is partly justified by six distinct resource domains (documents, tags, correspondents, document types, custom fields, mail). Repetition such as five near-identical bulk_edit_* tools and the deprecated search_documents adds weight without fully earning its place.
The surface is comprehensive: full CRUD plus bulk operations across all major entities, document content/thumbnail/download, notes, and mail accounts/rules. Minor gaps remain—storage paths are referenced as filters but have no management tools, and single-document deletion is only reachable through bulk_edit_documents' 'delete' method.