Skip to main content
Glama

paperless-ngx MCP server

An MCP server that puts a paperless-ngx document archive in reach of an AI assistant: full-text search, reading documents, filing them, and uploading new ones.

It talks to the paperless-ngx REST API over HTTP, so it works against any reachable instance — local, LAN, or remote behind a reverse proxy.

Why the tools look the way they do

The paperless API refers to tags, correspondents, document types and storage paths by numeric id, and returns bare ids on every document. That is awkward for a model. So this server:

  • resolves ids to names in all output, so a search result reads "correspondent": "ACME Corp" rather than "correspondent": 7;

  • exposes a paperless_list_objects tool (and a paperless://taxonomy resource) for going the other way, name → id, in a single call;

  • takes friendly filter names (created_after, tags_all, title_contains) and translates them into the API's created__gte / tags__id__all / title__icontains form;

  • truncates document text and raw responses by default, so one call cannot swamp the context;

  • requires an explicit confirm: true on anything destructive.

Related MCP server: paperlessngx-mcp

Two ways to run it

MCP has two transports, and which one you want depends on how the client reaches the server:

  • stdio (default) — the client spawns the server as a subprocess and talks over stdin/stdout. This is what Claude Code and Claude Desktop do, and what you want in almost all cases.

  • http — one long-lived server listening on a port, which several clients can connect to.

Set MCP_TRANSPORT=stdio or MCP_TRANSPORT=http.

Setup

First get an API token from the paperless web UI: user menu → My Profile → the circular arrow next to API Token.

Nothing to clone or build — npx fetches the package on demand.

claude plugin marketplace add patrickcylai/paperless-ngx-mcp
claude plugin install paperless-ngx@patrickcylai-plugins

Claude Code then prompts for your URL and token, and for the two directories described under what it can touch on your disk. The token is masked on entry and kept in your OS keychain rather than written to a settings file, which is the main reason to prefer this over the command below — that one leaves the token in your shell history.

The plugin runs the published npm package, so it needs nothing cloned or built.

To set everything up front instead of answering prompts:

claude plugin install paperless-ngx@patrickcylai-plugins \
  --config url=https://paperless.example.com \
  --config token=your-token \
  --config read_only=true

Change any of it later with /plugin configure paperless-ngx@patrickcylai-plugins. Leave download_dir and upload_dirs empty to accept the defaults. The plugin authenticates with a token only; for username/password use one of the forms below.

Claude Code, as a plain MCP server

claude mcp add paperless -e PAPERLESS_URL=https://paperless.example.com -e PAPERLESS_TOKEN=your-token -- npx -y @patrickcylai/paperless-ngx-mcp

Note that this writes the token into your shell history.

Claude Desktop / other MCP clients

Add to the client's MCP config (claude_desktop_config.json for Claude Desktop):

{
    "mcpServers": {
        "paperless": {
            "command": "npx",
            "args": ["-y", "@patrickcylai/paperless-ngx-mcp"],
            "env": {
                "PAPERLESS_URL": "https://paperless.example.com",
                "PAPERLESS_TOKEN": "your-token"
            }
        }
    }
}

From source

npm install
npm run build

Then point the client at node /absolute/path/to/paperless-ngx-mcp/dist/index.js instead of the npx command above.

Running as an HTTP service

Only needed if you want one long-lived server rather than a per-client subprocess:

MCP_TRANSPORT=http PAPERLESS_URL=https://paperless.example.com PAPERLESS_TOKEN=your-token npx -y @patrickcylai/paperless-ngx-mcp

It listens on 127.0.0.1:8765, with the MCP endpoint at /mcp and a liveness probe at /healthz:

curl -s http://127.0.0.1:8765/healthz

Point an HTTP-capable client at it:

claude mcp add --transport http paperless http://127.0.0.1:8765/mcp

If you expose the port

It binds loopback only by default. Before binding anything wider, set a bearer token — otherwise anyone who can reach the port can read and modify your archive. The server warns on stderr when it binds a non-loopback address without one.

openssl rand -hex 32

Set that as MCP_AUTH_TOKEN, and add MCP_ALLOWED_HOSTS for the hostname you'll use — Host and Origin are checked against a localhost-only allowlist by default, which blocks DNS rebinding. Clients then need to send Authorization: Bearer <token>. /healthz stays unauthenticated.

Configuration

Variable

Required

Default

Meaning

PAPERLESS_URL

yes

Base URL of the install. A trailing /api is stripped, so either form works.

PAPERLESS_TOKEN

yes*

API token. Takes precedence over username/password.

PAPERLESS_USERNAME / PAPERLESS_PASSWORD

yes*

Basic-auth alternative to a token.

PAPERLESS_READ_ONLY

no

false

When set, every tool that would modify the archive refuses to run — no request is even sent.

PAPERLESS_DOWNLOAD_DIR

no

$TMPDIR/paperless-mcp

The only directory paperless_download_document may write into. Created 0700.

PAPERLESS_UPLOAD_DIRS

no

$PAPERLESS_DOWNLOAD_DIR

Comma-separated list of directories paperless_upload_document may read from.

PAPERLESS_API_VERSION

no

server default

Pin the API version (Accept: …; version=N). Leave unset unless you have a reason.

PAPERLESS_TIMEOUT_MS

no

30000

Per-request timeout.

* One of the two credential forms is required.

Transport settings (the HTTP ones are ignored under stdio):

Variable

Default

Meaning

MCP_TRANSPORT

stdio

stdio or http.

MCP_HTTP_HOST

127.0.0.1

Interface to bind. Set a bearer token before widening this.

MCP_HTTP_PORT

8765

Port to listen on.

MCP_HTTP_PATH

/mcp

Path the MCP endpoint is mounted at.

MCP_AUTH_TOKEN

When set, requests must send Authorization: Bearer <token>. /healthz stays open.

MCP_ALLOWED_HOSTS

localhost

Comma-separated Host allowlist (DNS-rebinding protection). * disables the check.

MCP_ALLOWED_ORIGINS

localhost

Comma-separated Origin allowlist. * disables the check.

Start with PAPERLESS_READ_ONLY=1 if you want to let an assistant explore the archive before giving it permission to change anything. It governs the archive, not the local filesystem — downloads still write files, within the boundary described next.

What it can touch on your disk

Two tools reach the local filesystem, and both are confined:

  • paperless_download_document writes only inside PAPERLESS_DOWNLOAD_DIR. A dest_path is taken as relative to that directory; an absolute one has to be under it. Anything else is refused.

  • paperless_upload_document reads only from the directories in PAPERLESS_UPLOAD_DIRS, which defaults to just the download directory. Point it at your scans folder to upload from there:

    PAPERLESS_UPLOAD_DIRS=/home/me/Documents/scans,/home/me/Downloads

Both checks resolve symlinks, so a link inside an allowed directory cannot lead out of it, and the download directory is created 0700 and rejected outright if it is itself a symlink.

This matters because document text is untrusted input. An archive fed by a scanner or a mail rule contains whatever a sender put in it, that text reaches the model, and a model can be talked into calling a tool. The confinement is what keeps "read my documents" from becoming "write to my ~/.ssh/authorized_keys" — so widen these two settings deliberately, not by reflex.

If your instance uses a self-signed certificate, run the server with NODE_TLS_REJECT_UNAUTHORIZED=0 — bearing in mind that this disables certificate checking for the whole process.

Tools

Documents

Tool

Does

paperless_search_documents

Full-text search plus structured filters, paginated, with highlights.

paperless_get_document

One document: metadata, extracted text, notes, custom field values.

paperless_download_document

Write the original / archived PDF / thumbnail into PAPERLESS_DOWNLOAD_DIR.

paperless_upload_document

Upload a file from PAPERLESS_UPLOAD_DIRS for consumption, optionally waiting for the result.

paperless_update_document

Change title, dates, correspondent, type, tags, custom fields.

paperless_bulk_edit_documents

One operation across many documents; delete needs confirmation.

paperless_get_document_suggestions

What paperless' own matching would file the document as.

paperless_document_notes

List, add or delete notes on a document.

Taxonomy

Tool

Does

paperless_list_objects

List tags, correspondents, document types, storage paths, custom fields, saved views, users, groups, mail accounts, mail rules, workflows, share links.

paperless_create_object

Create a tag, correspondent, document type, storage path or custom field.

paperless_update_object

Rename or reconfigure one of the above.

paperless_delete_objects

Delete them; requires confirmation.

System

Tool

Does

paperless_get_statistics

Document counts, inbox size, file-type breakdown.

paperless_get_system_status

Version, database/index/Redis health, what this server is connected to.

paperless_list_tasks

Background tasks — use it to follow up on an upload.

paperless_api_request

Escape hatch to any REST endpoint the tools above do not cover.

Resources

  • paperless://taxonomy — every tag, correspondent, type, storage path and custom field with its id.

  • paperless://statistics — the same payload as the statistics tool.

Search syntax

paperless_search_documents' query parameter goes to the full-text index and supports paperless' advanced syntax:

shopname AND (product1 OR product2)
type:invoice tag:unpaid
correspondent:university certificate
created:[2005 to 2009]
added:yesterday
produ*name
custom_fields.name:"Contract Number" custom_fields.value:1312
notes.note:reminder

Date keywords: today, yesterday, "previous week", "this month", "previous month", "this year", "previous year", "previous quarter". Matching is word-order-independent and accent-insensitive, and separators are stripped at index time, so 1312 finds A-1312/B.

For plain substring matching use title_contains / content_contains instead, and to find documents resembling one you already have, use more_like_id.

Custom fields have their own filter, passed through verbatim as custom_field_query:

["due", "range", ["2024-08-01", "2024-09-01"]]
["customer", "exact", "bob"]
["OR", [["address", "isnull", true], ["address", "exact", ""]]]

Development

npm run dev        # run straight from TypeScript source
npm test           # unit tests + end-to-end tests against a stub paperless API
npm run typecheck  # tsc --noEmit
npm run build      # emit dist/

The end-to-end suite starts a stub HTTP server that mimics the paperless API and drives the real server over both transports with raw JSON-RPC, so it covers the wire protocol, query translation, multipart uploads, error handling, read-only enforcement, bearer auth, the DNS-rebinding checks and the filesystem confinement.

Anything not covered by a dedicated tool is reachable through paperless_api_request. Your own instance publishes its full, version-matched schema at <paperless-url>/api/schema/view/.

The Claude Code plugin lives in plugin/: plugin/.claude-plugin/plugin.json declares the settings users are prompted for, and plugin/.mcp.json runs the published package. .claude-plugin/marketplace.json makes this repository its own marketplace, listing the plugin by relative path.

That relative path is deliberate. An npm plugin source also works, and avoids re-resolving the package each session, but only the Claude Code CLI accepts one — the Claude Desktop and claude.ai sync paths take github, url, git-subdir or a relative path, and reject a marketplace whose entry uses anything else. A relative path is the only form that installs everywhere.

Validate both manifests with claude plugin validate ./plugin and claude plugin validate .. To exercise the plugin without publishing, add the repository as a local marketplace: claude plugin marketplace add /path/to/paperless-ngx-mcp.

License

MIT

Available Tools

16 tools
paperless_api_requestRaw API requestA
Destructive

Escape hatch for any paperless-ngx REST endpoint the other tools do not cover — workflows, share links, mail rules, trash, document merge/rotate/edit_pdf, permissions, and so on. path is relative to /api/, e.g. documents/12/history, trash, share_links. Trailing slashes are added automatically. Browse the full schema for your server at <paperless-url>/api/schema/view/. Prefer the purpose-built tools when one fits; they return smaller, name-resolved output.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoJSON request body, for POST/PATCH/PUT.
pathYesEndpoint path relative to `/api/`, without a query string.
queryNoQuery parameters.
methodNoGET
max_charsNoTruncate the response body at this many characters.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry destructiveHint=true and openWorldHint=true; the description adds useful behavioral details beyond the flags: paths are relative to `/api/`, trailing slashes are added automatically, and responses are raw rather than name-resolved. It does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each earning its place: purpose, path semantics, schema discovery, and alternative-preference guidance. It is front-loaded with the most important information and has no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a generic raw-API escape hatch with no output schema, the description is appropriately complete: it teaches the agent how to discover endpoint schemas, how to build paths, and when to avoid the tool. It correctly delegates exhaustive endpoint enumeration to the linked API schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high, but the description adds meaning beyond the schema by explaining that `path` is relative to `/api/`, giving concrete examples, and noting trailing-slash normalization. It also clarifies that `body` is for POST/PATCH/PUT implicitly via the raw-API context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: an escape hatch for any paperless-ngx REST endpoint not covered by the purpose-built siblings, with concrete examples such as workflows, share links, mail rules, and trash. It clearly distinguishes itself from the other paperless tools by scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing guidance: prefer the purpose-built tools when one fits; use this tool for endpoints they do not cover. It also provides path-relative-to-`/api/` instructions and a link to the full API schema, so the agent knows exactly how to construct a call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_bulk_edit_documentsBulk edit documentsA
Destructive

Apply one operation to many documents at once. Supply only the parameters the chosen method needs. Runs asynchronously on the server. delete moves documents to the trash and requires confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
methodYesOperation to perform.
tag_idNoFor `add_tag` / `remove_tag`.
confirmNoRequired for `delete`.
add_tag_idsNoFor `modify_tags`.
document_idsYesDocuments to act on.
remove_tag_idsNoFor `modify_tags`.
storage_path_idNoFor `set_storage_path`.
correspondent_idNoFor `set_correspondent`.
document_type_idNoFor `set_document_type`.
add_custom_fieldsNoFor `modify_custom_fields`: map of custom field id to value.
remove_custom_field_idsNoFor `modify_custom_fields`: custom field ids to strip.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag the operation as mutating/destructive, so the description adds meaningful behavior beyond them: it runs asynchronously and `delete` moves documents to trash rather than permanently deleting them, with `confirm: true` required. This is exactly the kind of context that helps an agent predict consequences.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded sentences communicate the core operation, the parameter-selection rule, and the two most important behavioral cautions. Every sentence contributes value and there is no redundancy with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description correctly focuses on the non-obvious facts: asynchronous execution and trash/confirm behavior. The schema covers parameter-method mappings, though the conditional parameter requirements across the nine methods are not fully enforced or spelled out in either place, leaving minor ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameter details are already well documented. The description only reinforces the general principle of passing only method-relevant parameters and highlights the `confirm` flag for delete, without adding new parameter-level semantic detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete action, 'Apply one operation to many documents at once,' which clearly identifies the resource and scope. It distinguishes the tool from single-document operations like paperless_update_document without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives useful operating guidance: 'Supply only the parameters the chosen method needs' and calls out the delete confirmation requirement. However, it never explicitly says when to choose bulk edit over single-document alternatives, so the tool-selection guidance is mostly implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_create_objectCreate a tag, correspondent or typeA

Create a tag, correspondent, document type, storage path or custom field. Matching algorithm: 0 none, 1 any word, 2 all words, 3 exact, 4 regex, 5 fuzzy, 6 auto (trained classifier). Storage paths need a path template such as {{ created_year }}/{{ correspondent }}/{{ title }}. Custom fields need a data_type (string, url, date, boolean, integer, float, monetary, documentlink, select).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the new object.
pathNoStorage paths only: the filename template.
typeYesWhat to create.
matchNoMatch text or pattern used for automatic assignment.
colourNoTags only: hex colour such as `#a6cee3`.
data_typeNoCustom fields only: the value type.
extra_dataNoCustom fields only, e.g. `{"select_options":[{"label":"Cat"},{"label":"Dog"}]}`.
is_inbox_tagNoTags only: mark newly consumed documents with this tag.
is_insensitiveNoCase-insensitive matching. Defaults to true server-side.
matching_algorithmNoMatching algorithm: 0 none, 1 any word, 2 all words, 3 exact, 4 regex, 5 fuzzy, 6 auto (trained classifier).

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is not read-only and not destructive. The description adds relevant domain context: matching algorithm values, storage path template requirements, and custom field data types. It does not disclose return values, validation behavior, or permission needs, but the annotation safety profile lowers the burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by concise type-specific notes. It loses a point because the full matching algorithm list largely duplicates the schema's existing description, and the title's 'type' is slightly ambiguous compared to the fuller description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a creation tool with 10 parameters and several type-specific constraints, the description supplies the important cross-cutting requirements: storage paths need a path template and custom fields need a data_type. Combined with the rich schema containing per-parameter descriptions and enums, the agent has enough information to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description repeats the matching algorithm enum and data_type values that are already in the schema, while adding only a storage path template example. This adds slight value but does not meaningfully compensate beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Create') and enumerates the exact resources: tag, correspondent, document type, storage path, or custom field. This clearly differentiates it from sibling tools like paperless_update_object, paperless_delete_objects, and paperless_list_objects, even without explicit cross-references.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the usage case by saying 'Create a tag...' and adds helpful type-specific conditions, such as storage paths needing a `path` and custom fields needing `data_type`. However, it does not explicitly state when not to use the tool or point to alternatives like paperless_update_object for modifications, leaving some routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_delete_objectsDelete tags, correspondents or typesA
Destructive

Permanently delete tags, correspondents, document types or storage paths. Documents themselves are not deleted, but they lose the association. Requires confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesIds to delete.
typeYesWhat to delete.
confirmNoMust be true; this cannot be undone.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructiveHint=true, readOnlyHint=false), the description discloses the exact nature of the destructive effect: associations are permanently removed while documents remain intact. It also surfaces the non-negotiable 'confirm: true' requirement, which is a critical behavioral condition for safe invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two succinct sentences front-load the primary action, then add the two most important qualifications: the effect on documents and the confirm requirement. No filler or duplication with schema descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with annotations present and no output schema, the description covers the essential behavioral context: what is deleted, what is not deleted, and the required confirmation. This is sufficient for an agent to call it correctly without additional hidden guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema description coverage is 100%, so the schema already documents all three parameters. The description adds no new detail beyond the schema, though it does reinforce the confirm requirement via 'Requires confirm: true'. This matches the baseline for fully-described schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('delete'), a precise set of resources ('tags, correspondents, document types or storage paths'), and clarifies the scope of the effect. It is immediately distinguishable from siblings like paperless_create_object, paperless_update_object, and document-focused tools because it is the only one that deletes these metadata objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful context about when not to use this tool: 'Documents themselves are not deleted, but they lose the association' tells the agent this does not remove documents. It also communicates the required confirmation. However, it does not explicitly name an alternative tool for deleting documents or for listing objects to obtain ids.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_document_notesDocument notesA
Destructive

