Paperless MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FASTMCP_LOG_LEVEL | No | Log level for FastMCP internals and app loggers. | INFO |
| PAPERLESS_MCP_HOST | No | Bind host for HTTP/SSE transport. | 127.0.0.1 |
| PAPERLESS_MCP_PORT | No | Bind port for HTTP/SSE transport. | 8000 |
| PAPERLESS_MCP_OIDC_* | No | OIDC provider settings when OIDC auth is enabled. | |
| PAPERLESS_MCP_BASE_URL | No | Public base URL for artifact download links. | |
| PAPERLESS_MCP_API_TOKEN | Yes | Paperless service-account token. | |
| PAPERLESS_MCP_HTTP_PATH | No | URL path prefix for HTTP transport. | /mcp |
| PAPERLESS_MCP_LOG_LEVEL | No | Log level: DEBUG, INFO, WARNING, ERROR. | INFO |
| PAPERLESS_MCP_READ_ONLY | No | When true, disables every writable tool. | false |
| PAPERLESS_MCP_TRANSPORT | No | Server transport: stdio, http, or sse. | stdio |
| PAPERLESS_MCP_LOG_FORMAT | No | Log format: rich or json. | rich |
| PAPERLESS_MCP_BEARER_TOKEN | No | Static bearer token for simple token auth. | |
| PAPERLESS_MCP_HTTP_RETRIES | No | Retries on 5xx/network errors. | 2 |
| PAPERLESS_MCP_INSTRUCTIONS | No | Operator-supplied description appended to MCP instructions. | built-in |
| FASTMCP_ENABLE_RICH_LOGGING | No | Set to false for plain/structured JSON log output. | true |
| PAPERLESS_MCP_PAPERLESS_URL | Yes | Base URL of the Paperless-NGX REST API (no trailing slash). | |
| PAPERLESS_MCP_EVENT_STORE_URL | No | Event store backend for HTTP session persistence. | memory:// |
| PAPERLESS_MCP_DEFAULT_PAGE_SIZE | No | Default page_size for list tools. Clamped [1, 100]. | 25 |
| PAPERLESS_MCP_HTTP_TIMEOUT_SECONDS | No | Per-request HTTP timeout (seconds). | 30 |
| PAPERLESS_MCP_PAPERLESS_PUBLIC_URL | No | Public-facing Paperless UI URL used to construct user-visible links. Defaults to PAPERLESS_MCP_PAPERLESS_URL when unset. | same as PAPERLESS_MCP_PAPERLESS_URL |
| PAPERLESS_MCP_DOWNLOAD_LINK_TTL_SECONDS | No | TTL of URLs issued by create_download_link. Clamped [30, 3600]. | 300 |
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
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_documentsA | List documents with optional filters. Returns one page. Per-document OCR
|
| search_documentsA | Full-text search documents. Per-hit OCR
|
| get_documentA | Fetch one document by ID. OCR |
| get_document_contentA | Return the OCR'd text content of a document. Documents such as books and technical standards can run to millions of
characters, so each call is capped at 20,000. A partial result opens
with a marker naming the character range returned, the document's full
length, and the |
| get_document_thumbnailB | Return the document's thumbnail as inline image content. |
| get_document_metadataB | Return technical metadata for a document (checksums, filenames, etc.). |
| get_document_notesB | Return notes attached to a document. |
| get_document_historyB | Return the audit history for a document. |
| get_document_suggestionsB | Return Paperless's classifier suggestions for a document. |
| update_documentA | Patch selected fields on a document. The response strips OCR |
| delete_documentD | Delete a document. |
| upload_documentB | Upload a document. Returns the task UUID for polling via |
| bulk_edit_documentsA | Apply a bulk operation to a set of documents. Paperless writes the change before answering |
| add_document_noteC | Append a note to a document. |
| delete_document_noteB | Remove a note from a document. |
| list_tagsD | List tags. |
| get_tagA | Fetch a tag by ID. |
| create_tagC | Create a new tag. |
| update_tagB | Patch selected fields on a tag. |
| delete_tagC | Delete a tag. |
| bulk_edit_tagsC | Apply a bulk operation to a set of tags. |
| list_correspondentsC | List correspondents. Each row's |
| get_correspondentA | Fetch a correspondent by ID. |
| create_correspondentD | Create a new correspondent. |
| update_correspondentC | Patch selected fields on a correspondent. |
| delete_correspondentC | Delete a correspondent. |
| bulk_edit_correspondentsC | Apply a bulk operation to a set of correspondents. |
| list_document_typesC | List document types. |
| get_document_typeB | Fetch a document type by ID. |
| create_document_typeC | Create a new document type. |
| update_document_typeC | Patch selected fields on a document type. |
| delete_document_typeC | Delete a document type. |
| bulk_edit_document_typesC | Apply a bulk operation to a set of document types. |
| list_custom_fieldsC | List custom fields. |
| get_custom_fieldA | Fetch a custom field by ID. |
| create_custom_fieldA | Create a new custom field.
Unknown shapes are rejected by Paperless with a 400. |
| update_custom_fieldA | Patch selected fields on a custom field definition.
See |
| delete_custom_fieldC | Delete a custom field. |
| list_storage_pathsD | List storage paths. |
| get_storage_pathA | Fetch a storage path by ID. |
| list_saved_viewsB | List saved views. Visibility flags are null when payload v10 omits those preferences. |
| get_saved_viewA | Fetch a saved view by ID. Visibility flags are null when payload v10 omits those preferences. |
| list_share_linksB | List share links (optionally filtered by document). |
| get_share_linkA | Fetch a share link by ID. |
| list_tasksA | List Paperless Celery tasks. Defaults to unacknowledged tasks only (set Pass |
| get_taskA | Fetch a task by UUID. Returns |
| wait_for_taskA | Poll until the task reaches a terminal state or times out. |
| get_statisticsA | Fetch collection-level statistics. |
| get_remote_versionA | Check whether a newer release of Paperless-NGX exists upstream. Answers the newest release published on GitHub, and whether it is newer
than the connected instance -- not the version installed on that
instance. The two coincide only while the instance is up to date.
Call |
| get_server_infoA | Report wrapper and upstream version info for paperless-mcp. Returns server_name, server_version, core_version (fastmcp-pvl-core), and (when configured) an upstream version block. Useful for verifying a deployment matches the expected build. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| config_resource | Return server configuration as JSON. |
| stats_resource | Return Paperless-NGX document statistics as JSON. |
| remote_version_resource | Return the newest release of Paperless-NGX published upstream. An update check, not an identity one: the newest release Paperless read from GitHub and whether it is newer than the connected instance -- not the version installed on that instance, which ``get_server_info`` reports. |
| tags_resource | Return all tags as a JSON array. |
| correspondents_resource | Return all correspondents as a JSON array. Each entry carries ``last_correspondence``, the date of the newest document, or null when it has none. |
| document_types_resource | Return all document types as a JSON array. |
| custom_fields_resource | Return all custom fields as a JSON array. |
| storage_paths_resource | Return all storage paths as a JSON array. |
| saved_views_resource | Return all saved views as a JSON array. |
| tasks_resource | Return Paperless-NGX tasks (first page, unacknowledged) as a JSON array. |
TDQS
Scored across 50 tools
Tools are grouped clearly by resource and action, so get_document, get_document_content, get_document_metadata, and get_document_notes are easy to distinguish despite all targeting a document by ID. The only mild overlap is list_documents versus search_documents, though their descriptions explain the metadata-filter vs full-text distinction.
The set overwhelmingly follows a snake_case verb_noun pattern with predictable singular/plural forms: list_*, get_*, create_*, update_*, delete_*, bulk_edit_*. Minor deviations like add_document_note versus get_document_notes and upload_document instead of create_document are understandable but break the otherwise consistent pattern.
50 tools is a very large surface for an agent to select from, even though Paperless has many resource types. Several resource groups are only read-only (storage paths, saved views, share links), which makes the high count feel heavier than necessary.
Documents, correspondents, tags, document types, and custom fields have solid CRUD coverage, and document retrieval/search is thorough. However, storage paths, saved views, and share links expose only list/get operations, and share-link creation is referenced but not present as a tool, leaving notable lifecycle gaps.