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 |
|---|---|
| tasks | {
"list": {},
"cancel": {},
"requests": {
"tools": {
"call": {}
},
"prompts": {
"get": {}
},
"resources": {
"read": {}
}
}
} |
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_documentsA | List documents with optional filters. Returns one page. By default, per-document OCR
|
| search_documentsA | Full-text search documents. By default per-hit OCR
|
| get_documentA | Fetch one document by ID. By default, the OCR |
| get_document_contentA | Return the OCR'd text content of a document. |
| get_document_thumbnailA | Return the document's thumbnail as inline image content. |
| get_document_metadataA | Return technical metadata for a document (checksums, filenames, etc.). |
| get_document_notesA | Return notes attached to a document. |
| get_document_historyA | Return the audit history for a document. |
| get_document_suggestionsA | Return Paperless's classifier suggestions for a document. |
| update_documentA | Patch selected fields on a document. The response strips OCR |
| delete_documentC | Delete a document. |
| upload_documentA | Upload a document. Returns the task UUID for polling via |
| bulk_edit_documentsC | Apply a bulk operation to a set of documents. |
| add_document_noteB | Append a note to a document. |
| delete_document_noteC | Remove a note from a document. |
| list_tagsC | List tags. |
| get_tagA | Fetch a tag by ID. |
| create_tagC | Create a new tag. |
| update_tagC | 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. |
| get_correspondentA | Fetch a correspondent by ID. |
| create_correspondentC | 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_typeA | Fetch a document type by ID. |
| create_document_typeC | Create a new document type. |
| update_document_typeB | 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_fieldB | 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_pathsC | List storage paths. |
| get_storage_pathB | Fetch a storage path by ID. |
| list_saved_viewsC | List saved views. |
| get_saved_viewA | Fetch a saved view by ID. |
| list_share_linksA | 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 |
| 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 | Fetch Paperless version info. |
| 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 remote Paperless-NGX version as JSON. |
| tags_resource | Return all tags as a JSON array. |
| correspondents_resource | Return all correspondents as a JSON array. |
| 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
Most tools are cleanly separated by resource and action, and the document getters are split into distinct aspects (content, metadata, notes, history, suggestions). The main ambiguity is between get_server_info and get_remote_version, since both expose Paperless version information.
Names overwhelmingly follow a verb_noun snake_case pattern like list_documents, create_tag, and delete_document_type. Minor inconsistencies exist, such as get_server_info vs. get_remote_version and add_document_note/delete_document_note using add/delete rather than create/delete, but the overall pattern is predictable.
50 tools is a very large surface for an MCP server and exceeds the 25+ threshold where tool count starts to hurt usability. While Paperless has many subresources, several of them only have list/get tools, so the set feels heavier and more cluttered than necessary.
Core resources like documents, tags, correspondents, document types, and custom fields have solid CRUD and bulk-operation coverage. However, storage paths, saved views, and share links only support list and get, with no create/update/delete, leaving noticeable lifecycle gaps.