List, add or delete the free-text notes attached to a document.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDocument id.
noteNoNote text. Required for `add`.
actionNolist
note_idNoNote id. Required for `delete`.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true and readOnlyHint=false, and the description explicitly mentions delete, which is consistent and non-contradictory. However, it adds no additional behavioral context beyond what annotations and the action list already convey, such as irreversibility of deletion or that adding appends to existing notes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence efficiently conveys the core capability without redundancy. It is front-loaded with the action list and resource, and every word adds meaning. This is appropriately concise for a multi-action CRUD tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is short but adequate given the absence of an output schema and the presence of annotations that cover safety. It does not detail return values or the effect of the default 'list' action, but those are implied by the action enum and not critical for a basic call. The required parameter relationships are documented in schema descriptions, so the agent can correctly construct calls.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds value by clarifying when note and note_id are required, complementing the schema's 75% coverage which lacks description for 'action'. It explains 'Note text. Required for add' and 'Note id. Required for delete', which is not in the schema description. This helps the agent map parameters to actions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool operates on document notes with three distinct actions: list, add, delete. It mentions the resource (document) and the actions, making the purpose explicit. It distinguishes from siblings like paperless_update_document by focusing on notes, though it doesn't explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus other tools, such as paperless_update_document or paperless_bulk_edit_documents. It does not mention prerequisites, exclusions, or alternative tools for related operations. Usage context is only implicit through the actions list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_download_documentDownload document fileA
Idempotent

