Paperless MCP
Paperless MCP exposes Paperless-NGX to MCP clients for searching, reading, uploading, editing, and administering documents.
Search and list documents with full-text queries, filters, pagination, and optional OCR content.
Read OCR text, thumbnails, technical metadata, notes, audit history, and AI/classifier suggestions.
Upload documents with metadata and wait for background OCR/indexing tasks to complete.
Edit document fields, add/remove notes, delete documents, and run bulk operations such as set correspondent/type/storage path, add/remove tags, merge, split, rotate, redo OCR, and modify custom fields.
Manage classification entities: tags, correspondents, document types, custom fields, and storage paths with full CRUD and bulk editing.
Inspect operational data: saved views, share links, background tasks, collection statistics, Paperless version/update status, and server info.
Use MCP resources for bounded document previews and domain collections.
With file transfer links enabled, download document files/OCR markdown and upload files over HTTP without putting file bytes in model context.
Allows interaction with a Paperless-NGX API server, providing tools for managing documents, tags, correspondents, document types, and custom fields in a Paperless-NGX instance.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Paperless MCPfind all invoices from ACME from last quarter"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Paperless MCP
Paperless-NGX over MCP: search, read, upload and tag documents; manage correspondents and types.
Documentation | Config wizard | PyPI | Docker
Features
File transfer links: Download document files and full OCR Markdown over HTTP. Upload files, including Markdown, through the same transfer route. Set
PAPERLESS_MCP_BASE_URLto enable the tools. File bytes stay outside model context. See file transfer links.Document search & retrieval: full-text and filtered list queries against Paperless-NGX, plus access to extracted OCR text, metadata, and thumbnails.
Tag, correspondent, document-type, custom-field management: full CRUD and bulk-edit for every classification dimension Paperless exposes.
Document lifecycle supports uploads, field changes, notes, audit history, and AI-suggested tags/correspondents/types.
Operational introspection covers saved views, storage paths, share links, background tasks (with
wait_for_task), statistics, and an upstream release check for Paperless-NGX.MCP tools: 49 LLM-visible tools with
Lucideicons; seesrc/paperless_mcp/tools/.MCP resources: 16 URIs exposing bounded document previews and domain collections; see
src/paperless_mcp/resources/.
Related MCP server: paperless-mcp
What you can do with it
With this server mounted in an MCP client (Claude, etc.), you can:
"Find last quarter's invoices from ACME." Composes
search_documentswith a correspondent filter, then reads bounded previews withget_document_content."Tag these three documents as 'reviewed' and move them to the Accounting correspondent." Uses
bulk_edit_documentsin a single call."Upload this PDF and wait until OCR finishes." Composes
upload_document+wait_for_taskso the assistant only reports back once the document is indexed."What changed on document 4213 in the last week?" Reads
paperless://documents/4213/historyand summarises the audit trail.
Every tool and resource is listed in the documentation site: Tools and Resources. The Paperless variables the server reads are in Configuration.
Installation
From PyPI
pip install pvliesdonk-paperless-mcpIf you add optional extras via the PROJECT-EXTRAS-START / PROJECT-EXTRAS-END sentinels in pyproject.toml, document them below:
pip install pvliesdonk-paperless-mcp[docs]: installsmkdocs-materialandmkdocstrings[python]for building the documentation site locally (uv run mkdocs serve).
From source
git clone https://github.com/pvliesdonk/paperless-mcp.git
cd paperless-mcp
uv sync --all-extras --all-groupsDocker
docker pull ghcr.io/pvliesdonk/paperless-mcp:latestTo run the newest merged code instead of the newest release, use the rolling edge tag. It is rebuilt on every merge to main and carries no version identity. See Image tags for the full tag list.
docker pull ghcr.io/pvliesdonk/paperless-mcp:edgeA compose.yml ships at the repo root and runs as-is: copy .env.example to .env, then docker compose up -d. It publishes port 8000 on the host and assumes no reverse proxy; Docker Compose covers the configuration split, the domain sentinel blocks, and a Traefik overlay.
To attach a remote Python debugger (development only; the protocol is unauthenticated), see Remote debugging.
Linux packages (.deb / .rpm)
Download .deb or .rpm packages from the GitHub Releases page. Both install a hardened systemd unit; env configuration is sourced from /etc/paperless-mcp/env (copy from the shipped /etc/paperless-mcp/env.example).
Claude Desktop (.mcpb bundle)
Download the .mcpb bundle from the GitHub Releases page and double-click to install, or run:
mcpb install paperless-mcp-<version>.mcpbClaude Desktop prompts for required env vars via a GUI wizard, with no manual JSON editing needed.
For manual Claude Desktop configuration and setup options, see Claude Desktop deployment.
Release channels
Artifacts ship on three channels. Each row lists exactly what that channel publishes.
Channel | Version identity | Artifacts |
| None; the commit is the identity | Docker image |
Pre-release |
| PyPI (as the pre-release |
Stable |
| Everything: PyPI, Docker (version tag plus ordering-aware |
Pre-releases reach PyPI so that a candidate's .mcpb bundle installs: the bundle points at PyPI rather than carrying the code. Ordinary installers never see them, because a PEP 440 resolver skips pre-releases unless the requirement pins one or you pass --pre. Ask for a candidate by name with pip install pvliesdonk-paperless-mcp==X.Y.ZrcN. PyPI spells it in the PEP 440 canonical form, while tags use SemVer. Rolling pointers are ordering-aware, so a patch release cut from an old release/X.Y branch never moves latest-style tags back to older content, and a candidate for an already-released version never moves rc. See Release process for the full model.
Quick start
paperless-mcp serve # stdio transport
paperless-mcp serve --transport http --port 8000 # streamable HTTPFor library usage (embedding the domain logic without the MCP transport), import from the paperless_mcp package directly. See the project's domain modules under src/paperless_mcp/ for entry points.
Server info
The server registers a built-in get_server_info tool (via fastmcp_pvl_core.register_server_info_tool) so operators can confirm the deployed version with a single MCP call. The default response carries server_name, server_version, and core_version. Servers that talk to a remote upstream wire upstream version reporting inside the DOMAIN-UPSTREAM-START / DOMAIN-UPSTREAM-END sentinel in src/paperless_mcp/server.py; see tool-registration for the wiring pattern.
Health
The server serves /health (liveness, a static 200) and /health/ready (readiness, 503 when a backing store or a domain check fails) outside the MCP mount and outside auth, via fastmcp_pvl_core.register_health_routes. compose.yml probes the first. Domain readiness checks go in the health_checks dict in src/paperless_mcp/server.py; see Docker deployment for the routes, the mount-path rule, and PAPERLESS_MCP_HEALTH_DETAIL.
Configuration
The most common environment variables, shared across all
fastmcp-pvl-core-based services:
Variable | Default | Description |
|
| Persistent-state backend URL shared by every pvl-core subsystem that needs state. |
|
| Log level for every logger in the process, FastMCP's included (DEBUG / INFO / WARNING / ERROR / CRITICAL). The -v CLI flag overrides to DEBUG. The unprefixed FASTMCP_LOG_LEVEL still works for one major version and logs a deprecation warning. |
| (none) | Log rendering. rich is one colour event key=value line per record, for a terminal; json is one JSON object per record, for a collector. Unset picks rich when stderr is a terminal and json everywhere else, so a container or journald gets JSON with no configuration. |
This table and the one under Domain configuration
are curated subsets. The complete generated reference, with every variable
the server reads, is the configuration reference;
.env.example lists the same surface in copy-paste form.
Authentication
Callers authenticate via a bearer token or OIDC (mutually exclusive). See the Authentication guide for setup, mapped multi-subject tokens, OIDC, and troubleshooting.
Post-scaffold checklist
After copier copy and gh repo create --push:
Fill in the DOMAIN blocks (every section marked with a
DOMAINsentinel comment) in this README and inAGENTS.md. TheGENERATED-ENV-TABLE-*regions are not DOMAIN blocks; the config generator owns them and rewrites them on every run.Configure GitHub secrets (see below).
Install dev + docs tooling:
uv sync --all-extras --all-groups.Install pre-commit hooks:
uv run pre-commit install.Run the gate locally:
uv run pytest -x -q && uv run ruff check --fix . && uv run ruff format . && uv run mypy src/ tests/.Push the first commit. CI should be green.
GitHub secrets
CI workflows reference two required repository secrets and one optional Claude token. Configure them via Settings → Secrets and variables → Actions or with gh secret set:
Secret | Used by | How to generate |
|
| Fine-grained PAT at https://github.com/settings/personal-access-tokens/new with |
|
| https://codecov.io: sign in with GitHub and add the repo. The upload token is on its settings page. |
|
| Optional. Run |
gh secret set RELEASE_TOKEN
gh secret set CODECOV_TOKEN
# Optional: enables @claude and opted-in automatic review.
gh secret set CLAUDE_CODE_OAUTH_TOKENDependency updates are handled by Renovate (
renovate.yml), which reusesRELEASE_TOKEN. It maintainsuv.lockand auto-merges patch/minor bumps once theCI Successcheck is green;bootstrap.ymlenables auto-merge, applies the repository rulesets (.github/rulesets/), and turns on private vulnerability reporting and Dependabot alerts on first push. See Repository Protection for the per-branch posture, bypass model, and security settings. GitHub Actions are updated in the copier template and arrive viacopier update, not per-repo.
GITHUB_TOKEN is auto-provided; no action needed.
Local development
The PR gate (matches CI):
uv run pytest -x -q # tests
uv run ruff check --fix . && uv run ruff format . # lint + format
uv run mypy src/ tests/ # type-checkPre-commit runs a subset of the gate on each commit; see .pre-commit-config.yaml for details, or AGENTS.md for the full Hard PR Acceptance Gates.
CI requires tests to pass on Python 3.11 through 3.14. Python 3.14 also collects
branch coverage and enforces the 80% total and patch coverage thresholds.
To reproduce that test command, run
uv run --python 3.14 pytest --cov --cov-report=xml --durations=20.
Troubleshooting
Moving a scaffolded project
uv sync creates .venv/bin/* scripts with absolute shebangs pointing at the venv Python. If you move the repo after scaffolding (mv /old/path /new/path), uv run pytest fails with ModuleNotFoundError: No module named 'fastmcp' because the stale shebang resolves to a different interpreter than the venv's site-packages.
Fix:
rm -rf .venv
uv sync --all-extras --all-groupsuv run python -m pytest also works as a one-shot workaround (bypasses the stale entry-script shim).
uv.lock refresh after copier update
When copier update introduces new dependencies (such as a new extra added to pyproject.toml.jinja), the CI install step runs uv sync --locked, which fails against a stale lockfile. Run uv lock locally and commit the refreshed uv.lock alongside accepting the copier-update PR.
CI installs with --locked (and the review workflow with --frozen) so no job ever rewrites uv.lock in its own workspace: a job that re-locks hides the drift it just repaired, and a dirty workspace breaks any later git checkout in the same job. Lockfile drift then shows up as a red install step with a clear message, not as a silent mutation.
Contributing
CONTRIBUTING.md holds the rules for issues and pull requests, and where a
fix belongs: fastmcp-pvl-core for library code, the template for
template-owned files, this repository for anything inside its DOMAIN-* /
CONFIG-* / PROJECT-* blocks. AGENTS.md carries the conventions and
gates; the skills under .agents/skills/ carry the task procedures, among
them code-review (local self-review before a pull request),
writing-release-notes (release notes),
applying-template-updates (the weekly template update pull request) and
authoring-issues-prs (filing). The release procedure is in
docs/deployment/release-process.md;
the template update procedure in
docs/deployment/template-updates.md.
SECURITY.md says how to report a vulnerability privately, and what to
expect after.
Links
Domain configuration
The variables this project features as its entry points (domain variables use the PAPERLESS_MCP_ prefix):
Variable | Default | Required | Description |
| (none) | No | Base URL of the Paperless-NGX REST API, without a trailing slash. The server refuses to start without it. |
| (none) | No | Paperless service-account token used for outbound API requests. The server refuses to start without it. |
| (none) | No | Public Paperless UI URL for user-visible links; defaults to PAPERLESS_URL. |
This is a curated subset: a field appears here when its tags metadata includes readme. Every domain variable is documented in the configuration reference, grouped the same way the config wizard presents them.
Domain-config fields are composed inside src/paperless_mcp/config.py between the CONFIG-FIELDS-START / CONFIG-FIELDS-END sentinels; env reads go through fastmcp_pvl_core.env(_ENV_PREFIX, "SUFFIX", default) so naming stays consistent, and field invariants go in __post_init__ between the CONFIG-VALIDATE-START / CONFIG-VALIDATE-END sentinels. Each field's metadata help, tags, and wizard group generate the reference tables directly, so keep them accurate and complete.
Key design decisions
Read-only deployments use tool visibility, not a domain switch. Set
PAPERLESS_MCP_TOOLS_DENY(orPAPERLESS_MCP_TOOLS_ALLOW) to hide the mutating tools, includingcreate_upload_linkwhen transfers are enabled. The template applies visibility last inmake_server, so hidden tools leavetools/listand are rejected ontools/call. Clients cannot invoke a write that will be refused, and the rule lives in one place for every server built on this template.HTTP layer retries idempotent reads only.
PAPERLESS_MCP_HTTP_RETRIESapplies to GETs on 5xx/network errors; writes never retry automatically, to avoid double-applying bulk edits or uploads.Tool icons come from
Lucide. Every tool carries aLucideicon hint so MCP clients that render icons (Claude Desktop) get a coherent visual surface. Seesrc/paperless_mcp/tools/_icons.py.Paperless API compatibility: requests prefer payload version 10, with automatic version 9 fallback for Paperless 2.x after an explicit version rejection. Tasks include structured results and timing data while retaining the legacy fields. Saved-view visibility flags can now be
null; Python consumers must handle that value. See task tools.Models accept unknown upstream fields.
Pydanticmodels use lenient validation for list-endpoint responses so newer Paperless-NGX versions do not break the client (theDocument.some_future_paperless_fieldtest pins this behaviour).No prompts ship in v1.
prompts.pyis intentionally empty; prompts land as concrete user-workflow patterns emerge in practice.
Available Tools
50 toolsadd_document_noteAdd Document NoteC
Append a note to a document.
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes | ||
| document_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| note | No | |
| user | No | |
| created | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=false, so the mutation profile is covered. The description adds no further behavioral detail – no mention of what is changed, whether existing notes are preserved, auth requirements, or error conditions – it essentially paraphrases the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no redundancy or filler. It front-loads the only necessary action and is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (2 scalar params, output schema exists) and the description captures the core operation, so it is minimally complete. However, it does not explain how the note relates to the document's existing notes or when this should be used over update_document/get_document_notes, leaving some gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only confirms document_id identifies the document and note is the text to append, which is marginally more than the parameter names. No constraints, formatting, or examples are provided, leaving the agent to infer note length or content rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Append') and resource ('note to a document'), making the action immediately clear. However, it does not explicitly differentiate itself from sibling tools like get_document_notes or delete_document_note, though the verb choice helps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 instead of alternatives such as update_document, get_document_notes, or delete_document_note. No prerequisites, exclusions, or alternative conditions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_edit_correspondentsBulk Edit CorrespondentsCDestructive
Apply a bulk operation to a set of correspondents.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ||
| operation | Yes | ||
| parameters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and non-idempotent, but the description adds no behavioral context such as consequences, scope of changes, or whether the operation is reversible. The open-world hint and free-form 'parameters' object suggest unknowns, but the description does not warn or clarify them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, so it is brief and readable. However, the brevity results from under-specification rather than efficient communication, since it omits operation vocabulary and parameter semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive bulk operation with an open-world parameter object, no enum values, and zero schema description coverage, this description is severely inadequate. An agent cannot determine valid operations, expected parameter shapes, or the scope of side effects, making successful invocation mostly guesswork.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to explain 'operation', 'ids', and 'parameters'. It provides none of that: 'operation' has no documented values, 'parameters' is an unconstrained object, and the description does not compensate for any of the schema's omissions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a resource ('correspondents') and a general verb ('apply a bulk operation'), but 'bulk operation' is vague and essentially restates the title. It does not say what operations are possible or how this differs from sibling bulk_edit_* tools beyond the noun in the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus single-resource alternatives like update_correspondent or delete_correspondent, or versus sibling bulk_edit_* tools. The intended usage must be inferred entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_edit_documentsBulk Edit DocumentsADestructive
Apply a bulk operation to a set of documents.
Paperless writes the change before answering OK, then queues the
search-index rebuild as a background task. A following
search_documents call can therefore miss the edited documents for
seconds to minutes, while list_documents and get_document
reflect the change at once. Metadata operations queue a
bulk_update task: find it with
list_tasks(task_type="bulk_update") and wait_for_task on its
task_id to wait for full-text search to catch up.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ||
| operation | Yes | ||
| parameters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the annotations: writes happen before the OK response, search-index rebuild is queued in the background, there is an eventual-consistency window for search, and metadata operations create a bulk_update task with a task_id. This goes well beyond the boolean annotations provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the primary purpose, then efficiently explains the async behavior and how to trace the background task. Every sentence adds operational value with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, complex bulk tool, the description covers side effects, consistency, and task tracking well; the output schema exists and the input schema enumerates operations. It is slightly incomplete in that parameter semantics are left entirely to the schema, but the agent has enough information to invoke the tool correctly in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden of explaining parameters, but it does not explain operation values, the ids array, or the parameters object. It only generically references 'metadata operations,' leaving the agent to infer semantics from the raw schema. This is a notable gap given the large operation enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Apply a bulk operation to a set of documents,' which clearly identifies the verb, resource, and scope. It does not explicitly differentiate from sibling bulk_edit_tags/correspondents/document_types tools, but the document resource target makes the purpose sufficiently distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives actionable usage context: it warns that a following search_documents call may miss edits for seconds to minutes, while list_documents and get_document reflect changes immediately. It also tells the agent how to track completed work via list_tasks and wait_for_task. It stops short of explicitly stating when not to use this tool versus single-document alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_edit_document_typesBulk Edit Document TypesCDestructive
Apply a bulk operation to a set of document types.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ||
| operation | Yes | ||
| parameters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive and not read-only, and the description adds no behavioral detail beyond that. It does not state what the bulk operation does to the selected document types, whether it is reversible, or what side effects might occur.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and free of fluff, but it is under-specified rather than efficiently informative. It essentially restates the tool name without adding operational detail, so it does not earn its place as a helpful definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given three parameters, an unconstrained operation string, no enum guidance, and a destructive annotation, the description is too incomplete for an agent to invoke the tool correctly. The presence of an output schema covers return values, but the core operation and parameter semantics remain undefined.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description provides no parameter guidance. The 'operation' string is unconstrained, and 'parameters' is an open object, yet the description does not clarify acceptable values or how ids map to the operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ('document types') and indicates a bulk action, but the verb 'apply' and the phrase 'bulk operation' are generic. It does not say whether the operation deletes, updates, or otherwise changes the document types, so the agent cannot tell what the tool actually accomplishes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like update_document_type, delete_document_type, or the sibling bulk_edit_* tools. The agent is left to infer usage from the name and resource type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_edit_tagsBulk Add or Remove TagsCDestructive
Apply a bulk operation to a set of tags.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ||
| operation | Yes | ||
| parameters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate a destructive, non-idempotent, non-read-only operation, but the description adds no behavioral context beyond that. It does not explain whether removal deletes tags or merely detaches them, whether effects are reversible, or what the bulk operation actually does to the tags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no fluff, so it is easy to parse. However, it is under-specified rather than economically complete for a tool with an opaque three-field schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even with annotations and an output schema present, an agent cannot reliably construct a valid request because `operation` has no documented values and the `parameters` object is unexplained. The description is too thin for a mutating bulk tool with three required inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must explain the parameters, but it only loosely ties the operation to a set of tags. It never states the accepted values for `operation`, the meaning of `ids`, or what can be placed in the `parameters` object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (tags) and that the tool applies a bulk operation, so it is not a tautology. However, "bulk operation" is vague and does not name the add/remove behavior that the title implies, leaving the core action underspecified.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool instead of single-tag operations like create_tag, update_tag, or delete_tag, or instead of sibling bulk_edit_* tools. No use-case context, prerequisites, or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_correspondentCreate CorrespondentD
Create a new correspondent.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| slug | No | |
| match | No | |
| owner | No | |
| document_count | No | |
| is_insensitive | No | |
| user_can_change | No | |
| matching_algorithm | No | |
| last_correspondence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the description adds no behavioral insight beyond what is structured. It does not mention uniqueness constraints, side effects of creating a correspondent, defaults for optional fields, or any failure/response behavior. There is no contradiction with annotations, but there is also no added transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short and free of fluff, but it does not earn its place: it restates the title and contributes no usable information. This is under-specification rather than effective conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having a nested input schema and output schema, the description leaves out essential context: what fields are required versus optional, what match/matching_algorithm are for, and what a successful create does. The bare 'Create a new correspondent.' is only minimally enough to identify the operation, not to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate by explaining what body, name, match, is_insensitive, and matching_algorithm mean. It mentions none of the parameters. An agent cannot determine the semantics of this nested body schema from the description alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Create a new correspondent.' merely restates the tool name and title ('Create Correspondent') with the word 'new' added. It gives no additional semantic information about what a correspondent is, what creation entails, or how it differs from update_correspondent or other sibling create tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus update_correspondent, bulk_edit_correspondents, or other alternatives. No preconditions, exclusions, or context are provided; the only implicit signal is that 'create' contrasts with 'update'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_custom_fieldCreate Custom FieldA
Create a new custom field.
extra_data depends on data_type:
string,longtext,integer,boolean,float,date,url,documentlink— unused; omit or passnull.monetary— optional{"default_currency": "USD"}(ISO-4217).select—extra_datarequired:{"select_options": [{"label": "Low"}, {"label": "Medium"}]}. Paperless assigns each option a stableidon creation.
Unknown shapes are rejected by Paperless with a 400.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| data_type | Yes | |
| extra_data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false, so no contradiction exists. The description adds valuable behavioral context beyond annotations: extra_data is conditionally required based on data_type, Paperless assigns stable option ids on creation, and invalid shapes result in a 400 error.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded with the core action, then uses a compact bulleted list to cover the complex conditional parameter behavior. Every sentence and bullet contributes necessary information with no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create operation with a nested body and data-type-dependent behavior, the description covers the essential validation rules and the error response for invalid shapes. The output schema is available to explain return values, and annotations cover idempotency and read-only hints, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description carries the burden for parameter meaning. It thoroughly explains the extra_data parameter across all data_type variants, including requiredness and exact shape for select and monetary. It does not explicitly describe name, but that parameter is self-evident and the schema marks it required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Create a new custom field." It clearly distinguishes this from sibling tools like update_custom_field and delete_custom_field through the "create" verb and "new" qualifier, and from other resource create tools through the resource name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives, such as update_custom_field or list_custom_fields. The only usage signal is the word "Create," which implies intent but does not provide context, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_document_typeCreate Document TypeC
Create a new document type.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| slug | No | |
| match | No | |
| owner | No | |
| document_count | No | |
| is_insensitive | No | |
| user_can_change | No | |
| matching_algorithm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description merely restates the operation and adds no behavioral context beyond the annotations. It does not disclose uniqueness constraints, default-applied behavior, side effects, or what happens on duplicate names. There is no contradiction with the annotations, but the description contributes little.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short, front-loaded sentence with no redundant wording. It is concise, though this conciseness comes at the cost of under-specification that is penalized in other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create tool with a nested body and meaningful optional fields, this description is too thin. It does not explain the purpose of matching-related parameters, defaults, or how this tool relates to document type management, despite having an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not compensate by explaining the `body` object or any of its fields (`name`, `match`, `is_insensitive`, `matching_algorithm`). An agent gets no added meaning from the description about how to configure a document type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Create a new document type.' It is unambiguous about the operation and distinguishes it from update/delete/list siblings, though it does not explicitly name any alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to create a new document type versus updating or reusing an existing one. There are no prerequisites, exclusions, or alternative tool mentions, leaving usage entirely to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_tagCreate TagC
Create a new tag.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| slug | No | |
| color | No | |
| match | No | |
| owner | No | |
| colour | No | |
| is_inbox_tag | No | |
| document_count | No | |
| is_insensitive | No | |
| user_can_change | No | |
| matching_algorithm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the description adds no extra behavioral context. It does not disclose side effects, permission requirements, or error conditions (e.g., duplicate names). The description is silent on anything beyond the act of creation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at five words, which is efficient, but it is under-specified. It lacks the substance needed to be useful, so while there is no verbosity, the brevity works against its effectiveness. It is not well-structured for comprehension beyond stating the obvious.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a complex nested input schema and an output schema present, the description is highly incomplete. It fails to explain how to construct the request, what the response contains, or any constraints. For a tool with such a detailed schema, this level of description is inadequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has a nested body object with multiple optional fields (color, match, is_inbox_tag, etc.), and schema description coverage is 0%. The description does not explain the body parameter, its structure, or the meaning of any of these fields, leaving the agent without semantic guidance beyond raw schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the verb 'create' and resource 'tag', which clearly distinguishes it from sibling operations like list, get, update, and delete. It is specific enough for an agent to know the tool's function, though it does not elaborate on scope or nuances.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, such as needing an existing tag or when to prefer create_tag over update_tag or bulk_edit_tags. The description is purely functional with no contextual direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_correspondentDelete CorrespondentCDestructiveIdempotent
Delete a correspondent.
| Name | Required | Description | Default |
|---|---|---|---|
| correspondent_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide destructiveHint, idempotentHint, and readOnlyHint false, but the description adds no extra behavioral context such as whether the deletion cascades to associated documents or is reversible. There is no annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no wasted words, but it is under-specified rather than efficiently informative. It is concise in length but does not use the available space to clarify selection or side effects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter delete and annotations plus output schema fill in some context. However, the definition omits whether deletion has cascading effects, how it differs from bulk deletion, and any relevant prerequisites, leaving notable gaps for an agent deciding whether to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description never references correspondent_id or explains that the parameter identifies the specific correspondent to delete. The property name is suggestive, but the text adds no semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Delete a correspondent.' restates the tool name and title almost word-for-word, adding no scope or differentiation. It does not mention that this targets a single correspondent by ID or contrast with bulk_edit_correspondents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as bulk_edit_correspondents, nor any mention of prerequisites, side effects, or expected context for deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_custom_fieldDelete Custom FieldCDestructiveIdempotent
Delete a custom field.
| Name | Required | Description | Default |
|---|---|---|---|
| field_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the destructive nature is known; however, the description itself adds zero behavioral context beyond that, such as whether deletion is permanent, whether it cascades to documents using the field, or whether it can be undone. With no added disclosure, the description falls below the bar set by the HIGH calibration example (which at least added scoping context).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is maximally efficient: a single short sentence with no wasted words. For a one-parameter delete operation, this brevity is acceptable, though it borders on under-specification rather than earning its place with added value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and has an output schema, so return values need no explanation, but the description still omits the meaning of field_id and the consequences of a destructive delete. For an irreversible operation on a metadata entity, agents would need at least a hint about affected documents or how to look up the field.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden of explaining field_id, but it never mentions the parameter. 'field_id' is a reasonably self-explanatory integer identifier, but the description does nothing to clarify how to find or supply it, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Delete a custom field.' names a specific verb and resource, and the resource type 'custom field' is enough to distinguish it from sibling delete tools like delete_document, delete_tag, and delete_correspondent. It is clear but adds no detail beyond the name/title, so it does not fully earn a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives, no mention of how to obtain a field_id (e.g., via list_custom_fields or get_custom_field), and no exclusions. The single-sentence description leaves all usage context to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_documentDelete Document PermanentlyDDestructiveIdempotent
Delete a document.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds no behavioral context beyond the annotations: it doesn't state that deletion is permanent/irreversible, what associated data (notes, history, metadata) is affected, or any authorization requirements. The destructiveHint and idempotentHint annotations already carry the safety information, and the description contributes nothing extra.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, but brevity here is under-specification rather than conciseness: the single sentence merely repeats the verb and object already present in the tool name and title. It doesn't earn its place by adding any new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive operation, the description omits key context such as permanence, cascading effects, and when deletion is appropriate. Although annotations and the presence of an output schema fill in some details, the description alone leaves an agent under-informed about the consequences and preconditions of calling this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description was responsible for explaining document_id, but it doesn't mention the parameter at all. The schema only shows an integer ID; no guidance is given on how to obtain it, what values are valid, or what the ID refers to, so the description adds no semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Delete a document.' merely restates the tool name and title without adding specificity. It does not mention 'permanently' from the title, and it doesn't distinguish this deletion from sibling actions like delete_document_type or delete_document_note except through the bare resource noun.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as update_document, bulk_edit_documents, or the sibling deletion tools. The description gives no conditions, prerequisites, or warnings, leaving the agent to guess the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_document_noteDelete Document NoteBDestructiveIdempotent
Remove a note from a document.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | ||
| document_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, covering the safety profile. The description adds no extra behavioral context beyond 'remove', which is consistent with the annotations. It does not disclose side effects like permanence or cascading effects, but given the annotations, the minimal statement is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, short sentence that gets straight to the point with zero filler. The core action is front-loaded and there is no redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter deletion tool, the description is minimal but workable. However, it lacks usage context and parameter elaboration, and does not mention expected behavior when the note does not exist or whether deletion is permanent. The output schema (though not shown) and annotations cover some gaps, but the description alone leaves an agent guessing about edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only says 'a note from a document' without elaborating on the two parameters (document_id, note_id) or their relationships. The parameter names are self-explanatory, but the description adds no semantic value beyond what the schema already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Remove a note from a document' clearly identifies the action (remove) and the resource (a note within a document). It is specific enough to distinguish from sibling tools like delete_document (whole document) and delete_document_type (type), though it does not explicitly name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 alternatives. It does not mention prerequisites, context, or situations where a different delete operation would be more appropriate. An agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_document_typeDelete Document TypeCDestructiveIdempotent
Delete a document type.
| Name | Required | Description | Default |
|---|---|---|---|
| document_type_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already convey destructive, non-read-only, and idempotent behavior, and the description simply restates 'Delete' without adding any behavioral context. It does not disclose downstream effects on documents, permanence, or authorization requirements, though 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence with no filler, and the action is front-loaded. It is appropriately concise for a one-parameter CRUD operation, though it errs on the side of being too sparse to be genuinely helpful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive operation, the description omits the most important operational context: what deletion means for documents assigned to the type, whether the type can be deleted while in use, and what the response indicates. The annotations and schema cover mechanics but not the impact of the deletion.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter document_type_id is self-explanatory and required, but with 0% schema description coverage the description was expected to clarify its role and constraints. It says only 'Delete a document type' and provides no additional meaning about how the ID is used or validated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('Delete' + 'document type') that clearly states the operation and target. It is readily distinguished from sibling tools such as update_document_type, get_document_type, and create_document_type, even without reading their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives, nor are prerequisites or exclusions mentioned. The description does not say, for example, whether a document type must be unused before deletion or what happens to documents assigned to it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_tagDelete TagCDestructiveIdempotent
Delete a tag.
| Name | Required | Description | Default |
|---|---|---|---|
| tag_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true, and the description adds no behavioral context beyond the title. It does not disclose consequences, reversibility, permissions, or possible side effects on associated documents, so the description carries no extra transparency value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded with zero filler. However, it carries no information beyond the title, so the terseness borders on under-specification; it is acceptable for such a simple tool but not a model of helpful structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter delete operation with annotations and an output schema present, the minimal invocation is inferable. The main gap is the lack of any statement about side effects or cascading behavior, which is relevant for a destructive tool like this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description never mentions tag_id or what value should be supplied. The parameter name and integer type in the schema are somewhat self-explanatory, but the description itself adds no semantic meaning to compensate for the missing parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Delete') and a clear resource ('tag'), which distinguishes it from sibling tools like delete_document or delete_correspondent. However, it is essentially a restatement of the title and adds no scope or qualifier, so it is clear but not exceptional.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use delete_tag versus related tools such as update_tag, bulk_edit_tags, or delete_document_type. The agent must infer usage solely from the name and siblings, with no exclusions or alternative conditions provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_correspondentGet CorrespondentARead-onlyIdempotent
Fetch a correspondent by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| correspondent_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| slug | No | |
| match | No | |
| owner | No | |
| document_count | No | |
| is_insensitive | No | |
| user_can_change | No | |
| matching_algorithm | No | |
| last_correspondence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false). The description adds the basic 'by ID' scope but does not disclose behavior like not-found handling or authentication requirements, though the annotations lower the bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, directly stating the action and resource. It is appropriately front-loaded and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple idempotent read operation with one self-explanatory parameter, strong annotations, and an output schema, the description is nearly sufficient. It lacks minor context like error behavior or sibling routing, but those are not essential for a basic get-by-ID call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the single parameter correspondent_id and its integer type are largely self-explanatory. The description reinforces 'by ID' but adds no additional meaning such as ID format, source, or lookup semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch'), a resource ('correspondent'), and the retrieval key ('by ID'). This clearly distinguishes it from siblings like list_correspondents and create/update/delete_correspondent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 alternatives, such as using list_correspondents to find an ID first or when not to use it. 'By ID' only implies a prerequisite, not explicit usage criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_custom_fieldGet Custom FieldARead-onlyIdempotent
Fetch a custom field by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| field_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| data_type | Yes | |
| extra_data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds no behavioral context beyond restating the fetch action, so it provides no extra transparency beyond what annotations already offer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single 7-word sentence contains exactly the necessary information, front-loading the action and object. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with output schema and safety annotations, the description is largely sufficient. However, it does not explicitly state that the field must already exist or how it relates to list_custom_fields, leaving minor completeness gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has a single integer field_id with no description (0% coverage). The description's 'by ID' clarifies that field_id is the unique identifier of the custom field, adding essential meaning the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Fetch a custom field by ID' uses a specific verb, resource, and identifier, clearly distinguishing it from sibling CRUD tools like list_custom_fields, create_custom_field, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus list_custom_fields or other alternatives. The usage is implied by the name and 'by ID', but there is no mention of when to prefer this over enumeration or other getters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_documentGet DocumentARead-onlyIdempotent
Fetch one document by ID.
OCR content is stripped to keep responses small. Call
get_document_content for a bounded preview, or use
create_download_link with the content variant when available.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| tags | No | |
| added | No | |
| notes | No | |
| owner | No | |
| title | Yes | |
| content | No | |
| created | Yes | |
| web_url | No | |
| modified | No | |
| page_count | No | |
| created_date | No | |
| storage_path | No | |
| correspondent | No | |
| custom_fields | No | |
| document_type | No | |
| user_can_change | No | |
| archived_file_name | No | |
| original_file_name | No | |
| archive_serial_number | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety: readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false. The description adds a useful behavioral detail beyond annotations: OCR content is stripped to keep responses small. It does not go into error handling or authorization, so 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler. The core action is front-loaded, and the following two sentences add only targeted routing details that an agent genuinely needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required integer parameter, an output schema present, and annotations covering read-only/idempotent behavior, nothing critical is missing. The content-related alternatives are explicitly named, so an agent can decide correctly without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter is document_id, an integer with no schema description (0% coverage). The phrase 'by ID' directly links the parameter to the fetch operationcars; for a single self-explanatory parameter, this is sufficient meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear action and resource: 'Fetch one document by ID.' It also distinguishes the tool from content-focused siblings by noting 'OCR content is stripped' and pointing to get_document_content, so an agent can tell this apart from related get_document_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes alternative usage: 'Call get_document_content for a bounded preview, or use create_download_link with the content variant when available.' This tells the agent when to prefer a different tool instead of get_document.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_contentGet Document TextARead-onlyIdempotent
Return the OCR'd text content of a document.
Documents such as books and technical standards can run to millions of
characters, so each call is capped at 20,000. A partial result opens
with a marker naming the character range returned, the document's full
length, and the offset to pass to read the next section; text that
fits under the cap is returned whole with no marker.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Character position to start reading from. Pass the value named in a truncation marker to continue from where it stopped. | |
| max_chars | No | Maximum number of characters to return, up to 20,000. | |
| document_id | Yes | ID of the document to read. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation read-only, idempotent, and non-destructive, and the description adds substantial behavioral detail beyond that: the 20,000-character cap, the truncation marker containing character range and full length, and the offset continuation mechanism. It also clearly states when no marker appears, leaving no surprise about response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense: the first sentence states the core purpose, and the second paragraph explains the only non-obvious behavior. Every sentence earns its place, and the structure front-loads the most important information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only content-fetching tool, the description fully covers the pagination edge case that could confuse an agent, while the output schema handles return-value details. Given the 100% schema coverage and rich annotations, nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters document_id, offset, and max_chars are already well explained. The description adds a little contextual meaning by tying offset to the truncation marker, but this mostly repeats what the schema already says. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Return the OCR'd text content of a document.' This clearly distinguishes the tool from siblings like get_document, get_document_metadata, and get_document_thumbnail, which serve different purposes. No ambiguity remains about what the tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by explaining that long documents require pagination and how the caller should continue reading via the returned offset. It does not name sibling alternatives or explicitly state when not to use this tool, but the scenario is obvious enough that an agent can determine appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_historyGet Document Audit LogBRead-onlyIdempotent
Return the audit history for a document.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description neither contradicts these nor adds behavioral context such as event ordering, included fields, or access requirements, so it adds no value beyond what annotations already provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler. For a one-parameter read-only tool, this is appropriately concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return value structure is not the description's responsibility. The tool is simple, well-annotated, and the description covers the basic operation. It lacks detail on what audit history includes or error behavior, but for this low-complexity tool, the coverage is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but there is only one parameter, document_id, whose name is self-explanatory. The description's 'for a document' reinforces that the ID targets a document, but it does not add format, constraints, or requiredness beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'Return the audit history for a document' is a clear verb+resource statement. It names the specific resource (audit history) that distinguishes it from siblings like get_document_metadata or get_document_content, though it does not elaborate on what audit history contains.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to choose this tool over similar get_* tools or any exclusions/alternatives. The only implied usage is the tautological 'when you need audit history,' with no context on prerequisites or edge cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_metadataGet Document File DetailsBRead-onlyIdempotent
Return technical metadata for a document (checksums, filenames, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| lang | No | |
| archive_size | No | |
| original_size | No | |
| media_filename | No | |
| archive_checksum | No | |
| archive_metadata | No | |
| original_checksum | No | |
| original_filename | No | |
| original_metadata | No | |
| original_mime_type | No | |
| has_archive_version | No | |
| archive_media_filename | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds only the 'technical metadata' scope; it does not describe pagination, error behavior, or result shape, but the output schema reduces the need.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with concrete examples and no filler. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only tool with an output schema, the definition is mostly sufficient. The main gap is that the description does not situate it among the many get_document_* siblings, leaving some ambiguity about which 'details' are meant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, but there is only one parameter, document_id, whose name and integer type are self-explanatory. The description's phrase 'for a document' loosely ties the parameter to the resource, though it never explicitly states how document_id is used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Return technical metadata') and a concrete resource (a document), with examples 'checksums, filenames' that hint at file-level details. It is clear enough to distinguish from get_document_content or get_document_notes, though it never explicitly contrasts with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to choose this tool over sibling getters such as get_document, get_document_content, or get_document_notes. The examples imply 'technical metadata', but there is no explicit condition, exclusion, or alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_notesList Document NotesBRead-onlyIdempotent
Return notes attached to a document.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds no behavioral context beyond what annotations already provide. Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description's 'Return notes' does not disclose any additional traits such as ordering, pagination, or error behavior. It is safe but not transparent about anything not covered by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that is front-loaded with the verb and resource, with no redundant words. Every word contributes to the purpose, making it appropriately concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity read operation with a single required parameter, strong safety annotations, and an output schema (present but not shown), the description is nearly complete. It lacks explicit mention of possible empty results or ordering, but these are minor given the output schema likely covers the return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for the undocumented document_id parameter. It does so minimally by indicating that notes are 'attached to a document', implying document_id identifies that document. This adds some meaning beyond a bare integer, but it does not elaborate on constraints, format, or relationships with other parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Return') on a specific resource ('notes attached to a document'), clearly distinguishing it from sibling tools like get_document, add_document_note, and delete_document_note. The purpose is unambiguous and matches the title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention that adding or deleting notes should use add_document_note or delete_document_note, nor does it clarify when this tool is preferable over get_document or search_documents. Usage is only implied by the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_suggestionsSuggest Tags, Correspondent and TypeBRead-onlyIdempotent
Return Paperless's classifier suggestions for a document.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | No | |
| dates | No | |
| storage_paths | No | |
| correspondents | No | |
| document_types | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is clear. The description adds classifier context but no extra behavioral detail, such as whether suggestions may be empty or that no changes are applied. It matches the annotations, so there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single eight-word sentence with no filler. It front-loads the verb and object and omits redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, read-only tool, the description plus annotations and output schema cover most of what an agent needs. The main gap is the missing explicit parameter mapping and usage context, but the required integer document_id is self-explanatory from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description never names document_id or explains that the required integer identifies the target document. The phrase 'for a document' is only a weak pointer, leaving parameter semantics almost entirely to the schema field name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb-resource pair: 'Return Paperless's classifier suggestions for a document.' The title clarifies exactly which suggestions are involved (Tags, Correspondent and Type), and this operation is distinct from any other sibling tool. It stops short of explicitly contrasting itself with get_document or get_document_metadata, so not a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus alternatives; the only hint is the word 'suggestions' versus the more concrete metadata/history tools. There are no exclusion criteria or alternative-tool routing, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_thumbnailGet Document ThumbnailBRead-onlyIdempotent
Return the document's thumbnail as inline image content.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the return format 'inline image content' beyond what annotations declare (read-only, idempotent, non-destructive). However, it does not disclose details like image size, resolution, or potential error handling. Given annotations cover safety, the description provides minimal additional behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words. It is front-loaded with the core purpose. However, it is so brief that it omits useful context, which slightly detracts from its effectiveness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and only a basic description, the return value is under-specified. 'Inline image content' is vague and does not explain format (e.g., base64, URL) or any limitations. The description does not cover potential errors or usage context, leaving the agent with incomplete information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides no explanation of the document_id parameter. Schema description coverage is 0%, so the description should compensate, but it remains silent on parameter meaning or constraints. The only parameter is obvious from its name, but the description does not clarify its role or format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return' and the resource 'document's thumbnail', and specifies the output as 'inline image content'. This distinguishes it from sibling tools like get_document_content (full content) or get_document_metadata (metadata). The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as get_document_content or get_document. The description only states what it does, not when to select it. No exclusions or alternative references are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_typeGet Document TypeBRead-onlyIdempotent
Fetch a document type by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| document_type_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| slug | No | |
| match | No | |
| owner | No | |
| document_count | No | |
| is_insensitive | No | |
| user_can_change | No | |
| matching_algorithm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is already covered. The description 'Fetch a document type by ID' is consistent with those annotations but adds no behavioral context beyond what the schema already shows. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, directly front-loaded with the verb and resource. No filler, no repetition, and the structure is appropriate for the simplicity of the operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-id tool with an output schema, safe annotations, and a single required parameter, the description is nearly sufficient. The main gap is the lack of any usage context or not-found/error behavior, but these are minor for such a straightforward lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fails to compensate. It only repeats the word 'by ID' without explaining the meaning, format, or expectations for the document_type_id parameter. The parameter name already conveys this, so the description adds no value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch'), identifies the exact resource ('a document type'), and scopes it 'by ID', which clearly distinguishes it from list_document_types and the mutation siblings. It is unambiguous, though it stops short of explicitly naming the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus list_document_types or other document-type tools. The use case (fetching a single document type by ID) is implied by the description and schema, but not stated explicitly, and there is no mention of prerequisites or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_remote_versionCheck for Paperless UpdatesARead-onlyIdempotent
Check whether a newer release of Paperless-NGX exists upstream.
Answers the newest release published on GitHub, and whether it is newer
than the connected instance -- not the version installed on that
instance. The two coincide only while the instance is up to date.
Call get_server_info for the installed version.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| version | Yes | |
| update_available | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered. The description adds valuable behavioral nuance beyond those hints: it checks upstream rather than the installed instance, and explains that the two only coincide when the instance is current. Missing details like network failure handling or rate limits are secondary given the openness implied by openWorldHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The primary action is front-loaded, the critical distinction from get_server_info is stated immediately, and the caveat about coincidence is compact and relevant. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema present, and annotations covering behavioral safety, the description fills the remaining gap by explaining what the output means ('newest release published on GitHub' vs. 'installed version') and how it relates to the connected instance. It also routes the agent to the complementary tool for the installed version, making the call context complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so the schema carries no burden. Per the baseline for 0-parameter tools, a score of 4 is appropriate because there is nothing for the description to add about parameters, and it does not attempt to pad that space with irrelevant detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Check') and resource ('newer release of Paperless-NGX upstream'), and clearly distinguishes it from related tools by explicitly noting it does not report the installed version. It names the sibling get_server_info for that purpose, making the differentiation concrete even without comparing schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool (to check for a newer upstream release) and directs it to get_server_info for the installed version. It also clarifies the relationship between the two values, which prevents common misuse where an agent might expect the installed version.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_saved_viewGet Saved ViewARead-onlyIdempotent
Fetch a saved view by ID.
Visibility flags are null when payload v10 omits those preferences.
| Name | Required | Description | Default |
|---|---|---|---|
| view_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| owner | No | |
| page_size | No | |
| sort_field | No | |
| filter_rules | No | |
| sort_reverse | No | |
| show_in_sidebar | No | |
| show_on_dashboard | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and destructiveHint. The description adds a specific behavioral nuance about visibility flags being null when payload v10 omits those preferences, which is context beyond the annotations. No contradiction detected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The primary purpose is front-loaded, and the second sentence adds a targeted behavioral detail. No unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-ID tool with an output schema and comprehensive safety annotations, the description covers the key nuance (null visibility flags). No critical missing information; mentioning the sibling list_saved_views would be nice but is not essential for correctness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only says 'by ID', which does not clarify what a saved view is, any constraints, or the meaning of view_id beyond the schema's integer type. The description adds minimal value to parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch'), a resource ('saved view'), and identifies the parameter as ID. It clearly distinguishes from sibling list_saved_views by focusing on retrieving a single view by identifier. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a view_id is available but does not explicitly state when to use this versus alternatives like list_saved_views, nor does it mention exclusions or prerequisites. Guidance is minimal and left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_infoServer InfoARead-only
Report wrapper and upstream version info for paperless-mcp. Returns server_name, server_version, core_version (fastmcp-pvl-core), and (when configured) an upstream version block. Useful for verifying a deployment matches the expected build.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds the useful conditional detail that the upstream version block appears only 'when configured', but it otherwise provides no deeper behavioral context such as failure modes or configuration prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two crisp sentences: purpose is front-loaded, return fields are named, and the use case is stated. Every sentence earns its place with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with an output schema, the description covers purpose, return fields, a conditional behavior, and a use case. The only notable gap is the lack of an explicit contrast with the version-related sibling get_remote_version, which would make the selection decision more robust.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there is nothing to explain and the description correctly avoids inventing parameter details. This matches the baseline for a zero-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Report') and a clear resource ('wrapper and upstream version info for paperless-mcp'), then lists the exact returned fields. This makes the tool's purpose very clear, but it does not explicitly differentiate it from the similarly named sibling get_remote_version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The statement 'Useful for verifying a deployment matches the expected build' provides a concrete, explicit context for when to call this tool. It does not exclude alternatives or mention get_remote_version, but for a simple read-only info endpoint this is sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statisticsGet Paperless StatisticsARead-onlyIdempotent
Fetch collection-level statistics.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| inbox_tag | No | |
| tag_count | No | |
| current_asn | No | |
| character_count | No | |
| documents_inbox | No | |
| documents_total | No | |
| storage_path_count | No | |
| correspondent_count | No | |
| document_type_count | No | |
| document_file_type_counts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds only 'collection-level' scope and no additional behavioral detail such as freshness, performance, or output caveats; 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short declarative sentence with no filler, and the scope qualifier 'collection-level' is front-loaded. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, read-only and idempotent annotations, and an output schema present, the description contains all the operational information an agent needs to invoke the tool correctly. Return-value details are intentionally delegated to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero properties, so there are no parameters to document. Per the baseline for zero-parameter tools, the description does not need to provide parameter-level semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the operation and resource directly ('Fetch collection-level statistics'), and the phrase 'collection-level' signals aggregate scope, distinguishing it from the many document/item-specific sibling tools. This is a specific and unambiguous action statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when aggregate collection-wide statistics are needed, but it never states when not to use it, names an alternative such as get_server_info, or gives any conditions. An agent must infer usage from the tool name and title.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_storage_pathGet Storage PathARead-onlyIdempotent
Fetch a storage path by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| storage_path_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| path | Yes | |
| slug | No | |
| match | No | |
| owner | No | |
| document_count | No | |
| is_insensitive | No | |
| user_can_change | No | |
| matching_algorithm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior; the description's 'Fetch' aligns with those and adds no extra behavioral caveats. For a simple getter this is sufficient, though the description contributes no behavioral detail beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence that delivers the core action and parameter relationship with no filler. Everything present earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only, idempotent getter with an output schema and rich annotations, this description is complete. An agent has everything needed to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by identifying the single parameter's role as the lookup key ('by ID'). The parameter's name and integer type make the remaining semantics self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'Fetch a storage path by ID' names a specific action, resource, and lookup mechanism. The singular 'by ID' distinguishes it from list_storage_paths and other sibling getters, so an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The by-ID lookup makes the appropriate context clear: use when you already have a storage_path_id and need that single resource. It does not explicitly name list_storage_paths as the alternative when an ID is not known, so it falls just short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tagGet TagARead-onlyIdempotent
Fetch a tag by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| tag_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| slug | No | |
| color | No | |
| match | No | |
| owner | No | |
| colour | No | |
| is_inbox_tag | No | |
| document_count | No | |
| is_insensitive | No | |
| user_can_change | No | |
| matching_algorithm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description's 'Fetch' is consistent with those traits. It adds no extra behavioral context such as not-found behavior, but the annotation coverage makes this an acceptable baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four words with no filler or redundancy. It front-loads the action, resource, and the key identifying parameter, so every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter getter with an output schema and annotations covering the safety profile, the description is functionally complete enough for an agent to call it correctly. It omits missing-tag behavior, but the low complexity and rich annotations prevent this from being a significant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but there is only one parameter, tag_id, and the phrase 'by ID' directly maps to it. The description adds minimal meaning beyond the schema and does not clarify where a valid ID comes from or what constraints apply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action, 'Fetch', and a specific resource, 'a tag', with an ID qualifier. This makes it clear the tool retrieves a single tag rather than listing all tags, though it does not explicitly contrast with sibling tools like list_tags or create_tag.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case is implied: call this when you have a tag_id and need a single tag. However, the description gives no explicit guidance about when to prefer get_tag over list_tags, nor does it address edge cases such as a nonexistent ID.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskGet Background TaskARead-onlyIdempotent
Fetch a task by UUID. Returns None if no such task exists.
| Name | Required | Description | Default |
|---|---|---|---|
| task_uuid | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds a valuable behavioral detail beyond those: it returns None when no such task exists. There is no contradiction with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The primary action is front-loaded, and the return behavior is stated immediately after.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, read-only fetch with an output schema and safety-related annotations, the description is nearly complete. The only real gap is not cross-referencing sibling tools, which is already reflected in the usage_guidelines score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must clarify the parameter, and 'by UUID' does add some meaning to task_uuid. However, it never explicitly describes the parameter format, source, or constraints beyond what the property name already implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch'), a clear resource ('a task'), and the identifying key ('by UUID'). It also states the not-found behavior, which distinguishes it from list_tasks and wait_for_task without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for retrieving an individual background task when its UUID is known, but it does not explicitly say when to choose it over list_tasks or wait_for_task. There is no when-not guidance or mention of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_correspondentsList CorrespondentsCRead-onlyIdempotent
List correspondents.
Each row's last_correspondence is the date of the correspondent's
newest document, or null when it has none; ordering accepts it.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| ordering | No | ||
| page_size | No | ||
| name__icontains | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| count | Yes | |
| results | No | |
| previous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds useful behavior: the meaning of `last_correspondence` (null when no documents) and that `ordering` accepts it. Still, it does not disclose return details beyond one field, and pagination behavior is left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with the core action stated first and one additional field-semantics sentence. Every sentence earns its place, and there is no boilerplate. The formatting with backticks is slightly awkward but does not hurt readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list endpoint, the main gap is the undocumented `name__icontains` filter, which an agent would need for name-based lookups, and the lack of allowed ordering fields beyond `last_correspondence`. The output schema and annotations reduce some burden, but the description does not equip an agent to use both the pagination and filtering parameters confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it only clarifies `ordering` (as accepting `last_correspondence`). The non-obvious `name__icontains` filter is left unexplained, and `page`/`page_size` are only inferable by convention. This is insufficient compensation for four undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List correspondents.' It is clearly distinct from singular siblings like get_correspondent and mutating ones like create_correspondent. However, it does not explicitly contrast with any sibling, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. The description implies usage through the verb 'List' but never states exclusions or references get_correspondent or list_documents. A tool that merely names its action without selection criteria provides no real usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_custom_fieldsList Custom FieldsCRead-onlyIdempotent
List custom fields.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| ordering | No | ||
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| count | Yes | |
| results | No | |
| previous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so there is no contradiction. However, the description adds no behavioral detail beyond 'list'—it does not mention pagination, ordering behavior, or any other runtime characteristic, so it provides no value beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is genuinely brief and front-loaded, with no filler or redundant sentences. However, it is under-specified rather than appropriately compact—it essentially repeats the title and lacks structure or detail that would help an agent use the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that all parameters are optional, annotations cover the safety profile, and an output schema exists, an agent can call the tool with defaults and understand the return shape. Still, there is no explanation of ordering semantics, pagination defaults, or when to prefer this over get_custom_field, making it only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description mentions none of the three parameters. An agent cannot learn what page, ordering, or page_size mean semantically, what values ordering accepts, or how pagination behaves, so the description does nothing to compensate for the schema's lack of parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'List custom fields' tells an agent this retrieves the collection of custom field objects. It is not differentiated from siblings like get_custom_field or other list tools, but the resource is specific enough to avoid ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives. The description does not mention get_custom_field for retrieving a single field, nor does it explain when list_custom_fields is appropriate, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_documentsList DocumentsARead-onlyIdempotent
List documents with optional filters. Returns one page.
Per-document OCR content is stripped to keep results small. Use
get_document_content for a bounded preview of one result.
notes[].note and custom_fields[].value are always stripped
from listings. The metadata refs
(note ids, timestamps, custom-field ids) are retained so callers can
detect presence; use get_document or get_document_notes to read
those values.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| tags | No | ||
| ordering | No | ||
| page_size | No | ||
| custom_field | No | ||
| storage_path | No | ||
| correspondent | No | ||
| document_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| count | Yes | |
| results | No | |
| previous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds behavioral context about response content: OCR content is stripped, notes and custom fields values are stripped but metadata refs retained, and pagination returns one page. This goes beyond annotations and informs the agent about data truncation and how to retrieve full values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, front-loaded with the core purpose and pagination, then detailing what is stripped and pointing to alternatives. There is no fluff or redundant information; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main behavior, pagination, and content truncation, and the output schema (not shown) likely defines the return structure. However, it lacks parameter-level guidance for the eight optional filters, which could be important for correct invocation. Given the annotations and output schema, the description is adequate but not fully comprehensive for a tool with many optional parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the schema provides no parameter descriptions. The description only mentions 'optional filters' without explaining the meaning or usage of any of the eight parameters (e.g., tags, custom_field, storage_path). Parameter names are somewhat self-explanatory, but the description does not add semantic value to help the agent choose or format filter values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'List documents with optional filters. Returns one page.' It also distinguishes itself from related tools by noting what is stripped (OCR content, notes, custom fields) and pointing to alternatives like get_document_content, get_document, and get_document_notes. This makes the purpose unambiguous and differentiates it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus alternatives: 'Use get_document_content for a bounded preview' and 'use get_document or get_document_notes to read those values.' It also implies pagination usage by stating 'Returns one page.' However, it does not directly contrast with search_documents or explain when a list vs. a search is appropriate, which is a minor gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_document_typesList Document TypesCRead-onlyIdempotent
List document types.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| ordering | No | ||
| page_size | No | ||
| name__icontains | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| count | Yes | |
| results | No | |
| previous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation read-only, idempotent, and non-destructive, but the description adds no behavioral detail beyond the word 'List'. It does not mention pagination behavior, filtering semantics, or any other runtime traits beyond what structured metadata provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no padding, but it is under-specified rather than usefully concise. It adds essentially no information beyond the tool title and does not earn its place as a meaningful explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The operation is simple, has zero required parameters, and is backed by rich annotations plus an output schema, so an agent could call it with no arguments. However, it lacks guidance on filtering, pagination, and when listing is the right choice among sibling tools, leaving a clear but minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to explain page, ordering, page_size, and name__icontains, but it does not mention any of them. The parameter names and defaults in the schema hint at meaning, but the description itself fails to compensate for the complete absence of parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a clear resource ('document types'), so the core action is immediately understandable. It does not, however, differentiate this from sibling tools like get_document_type or list_documents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as get_document_type, create_document_type, or bulk_edit_document_types. The only hint is the tool name itself, and no exclusions or preconditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_saved_viewsList Saved ViewsBRead-onlyIdempotent
List saved views.
Visibility flags are null when payload v10 omits those preferences.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| count | Yes | |
| results | No | |
| previous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false. The description adds one useful behavioral detail: visibility flags can be null when payload v10 omits them. It does not mention pagination behavior, ordering, or empty-result handling, so it only partially fleshes out the behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact at two sentences. The first sentence restates the tool name without new information, but the second sentence adds a meaningful edge case. There is no filler, and the important note is placed clearly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple paginated list endpoint with an output schema and read-only annotations, so the description does not need to explain return values or safety. The visibility-flags note covers a relevant quirk. The main omission is any statement about how pagination parameters affect results, but those are largely inferable from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds no explanation for the page or page_size parameters, and schema description coverage is 0%. However, the schema itself includes meaningful defaults, minimums, and maximums that make the pagination parameters reasonably self-explanatory. Still, the description does not compensate for the lack of property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List saved views.' This is unambiguous and clearly distinct from the sibling get_saved_view, which retrieves a single item. It is nearly identical to the title, and a more explicit scope statement would earn a 5, but the intent is plain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use list_saved_views versus get_saved_view or other list alternatives. The agent is left to infer from the name alone. There are no stated prerequisites, exclusions, or scenarios mentioning the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_storage_pathsList Storage PathsDRead-onlyIdempotent
List storage paths.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| ordering | No | ||
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| count | Yes | |
| results | No | |
| previous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds no behavioral context beyond what annotations already provide (readOnly, idempotent, non-destructive). It does not mention pagination behavior, ordering, or return format, leaving the agent uninformed about operational details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely short, but this is under-specification rather than conciseness. It omits essential information that should be present for a tool with pagination parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three parameters and no schema descriptions, the description provides no usage guidance, parameter explanation, or behavioral context. The existence of an output schema does not compensate for the lack of operational information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description does not explain any of the three parameters (page, ordering, page_size). The agent receives no semantic guidance beyond the parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource ('List storage paths'), but it is minimal and does not differentiate from siblings like get_storage_path or other list tools. It lacks any context about what storage paths are or how they relate to other resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. No mention of pagination, filtering, or when get_storage_path would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsList TagsDRead-onlyIdempotent
List tags.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| ordering | No | ||
| page_size | No | ||
| name__icontains | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| count | Yes | |
| results | No | |
| previous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. However, the description adds no behavioral context beyond the bare operation label; it does not mention pagination limits, filtering behavior, or what the returned tag list represents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief, but brevity is not effective conciseness when the only sentence is a restatement of the title. It contains no useful structure and wastes the opportunity to communicate behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The annotations and output schema reduce the burden, but the description still omits filtering, sorting, and pagination semantics. With four optional parameters that all lack schema descriptions, an agent does not have enough context to use them correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description is simply 'List tags.' It makes no mention of page, ordering, page_size, or name__icontains, so the agent must infer semantics solely from parameter names. This is especially insufficient for a non-obvious parameter like name__icontains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is the tautological phrase 'List tags,' which repeats the tool name and title without adding scope, filtering, pagination, or distinction from sibling operations like get_tag. It identifies a verb and resource but adds no differentiating detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to choose list_tags over list_documents, get_tag, or bulk_edit_tags, and no exclusions or prerequisites are stated. The description leaves the decision entirely to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksList Background TasksARead-onlyIdempotent
List Paperless Celery tasks.
Defaults to unacknowledged tasks only (set include_acknowledged=True
or acknowledged=True to see acknowledged ones). Returns one page,
newest first.
Pass task_type to filter by the kind of work — "bulk_update"
is the search-index rebuild that bulk_edit_documents queues, so
that tool's deferred indexing can be waited on with wait_for_task.
Version 10 adds task_type, trigger_source, structured result_data,
related_document_ids and timing fields. Statuses retain their uppercase
spelling. Legacy task_name, type, result and related_document remain
compatibility projections; use the v10 fields for full detail.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| status | No | ||
| page_size | No | ||
| task_type | No | ||
| acknowledged | No | ||
| include_acknowledged | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| count | Yes | |
| results | No | |
| previous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds substantial detail beyond that: default unacknowledged filtering, one-page newest-first pagination, version 10 field additions, legacy compatibility projections, uppercase status spelling, and the meaning of the bulk_update task_type. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well organized: core purpose, default behavior, filtering guidance, and version compatibility notes. It front-loads the most important facts. The version-compatibility paragraph is somewhat long but earns its place given the API's complexity, so this is not a case of fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and annotations, the description covers defaults, pagination, task_type filtering, and version differences. It leaves minor gaps around the exact semantics of the status filter and page_size, but the tool is still safely callable. For a tool with six parameters and versioned behavior, this is a high level of completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the parameters. It does explain include_acknowledged, acknowledged, and task_type, with a concrete bulk_update example. However, status, page, and page_size are not meaningfully described beyond the phrase 'Returns one page,' leaving some parameter semantics to be inferred from names and schema enums.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 Paperless Celery tasks.' It clearly distinguishes itself from sibling list_documents by focusing on background work rather than documents, and it connects to related tools by noting that bulk_update is the indexing rebuild queued by bulk_edit_documents and can be waited on with wait_for_task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit context for when to use the tool, such as inspecting unacknowledged tasks by default and passing task_type to filter. It also explains the workflow relationship with bulk_edit_documents and wait_for_task. It does not explicitly list exclusions or say 'use get_task instead for a single task,' but the guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documentsSearch DocumentsARead-onlyIdempotent
Full-text search documents.
Per-hit OCR content is stripped. Use get_document_content for a
bounded preview of one hit. Use more_like for similarity search.
notes[].note and custom_fields[].value are always stripped
from search hits; fetch them via get_document or
get_document_notes when needed.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| query | Yes | ||
| more_like | No | ||
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| count | Yes | |
| results | No | |
| previous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), and the description adds genuinely non-obvious behavior on top: per-hit OCR content is stripped, and notes/custom_fields values are 'always' stripped from hits. This is high-value disclosure that annotations cannot express. Minor gaps remain (no mention of result ordering, ranking, or count semantics), but the critical quirks are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, information-dense sentences with zero fluff. Purpose is front-loaded, followed by the OCR-content stripping warning and routing, then the always-stripped field warning. Paragraph breaks group related ideas cleanly and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema documents return values and annotations cover the read-only/idempotent safety profile, the description covers the remaining essentials: purpose, sibling routing, and field-stripping behavior. Pagination behavior and exact matching semantics are minor omissions for a moderately simple 4-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the burden is on the description to explain parameters. It adds meaning for more_like ('use for similarity search'), which the schema only types as integer|null. However, query semantics (search syntax, what fields are matched) and page/page_size behavior are left to inference, so compensation is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Full-text search documents" uses a specific verb and resource, clearly distinguishing this from list_documents (listing) and get_document/get_document_content (fetching one record). The description further differentiates by naming get_document_content as the preview alternative and get_document/get_document_notes as the routes for stripped fields, so an agent can pick the right sibling without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing guidance is given: use get_document_content for a bounded preview of one hit, use more_like for similarity search, and fetch stripped notes/custom fields via get_document or get_document_notes. Conditional alternatives are named concretely rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_correspondentUpdate CorrespondentCIdempotent
Patch selected fields on a correspondent.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | ||
| correspondent_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| slug | No | |
| match | No | |
| owner | No | |
| document_count | No | |
| is_insensitive | No | |
| user_can_change | No | |
| matching_algorithm | No | |
| last_correspondence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a write operation (readOnlyHint=false), idempotency, and non-destructiveness. The description adds no behavioral context beyond the word 'patch', such as what happens to unspecified fields, whether the correspondent must exist, or whether patch merges or replaces. It relies entirely on 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with no wasted words, and the key action is front-loaded. It is concise, though the brevity borders on under-specification, which is reflected in other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a nested patch object, required correspondent_id, and multiple sibling tools, the description is too thin. It does not explain the relationship between the fields, valid matching_algorithm values, or how patch behaves with defaults. The output schema may cover return values, but callers lack enough context to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description bears full responsibility for explaining parameters. It only says 'selected fields' without naming correspondent_id or the patch sub-fields (name, match, is_insensitive, matching_algorithm). This adds little meaning over the schema structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Patch') and resource ('correspondent'), and 'selected fields' conveys a partial-update semantics. It is not a tautology, and it clearly distinguishes this tool from create/delete/list operations, though it does not explicitly compare against sibling update tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like create_correspondent, bulk_edit_correspondents, or delete_correspondent. No prerequisites, exclusions, or context are provided; usage is only implied by the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_custom_fieldUpdate Custom FieldAIdempotent
Patch selected fields on a custom field definition.
extra_data shape depends on data_type:
monetary— optional{"default_currency": "USD"}(ISO-4217).select—extra_data.select_optionsreplaces the current list wholesale. To preserve existing values, include each existing option with its server-assignedid:{"select_options": [{"id": "abc", "label": "Low"}, ...]}. Omitting an option'sidcreates a new option; dropping an option from the list deletes it and any document values referencing it. A patch withoutextra_data, such as a rename, keeps the current options: the server reads them and sends them back with their ids.
See create_custom_field for the full extra_data shape table.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | ||
| field_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| data_type | Yes | |
| extra_data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark idempotentHint:true, destructiveHint:false, but the description adds crucial behavioral details: it explains the destructive side effect of dropping options in the select list (deletes them and referencing document values) and how renaming (patch without extra_data) preserves options. This goes beyond annotations and is essential for agent decision-making.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense with technical detail but efficiently organized with bullet points for the two data types. It is front-loaded with the core action and then provides necessary examples. Slightly long but each sentence earns its place given the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a nested object schema and 0% schema coverage, this description is thorough. It covers the two main extra_data variations, gives examples, and points to create_custom_field for the full table. It doesn't describe return values, but an output schema exists. Minor gap: doesn't mention error conditions or idempotency implications, but the idempotent hint covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must shoulder the load. It thoroughly explains the semantics of extra_data for two data types, including how to preserve, create, and delete options. It also clarifies that field_id is an identifier and patch is a partial update object. This far exceeds the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear action ('Patch selected fields') on a specific resource ('custom field definition'), with explicit mention of partial updates. It also references the sibling create_custom_field for full shape, aiding differentiation from creation and other update tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides detailed guidance on when to use the tool and how to handle specific data_type cases, especially the select behavior with wholesale replacement and id preservation. It does not explicitly list exclusions (e.g., when to use create/delete) but gives clear conditional context for different use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_documentUpdate DocumentAIdempotent
Patch selected fields on a document.
The response strips OCR content. Use get_document_content or a
transfer link when the updated text is needed.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | ||
| document_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| tags | No | |
| added | No | |
| notes | No | |
| owner | No | |
| title | Yes | |
| content | No | |
| created | Yes | |
| web_url | No | |
| modified | No | |
| page_count | No | |
| created_date | No | |
| storage_path | No | |
| correspondent | No | |
| custom_fields | No | |
| document_type | No | |
| user_can_change | No | |
| archived_file_name | No | |
| original_file_name | No | |
| archive_serial_number | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the response strips OCR content, a behavioral trait not present in the annotations. The annotations already mark the operation as non-read-only, non-destructive, and idempotent, and the description aligns with those without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the purpose stated first and a targeted behavioral note second. No filler words, no repetition of schema information, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the nested `patch` object and existing output schema, the description covers the key behavioral quirk (content stripping) but leaves some patch semantics implicit, such as whether null clears fields or which fields are typically updated together. Adequate, but a bit more detail on patch semantics would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for parameter meaning. 'Patch selected fields' conveys partial-update semantics and the content-stripping note relates to the `content` field, but it does not explain null behavior, per-field details, or the relationship between fields. The schema provides field names and types, so the description adds minimal but meaningful value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence, 'Patch selected fields on a document,' names a specific verb (patch), resource (document), and scope (selected fields). This clearly distinguishes it from sibling tools like update_document_type or bulk_edit_documents, which target different resources or operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit alternative for a specific need: use get_document_content or a transfer link when updated text is needed after the response strips OCR content. However, it does not explain broader when-to-use conditions versus sibling tools like bulk_edit_documents or mention prerequisites such as permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_document_typeUpdate Document TypeCIdempotent
Patch selected fields on a document type.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | ||
| document_type_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| slug | No | |
| match | No | |
| owner | No | |
| document_count | No | |
| is_insensitive | No | |
| user_can_change | No | |
| matching_algorithm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only (false), idempotent (true), and destructive (false) hints. The description adds the notion of 'selected fields', implying only provided fields are updated, which aligns with the annotations. However, it does not elaborate on other behavioral aspects like authentication requirements or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no fluff, front-loading the core action. It is appropriately brief, though it omits essential details that would make it more helpful. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a nested patch object and no parameter descriptions, the description is incomplete. It does not explain the semantics of patch fields, how they interact, or any prerequisites. The presence of an output schema helps with return values, but parameter usage and behavioral nuances are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description must compensate but provides no parameter information at all. It does not explain what document_type_id refers to or what the patch fields (name, match, is_insensitive, matching_algorithm) mean, leaving the agent to guess from names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'patch' and the resource 'document type', which conveys a partial update operation. It distinguishes from create/delete siblings but does not explicitly differentiate from bulk_edit_document_types, though the title and singular target imply single-resource update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives like create, delete, or bulk edit. There are no conditions, exclusions, or context cues to help an agent decide when this is the appropriate choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tagUpdate TagBIdempotent
Patch selected fields on a tag.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | ||
| tag_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| slug | No | |
| color | No | |
| match | No | |
| owner | No | |
| colour | No | |
| is_inbox_tag | No | |
| document_count | No | |
| is_insensitive | No | |
| user_can_change | No | |
| matching_algorithm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, covering safety. The description adds the partial-update behavior implied by 'Patch selected fields', but does not disclose any other consequences like validation rules, effect of omitted fields, or permission requirements. Minimal value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no filler. 'Patch selected fields on a tag' is front-loaded with the verb and resource, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite a rich nested patch schema and annotations, the description leaves field-level semantics and selection criteria unexplained. An agent cannot confidently know which patch fields are valid or what values they accept without deeper inference from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description needed to explain the parameters, but it only says 'selected fields' without listing which fields are patchable. tag_id and patch are inferable from names, but the six nested patch properties remain undocumented in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Patch') and resource ('a tag'), and 'selected fields' signals a partial update rather than full replacement. This clearly distinguishes update_tag from sibling tools like create_tag, delete_tag, and bulk_edit_tags.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives such as bulk_edit_tags or create_tag. There are no exclusions, preconditions, or explicit routing cues, so the agent must infer usage from the sibling list alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_documentUpload DocumentB
Upload a document. Returns the task UUID for polling via get_task.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| title | No | ||
| created | No | ||
| filename | Yes | ||
| correspondent | No | ||
| custom_fields | No | ||
| document_type | No | ||
| content_base64 | Yes | ||
| archive_serial_number | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the operation is asynchronous by returning a task UUID for polling via get_task. This is a critical behavioral trait not covered by the annotations (which only indicate it is not read-only). It adds useful context about the operation's non-blocking nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two short sentences that immediately state the action and the key return behavior. Every word earns its place, with no filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 9 parameters and no schema descriptions, the description is highly incomplete. It omits any explanation of parameter meanings, prerequisites, or how the polling process works beyond mentioning the task UUID. It fails to equip an agent to use the tool correctly without additional external knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for parameter meaning, but it provides none. It does not mention any of the 9 parameters, leaving the agent with no semantic guidance for required fields like filename and content_base64 or optional ones like tags and title.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Upload' and the resource 'document', and mentions the return of a task UUID for polling, which differentiates it from read-only tools like list_documents or get_document. It is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. It does not mention that it is for creating new documents, nor does it exclude any scenarios or mention prerequisites. The description simply states 'Upload a document' without any context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_taskWait for Task to FinishARead-onlyIdempotent
Poll until the task reaches a terminal state or times out.
| Name | Required | Description | Default |
|---|---|---|---|
| task_uuid | Yes | ||
| timeout_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| type | No | |
| result | No | |
| status | Yes | |
| task_id | Yes | |
| date_done | No | |
| task_type | No | |
| input_data | No | |
| result_data | No | |
| acknowledged | No | |
| date_created | Yes | |
| date_started | No | |
| status_display | No | |
| task_file_name | No | |
| trigger_source | No | |
| duration_seconds | No | |
| related_document | No | |
| task_type_display | No | |
| wait_time_seconds | No | |
| related_document_ids | No | |
| trigger_source_display | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description adds value by introducing the polling behavior and the terminal-state/timeout stopping condition. There is no contradiction with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence with no filler, repeating structured data, or irrelevant detail. It front-loads the core behavior and stopping condition efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity polling tool with an output schema and safety annotations, the description covers the essential behavior needed to invoke it. It could be slightly more explicit about what counts as a terminal state, but the timeout behavior is already reflected in the schema's timeout_seconds parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain task_uuid or timeout_seconds beyond what their names and schema constraints already imply. The tool's one-sentence overview does not compensate for the lack of parameter-level documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('poll'), a clear resource ('the task'), and an explicit exit condition ('reaches a terminal state or times out'). This makes it readily distinguishable from sibling tools like get_task and list_tasks, which retrieve task information rather than block until completion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage is implicitly clear: use this tool when you need to wait for a task to finish. However, the description does not explicitly state when to prefer it over alternatives such as get_task or list_tasks, nor does it mention any exclusions.
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.
11 tool updates
v2.1.0- Changed
get_document1 field changed- removed
Input schema / properties / include_contentRemoved value: -{ - "default": false, - "type": "boolean" -}
- Changed
get_document_content3 fields changed- added
Input schema / properties / document_id / descriptionAdded value: +"ID of the document to read." - added
Input schema / properties / max_charsAdded value: +{ + "default": 20000, + "description": "Maximum number of characters to return, up to 20,000.", + "exclusiveMinimum": 0, + "maximum": 20000, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Character position to start reading from. Pass the value\nnamed in a truncation marker to continue from where it stopped.", + "minimum": 0, + "type": "integer" +}
- Changed
get_remote_version1 field changed- added
Output schema / descriptionAdded value: +"``/api/remote_version/``: the newest release published on GitHub.\n\n``version`` is the latest release tag Paperless fetched from GitHub (its\nown 15-minute cache, ``\"0.0.0\"`` when that fetch failed), **not** the\nversion of the instance answering the call. Paperless parses its running\nversion only to compute ``update_available`` and never returns it.\n[verified: paperless-ngx ``src/documents/views.py``, ``RemoteVersionView``\nat ae9529551d17] For the running version see :class:`UiSettingsResponse`."
- Changed
get_saved_view6 fields changed- added
Output schema / properties / show_in_sidebar / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - changed
Output schema / properties / show_in_sidebar / defaultPrevious value: -falseNew value: +null - removed
Output schema / properties / show_in_sidebar / typeRemoved value: -"boolean" - added
Output schema / properties / show_on_dashboard / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - changed
Output schema / properties / show_on_dashboard / defaultPrevious value: -falseNew value: +null - removed
Output schema / properties / show_on_dashboard / typeRemoved value: -"boolean"
- Changed
get_task1 field changed- changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "acknowledged": { - "default": false, - "type": "boolean" - }, - "date_created": { - "format": "date-time", - "type": "string" - }, - "date_done": { - "anyOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "id": { - "type": "integer" - }, - "related_document": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "result": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "status": { - "enum": [ - "PENDING", - "STARTED", - "SUCCESS", - "FAILURE", - "RETRY", - "REVOKED" - ], - "type": "string" - }, - "task_file_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "task_id": { - "type": "string" - }, - "type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "required": [ - "id", - "task_id", - "date_created", - "status" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "description": "Task details with structured results and compatible legacy projections.", + "properties": { + "acknowledged": { + "default": false, + "type": "boolean" + }, + "date_created": { + "format": "date-time", + "type": "string" + }, + "date_done": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "date_started": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "duration_seconds": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + }, + "id": { + "type": "integer" + }, + "input_data": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null + }, + "related_document": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "related_document_ids": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "result": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "result_data": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null + }, + "status": { + "enum": [ + "PENDING", + "STARTED", + "SUCCESS", + "FAILURE", + "RETRY", + "REVOKED" + ], + "type": "string" + }, + "status_display": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "task_file_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "task_id": { + "type": "string" + }, + "task_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "task_type_display": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "trigger_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "trigger_source_display": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "wait_time_seconds": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "id", + "task_id", + "date_created", + "status" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
list_documents1 field changed- removed
Input schema / properties / include_contentRemoved value: -{ - "default": false, - "type": "boolean" -}
- Changed
list_saved_views6 fields changed- added
Output schema / properties / results / items / properties / show_in_sidebar / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - changed
Output schema / properties / results / items / properties / show_in_sidebar / defaultPrevious value: -falseNew value: +null - removed
Output schema / properties / results / items / properties / show_in_sidebar / typeRemoved value: -"boolean" - added
Output schema / properties / results / items / properties / show_on_dashboard / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - changed
Output schema / properties / results / items / properties / show_on_dashboard / defaultPrevious value: -falseNew value: +null - removed
Output schema / properties / results / items / properties / show_on_dashboard / typeRemoved value: -"boolean"
- Changed
list_tasks13 fields changed- added
Input schema / properties / task_typeAdded value: +{ + "anyOf": [ + { + "description": "Kinds of background work Paperless records in ``/api/tasks/``.\n\nThese are payload version 10 spellings. On version 9 fallback, the HTTP\nboundary translates the filter to task_name and maps sanity_check to\ncheck_sanity and llm_index to llmindex_update. Not every task kind exists\non Paperless 2.x. See\n``docs/design/reference/paperless-bulk-edit-indexing.md``.", + "enum": [ + "consume_file", + "train_classifier", + "sanity_check", + "index_optimize", + "mail_fetch", + "llm_index", + "empty_trash", + "check_workflows", + "bulk_update", + "reprocess_document", + "build_share_link", + "bulk_delete", + "apply_ai_suggestions" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / results / items / descriptionAdded value: +"Task details with structured results and compatible legacy projections." - added
Output schema / properties / results / items / properties / date_startedAdded value: +{ + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / results / items / properties / duration_secondsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / results / items / properties / input_dataAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / results / items / properties / related_document_idsAdded value: +{ + "items": { + "type": "integer" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / result_dataAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / results / items / properties / status_displayAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / results / items / properties / task_typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / results / items / properties / task_type_displayAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / results / items / properties / trigger_sourceAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / results / items / properties / trigger_source_displayAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / results / items / properties / wait_time_secondsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null +}
- Changed
search_documents1 field changed- removed
Input schema / properties / include_contentRemoved value: -{ - "default": false, - "type": "boolean" -}
- Changed
update_document1 field changed- removed
Input schema / properties / include_contentRemoved value: -{ - "default": false, - "type": "boolean" -}
- Changed
wait_for_task12 fields changed- added
Output schema / descriptionAdded value: +"Task details with structured results and compatible legacy projections." - added
Output schema / properties / date_startedAdded value: +{ + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / duration_secondsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / input_dataAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / related_document_idsAdded value: +{ + "items": { + "type": "integer" + }, + "type": "array" +} - added
Output schema / properties / result_dataAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / status_displayAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / task_typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / task_type_displayAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / trigger_sourceAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / trigger_source_displayAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / wait_time_secondsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null +}
1 tool update
v1.0.2- Added
get_server_info
49 tool updates
v1.0.1- First observed
add_document_note - First observed
bulk_edit_correspondents - First observed
bulk_edit_document_types - First observed
bulk_edit_documents - First observed
bulk_edit_tags - First observed
create_correspondent - First observed
create_custom_field - First observed
create_document_type - First observed
create_tag - First observed
delete_correspondent - First observed
delete_custom_field - First observed
delete_document - First observed
delete_document_note - First observed
delete_document_type - First observed
delete_tag - First observed
get_correspondent - First observed
get_custom_field - First observed
get_document - First observed
get_document_content - First observed
get_document_history - First observed
get_document_metadata - First observed
get_document_notes - First observed
get_document_suggestions - First observed
get_document_thumbnail - First observed
get_document_type - First observed
get_remote_version - First observed
get_saved_view - First observed
get_share_link - First observed
get_statistics - First observed
get_storage_path - First observed
get_tag - First observed
get_task - First observed
list_correspondents - First observed
list_custom_fields - First observed
list_document_types - First observed
list_documents - First observed
list_saved_views - First observed
list_share_links - First observed
list_storage_paths - First observed
list_tags - First observed
list_tasks - First observed
search_documents - First observed
update_correspondent - First observed
update_custom_field - First observed
update_document - First observed
update_document_type - First observed
update_tag - First observed
upload_document - First observed
wait_for_task
TDQS
Scored across 50 tools
Tools are grouped clearly by resource and action, so get_document, get_document_content, get_document_metadata, and get_document_notes are easy to distinguish despite all targeting a document by ID. The only mild overlap is list_documents versus search_documents, though their descriptions explain the metadata-filter vs full-text distinction.
The set overwhelmingly follows a snake_case verb_noun pattern with predictable singular/plural forms: list_*, get_*, create_*, update_*, delete_*, bulk_edit_*. Minor deviations like add_document_note versus get_document_notes and upload_document instead of create_document are understandable but break the otherwise consistent pattern.
50 tools is a very large surface for an agent to select from, even though Paperless has many resource types. Several resource groups are only read-only (storage paths, saved views, share links), which makes the high count feel heavier than necessary.
Documents, correspondents, tags, document types, and custom fields have solid CRUD coverage, and document retrieval/search is thorough. However, storage paths, saved views, and share links expose only list/get operations, and share-link creation is referenced but not present as a tool, leaving notable lifecycle gaps.
Maintenance
Related MCP Connectors
Document processing over MCP: merge, split and compress PDFs, run OCR, extract document text.
MCP server for the PDFGate API. Generate PDFs, manage documents and handle e-signatures.
Political Comms documentation MCP server: search docs, query the docs filesystem. No auth.
Document conversion MCP server: PDF to Markdown, image OCR, spreadsheet parsing.
Related MCP Servers
- FlicenseAqualityCmaintenanceMCP server for Paperless-ngx document management. Enables AI models to search, retrieve, update documents and manage metadata.7-
- FlicenseNot gradedqualityBmaintenanceEnables interaction with a paperless-ngx document management system through MCP tools, allowing document search, retrieval, upload, and metadata management via natural language.-
- FlicenseNot gradedqualityCmaintenanceMCP server for Paperless-ngx document management, enabling search, OCR content access, metadata updates, tag/correspondent/type management, and duplicate detection via natural language.-
- FlicenseNot gradedqualityCmaintenanceEnables MCP clients to search and retrieve documents from a self-hosted Paperless-ngx instance, including full OCR'd text and metadata, with read-only access enforced via API tokens.-