{"name":"io.github.tobee89/mcp-paperless-ngx","slug":"tobee89-mcp-paperless-ngx","title":"Paperless-ngx","description":"MCP server for Paperless-ngx 3.x — full REST API coverage, schema-aware, token-frugal.","url":"https://mcp.market/server/tobee89-mcp-paperless-ngx","rating":null,"grade":"B","score":78,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":31,"stars":2,"forks":1,"downloads_week":2101,"last_push_at":"2026-08-21T08:22:38.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/tobee89/mcp-paperless-ngx","website":null,"version":"0.1.1","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"mcp-paperless-ngx","version":"0.1.1","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"Base URL of the Paperless-ngx instance","isRequired":true,"name":"PAPERLESS_URL"},{"description":"Paperless-ngx API token","isRequired":true,"isSecret":true,"name":"PAPERLESS_TOKEN"},{"description":"URL used when building links, if the instance is reachable under a different name from outside","name":"PAPERLESS_PUBLIC_URL"},{"description":"Comma-separated toolsets, or all","name":"PAPERLESS_TOOLSETS"},{"description":"Expose only tools that cannot change anything","default":"false","name":"PAPERLESS_READ_ONLY"},{"description":"Extra request headers; needed behind forward-auth proxies such as Authentik","name":"PAPERLESS_HEADERS"},{"description":"Where downloaded files are written","format":"filepath","name":"PAPERLESS_DOWNLOAD_DIR"},{"description":"Hard ceiling on list page sizes","default":"100","name":"PAPERLESS_MAX_PAGE_SIZE"},{"description":"Request timeout in milliseconds","default":"60000","name":"PAPERLESS_TIMEOUT_MS"},{"description":"REST API version sent in the Accept header","default":"10","name":"PAPERLESS_API_VERSION"}]}],"tools":[{"name":"acknowledge_tasks","description":"Mark finished or failed tasks as acknowledged so they stop showing in the UI.","write_action":false,"price_micros":0,"input_schema":null},{"name":"bulk_download_documents","description":"Download several documents as one zip archive, written to the download directory.","write_action":false,"price_micros":0,"input_schema":null},{"name":"bulk_edit_documents","description":"Apply one operation to many documents at once. Far cheaper than looping update_document, and the","write_action":false,"price_micros":0,"input_schema":null},{"name":"bulk_edit_metadata_objects","description":"Delete or set permissions on many tags, correspondents, document types or storage paths at once.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_custom_field","description":"Define a new custom field. The data type cannot be changed afterwards, so pick it deliberately.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_document_note","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_saved_view","description":"Save a filter preset that shows up in the user's Paperless sidebar.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_share_link","description":"Create a public, unauthenticated URL for a document. Anyone holding the link can read the","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_share_link_bundle","description":"Publish several documents behind one public link. Same warning as create_share_link: this is","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_workflow","description":"Create an automation rule. Workflows run automatically against future documents, so a mistake","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_custom_field","description":"Delete a custom field definition and every value stored in it, across all documents.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_document","description":"Move a document to the trash. It stays recoverable until the trash is emptied or the retention","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_document_note","description":"Remove a note from a document. Not recoverable.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_documents","description":"Move several documents to the trash at once. Recoverable until the trash is emptied.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_saved_view","description":"Remove a saved view. Documents are unaffected.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_share_link","description":"Revoke a share link immediately. Anyone still holding the URL loses access at once; the document itself is untouched.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_share_link_bundle","description":"Revoke a share link bundle immediately. Every document in the bundle stops being publicly reachable; the documents themselves are untouched.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_workflow","description":"Delete an automation rule permanently. Consider update_workflow with enabled:false instead.","write_action":true,"price_micros":0,"input_schema":null},{"name":"download_document","description":"Save a document's file to disk on the machine running this MCP server and return the path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"edit_pdf","description":"Reorder, rotate, remove or split out pages of a single document, producing a new document.","write_action":false,"price_micros":0,"input_schema":null},{"name":"email_documents","description":"Send one or more documents by email from the Paperless instance. This sends real mail to real","write_action":true,"price_micros":0,"input_schema":null},{"name":"empty_trash","description":"Permanently destroy trashed documents. There is no recovery after this — the files are gone.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_active_tasks","description":"Tasks executing right now. Tells you whether the instance is busy.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_configuration","description":"The instance's application configuration: OCR defaults, output type, barcode settings, AI","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_custom_field","description":"One custom field definition including its select options, if any.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_document","description":"Fetch one document's metadata by ID: title, correspondent, type, tags, dates, custom fields, notes","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_document_ai_suggestions","description":"Suggestions from the instance's configured LLM backend (Paperless-ngx 3.x, only if AI features are","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_document_content","description":"Return the OCR/extracted text of one document. Deliberately a separate tool: this is the most","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_document_history","description":"Audit trail of changes to a document — who changed which field, and when. Requires audit logging","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_document_metadata","description":"Technical file metadata for a document: checksums, byte sizes, MIME type, stored filename, whether","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_document_suggestions","description":"Paperless' own suggestions for a document — correspondents, tags, document types and dates its","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_document_thumbnail","description":"Return the document's thumbnail image inline so it can actually be looked at.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_log","description":"Read one of the instance's log files. Returns the tail by default — logs are long and mostly","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_mail_account","description":"One mail account in full: server, port, username, folder and security settings. Passwords are never returned by the API.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_mail_rule","description":"One mail rule in full: which messages it matches, what metadata it assigns, and what it does with the message afterwards (leave, mark read, move, delete).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_metadata_overview","description":"One compact snapshot of all tags, correspondents, document types and storage paths with their","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_next_asn","description":"The next free archive serial number, for filing a physical document alongside its scan.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_profile","description":"The profile of the user whose API token this server is using. Confirms which account you are","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_remote_version","description":"The latest Paperless-ngx release, and whether an update is available.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_saved_view","description":"One saved view including its filter rules, so you can reproduce it as a search.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_selection_data","description":"For a set of document IDs, return how many of them carry each tag, correspondent, document type and","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_server_status","description":"Instance health: Paperless version, database and index status, whether Redis and the task","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_statistics","description":"Totals for the archive: document count, inbox count, characters, file type breakdown.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_task","description":"One background task by database ID, including its result. Use this to find out whether an","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_user","description":"One user record by ID, including group membership and permission flags. Use it to resolve an owner ID to a human name.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_workflow","description":"One workflow with its full trigger and action definitions.","write_action":false,"price_micros":0,"input_schema":null},{"name":"global_search","description":"Search across every object type at once — documents, tags, correspondents, document types,","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_custom_fields","description":"Custom fields defined on this instance, with their IDs, data types and how many documents use","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_document_notes","description":"Notes attached to a document, with authors and timestamps. Notes hold context the OCR text does","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_document_share_links","description":"Existing share links for one document — check this before creating another.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_groups","description":"Permission groups with their IDs and member counts, for use in set_permissions payloads.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_logs","description":"Names of the log files available, e.g. 'paperless' and 'mail'.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_mail_accounts","description":"IMAP accounts Paperless fetches documents from. Passwords are not returned.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_mail_rules","description":"Rules deciding which messages become documents, and what metadata they get.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_processed_mail","description":"Messages Paperless has already handled, with their status. The place to look when a mail","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_saved_views","description":"Saved views are the filter presets the user built in the Paperless web UI. Reading them is the","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_share_link_bundles","description":"Share link bundles (Paperless-ngx 3.x) expose several documents behind a single public link.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_share_links","description":"Every share link on the instance, with its slug, target document and expiry.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_tasks","description":"Background tasks — consumption, merges, reprocessing — with their state and result.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_trash","description":"Documents in the trash, with the date each was deleted and when it will be purged for good.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_users","description":"Users on this instance with their IDs and permissions. You need these IDs to set document","write_action":false,"price_micros":0,"input_schema":null},{"name":"merge_documents","description":"Merge several documents into one new PDF, in the order given. The originals stay unless","write_action":false,"price_micros":0,"input_schema":null},{"name":"process_mail_account","description":"Trigger an immediate fetch for one mail account instead of waiting for the next scheduled run.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remove_pdf_password","description":"Decrypt password-protected PDFs so Paperless can OCR them. The password is sent to your Paperless","write_action":true,"price_micros":0,"input_schema":null},{"name":"reprocess_documents","description":"Re-run OCR and the archive generation for the given documents, e.g. after changing OCR settings.","write_action":false,"price_micros":0,"input_schema":null},{"name":"restore_from_trash","description":"Bring deleted documents back. The safe counterpart to delete_document.","write_action":false,"price_micros":0,"input_schema":null},{"name":"rotate_documents","description":"Rotate every page of the given documents clockwise by 90, 180 or 270 degrees.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_autocomplete","description":"Completions for a partial search term, ranked by importance in the full-text index.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_documents","description":"Find documents by full-text search, metadata filters, or both. This is the main entry point for","write_action":false,"price_micros":0,"input_schema":null},{"name":"test_storage_path","description":"Render a storage path template against an existing document to see the resulting file path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_custom_field","description":"Rename a custom field or adjust its extra_data (e.g. add select options).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_document","description":"Change metadata on a single document. Only the fields you pass are modified.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_mail_rule","description":"Change a mail rule. Rules run unattended against a live mailbox, so a wrong filter can consume","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_saved_view","description":"Change a saved view's name, sorting, visibility or filter rules.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_workflow","description":"Update a workflow. Passing `triggers` or `actions` replaces the existing list wholesale — fetch","write_action":true,"price_micros":0,"input_schema":null},{"name":"upload_document","description":"Hand a file to Paperless for consumption. Provide either `path` (a file on the machine running","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":78,"grade":"B","scanned_at":"2026-11-02T06:14:22.281Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-02T06:14:22.228Z","components":{"code":{"score":25,"max":25,"notes":["25 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":12,"max":15,"notes":["last push 73 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"mcp-paperless-ngx","version":"0.1.1","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-08-20T17:46:46.496Z","repositoryUrl":"git+https://github.com/tobee89/mcp-paperless-ngx.git","weeklyDownloads":2101}],"repo":{"found":true,"owner":"tobee89","repo":"mcp-paperless-ngx","archived":false,"pushedAt":"2026-08-21T08:22:38Z","stars":2,"forks":1,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/186403981?v=4","ownerCreatedAt":"2024-10-26T15:07:15Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/186403981?v=4&s=128","source":"registry","width":128,"height":128},"presence":{"stars":2,"forks":1,"downloadsWeek":2101,"license":"MIT","lastPushAt":"2026-08-21T08:22:38.000Z","score":31}}}},"grade_history":[],"reviews":[]}