Save a document’s file to local disk and return the path. Use kind: "original" for the file as uploaded, "archive" for the OCR’d PDF paperless generated, "thumbnail" for a small preview image. Read the extracted text with paperless_get_document instead when you only need the words. Writes are confined to PAPERLESS_DOWNLOAD_DIR.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDocument id.
kindNoWhich rendition to fetch.archive
versionNoFetch a specific document version id.
dest_pathNoWhere to write, as a path inside PAPERLESS_DOWNLOAD_DIR — relative to it, or absolute and under it. Anything outside is refused. Defaults to the server-supplied filename.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal idempotence, non-read-only, and non-destructive behavior; the description adds useful context by stating that writes are confined to PAPERLESS_DOWNLOAD_DIR and that the tool returns the file path. It does not contradict the annotations, and the added safety scoping is genuinely valuable for an agent deciding how to invoke it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences carry the essential message with no filler: the action, the key parameter option, the sibling alternative, and the safety boundary. Formatting with backticks makes parameter values easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the return value (the path), the key parameter distinctions, the alternative tool, and the write boundary, which is strong for a tool with no output schema. It falls slightly short by not clarifying the relationship between `preview` and `thumbnail` or elaborating on the `version` parameter, but the schema covers the latter and the overall picture is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, giving a baseline of 3. The description adds meaning beyond the schema by explaining what each rendition means ('as uploaded', 'OCR'd PDF', 'small preview image') and reinforces the download directory confinement. It does omit the `preview` enum value, but the main parameter semantics are enriched.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb-resource pair ('Save a document's file to local disk and return the path') and clearly differentiates this tool from paperless_get_document by directing text-only needs to the sibling. This is unambiguous and distinguishes the tool from its siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent which `kind` to choose for original files, OCR'd archives, and thumbnails, and it specifically says to use paperless_get_document when only extracted text is needed. This provides actionable when-to-use guidance with a clear alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_get_documentGet documentA
Read-only

Fetch one document by id: metadata with names resolved, plus its extracted text, notes and custom field values. Use this after paperless_search_documents to read a document’s contents.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDocument id.
versionNoResolve content against a specific document version id.
include_contentNoInclude the extracted text.
include_metadataNoAlso fetch file-level metadata (media filename, checksum, size, PDF fields).
content_max_charsNoTruncate the extracted text at this many characters.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only. The description adds useful behavioral detail: metadata names are resolved, and the response includes extracted text, notes, and custom field values. No contradictions with the readOnlyHint annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action and payload, with no filler. Every clause contributes either scope or usage guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-document read tool with a fully documented schema and read-only annotations, the description covers the main behavior and even notes the natural predecessor tool. It does not explicitly contrast with downloading the file, but the listed return contents make the distinction inferable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including defaults and limits for include_content, include_metadata, and content_max_chars. The description adds no extra parameter semantics beyond that, matching the baseline for fully documented schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch one document by id') and enumerates what is returned: metadata with resolved names, extracted text, notes, and custom field values. This clearly distinguishes it from sibling search and download tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use this after `paperless_search_documents` for reading a document's contents. It does not mention the alternative `paperless_download_document`, but the intended context is clear enough for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_get_document_suggestionsGet filing suggestionsA
Read-only

Ask paperless what it would file a document as, based on its trained matching. Returns suggested correspondents, tags, document types, storage paths and dates. Useful before paperless_update_document.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDocument id.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds what the tool returns: suggested correspondents, tags, document types, storage paths, and dates. It also explains the suggestion source ('trained matching'), which goes beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no wasted words. The primary action and return value are front-loaded, and the note about being useful before paperless_update_document adds practical guidance without bloating the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a single fully documented parameter and read-only annotations, the description covers the purpose, inputs, and expected outputs. Since there is no output schema, listing the returned suggestion fields is sufficient for an agent to understand what the tool provides.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

placeholder

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states a specific action: asking paperless what it would file a document as, based on its trained matching. It enumerates the returned suggestion categories, making it distinct from sibling tools like paperless_get_document or paperless_search_documents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: when you want filing suggestions and before calling paperless_update_document. It does not explicitly mention when not to use it or name alternative tools, but the use case is well defined.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_get_statisticsLibrary statisticsA
Read-only

Totals for the whole library: document count, documents in the inbox, characters indexed, counts of tags/correspondents/document types, and a breakdown by file type. A good first call to see how big the library is before searching it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavior beyond the readOnlyHint annotation by specifying exactly what aggregate data is returned and emphasizing the whole-library scope. It also implicitly communicates a safe, lightweight overview operation. No side effects are claimed, and the description does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first phrase states the core scope, then the sentence enumerates the contents, and the final sentence gives the use case. Every sentence adds value and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple parameterless, read-only statistics tool, the description is largely complete: it enumerates the returned categories and explains when to use it. Since there is no output schema, some response-shape detail is left unspecified, but the listed contents give an agent enough confidence to invoke the tool and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters and 100% schema description coverage, the input schema already fully documents the calling contract. The description adds no parameter details because none are needed. The baseline of 4 for parameterless tools is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as returning library-wide totals and enumerates the specific statistics included (document count, inbox count, characters indexed, tag/correspondent/document-type counts, file type breakdown). It does not use an explicit verb, but the tool name and content make the purpose unambiguous. It implies differentiation from search-oriented siblings by stressing 'whole library' and positioning it before searching.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states a clear usage context: it is 'a good first call to see how big the library is before searching it.' This gives an agent a concrete trigger for choosing this tool. However, it does not explicitly mention alternatives or say when not to use it, so it falls short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_get_system_statusSystem statusA
Read-only

Health of the paperless-ngx install: version, database and index status, Redis/Celery connectivity, plus the API version this server is talking to. Use this to check connectivity and diagnose failures.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true, and the description adds meaningful context by listing which subsystems are inspected. It makes clear this is a passive health probe and does not mutate anything, going beyond the bare annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: the first defines scope, the second defines when to use it. Every phrase adds value and there is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main returned categories and the intended diagnostic use, which is sufficient for a zero-input status endpoint. It could specify exact response formatting, but the absence of an output schema is mitigated by the concrete list of reported areas.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema description coverage is 100%, so there are no inputs left for the description to clarify. The baseline of 4 applies since no parameter documentation burden exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool reports the health of the paperless-ngx install and enumerates the exact areas covered (version, database/index status, Redis/Celery connectivity, API version). It clearly distinguishes this diagnostic endpoint from sibling document/data tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use this tool to check connectivity and diagnose failures, providing a concrete use case. It does not name alternatives or state when not to use it, but the intended trigger condition is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_list_objectsList tags, correspondents and other objectsA
Read-only

List the objects documents are filed under, with their ids and document counts. Call this first when you need an id for a tag, correspondent, document type, storage path or custom field — the document tools take ids, not names. Also reaches saved views, users, groups, mail accounts, mail rules, workflows and share links.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
typeYesWhich collection to list.
orderingNoSort field, `-` prefix for descending, e.g. `name`, `-document_count`.
all_pagesNoFetch every page (capped at 1000 objects) instead of a single page.
page_sizeNo
name_containsNoCase-insensitive substring filter on the name (username, for `users`).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the description doesn't need to restate read-only behavior. It adds value by disclosing the return shape (ids and document counts) and broadening scope to saved views, users, groups, mail accounts, mail rules, workflows and share links, which the title alone doesn't convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no filler. The primary purpose and usage guidance are front-loaded, and the extra object-type coverage is confined to a single closing sentence. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the return-value burden; it says the tools provides ids and document counts, which is sufficient for an agent to know what to expect. It could add a note about pagination or rate limits, but those are partially covered by the all_pages parameter description and annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, covering type, ordering, all_pages, and name_contains. The description reinforces the type enum by naming tags, correspondents, document types, storage paths, and custom fields, but it does't add meaningful semantics for page or page_size beyond their schema defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List the objects documents are filed under, with their ids and document counts.' It clearly distinguishes itself from document-search and document-mutation siblings by positioning itself as the id-lookup tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs when to call it: 'Call this first when you need an id for a tag, correspondent, document type, storage path or custom field — the document tools take ids, not names.' This also implies when not to use it, since document tools should be used once you have the id.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_list_tasksList background tasksA
Read-only

Inspect paperless’ background tasks — document consumption, index rebuilds, and so on. Use this to follow up on an upload: pass the task_id returned by paperless_upload_document to see whether consumption succeeded and which document it produced.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
statusNoOnly tasks in this state.
task_idNoLook up one task by its UUID.
page_sizeNo
acknowledgedNoFilter on whether the task has been acknowledged in the UI.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only, and the description adds the meaningful follow-up behavior: checking whether consumption succeeded and which document was produced. It avoids repeating the annotation and contributes a useful workflow detail, though it does not describe pagination or response format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the tool's domain and then immediately giving a concrete usage pattern. Every word contributes; there is no filler or redundant restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully communicates the key outcome: seeing whether consumption succeeded and which document resulted. It could mention status filters or default pagination, but the upload-follow-up scenario is sufficiently complete for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is about 60%, with status and acknowledged already explained in the schema. The description adds critical provenance for task_id by identifying it as the value returned by paperless_upload_document, making the most important parameter actionable. It leaves page and page_size semantically thin, but they are conventional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (paperless background tasks) with a concrete inspection purpose, and clarifies typical task types like document consumption and index rebuilds. The tie-in to paperless_upload_document makes the tool's role in an upload workflow unmistakable and distinguishes it from document-centric siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent when to call it ('Use this to follow up on an upload') and exactly how to use it by passing the task_id from paperless_upload_document. It does not enumerate when not to use it or alternatives, so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_search_documentsSearch documentsA
Read-only

Find documents in paperless-ngx. Combine full-text search with structured filters. query uses the full-text index and supports the advanced syntax: invoice AND (acme OR globex), type:invoice tag:unpaid, correspondent:university, created:[2005 to 2009], added:yesterday, produ*name, custom_fields.name:"Contract Number", custom_fields.value:policy, notes.note:reminder. Date keywords: today, yesterday, "previous week", "this month", "previous month", "this year", "previous year", "previous quarter". Matching is word-order-independent and accent-insensitive. Use title_contains/content_contains instead for plain substring matching, or more_like_id to find documents similar to a known one. Tag/correspondent/type filters take ids — get them from paperless_list_objects. Returns names resolved, not raw ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number.
queryNoFull-text query using the advanced search syntax described above.
orderingNoSort field, `-` prefix for descending. Common values: `created`, `-created`, `added`, `-added`, `modified`, `title`, `archive_serial_number`, `correspondent__name`, `document_type__name`, `num_notes`, `page_count`.
tags_allNoOnly documents carrying every one of these tag ids.
tags_anyNoOnly documents carrying at least one of these tag ids.
is_taggedNotrue = only tagged documents, false = only untagged.
mime_typeNoSubstring match on mime type, e.g. `pdf`, `image/`.
owner_idsNoRestrict to documents owned by these user ids.
page_sizeNoResults per page (max 100).
tags_noneNoExclude documents carrying any of these tag ids.
added_afterNoInclusive lower bound on when it was added, `YYYY-MM-DD`.
is_in_inboxNotrue = only documents still carrying an inbox tag.
added_beforeNoInclusive upper bound on when it was added, `YYYY-MM-DD`.
more_like_idNoReturn documents similar to this document id. Cannot be combined with `query`.
created_afterNoInclusive lower bound on the document date, `YYYY-MM-DD`.
extra_filtersNoEscape hatch for any other documented query parameter, e.g. `{"checksum__iexact":"…"}`.
snippet_charsNoCharacters of document text to include per result when there is no search highlight.
created_beforeNoInclusive upper bound on the document date, `YYYY-MM-DD`.
title_containsNoCase-insensitive substring match on the title.
content_containsNoCase-insensitive substring match on the extracted text.
storage_path_idsNoRestrict to these storage path ids.
correspondent_idsNoRestrict to these correspondent ids.
document_type_idsNoRestrict to these document type ids.
custom_field_queryNoJSON custom-field query, passed through verbatim. Examples: `["due","range",["2024-08-01","2024-09-01"]]`, `["customer","exact","bob"]`, `["answered","exact",true]`, `["foo","exists",false]`. Operators: exact, in, isnull, exists (all types); icontains/istartswith/iendswith (text); gt/gte/lt/lte/range (number, date); contains (document link).
archive_serial_numberNoExact archive serial number.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only provide readOnlyHint and openWorldHint, so the description carries the burden of behavioral disclosure, and it delivers: it documents advanced query syntax, date keywords, word-order-independent and accent-insensitive matching, and the fact that returned names are resolved rather than raw ids. It does not contradict annotations, though it omits details about result response structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but the length is justified by the tool's 25-parameter search surface. It front-loads the purpose, then moves through syntax, alternative routes, and return behavior without filler. Each block earns its place, though it could be slightly more scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex search tool with no output schema, the description covers the ambiguous parts: query syntax, date keywords, matching semantics, id-based filters, and resolved-name return behavior. It appropriately relies on the schema for the many structured filter parameters. The main missing piece is a fuller description of the result payload shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds substantial value beyond the schema: it teaches the full-text query syntax with rich examples, clarifies that tag/correspondent/type filters consume ids, and points to paperless_list_objects as the id source. This materially helps an agent use the parameters correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with 'Find documents in paperless-ngx' — a specific action and resource — and immediately differentiates itself from retrieval/download siblings. It also names the closest semantic alternatives ('title_contains', 'content_contains', 'more_like_id'), so the tool's unique search scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells agents when to prefer alternatives: use title_contains/content_contains for plain substring matching or more_like_id for similarity search. It also directs the agent to paperless_list_objects for id-based filters, preventing the common mistake of passing names instead of ids.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_update_documentUpdate documentA
Idempotent

Change one document’s metadata. Only the fields you pass are touched. tag_ids replaces the whole tag set, while add_tag_ids/remove_tag_ids adjust it relative to what is already there. Pass clear_correspondent/clear_document_type/clear_storage_path to unset a field.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDocument id.
titleNo
contentNoOverwrite the extracted text. Rarely what you want.
createdNoDocument date, `YYYY-MM-DD`.
tag_idsNoReplace all tags with exactly these ids.
owner_idNo
add_tag_idsNo
custom_fieldsNoReplaces the document’s custom field values wholesale.
remove_tag_idsNo
storage_path_idNo
correspondent_idNo
document_type_idNo
clear_storage_pathNo
clear_correspondentNo
clear_document_typeNo
archive_serial_numberNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond annotations by disclosing that only passed fields are touched, that tag_ids is a wholesale replacement while add_tag_ids/remove_tag_ids are relative, and that clear_* flags unset fields. This gives an agent critical behavioral knowledge about merging versus replacing that cannot be inferred from the schema alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences lead with the core action, then state the partial-update behavior, then clarify the tag and clear-flag edge cases. Every sentence earns its place and the most important distinguishing semantics are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 16-parameter mutation tool with no output schema and low schema coverage, the description covers the highest-risk semantics but leaves gaps: how to clear simple fields, null-handling for owner_id and archive_serial_number, and the wholesale replacement behavior of custom_fields is only in the schema. An agent could still call it correctly for common cases but would be uncertain about several edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 31% schema description coverage, the description compensates for the most confusing parameters: tag_ids, add_tag_ids, remove_tag_ids, and the clear_* flags. However, many parameters (owner_id, custom_fields, archive_serial_number, storage_path_id) are not addressed in the description, and the generic 'only fields you pass are touched' rule only partially fills that gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Change one document’s metadata', a specific verb ('change') and resource ('one document’s metadata'), and the singular scope clearly separates it from sibling tools like paperless_bulk_edit_documents. The distinction from paperless_update_object is also implied by the document focus.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates this is for a single document and explains update mechanics, but it never explicitly states when to prefer this over paperless_bulk_edit_documents or when not to use it. Usage context is present but no exclusions or alternative routing are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_update_objectUpdate a tag, correspondent or typeA
Idempotent

Rename or reconfigure an existing tag, correspondent, document type, storage path or custom field. Only the fields you pass are changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesId of the object.
nameNo
pathNoStorage paths only.
typeYesWhat to update.
matchNo
colourNoTags only: hex colour.
owner_idNo
extra_dataNoCustom fields only.
is_inbox_tagNoTags only.
is_insensitiveNo
matching_algorithmNoMatching algorithm: 0 none, 1 any word, 2 all words, 3 exact, 4 regex, 5 fuzzy, 6 auto (trained classifier).

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the description doesn't need to restate safety behavior. It adds a useful behavioral guarantee: 'Only the fields you pass are changed,' clarifying that this is a partial update rather than full replacement. This goes beyond the schema and annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no redundancy. The first sentence states the action and resource types; the second states the key behavioral caveat. Information is front-loaded and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter object with no output schema, the description gives a workable overview but omits edge-case guidance such as uniqueness constraints, error behavior for nonexistent IDs, or explicit direction to use paperless_update_document for document fields. It is complete enough for common calls but not fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes several parameters (type, path, colour, extra_data, is_inbox_tag, matching_algorithm), giving moderate coverage. The description adds general partial-update semantics but doesn't clarify parameters like name, match, owner_id, or is_insensitive beyond what the schema provides. It is adequate but not fully compensatory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verbs ('Rename or reconfigure') and names the exact resources (tag, correspondent, document type, storage path, custom field), distinguishing it clearly from document-level tools like paperless_update_document and from create/delete object tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'existing' implies this tool is for modifying already-created objects rather than creating or deleting them, but it never explicitly states when to prefer this over paperless_update_document, paperless_create_object, or paperless_delete_objects. Usage context is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paperless_upload_documentUpload documentA

Upload a local file into paperless-ngx for consumption (OCR, tagging, filing). The file must live in one of the directories this server is allowed to read (PAPERLESS_UPLOAD_DIRS). Returns the consumption task id; consumption is asynchronous, so set wait_seconds to poll until it finishes and get back the created document id. Any field left unset is filled in by paperless’ own matching rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoTitle to use instead of one derived from the filename.
createdNoDocument date, e.g. `2016-04-19` or `2016-04-19 06:15:00+02:00`.
tag_idsNoTag ids to apply on consumption.
file_pathYesPath to the file on this machine. Must sit inside one of the PAPERLESS_UPLOAD_DIRS directories, which defaults to PAPERLESS_DOWNLOAD_DIR.
wait_secondsNoPoll the task endpoint for up to this many seconds and report the outcome.
custom_fieldsNoMap of custom field id to value, e.g. `{"3":"ACME-1234"}`.
storage_path_idNo
correspondent_idNo
document_type_idNo
archive_serial_numberNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals important behavior beyond the annotations: it returns a consumption task ID, consumption is asynchronous, polling can yield the final document ID, and unset fields defer to paperless's matching rules. These details are not visible in the schema or annotations and materially affect how the agent should invoke and await the result.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose first, then prerequisites, then return behavior, then fallback behavior. Every sentence contributes a necessary operational fact, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description explains what the tool returns, how to wait for completion, and what prerequisites exist. It gives enough context for an agent to invoke it correctly and interpret the result, including the local-file restriction that is critical for this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds real meaning to `file_path` (allowed directory constraint), `wait_seconds` (polling semantics), `created` (date format example), `custom_fields` (map example), and the general fallback behavior for unset fields. It does not explain every ID parameter, but the schema already names them clearly and coverage is moderate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action and resource: uploading a local file into paperless-ngx for consumption via OCR, tagging, and filing. It clearly distinguishes this from sibling tools like paperless_search_documents or paperless_download_document by focusing on the ingestion pipeline.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete operational guidance: files must reside in PAPERLESS_UPLOAD_DIRS, consumption is asynchronous, and `wait_seconds` should be used to poll for completion. It does not explicitly list when not to use this tool or mention alternative siblings, but the context is clear enough for an agent to select it correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 16 tool updatesv0.2.0
    • First observedpaperless_api_request
    • First observedpaperless_bulk_edit_documents
    • First observedpaperless_create_object
    • First observedpaperless_delete_objects
    • First observedpaperless_document_notes
    • First observedpaperless_download_document
    • First observedpaperless_get_document
    • First observedpaperless_get_document_suggestions
    • First observedpaperless_get_statistics
    • First observedpaperless_get_system_status
    • First observedpaperless_list_objects
    • First observedpaperless_list_tasks
    • First observedpaperless_search_documents
    • First observedpaperless_update_document
    • First observedpaperless_update_object
    • First observedpaperless_upload_document

TDQS

A4.1/5.0
Disambiguation5/5

Each tool targets a distinct resource or action: search, get, download, upload, update, bulk edit, notes, object CRUD, stats, status, and tasks. The api_request escape hatch intentionally overlaps but explicitly directs agents to prefer purpose-built tools. No two tools appear interchangeable.

Naming Consistency4/5

Almost all tools follow a clear paperless_verb_noun pattern, making the set easy to scan. Minor deviations include paperless_document_notes, which lacks an action verb, and paperless_api_request, which is noun-like, plus mixed singular/plural object forms.

Tool Count4/5

At 16 tools the set sits just above the ideal 3-15 range, but the breadth is justified by paperless-ngx's domain: documents, objects, notes, tasks, stats, and system health. Each tool covers a distinct responsibility with no redundant entries.

Completeness4/5

Document lifecycle coverage is strong: search, read, download, upload, update, bulk delete, notes, and suggestions are all present, and object CRUD is covered. However, several secondary areas like trash, permissions, workflows, and document editing are only reachable through the generic api_request escape hatch rather than first-class tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    A
    maintenance
    An MCP (Model Context Protocol) server for interacting with a Paperless-NGX API server. This server provides tools for managing documents, tags, correspondents, and document types in your Paperless-NGX instance.
    23
    939
    139
    TypeScript
    ISC
  • F
    license
    A
    quality
    B
    maintenance
    A privacy-first MCP server for Paperless-ngx that lets an LLM agent search, organize, tag, and reference documents without exposing full text unless explicitly requested.
    13
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    A read-only and write MCP server for Paperless-ngx, enabling document listing, metadata retrieval, and creation of tags, correspondents, document types, and sorting workflows via natural language.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/patrickcylai/paperless-ngx-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server