paperless-mcp
Paperless-NGX MCP Server
Paperless-NGX API 서버와 상호작용하기 위한 MCP(Model Context Protocol) 서버입니다. 이 서버는 Paperless-NGX 인스턴스에서 문서, 태그, 거래처, 문서 유형을 관리하기 위한 도구를 제공합니다.
빠른 시작
설치
MCP 구성 파일에 다음을 추가하세요:
// STDIO 모드(로컬 또는 CLI 사용에 권장)
"paperless": {
"command": "npx",
"args": [
"-y",
"@baruchiro/paperless-mcp@latest",
],
"env": {
"PAPERLESS_URL": "http://your-paperless-instance:8000",
"PAPERLESS_API_KEY": "your-api-token",
"PAPERLESS_PUBLIC_URL": "https://your-public-domain.com"
}
}// HTTP 모드(Docker 또는 원격 사용에 권장)
"paperless": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/baruchiro/paperless-mcp:latest",
],
"env": {
"PAPERLESS_URL": "http://your-paperless-instance:8000",
"PAPERLESS_API_KEY": "your-api-token",
"PAPERLESS_PUBLIC_URL": "https://your-public-domain.com"
}
}API 토큰을 가져옵니다:
Paperless-NGX 인스턴스에 로그인합니다
오른쪽 상단에서 사용자 이름을 클릭합니다
"내 프로필(My Profile)"을 선택합니다
원형 화살표 버튼을 클릭하여 새 토큰을 생성합니다
MCP 구성 파일의 자리 표시자를 바꿉니다:
http://your-paperless-instance:8000을(를) Paperless-NGX URL로your-api-token을(를) 방금 생성한 토큰으로https://your-public-domain.com을(를) 공개 Paperless-NGX URL로(선택 사항, PAPERLESS_URL로 대체됨)
환경 변수
변수 | 필수 | 기본값 | 설명 |
| 예 | — | Paperless-NGX 인스턴스의 기본 URL |
| 예 | — | Paperless-NGX 프로필의 API 토큰 |
| 아니요 |
| 문서 링크용 공개 URL |
| 아니요 |
| Paperless-ngx REST API 버전. |
| 아니요 | — |
|
이제 끝입니다! 이제 Claude에게 Paperless-NGX 문서 관리를 요청할 수 있습니다.
사용 예시
Claude에게 요청할 수 있는 작업의 예는 다음과 같습니다:
"'Invoice' 태그가 있는 모든 문서를 보여줘"
"'tax return'이 포함된 문서를 검색해 줘"
"'Receipts'라는 새 태그를 색상 #FF0000으로 만들어 줘"
"문서 #123을 다운로드해 줘"
"모든 거래처를 나열해 줘"
"'Bank Statement'라는 새 문서 유형을 만들어 줘"
Related MCP server: paperless-mcp
사용 가능한 도구
문서 작업
list_documents
간단한 필터로 문서의 페이지별 목록을 가져옵니다. 단순한 목록 작업에 사용하세요. 전체 텍스트 쿼리, 구조화된 사용자 정의 필드 필터링 또는 고급 Paperless 필터가 필요하면 query_documents를 사용하세요.
매개변수:
page (선택 사항): 페이지 번호
page_size (선택 사항): 페이지당 문서 수
search (선택 사항): 간단한 Paperless 검색어
correspondent (선택 사항): 거래처 ID
document_type (선택 사항): 문서 유형 ID
tag (선택 사항): 태그 ID
storage_path (선택 사항): 저장 경로 ID
created__date__gte (선택 사항): YYYY-MM-DD 이후(포함) 생성 날짜
created__date__lte (선택 사항): YYYY-MM-DD 이전(포함) 생성 날짜
ordering (선택 사항): Paperless 정렬 필드
archive_serial_number (선택 사항): 아카이브 일련번호
archive_serial_number__isnull (선택 사항): 아카이브 일련번호가 비어 있는지 여부
custom_field_query (선택 사항): 원시 JSON으로 인코딩된 Paperless 사용자 정의 필드 쿼리 문자열
custom_fields__icontains (선택 사항): 사용자 정의 필드 값에 대한 대소문자 구분 없는 부분 문자열 일치
list_documents({
page: 1,
page_size: 25
})query_documents
표준 문서 쿼리 도구입니다. 전체 텍스트 쿼리, 간단한 Paperless 검색, 사용자 정의 필드 필터, 문서화된 /api/documents/ Paperless 쿼리 매개변수를 지원합니다.
매개변수:
page (선택 사항): 페이지 번호
page_size (선택 사항): 페이지당 문서 수
ordering (선택 사항): Paperless 정렬 필드
query (선택 사항): 전체 텍스트 쿼리 문자열
search (선택 사항): 간단한 Paperless 검색어
more_like_id (선택 사항): 이 문서 ID와 유사한 문서 찾기
correspondent (선택 사항): 거래처 ID
document_type (선택 사항): 문서 유형 ID
tag (선택 사항): 태그 ID
storage_path (선택 사항): 저장 경로 ID
created__date__gte (선택 사항): YYYY-MM-DD 이후(포함) 생성 날짜
created__date__lte (선택 사항): YYYY-MM-DD 이전(포함) 생성 날짜
custom_field_query (선택 사항):
[field_name_or_id, operator, value]리프 또는["AND" | "OR", [clause1, clause2]]그룹을 사용하는 구조화된 Paperless 사용자 정의 필드 쿼리paperless_filters (선택 사항): 키/값 쌍으로 전달되는 추가 문서화된
/api/documents/Paperless 쿼리 매개변수
// Full-text query
query_documents({
query: "invoice 2024"
})
// Simple search term
query_documents({
search: "acme"
})
// Custom field exact match
query_documents({
custom_field_query: ["Invoice Number", "exact", "12345"]
})
// Custom field empty
query_documents({
custom_field_query: ["OR", [
["Invoice Number", "isnull", true],
["Invoice Number", "exact", ""]
]]
})
// Custom field missing
query_documents({
custom_field_query: ["Invoice Number", "exists", false]
})
// Combined filters
query_documents({
query: "invoice",
tag: 5,
created__date__gte: "2024-01-01",
custom_field_query: ["Invoice Number", "exists", true]
})
// One documented Paperless filter that is not a first-class argument
query_documents({
paperless_filters: {
id__in: [101, 202, 303]
}
})get_document
ID로 특정 문서를 가져옵니다.
매개변수:
id: 문서 ID
get_document({
id: 123
})search_documents
전체 텍스트 검색용으로 더 이상 사용되지 않는 호환성 래퍼입니다. 새 통합에서는 query_documents({ query: ... })를 사용하세요.
매개변수:
query: 검색 쿼리 문자열
search_documents({
query: "invoice 2024"
})download_document
ID로 문서 파일을 다운로드합니다.
매개변수:
id: 문서 ID
original (선택 사항): true이면 아카이브 버전 대신 원본 파일을 다운로드합니다
download_document({
id: 123,
original: false
})get_document_thumbnail
ID로 문서 썸네일(이미지 미리보기)을 가져옵니다. 썸네일을 base64로 인코딩된 WebP 이미지 리소스로 반환합니다.
매개변수:
id: 문서 ID
get_document_thumbnail({
id: 123
})bulk_edit_documents
여러 문서에 대해 일괄 작업을 수행합니다.
매개변수:
documents: 문서 ID 배열
method: 다음 중 하나:
set_correspondent: 문서의 거래처 설정
set_document_type: 문서의 문서 유형 설정
set_storage_path: 문서의 저장 경로 설정
add_tag: 문서에 태그 추가
remove_tag: 문서에서 태그 제거
modify_tags: 여러 태그 추가 및/또는 제거
delete: 문서 삭제
reprocess: 문서 재처리
set_permissions: 문서 권한 설정
merge: 여러 문서 병합
split: 문서를 여러 문서로 분할
rotate: 문서 페이지 회전
delete_pages: 문서에서 특정 페이지 삭제
메서드에 따른 추가 매개변수:
correspondent: set_correspondent용 ID
document_type: set_document_type용 ID
storage_path: set_storage_path용 ID
tag: add_tag/remove_tag용 ID
add_tags: modify_tags용 태그 ID 배열
remove_tags: modify_tags용 태그 ID 배열
set_permissions: 보기/변경 사용자 및 그룹을 지정하는 set_permissions용 객체(
{"view": {"users": [], "groups": []}, "change": {...}}). 생략된 작업/목록은 변경되지 않습니다owner: set_permissions용 사용자 ID(제거하려면 null). merge가 true가 아니면 owner를 생략하면 현재 소유자가 제거됩니다
merge: set_permissions용 부울 값 — true는 기존 권한에 추가하고 소유자를 유지하며, false(기본값)는 나열된 사용자/그룹을 대체합니다
metadata_document_id: 병합 시 메타데이터 소스를 지정하는 ID
delete_originals: merge/split용 부울 값
pages: split "[1,2-3,4,5-7]" 또는 delete_pages "[2,3,4]"용 문자열
degrees: rotate용 숫자(90, 180 또는 270)
예시:
// Add a tag to multiple documents
bulk_edit_documents({
documents: [1, 2, 3],
method: "add_tag",
tag: 5
})
// Set correspondent and document type
bulk_edit_documents({
documents: [4, 5],
method: "set_correspondent",
correspondent: 2
})
// Merge documents
bulk_edit_documents({
documents: [6, 7, 8],
method: "merge",
metadata_document_id: 6,
delete_originals: true
})
// Split document into parts
bulk_edit_documents({
documents: [9],
method: "split",
pages: "[1-2,3-4,5]"
})
// Modify multiple tags at once
bulk_edit_documents({
documents: [10, 11],
method: "modify_tags",
add_tags: [1, 2],
remove_tags: [3, 4]
})
// Modify custom fields
bulk_edit_documents({
documents: [12, 13],
method: "modify_custom_fields",
add_custom_fields: [
{ field: 2, value: "year" }
],
remove_custom_fields: []
})
// Set an empty custom field value, e.g. a date field used as a pending marker
bulk_edit_documents({
documents: [14],
method: "modify_custom_fields",
add_custom_fields: [
{ field: 9, value: "" }
],
remove_custom_fields: []
})post_document
Paperless-NGX에 새 문서를 업로드합니다.
두 가지 업로드 모드:
Base64 모드(기존 방식):
file(base64로 인코딩된 콘텐츠) +filename을 제공합니다파일시스템 모드(효율적):
file_path(서버의 절대 경로)를 제공합니다
보안 참고: file_path를 사용할 때는 PAPERLESS_MCP_UPLOAD_PATHS 환경 변수(허용 디렉터리의 콜론으로 구분된 목록)를 설정하여 업로드를 특정 위치로 제한하세요. 이 설정이 없으면 서버 파일시스템의 모든 파일을 업로드할 수 있습니다.
매개변수:
file (선택 사항): Base64로 인코딩된 파일 콘텐츠.
file또는file_path중 하나가 필요합니다.file_path (선택 사항): 서버 파일시스템에 있는 파일의 절대 경로.
file또는file_path중 하나가 필요합니다.filename (선택 사항): 파일 이름.
file과 함께 사용할 때 필수이며,file_path와 함께 사용할 때는 선택 사항입니다(경로에서 파생됨).title (선택 사항): 문서 제목
created (선택 사항): 문서가 생성된 날짜/시간(예: "2024-01-19" 또는 "2024-01-19 06:15:00+02:00")
correspondent (선택 사항): 거래처 ID
document_type (선택 사항): 문서 유형 ID
storage_path (선택 사항): 저장 경로 ID
tags (선택 사항): 태그 ID 배열
archive_serial_number (선택 사항): 아카이브 일련번호
custom_fields (선택 사항): 사용자 정의 필드 ID 배열
파일 크기 제한: 두 모드 모두 100MB
// Base64 mode (traditional)
post_document({
file: "base64_encoded_content",
filename: "invoice.pdf",
title: "January Invoice",
created: "2024-01-19",
correspondent: 1,
document_type: 2,
tags: [1, 3],
archive_serial_number: "2024-001",
custom_fields: [1, 2]
})
// Filesystem mode (more efficient for large files)
post_document({
file_path: "/var/uploads/invoice.pdf",
title: "January Invoice",
correspondent: 1,
document_type: 2,
tags: [1, 3]
})문서 메모
list_document_notes
문서에 첨부된 모든 메모를 나열합니다.
매개변수:
id: 문서 ID
list_document_notes({
id: 123
})create_document_note
문서에 메모를 추가합니다. 문서의 전체 메모 목록을 반환합니다.
매개변수:
id: 문서 ID
note: 추가할 메모 텍스트
create_document_note({
id: 123,
note: "Invoice paid on 2026-06-30 from Commerzbank account."
})delete_document_note
⚠️ 메모 ID로 문서에서 단일 메모를 삭제합니다. 이 작업은 되돌릴 수 없습니다.
매개변수:
id: 문서 ID
note_id: 삭제할 메모의 ID
confirm: 이 파괴적 작업을 확인하려면
true여야 합니다
delete_document_note({
id: 123,
note_id: 5,
confirm: true
})태그 작업
list_tags
모든 태그를 가져옵니다.
list_tags()create_tag
새 태그를 만듭니다.
매개변수:
name: 태그 이름
color (선택 사항): 16진수 색상 코드(예: "#ff0000")
match (선택 사항): 일치시킬 텍스트 패턴
matching_algorithm (선택 사항): 0에서 6 사이의 숫자: 0 - 없음 1 - 아무 단어 2 - 모든 단어 3 - 정확히 일치 4 - 정규 표현식 5 - 퍼지 단어 6 - 자동
create_tag({
name: "Invoice",
color: "#ff0000",
match: "invoice",
matching_algorithm: 5
})거래처 작업
list_correspondents
모든 거래처를 가져옵니다.
list_correspondents()create_correspondent
새 거래처를 만듭니다.
매개변수:
name: 거래처 이름
match (선택 사항): 일치시킬 텍스트 패턴
matching_algorithm (선택 사항): 0에서 6 사이의 숫자: 0 - 없음 1 - 아무 단어 2 - 모든 단어 3 - 정확히 일치 4 - 정규 표현식 5 - 퍼지 단어 6 - 자동
create_correspondent({
name: "ACME Corp",
match: "ACME",
matching_algorithm: 5
})문서 유형 작업
list_document_types
모든 문서 유형을 가져옵니다.
list_document_types()create_document_type
새 문서 유형을 만듭니다.
매개변수:
name: 문서 유형 이름
match (선택 사항): 일치시킬 텍스트 패턴
matching_algorithm (선택 사항): 0과 6 사이의 숫자: 0 - 없음 1 - 단어 중 하나 2 - 모든 단어 3 - 정확히 일치 4 - 정규 표현식 5 - 퍼지 단어 6 - 자동
create_document_type({
name: "Invoice",
match: "invoice total amount due",
matching_algorithm: 1
})사용자 정의 필드 작업
list_custom_fields
모든 사용자 정의 필드를 가져옵니다.
list_custom_fields()get_custom_field
ID로 특정 사용자 정의 필드를 가져옵니다.
매개변수:
id: 사용자 정의 필드 ID
get_custom_field({
id: 1
})create_custom_field
새 사용자 정의 필드를 생성합니다.
매개변수:
name: 사용자 정의 필드 이름
data_type: "string", "url", "date", "boolean", "integer", "float", "monetary", "documentlink", "select" 중 하나
extra_data (선택 사항): 선택 옵션 등 사용자 정의 필드에 대한 추가 데이터
create_custom_field({
name: "Invoice Number",
data_type: "string"
})update_custom_field
기존 사용자 정의 필드를 업데이트합니다.
매개변수:
id: 사용자 정의 필드 ID
name (선택 사항): 새 사용자 정의 필드 이름
data_type (선택 사항): 새 데이터 유형
extra_data (선택 사항): 사용자 정의 필드에 대한 추가 데이터
update_custom_field({
id: 1,
name: "Updated Invoice Number",
data_type: "string"
})delete_custom_field
사용자 정의 필드를 삭제합니다.
매개변수:
id: 사용자 정의 필드 ID
delete_custom_field({
id: 1
})bulk_edit_custom_fields
여러 사용자 정의 필드에 대해 일괄 작업을 수행합니다.
매개변수:
custom_fields: 사용자 정의 필드 ID 배열
operation: "delete" 중 하나
bulk_edit_custom_fields({
custom_fields: [1, 2, 3],
operation: "delete"
})메일 작업
Paperless 메일 계정과 자동 이메일 수집을 구동하는 메일 규칙을 관리하기 위한 도구입니다. 계정 비밀번호/토큰은 절대 노출되지 않으며 모든 도구 응답에서 마스킹됩니다.
list_mail_accounts
메일 규칙을 만들 때 필요한 계정 ID를 선택할 수 있도록 메일 계정을 나열합니다. 비밀번호는 마스킹됩니다.
매개변수:
page (선택 사항): 페이지 번호
page_size (선택 사항): 페이지당 결과 수
list_mail_accounts()get_mail_account
ID로 단일 메일 계정을 가져옵니다. 비밀번호/토큰 필드는 마스킹됩니다.
매개변수:
id: 메일 계정 ID
get_mail_account({
id: 1
})process_mail_account
하나의 계정에 대해 Paperless 메일 처리를 수동으로 트리거합니다. 계정에서 활성화된 메일 규칙에 따라 일치하는 메일을 처리할 수 있습니다.
매개변수:
id: 메일 계정 ID
process_mail_account({
id: 1
})list_mail_rules
선택적 페이지네이션으로 메일 규칙을 나열합니다.
매개변수:
page (선택 사항): 페이지 번호
page_size (선택 사항): 페이지당 결과 수
list_mail_rules()get_mail_rule
ID로 단일 메일 규칙을 가져옵니다.
매개변수:
id: 메일 규칙 ID
get_mail_rule({
id: 1
})create_mail_rule
메일 규칙을 생성합니다. 계정을 선택하려면 먼저 list_mail_accounts를 사용하세요.
필수 매개변수:
name: 규칙 이름
account: 메일 계정 ID
folder: 검색할 IMAP 폴더 (예: "INBOX")
일반적인 선택 매개변수:
enabled (기본값 true): 규칙이 활성화되어 있는지 여부
filter_from / filter_to / filter_subject / filter_body: 수신 메일 일치
maximum_age: 이 일수보다 최신 메일만 처리
action: 1=삭제, 2=폴더로 이동, 3=읽음으로 표시, 4=플래그, 5=태그
action_parameter: 선택한 작업의 대상 폴더/태그
assign_title_from: 1=제목, 2=첨부 파일 이름, 3=할당 안 함
assign_tags / assign_correspondent / assign_document_type: 적용할 메타데이터
assign_correspondent_from: 1=없음, 2=메일 주소, 3=보낸 사람 이름, 4=assign_correspondent 사용
attachment_type: 1=첨부 파일만, 2=인라인 포함 모든 파일
consumption_scope: 1=첨부 파일만, 2=.eml 형식의 전체 메일, 3=둘 다
pdf_layout: 0=시스템 기본값, 1=텍스트+HTML, 2=HTML+텍스트, 3=HTML만, 4=텍스트만
create_mail_rule({
name: "Invoices",
account: 1,
folder: "INBOX",
filter_subject: "invoice",
action: 3,
attachment_type: 1
})update_mail_rule
기존 메일 규칙을 패치합니다. 제공한 필드만 변경됩니다.
매개변수:
id: 메일 규칙 ID
...업데이트할
create_mail_rule필드 중 원하는 항목
update_mail_rule({
id: 1,
enabled: false
})delete_mail_rule
메일 규칙을 삭제합니다. 명시적인 확인 플래그가 필요합니다. 이 작업은 향후 메일 수집 동작을 변경하지만 기존 문서는 삭제하지 않습니다.
매개변수:
id: 메일 규칙 ID
confirm: 삭제를 확인하려면
true여야 합니다.
delete_mail_rule({
id: 1,
confirm: true
})오류 처리
다음과 같은 경우 서버가 명확한 오류 메시지를 표시합니다:
Paperless-NGX URL 또는 API 토큰이 올바르지 않은 경우
Paperless-NGX 서버에 연결할 수 없는 경우
요청한 작업이 실패하는 경우
제공된 매개변수가 유효하지 않은 경우
테스트
단위 테스트
단위 테스트 스위트를 실행합니다 (외부 종속성 불필요):
npm testE2E 테스트
E2E 스위트는 빈 Paperless-ngx 인스턴스를 부팅하고, 컴파일된 MCP 서버를 실행한 다음, tools/call 요청을 통해 결정적(deterministic) 직렬 시나리오를 구동합니다 — 태그, 발신처(correspondent), 문서 유형을 생성하고 PDF를 업로드한 다음 동일한 문서에 대해 list / get / search / download / thumbnail / bulk-edit을 실행합니다. MCP 외부의 LLM이나 Paperless REST 클라이언트는 사용하지 않습니다.
사전 요구 사항: Docker, Docker Compose 및 jq.
# 1. Build the MCP server
npm run build
# 2. Start Paperless-ngx
docker compose -f docker-compose.e2e.yml up -d
# 3. Wait for Paperless to be ready, then get a token
TOKEN=$(curl -s -X POST http://localhost:8000/api/token/ \
-H 'Content-Type: application/json' \
-d '{"username":"admin","password":"admin123"}' | jq -r '.token')
# 4. Start the MCP server
node build/index.js --http --port 3001 \
--baseUrl http://localhost:8000 --token "$TOKEN" &
MCP_PID=$!
# 5. Run the E2E tests
MCP_URL=http://localhost:3001/mcp \
PAPERLESS_URL=http://localhost:8000 \
PAPERLESS_TOKEN="$TOKEN" \
npm run test:e2e
# 6. Cleanup
kill "$MCP_PID"
docker compose -f docker-compose.e2e.yml down -vE2E 테스트는 모든 풀 리퀘스트와 main 브랜치 푸시 시 CI에서 자동으로 실행되며, build/index.js CLI와 게시된 Docker 이미지 모두를 대상으로 합니다.
개발
서버에 기여하거나 수정하고 싶으신가요? 알아야 할 사항은 다음과 같습니다:
저장소를 클론합니다.
종속성을 설치합니다:
npm installserver.js를 수정합니다.
로컬에서 테스트합니다:
node server.js http://localhost:8000 your-test-token서버는 다음으로 구축되었습니다:
API 문서
이 MCP 서버는 Paperless-NGX REST API의 엔드포인트를 구현합니다. 기본 API에 대한 자세한 내용은 공식 문서를 참조하세요.
MCP 서버 실행
MCP 서버는 두 가지 모드로 실행할 수 있습니다:
1. stdio (기본값)
이것은 기본 모드입니다. 서버는 stdio를 통해 통신하며, CLI 및 직접 통합에 적합합니다.
npm run start -- <baseUrl> <token>2. HTTP (Streamable HTTP Transport)
서버를 HTTP 서비스로 실행하려면 --http 플래그를 사용하세요. --port로 포트를 지정할 수도 있습니다 (기본값: 3000). 이 모드에서는 Express가 설치되어 있어야 합니다 (종속성으로 포함되어 있습니다).
npm run start -- <baseUrl> <token> --http --port 3000MCP API는 지정된 포트의
POST /mcp에서 사용할 수 있습니다.각 요청은 StreamableHTTPServerTransport 패턴에 따라 상태 비저장(stateless) 방식으로 처리됩니다.
/mcp에 대한 GET 및 DELETE 요청은 405 Method Not Allowed를 반환합니다.
요청별 API 토큰 (HTTP/Docker 모드)
HTTP 모드에서 클라이언트는 표준 Authorization 헤더를 통해 Paperless-NGX API 토큰을 제공하여 인증합니다:
Authorization: Bearer <paperless-ngx-api-token>토큰은 Paperless-NGX로 직접 전달되므로 각 클라이언트의 Paperless 권한이 종단 간(end-to-end) 적용됩니다. 이를 통해 단일 서버 인스턴스가 각자 자신의 토큰을 가진 여러 사용자에게 서비스를 제공할 수 있습니다. 동일한 동작이 /mcp 및 /sse 엔드포인트 모두에 적용됩니다.
⚠️ v2.0.0의 주요 변경 사항 — HTTP 모드는 이제 기본적으로 인증됩니다.
이전에는
Authorization헤더가 없는 요청이 서버에 구성된PAPERLESS_API_KEY로 자동 대체되어, 포트에 접근할 수 있는 모든 사람에게 HTTP 엔드포인트가 열려 있었습니다. v2.0.0부터는Bearer토큰이 없는 요청은401 Unauthorized로 거부됩니다. 서버 토큰은--no-auth로 명시적으로 선택하지 않는 한 인증되지 않은 요청에 절대 사용되지 않습니다.
시나리오 |
|
|
클라이언트가 |
|
|
헤더 없음, |
| 서버 토큰 |
헤더 없음, 서버 토큰 없음 |
|
|
v1.x에서 마이그레이션: 토큰을 보내지 않는 클라이언트와 단일 공유 PAPERLESS_API_KEY를 사용하는 이전 폴백(fallback) 방식에 의존했다면 두 가지 옵션이 있습니다:
권장: 각 클라이언트가
Authorization: Bearer <paperless-token>을 보내도록 합니다.이전 동작 복원 (신뢰할 수 있는 로컬 네트워크 전용):
--no-auth플래그로 서버를 시작합니다. 예를 들어 Dockercommand/args 또는 CLI 호출에 추가하세요. 이 경우 서버 토큰(PAPERLESS_API_KEY또는--token)이 구성되어 있어야 합니다.
MCP 서버는 Docker 및 Docker Compose를 사용하여 배포할 수 있습니다. Docker 이미지는 포트 3000에서 SSE(Server-Sent Events) 지원과 함께 HTTP 모드로 자동 실행됩니다.
Docker Compose 구성
docker-compose.yml 파일을 생성합니다:
services:
paperless-mcp:
container_name: paperless-mcp
image: ghcr.io/baruchiro/paperless-mcp:latest
environment:
- PAPERLESS_URL=http://your-paperless-ngx-server:8000
- PAPERLESS_API_KEY=your-paperless-api-key
- PAPERLESS_PUBLIC_URL=https://paperless-ngx.yourpublicurl.com
ports:
- "3000:3000"
restart: unless-stopped그런 다음 실행합니다:
docker-compose up -dContinue VS Code 확장과 함께 사용
Continue VS Code 확장을 사용하는 경우 SSE를 통해 Docker화된 MCP 서버를 사용하도록 구성할 수 있습니다.
작업 공간 루트에 .continue/mcpServers/paperless-mcp.yaml을 생성하거나 편집합니다:
name: Paperless
version: 0.0.1
schema: v1
mcpServers:
- name: Paperless
type: sse
url: http://localhost:3000/sse참고:
원격 서버에서 실행하는 경우
localhost를 Docker 호스트의 IP 주소 또는 호스트 이름으로 바꾸세요.Docker 컨테이너는 환경 변수를 통해 인증을 처리하므로 Continue 구성에 자격 증명이 필요하지 않습니다.
SSE 엔드포인트는 구성된 포트(기본값: 3000)의
/sse에서 사용할 수 있습니다.
크레딧
이 프로젝트는 nloui/paperless-mcp의 포크입니다. 원저자의 작업에 깊이 감사드립니다. 기여와 개선 사항은 업스트림으로 반환될 수 있습니다.
디버깅
VS Code에서 MCP 서버를 디버깅하려면 다음 실행 구성을 사용하세요:
{
"type": "node",
"request": "launch",
"name": "Debug Paperless MCP (HTTP, ts-node ESM)",
"program": "${workspaceFolder}/node_modules/ts-node/dist/bin.js",
"args": [
"--esm",
"src/index.ts",
"--http",
"--baseUrl",
"http://your-paperless-instance:8000",
"--token",
"your-api-token",
"--port",
"3002"
],
"env": {
"NODE_OPTIONS": "--loader ts-node/esm",
},
"console": "integratedTerminal",
"skipFiles": [
"<node_internals>/**"
]
}중요: 디버깅 전에 src/index.ts의 다음 줄(약 175행)의 주석을 해제하세요:
// await new Promise((resolve) => setTimeout(resolve, 1000000));이렇게 하면 서버가 즉시 종료되지 않으며 중단점을 설정하고 코드를 디버깅할 수 있습니다.
Available Tools
44 toolsbulk_edit_correspondentsC
Bulk edit correspondents. ⚠️ WARNING: 'delete' operation permanently removes correspondents from the entire system.
| Name | Required | Description | Default |
|---|---|---|---|
| merge | No | ||
| owner | No | ||
| confirm | No | Must be true when operation is 'delete' to confirm destructive operation | |
| operation | Yes | ||
| permissions | No | ||
| correspondent_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the safety burden and does disclose that the 'delete' operation permanently removes correspondents system-wide, which is genuinely useful. However, it says nothing about the other operation (set_permissions), permission/auth requirements, or that a confirm flag is mandatory, leaving important behavior undisclosed.
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 short sentences with the destructive warning front-loaded and no wasted words. Efficient, though it is under-informative rather than over-specified.
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 6-parameter destructive bulk tool with nested objects, no output schema, and no annotations, the description is far too thin. It covers only the delete hazard and omits the second operation, parameter meanings, and return behavior.
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 only 17%, so the description should compensate but instead mentions no parameters at all. The nested permissions object, merge, owner, and even the enum values are left unexplained in both the description and largely 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 verb ('bulk edit') and resource ('correspondents'), but this is essentially a restatement of the tool name. It signals the bulk scope, which distinguishes it from the singular update_correspondent/delete_correspondent siblings, but adds little beyond that.
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 versus the singular update_correspondent or delete_correspondent, or versus other bulk_edit_* tools. The only hint is the embedded warning about the delete operation; no prerequisites or alternative selection criteria are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_edit_custom_fieldsB
Bulk edit custom fields. ⚠️ WARNING: 'delete' operation permanently removes custom fields from the entire system.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true when operation is 'delete' to confirm destructive operation | |
| operation | Yes | ||
| custom_fields | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the safety burden, and it does disclose the key trait: 'delete' permanently removes fields from the entire system, which is a global, irreversible side effect beyond the schema. It omits auth requirements and what happens to documents using the deleted fields, keeping it short of a 5.
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 short sentences, with the destructive warning surfaced up front and no filler. Efficient, though it spends words on 'bulk edit' framing that the schema actually narrows to delete-only.
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 mutation with no annotations and no output schema, the description covers the critical hazard but omits prerequisites (confirm must be true), the delete-only operation reality, and any return behavior. Adequate but with clear 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 coverage is only 33%, so the description should compensate but adds nothing about parameters. The custom_fields array of numbers (field IDs) is undocumented, and the confirm flag's destructive-precondition role is left entirely to 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 names a verb ('bulk edit') and resource ('custom fields'), but 'edit' oversells the tool: the operation enum permits only 'delete', so a reader expecting edits could be misled. It also does not distinguish this from the sibling delete_custom_field.
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 on when to use this bulk tool versus the singular delete_custom_field, nor when bulk deletion is appropriate over individual calls. The delete warning hints at scope but never states the selecting condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_edit_documentsB
Perform bulk operations on multiple documents. Note: 'remove_tag' removes a tag from specific documents (tag remains in system), while 'delete_tag' permanently deletes a tag from the entire system. ⚠️ WARNING: 'delete' method permanently deletes documents and requires confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| merge | No | For set_permissions: true adds to existing permissions and keeps the current owner; false (default) replaces the listed users/groups | |
| owner | No | For set_permissions: new owner user ID, or null to remove the owner. Unless merge is true, omitting owner also clears the current owner. | |
| pages | No | ||
| method | Yes | ||
| confirm | No | Must be true when method is 'delete' to confirm destructive operation | |
| degrees | No | ||
| add_tags | No | ||
| documents | Yes | ||
| remove_tags | No | ||
| storage_path | No | ||
| correspondent | No | ||
| document_type | No | ||
| set_permissions | No | For set_permissions: view/change permissions to apply. Omitted actions (view/change) and omitted users/groups lists are left untouched; an empty list [] removes all (unless merge is true). Omit entirely for owner-only changes. | |
| delete_originals | No | ||
| add_custom_fields | No | ||
| metadata_document_id | No | ||
| remove_custom_fields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It usefully discloses that 'delete_tag' is system-wide and permanent, and that 'delete' permanently deletes documents and needs confirmation. But it remains silent on side effects, permissions, or reversibility for the remaining methods (set_permissions, merge, split, reprocess, etc.).
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 tight sentences: purpose first, then method distinction, then destructive warning. Nothing is wasted, though given the tool's breadth it is arguably too sparse rather than too long.
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 18 parameters, 14 methods, nested objects, no annotations, and no output schema, the description is substantially incomplete. It covers only a fraction of the method semantics and parameter meanings an agent would need 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 only 22%, so the description must compensate. It explains the distinction between two method values but adds no meaning for core parameters like 'tag', 'documents', 'pages', 'storage_path', or most of the 14 enum methods, leaving most parameters undocumented.
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 specific verb+resource ('Perform bulk operations on multiple documents'), which clearly separates it from single-document siblings like update_document and from other bulk tools. However, it does not enumerate what kinds of operations are available beyond the two tag methods it calls out, so it stops short of full sibling differentiation.
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 explicit guidance for choosing between two similar methods ('remove_tag' vs 'delete_tag') and warns that 'delete' requires confirmation, which is useful. But it gives no guidance on when to use this bulk tool versus other tools, and no context for the other 11 methods.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_edit_document_typesB
Bulk edit document types. ⚠️ WARNING: 'delete' operation permanently removes document types from the entire system.
| Name | Required | Description | Default |
|---|---|---|---|
| merge | No | ||
| owner | No | ||
| confirm | No | Must be true when operation is 'delete' to confirm destructive operation | |
| operation | Yes | ||
| permissions | No | ||
| document_type_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses that the 'delete' operation permanently removes document types system-wide, which is critical context beyond the schema. However, it omits other behavioral traits such as required permissions, the effect of set_permissions, and any rate limits or side effects for non-delete operations.
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, front-loading the purpose and clearly marking the destructive warning. It is appropriately sized and easy to parse.
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 a complex mutation tool with 6 parameters, nested objects, no annotations, no output schema, and 17% schema coverage, the description is substantially incomplete. It covers purpose and delete danger but leaves the main non-delete operation, parameter meanings, and required confirmation behavior (documented only in schema) unexplored.
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 only 17% (only the confirm parameter has a description). The description adds meaning only for the 'delete' enum value, but does not explain document_type_ids, merge, owner, permissions, or the set_permissions operation. It does not compensate for the low schema coverage.
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 ('Bulk edit document types'), clearly distinguishing it from siblings like bulk_edit_documents or bulk_edit_tags. However, it does not indicate what kinds of edits are supported (e.g., set_permissions vs delete) beyond the warning, leaving the purpose slightly less specific than a 5 would require.
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 explicit guidance on when to use this tool versus alternatives such as delete_document_type, update_document_type, or other bulk_edit_* tools. The warning about the 'delete' operation provides a condition but not a tool-selection rule, and no prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_edit_tagsC
Bulk edit tags. ⚠️ WARNING: 'delete' operation permanently removes tags from the entire system. Use with caution.
| Name | Required | Description | Default |
|---|---|---|---|
| merge | No | ||
| owner | No | ||
| confirm | No | Must be true when operation is 'delete' to confirm destructive operation | |
| tag_ids | Yes | ||
| operation | Yes | ||
| permissions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose that 'delete' permanently removes tags system-wide, which is the single most important behavioral fact and is not stated in the schema. However, it omits the confirmation requirement, the set_permissions behavior, and whether the operation is reversible or requires elevated permissions.
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 short sentences with the destructive warning front-loaded and no filler. Efficient, though the extreme brevity is partly the source of the coverage gaps.
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 6-parameter mutation tool with nested permission objects, no annotations, no output schema, and very low schema coverage, the description is far too thin. It should explain the two operation modes and the confirm gate, and at minimum sketch the permissions/owner/merge 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 only 17% across 6 parameters, so the description must compensate and it largely does not. It names 'delete' as an operation value but says nothing about confirm, merge, owner, permissions, or tag_ids semantics, leaving most parameters undocumented in both places.
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 verb and resource ('bulk edit tags'), so the purpose is discernible, but it is essentially a restatement of the tool name and gives no scope detail (what 'bulk edit' encompasses: set_permissions vs delete). It does not distinguish this tool from siblings like bulk_edit_documents or update_tag/delete_tag beyond the 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?
The warning implies caution for the 'delete' operation, but there is no explicit when-to-use guidance, no statement of when to prefer this over individual update_tag/delete_tag, and no mention of the required 'confirm' flag that gates the destructive path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_correspondentC
Create a new correspondent with optional matching pattern and algorithm for automatic document assignment.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| match | No | ||
| matching_algorithm | No | Matching algorithm: 0=None, 1=Any word, 2=All words, 3=Exact match, 4=Regular expression, 5=Fuzzy word, 6=Automatic |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. For a mutation tool it says nothing about permissions, name-uniqueness/duplicate handling, idempotency, or what is returned after creation. It only hints that match/matching_algorithm drive automatic document assignment, which is useful but thin.
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 well-formed sentence with the core action front-loaded and no filler. It is appropriately sized, though it stops short of adding any operational detail.
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 3-parameter create tool with no output schema and no annotations, the description covers the action and the optional fields' intent. It leaves gaps on return value and on how the matching fields interact with existing documents, which matters given the tool's stated purpose of automatic assignment.
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 33% – only matching_algorithm is documented in the schema, and it is documented exhaustively (0-6 enum meanings). The description compensates partially by explaining that 'match' is a pattern and 'matching_algorithm' governs automatic assignment, but it does not clarify match syntax (regex vs. plain) despite algorithm 4 being regex.
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 specific verb and resource ('Create a new correspondent') and adds the purpose of the optional fields ('matching pattern and algorithm for automatic document assignment'). An agent can tell it apart from get_correspondent/update_correspondent by name, but the description does not explicitly contrast it with those 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?
No when-to-use, when-not-to-use, or alternative guidance is given. The only implied usage is the verb 'create', and there is no mention of update_correspondent for existing records or list_correspondents for lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_custom_fieldC
Create a new custom field with a specified data type (string, url, date, boolean, integer, float, monetary, documentlink, or select). For monetary fields, values must use currency code prefix format (e.g., USD10.00, GBP123.45) — NOT trailing symbol format (e.g., 10.00$).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| data_type | Yes | ||
| extra_data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does add genuine behavioral content: the accepted data_type set and the currency-prefix validation rule for monetary values. However, it omits other mutation traits — permission requirements, duplicate-name behavior, irreversibility, and what extra_data does — leaving significant gaps.
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, front-loaded with the core action and the type list, then the noteworthy monetary caveat. Every clause earns its place; only minor redundancy in listing all nine types already present in the enum.
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 mutation tool with no annotations, no output schema, and an undocumented `extra_data` parameter, the description is under-specified. It covers the happy path of creating a typed field but not side effects, failure modes, or the extra payload.
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%, so the description must compensate. It enumerates the data_type values (matching the enum) and explains monetary value formatting, but says nothing about `name` constraints or the open-ended `extra_data` object, which is the most opaque parameter.
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 specific verb+resource ("Create a new custom field") and adds the key discriminator, the data_type that shapes the field. It is clearly distinguishable from list/update/delete_custom_field siblings, though it does not name them explicitly.
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 when-to-use, when-not-to-use, or alternative guidance is given. The agent must infer that this is the creation counterpart to update_custom_field purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_document_noteA
Add a note to a document. Use this to record an audit trail or progress note directly on the document. Returns the document's full list of notes after the note is added.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The document ID | |
| note | Yes | The note text to add |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the effect and the return payload ('Returns the document's full list of notes after the note is added'), but says nothing about required permissions, whether the note is mutable or deletable afterward, or failure behavior when the document ID does not exist.
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 tight sentences with the action front-loaded, followed by usage context and the return value. 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 simple two-parameter create tool with no annotations or output schema, the description covers purpose, a usage scenario, and the return payload. It is nearly complete; only auth/idempotency details are absent.
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% and the schema already documents 'id' (document ID) and 'note' (note text with minLength 1). The description adds no syntax, format, or length guidance beyond what the schema supplies, so the baseline 3 applies.
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 specific verb and resource ('Add a note to a document') that cleanly separates it from sibling tools like list_document_notes and delete_document_note. The sentence also clarifies the note is attached to the document itself, not a global record.
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?
Offers a concrete use case ('record an audit trail or progress note directly on the document'), which implies context, but does not state when NOT to use it or name alternatives (e.g. update_document, custom fields) for recording information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_document_typeC
Create a new document type with optional matching pattern and algorithm for automatic document classification.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| match | No | ||
| matching_algorithm | No | Matching algorithm: 0=None, 1=Any word, 2=All words, 3=Exact match, 4=Regular expression, 5=Fuzzy word, 6=Automatic |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a write/mutation but says nothing about uniqueness of name, behavior on duplicate, permissions required, or what the created type looks like. Only the classification purpose hints at downstream 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?
A single front-loaded sentence with no filler; the optional parameters are noted up front. It is efficient, though it could be slightly richer given the missing behavioral detail.
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 mutation tool with no annotations and no output schema, the description leaves important gaps: side effects, name uniqueness/conflict handling, and return shape are unaddressed, and one of three parameters is undocumented in both schema and description.
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 only 33%: 'matching_algorithm' is fully documented in-schema (enum 0–6), while 'name' and 'match' are undocumented. The description partially compensates by framing 'match' as a matching pattern and both extras as optional, but gives no format or example for the pattern.
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+resource ('Create a new document type') and adds the purpose ('for automatic document classification'), which distinguishes it from sibling read tools like get_document_type. It does not explicitly disambiguate from create_tag or create_correspondent, but the create+resource framing is clear.
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 explicit when-to-use guidance, no mention of alternatives like list_document_types or update_document_type, and no prerequisites. The phrase 'for automatic document classification' implies intent but leaves the agent to infer when to reach for this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_mail_ruleB
Create a Paperless mail rule. Use list_mail_accounts first to choose account. Prefer attachment-only rules for invoices unless the full mail must be archived.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| order | No | ||
| owner | No | ||
| action | No | Mail rule action: 1=Delete, 2=Move to specified folder, 3=Mark as read/don't process read mails, 4=Flag/don't process flagged mails, 5=Tag/don't process tagged mails | |
| folder | Yes | ||
| account | Yes | ||
| enabled | No | ||
| filter_to | No | ||
| pdf_layout | No | PDF layout for full-mail consumption: 0=System default, 1=Text then HTML, 2=HTML then text, 3=HTML only, 4=Text only | |
| assign_tags | No | ||
| filter_body | No | ||
| filter_from | No | ||
| maximum_age | No | ||
| filter_subject | No | ||
| attachment_type | No | Attachment type: 1=Only process attachments, 2=Process all files including inline attachments | |
| action_parameter | No | ||
| assign_title_from | No | Title assignment: 1=Use subject as title, 2=Use attachment filename as title, 3=Do not assign title from rule | |
| consumption_scope | No | Consumption scope: 1=Only process attachments, 2=Process full mail as .eml, 3=Process full mail and attachments separately | |
| assign_correspondent | No | ||
| assign_document_type | No | ||
| assign_owner_from_rule | No | ||
| assign_correspondent_from | No | Correspondent assignment: 1=Do not assign, 2=Use mail address, 3=Use sender name or address, 4=Use assign_correspondent | |
| filter_attachment_filename_exclude | No | ||
| filter_attachment_filename_include | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, yet it only hints at the attachment-vs-full-mail tradeoff. It says nothing about what happens once the rule is created (whether it starts fetching mail), permission requirements, or side effects for a 24-parameter mutating tool.
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 tight sentences with the core action front-loaded and no filler. The use-case advice is compact, though it is somewhat narrow relative to the tool's breadth.
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 high-complexity creation tool with 24 parameters, no annotations, no output schema, and 25% schema coverage, the description is far too thin. It omits the behavioral and parameter context an agent needs 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 only 25%, and the description explains almost none of the 24 parameters beyond gesturing at account and attachment-only behavior. With low coverage the description should compensate, but it leaves most fields (order, action, filters, assign_* mappings) entirely to the sparse 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 opens with a specific verb+resource, 'Create a Paperless mail rule,' which is unambiguous and clearly distinct from get/update/delete_mail_rule siblings. However, it does not explicitly name those siblings or differentiate create from update, so it stops short of full sibling routing.
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?
It gives a concrete prerequisite ('Use list_mail_accounts first to choose account') and a situational recommendation ('Prefer attachment-only rules for invoices unless the full mail must be archived'). That is actionable, though it never addresses when to update vs create a rule or any preconditions beyond account selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_tagC
Create a new tag with optional color, matching pattern, and matching algorithm for automatic document tagging.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| color | No | ||
| match | No | ||
| matching_algorithm | No | Matching algorithm: 0=None, 1=Any word, 2=All words, 3=Exact match, 4=Regular expression, 5=Fuzzy word, 6=Automatic |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, yet it only says 'Create.' It does not state whether the name must be unique, what happens on conflict, whether the operation requires specific permissions, or what the response contains – all material for a mutation tool.
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 no wasted words. It is efficient, though its brevity is part of why behavioral and parameter detail is missing.
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 4-parameter mutation tool with zero annotation coverage, no output schema, and 25% schema description coverage, the description leaves too much undisclosed – validation rules, uniqueness, permissions, and return behavior are all absent.
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 only 25% (only matching_algorithm is documented). The description loosely labels three optional fields but never explains the color hex format, the syntax of the 'match' pattern, or the valid name constraints, so it does not 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?
States a specific verb ('Create') and resource ('a new tag') and enumerates the optional facets it accepts. It is clearly distinguishable from siblings like list_tags, update_tag, and delete_tag, though it does not explicitly name any of 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 when-to-use guidance is given, no prerequisites, and no mention of alternatives such as update_tag or bulk_edit_tags. The reader must infer that this is the creation path 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_correspondentA
⚠️ DESTRUCTIVE: Permanently delete a correspondent from the entire system. This will affect ALL documents that use this correspondent.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | Yes | Must be true to confirm this destructive operation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the two most important traits: the deletion is permanent (irreversible) and it cascades to ALL documents using the correspondent. It still omits permission/auth requirements and any recoverability detail beyond 'permanently'.
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 tight sentences, with the destructive warning emoji and 'DESTRUCTIVE' keyword front-loaded before the mechanical detail. No 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 simple two-parameter destructive tool with no annotations and no output schema, the description covers the essential consequence model (permanent + system-wide cascade). It stops short of permission requirements or recovery options, which would complete the picture.
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 only 50% – 'id' has no schema description and the description adds no meaning for it either. The description explains no parameter semantics, so it fails to compensate for the coverage gap even though 'confirm' is self-documented in 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?
States a specific verb+resource ('Permanently delete a correspondent') plus the system-wide scope ('from the entire system'), which the sibling delete_tag/delete_document_type do not share. An agent can distinguish this from update_correspondent or bulk_edit_correspondents immediately.
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 makes the consequence explicit, which implies caution, but never states when to choose this over alternatives such as update_correspondent or bulk_edit_correspondents, nor any prerequisite. Usage is implied by the destructive warning rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_custom_fieldA
⚠️ DESTRUCTIVE: Permanently delete a custom field from the entire system. This will remove the field from ALL documents that use it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | Yes | Must be true to confirm this destructive operation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well on the most important trait: it discloses that deletion is permanent and cascading, removing the field from ALL documents that use it. It omits any auth/permission requirements and the response shape, so it is strong but not exhaustive.
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, zero waste, with the destructive warning and permanence front-loaded ahead of the cascading impact. Ideal sizing for a simple delete 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?
For a two-parameter destructive tool with no annotations and no output schema, the description covers the essential risk (permanent, system-wide removal). Minor gaps remain around permissions and the confirmation behavior, which the schema only partially covers.
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 only 50% (the 'id' parameter is undocumented). The description adds nothing about either parameter, not even mentioning the required 'confirm' gate or what 'id' refers to, 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?
States a specific verb and resource ('Permanently delete a custom field') and scopes it precisely ('from the entire system'), which distinguishes it from the many sibling delete_* tools for tags, correspondents, document types, etc. An agent can select it unambiguously.
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 when-to-use or when-not-to-use guidance: nothing says when to delete versus update or bulk_edit_custom_fields, nor mentions prerequisites beyond the schema's confirm flag. The destructive warning signals caution but not tool selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_document_noteA
⚠️ DESTRUCTIVE: Permanently delete a single note from a document by its note ID. This operation is irreversible. Returns the document's remaining notes.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The document ID | |
| confirm | Yes | Must be true to confirm this destructive operation | |
| note_id | Yes | The ID of the note to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it flags the operation as destructive, states it is permanent and irreversible, and discloses that the return value is the document's remaining notes. It does not mention permission/auth requirements, which is the remaining gap.
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 tightly written sentences with the DESTRUCTIVE warning and irreversibility front-loaded, then the return value. 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 three-parameter destructive tool with no output schema, the description covers the safety profile, irreversibility, key parameter meaning, and return shape. Only a note about required permissions or a pointer to sibling list/bulk tools 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?
Schema description coverage is 100%, so the schema already documents id, note_id, and confirm. The description adds only that deletion targets a 'note' by 'note ID' and implies a document context, which is marginal added value. Baseline 3 applies.
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 specific verb (delete), resource (a single note on a document), and the lookup key (note ID). It is clearly distinguishable from siblings like list_document_notes and create_document_note.
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?
Usage is implied by the destructive warning and the singular scope ('a single note'), but there is no explicit when-to-use vs alternatives guidance (e.g., to remove many notes use bulk_edit_documents, or to list notes first use list_document_notes). No exclusions or prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_document_typeB
⚠️ DESTRUCTIVE: Permanently delete a document type from the entire system. This will affect ALL documents that use this type.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | Yes | Must be true to confirm this destructive operation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it does disclose two important traits: the deletion is permanent (irreversible) and it cascades to ALL documents using that type. It omits permission requirements and what happens to the affected documents' type assignment, so it is strong but not complete.
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 short sentences with the warning icon and DESTRUCTIVE keyword front-loaded, followed immediately by the blast radius. Zero 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 system-wide destructive tool with no annotations and no output schema, the description covers the danger well but leaves open the confirmation requirement, authorization needs, and the effect on documents that reference the deleted type. Adequate but with clear 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 coverage is only 50% (id is undocumented), and the description says nothing about either parameter. Notably, it never mentions the required 'confirm' flag, which is central to a destructive operation, so it does not 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?
States a specific verb and resource ('delete a document type') and adds scope ('from the entire system'), which distinguishes it from bulk_edit_document_types. However, it doesn't name any alternative operation (e.g., update_document_type), so sibling differentiation is only implicit.
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 versus update_document_type or bulk_edit_document_types, nor any stated prerequisites. The destructive warning implies caution but gives no condition that selects this tool over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_mail_ruleB
Delete one Paperless mail rule. This changes future mail ingestion behavior but does not delete documents.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | Yes | Must be true to confirm deleting the rule |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose a genuinely non-obvious behavioral trait (affects future mail ingestion, does not delete documents), but omits reversibility, whether the confirm flag is required for safety, and permission requirements.
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 tight sentences, front-loaded with the action and then the key scoping caveat. Nothing redundant or padded.
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 small destructive tool with no annotations and no output schema, the description covers the blast radius but leaves the id parameter, reversibility, and confirmation requirement unexplained across all surfaces. Adequate but with clear 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 coverage is only 50% and the description adds no parameter meaning at all. The 'id' parameter has no description anywhere, and the 'confirm' semantics ('must be true') live only in the schema, so the description 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?
States a specific verb+resource ('Delete one Paperless mail rule') and immediately scopes it against the confusing sibling domain by clarifying it does not delete documents. It is distinguishable from delete_document_note/delete_tag and from create_mail_rule/update_mail_rule, though it never names an alternative directly.
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?
Usage is implied rather than stated: an agent can infer this is for removing a mail rule, and the ingestion-behavior note hints at the consequence. There is no explicit when-to-use vs update_mail_rule (e.g. disabling instead of deleting) and no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_tagA
⚠️ DESTRUCTIVE: Permanently delete a tag from the entire system. This will remove the tag from ALL documents that use it. Use with extreme caution.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | Yes | Must be true to confirm this destructive operation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does disclose the key traits: the operation is destructive, permanent, and cascades across the entire system. It omits auth/permission requirements, whether the deletion is recoverable, and what happens to the tag's other relationships, but the core behavioral risk is clearly surfaced.
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 tight sentences with the destructive warning front-loaded. The trailing caution sentence is somewhat redundant with the opener but small enough not to be wasteful.
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 delete with no output schema, the description is largely complete: it conveys destructiveness, permanence, and global scope. Missing only the param explanation for id and any auth/cascade-recovery context, which are minor for this tool's complexity.
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 only 50%: the confirm parameter is self-documented, but id has no description in the schema and none in the description either. The description adds no parameter-level meaning beyond the schema, so it neither compensates for the gap nor confuses anything.
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 specific verb (delete) and resource (tag), and goes further by scoping the effect: 'from the entire system' and 'from ALL documents that use it.' An agent can distinguish this from sibling tag tools like update_tag or bulk_edit_tags immediately.
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?
'Use with extreme caution' is a warning, not usage guidance. It never says when to prefer this over alternatives such as update_tag (removing a tag from a single document) or bulk_edit_tags, nor does it state preconditions beyond the schema's confirm flag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_documentB
Download a document file by ID. Returns a paperless:// resource URI; read the resource to fetch the file content.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| original | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose a genuinely non-obvious behavior: the tool does not return file bytes but a paperless:// resource URI that must then be read. It says nothing about permissions, file size, or error behavior, so it is only partially transparent for a no-annotation tool.
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 short sentences, zero filler, and the most important information (the URI indirection) is placed immediately after the core action. Nothing needs trimming.
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 output schema, the description does the right thing by explaining the return shape (a resource URI), which covers the biggest gap. But the undocumented 'original' parameter and the absence of any guidance about when to use this over sibling content-retrieval tools leave it short of 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 there are 2 parameters. The description accounts for 'id' implicitly ('by ID') but adds no format or constraint detail, and completely ignores the 'original' boolean, leaving an agent unable to tell what it does from either schema or description.
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 specific verb ('Download') and resource ('a document file by ID'), which is clear enough to separate it from list/query siblings. However, it never distinguishes itself from the closely related get_document_content or get_document_thumbnail, so sibling differentiation is left to inference.
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 sentence 'read the resource to fetch the file content' implies the two-step download flow, which is useful implied guidance. But there is no explicit when-to-use versus get_document_content or get_document_thumbnail, and no statement of prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_correspondentA
Get a specific correspondent by ID with full details including matching rules.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the response includes full details and matching rules, which is useful behavioral context, but says nothing about error behavior for invalid IDs, permissions, or read-only 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?
A single front-loaded sentence with no waste. It is short and efficient, though it could carry slightly more routing information at the same length.
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 no output schema or annotations, the description conveys the key facts (identifies record by ID, returns full details plus matching rules). It omits error/edge-case behavior but is largely sufficient.
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 there is one parameter. The description identifies the parameter's purpose ('by ID'), which compensates minimally for the single undocumented param, but adds no type or format 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?
States a specific verb (Get) and resource (correspondent) with scope ('by ID') and return detail ('full details including matching rules'). This distinguishes it from list_correspondents, though it never names that sibling explicitly.
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 phrase 'by ID' implies the tool is for single-record retrieval versus the list variant, but there is no explicit when-to-use guidance or named alternative. Usage is only inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_custom_fieldB
Get a specific custom field by ID with full details including data type and extra configuration.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It usefully notes the return includes data type and extra configuration, which hints at the response shape, but says nothing about permissions, failure behavior when the ID does not exist, or whether this is strictly read-only.
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 efficient sentence that front-loads the action and the output promise. No padding 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 one-parameter read tool with no output schema, the description covers the basics of what is returned. However, with no annotations and no output schema, the agent still lacks detail on error cases and the exact structure of the returned 'extra configuration'.
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 schema only types the id as a number with no description. The description repeats 'by ID' without adding format, source, or range guidance, so it fails to compensate for the undocumented parameter.
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 (get) plus resource (custom field) and scope (by ID, full details). It implicitly distinguishes itself from list_custom_fields by requiring an ID, though it never names the list/create/update siblings explicitly.
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 explicit when-to-use guidance and no alternatives named. The phrase 'by ID' implies the caller must already have an identifier (presumably from list_custom_fields), but that inference is left 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.
get_documentA
Get a specific document by ID with full details including correspondent, document type, tags, and custom fields. Note: Document content is excluded from results by default. Use 'get_document_content' to retrieve content when needed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses that document content is omitted by default, which is real behavioral information beyond the schema, but it says nothing about permissions, error behavior for invalid IDs, or whether the result is cached/fresh.
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, zero filler, and the most important constraint (content excluded, use the sibling tool) is front-loaded right after the purpose statement.
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 output schema and no annotations, the description compensates by enumerating the returned metadata fields and flagging the excluded content field. That covers most of what an agent needs for a single-parameter read tool; only input format and failure behavior remain unstated.
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?
There is one parameter (id) with 0% schema description coverage. The description implies the argument is a document identifier via 'by ID', which adds marginal meaning, but does not state expected format (the schema type is number) or whether it accepts other identifiers. Adequate but thin for a fully undocumented parameter.
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 specific verb (get) and resource (document by ID) and enumerates the shape of what is returned: correspondent, document type, tags, custom fields. It also explicitly distinguishes itself from get_document_content, so an agent can route correctly without opening any 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?
It names the primary alternative (get_document_content) and the exact condition that selects it (content excluded by default). It does not address when to use this versus list_documents, query_documents, or search_documents, but the content-vs-metadata split is the highest-value distinction and it is stated explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_contentA
Get the text content of a specific document by ID. Use this when you need to read or analyze the actual document text.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It says nothing about permissions, whether large documents are truncated, pagination, or what happens with non-text/binary documents, which is a notable gap for a content-retrieval tool.
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 tight sentences with the action front-loaded followed by the use case. 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?
With no output schema and no annotations, the description should say more about what comes back (raw text, truncation, encoding) and any access requirements. It covers the basic intent but leaves the agent guessing about the return payload.
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 single 'id' parameter is bare, but the description does clarify that the ID refers to a specific document. It adds no format constraints, valid range, or relation to other identifiers, so it only partially compensates for the schema 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?
States a specific verb and resource: retrieve the text content of a document identified by ID. This distinguishes it reasonably from the metadata-oriented 'get_document' and the image-oriented 'get_document_thumbnail', though it never names those siblings explicitly.
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?
Gives a clear use condition: 'when you need to read or analyze the actual document text.' That differentiates it from metadata or thumbnail retrieval in spirit, but it stops short of naming alternatives (get_document, download_document) or excluding cases (e.g., binary/non-text documents).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_thumbnailB
Get a document thumbnail (image preview) by ID. Returns a paperless:// resource URI; read the resource to fetch the image content.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it does disclose a genuinely useful behavioral trait: the call returns a paperless:// resource URI that must then be read to obtain image bytes. However, it omits other relevant behavior such as what happens when a document has no thumbnail, any permission requirements, or the image format/size.
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 short sentences with zero filler; the purpose is front-loaded and the two-step retrieval behavior follows immediately. 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?
For a one-parameter read tool with no output schema and no annotations, the description covers the essential contract including the non-obvious two-step resource-URI return. Only minor gaps remain, such as missing-thumbnail behavior and image characteristics.
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, and 'by ID' at least establishes that the single integer parameter identifies the document. It adds no constraints, format, or example beyond that, so it is only partially compensating for the undocumented parameter.
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 specific verb and resource ('Get a document thumbnail') and parenthetically disambiguates it as an image preview, which separates it from text-oriented siblings like get_document_content or get_document. It does not explicitly name any sibling, so it falls short of full differentiation.
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 when-to-use or when-not-to-use guidance, and no mention of the adjacent tools (get_document_content, get_document, download_document) an agent might confuse it with. The usage is only implied by the description of what is returned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_typeB
Get a specific document type by ID with full details including matching rules.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It helpfully signals that the response includes 'full details including matching rules,' but says nothing about whether this is a safe read, error behavior for invalid IDs, permissions, or rate limits.
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 no filler; the core action and scope are stated immediately. It is efficiently sized for a trivial single-parameter getter.
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 tool with no output schema, the description is minimally sufficient and gestures at return content ('matching rules'). It still leaves the return shape, error cases, and read-only nature unstated.
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?
There is a single required parameter with 0% schema description coverage, so the schema does not document 'id' at all. The description only says 'by ID,' clarifying that the parameter is an identifier but adding no detail on type, format, or expected 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?
States a specific verb and resource ('Get a specific document type') and nodes its scope by ID, which implicitly separates it from the sibling list_document_types. It does not name a sibling explicitly, so it stops short of the top score.
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 phrase 'by ID' implies you call this when you already have an identifier and want single-record detail, but there is no explicit when-to-use guidance, no exclusion, and no mention of when to prefer list_document_types or update_document_type instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mail_accountA
Get one Paperless mail account by ID. Password/token fields are redacted if the server returns them.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses that password/token fields are redacted in the response, but does not state permission requirements or confirm the read-only nature beyond the verb 'Get'.
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 short sentences with no filler; the core action is front-loaded and the redaction caveat follows. 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?
For a simple single-record getter with no output schema, the description covers the action and the notable redaction behavior. It omits what fields are returned and any failure/not-found behavior, leaving some gaps for an agent.
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 'id' parameter has 0% schema description coverage, so the description must compensate. It only says 'by ID', which restates the obvious integer identifier without adding format or lookup semantics, though the parameter is fairly self-evident.
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 specific verb+resource ('Get one Paperless mail account') and scopes it to a single record by ID, which implicitly distinguishes it from list_mail_accounts. It does not name the sibling explicitly, but an agent can still tell it apart.
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?
Usage is only implied: use this when you already have an account ID and want its details rather than the full list. There is no explicit when-to-use, when-not, or reference to list_mail_accounts as the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mail_ruleB
Get one Paperless mail rule by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Get' implies a read, but it says nothing about behavior on a missing/invalid ID, required permissions, or what is returned; for a zero-annotation tool this is a substantial gap.
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 with the key scoping information front-loaded and 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 simple single-param getter the description is arguably sufficient, but with no annotations, no output schema, and 0% parameter documentation, an agent gets no safety or error-handling context. Adequate as a minimum but with clear 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?
There is one parameter at 0% schema description coverage, so the description must compensate. Saying 'by ID' confirms the parameter identifies a mail rule, but adds no format, range, or type detail beyond that; a minimal but non-zero contribution.
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 (Get) and resource (Paperless mail rule) scoped to a single entity by ID, which separates it from the sibling list_mail_rules. It is clear but does not explicitly name the alternatives it is distinguished from.
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 when-to-use guidance is given and no alternatives (e.g., list_mail_rules for discovery, get_mail_account for accounts) are mentioned. The only implied usage is fetching a rule whose ID is already known.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_correspondentsC
List all correspondents with optional filtering and pagination. Correspondents represent entities that send or receive documents.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| ordering | No | ||
| page_size | No | ||
| name__iexact | No | ||
| name__icontains | No | ||
| name__iendswith | No | ||
| name__istartswith | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. 'List' implies a read-only operation, but there is no explicit statement about safety, permissions, rate limits, pagination defaults, or what the response contains.
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 tightly written sentences with zero waste. The core purpose is front-loaded, followed by a brief clarifying 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?
For a 7-parameter list endpoint with no annotations, no output schema, and no schema descriptions, the description is too sparse. It omits parameter explanations, pagination behavior, filtering syntax, and return format details.
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 7 parameters at 0% description coverage, so the description must compensate. It only vaguely refers to 'filtering and pagination' without naming or explaining any of the specific name filters, ordering, page, or page_size 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?
States a specific verb ('List') and resource ('correspondents'), and adds a definition of what correspondents are. It implicitly distinguishes from single-item siblings like get_correspondent, but does not explicitly name alternatives or contrast 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?
Mentions optional filtering and pagination, which hints at capabilities, but provides no guidance on when to use this tool versus get_correspondent or other list tools, nor any conditions or prerequisites for filtering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_custom_fieldsA
List all custom fields. IMPORTANT: When a user query may refer to a custom field, you should fetch all custom fields up front (with a large enough page_size), cache them for the session, and search locally for matches by name before making further API calls. This reduces redundant requests and handles ambiguity efficiently.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| ordering | No | ||
| page_size | No | ||
| name__iexact | No | ||
| name__icontains | No | ||
| name__iendswith | No | ||
| name__istartswith | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses genuine behavioral traits (caching strategy, page_size guidance, request-reduction intent), but omits return format, read-only confirmation, and permission/auth needs for a list operation.
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?
Front-loaded with the core purpose, then a clearly flagged IMPORTANT workflow note. Efficient overall, though the caching instruction is somewhat verbose for a single-line purpose.
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?
No output schema and no annotations means the description should carry more, yet it is heavily weighted toward workflow advice while leaving most parameter semantics and the return shape unexplained. Adequate for a list tool but with clear gaps for 7 undocumented params.
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% across 7 parameters, and the description only adds meaning to one of them (page_size, described as needing to be 'large enough'). page, ordering, and the four name filtering operators (name__iexact/icontains/iendswith/istartswith) are left entirely undocumented in both schema and description, leaving the compensation gap unfilled.
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 specific verb and resource ('List all custom fields') that an agent can immediately disambiguate from get_custom_field, create/update/delete_custom_field, and bulk_edit_custom_fields in the sibling set. The scope ('all') is clear, though slightly at odds with the exposed name-filter params.
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?
Gives explicit operational guidance: fetch up front with a large page_size, cache for the session, and search locally before further API calls. This is strong 'when to use' context, but it never names the sibling alternatives (e.g., get_custom_field for a single record) so the routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_document_notesA
List all notes attached to a document. Notes are free-text comments on a document and are the natural place for an audit trail (e.g. "invoice paid on X from account Y") or progress notes on an action item.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The document ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden; "List" does imply a read-only operation, and the description characterizes the returned data as free-text comments. It does not disclose ordering, pagination, or whether an empty result is possible for a document with no notes, leaving some behavioral gaps for a no-annotation tool.
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 short sentences, front-loaded with the core purpose, and the second sentence adds domain meaning rather than filler. Slightly more elaboration than strictly necessary for a one-parameter list 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?
For a simple, single-parameter read tool with no output schema, the description covers purpose and the nature of the returned notes adequately. Remaining gaps (result shape, ordering) are minor given the tool's low complexity.
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 one parameter at 100% schema description coverage, the schema already documents the required "id" as the document ID. The description adds no format, type, or constraint information about the parameter, so the baseline 3 applies.
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+resource ("List all notes attached to a document"), so an agent immediately knows what the tool returns. It stops short of naming sibling note tools (create_document_note, delete_document_note), so the read-vs-write distinction is inferred from the verb rather than stated.
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 second sentence explains what notes are and gives example use cases (audit trail, progress notes on an action item), which implies when reading them is valuable. However, it never states when to use this tool versus alternatives like get_document or query_documents, and there are no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_documentsA
List and filter documents with pagination and common Paperless filters such as title search, correspondent, document type, tag, storage path, creation date, archive serial number, and simple custom field filters. Use 'query_documents' for full-text query, structured custom field conditions, or advanced documented /api/documents/ query parameters. IMPORTANT: For queries like 'the last 3 contributions' or when searching by tag, correspondent, document type, or storage path, first use the relevant lookup tool to find the correct ID. Note: Document content is excluded from results by default. Use 'get_document_content' when you need the document text.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| page | No | ||
| search | No | ||
| ordering | No | ||
| page_size | No | ||
| storage_path | No | ||
| correspondent | No | ||
| document_type | No | ||
| created__date__gte | No | ||
| created__date__lte | No | ||
| custom_field_query | No | ||
| archive_serial_number | No | ||
| custom_fields__icontains | No | ||
| archive_serial_number__isnull | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose meaningful behavior: results are paginated, document content is excluded by default, and lookups are required to obtain filter IDs. It stops short of stating auth/permission needs or response shape/pagination mechanics, but the key surprise (missing content) is flagged.
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?
It is longer than typical but front-loaded with the core action, then routing, then cautions in descending priority. Minor redundancy: the exclusion note and the get_document_content pointer state the same thing twice, but each sentence still 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 14-parameter, zero-coverage, no-output-schema tool, the description covers what it returns (documents without content), when to resolve IDs, and which sibling to prefer. The remaining gap is parameter-level format guidance, which the 0%-coverage schema leaves undocumented.
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% across 14 parameters, so the description must compensate. It names the filter concepts (title search, correspondent, document type, tag, storage path, creation date, ASN, simple custom field filters) but never maps them to parameter names or explains formats for ordering, page/page_size, or how custom_field_query differs from custom_fields__icontains and archive_serial_number__isnull.
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+resource ('List and filter documents') and immediately scopes it with pagination and the concrete Paperless filter set. It explicitly distinguishes itself from query_documents (full-text, structured conditions, advanced API params) and from get_document_content, so an agent can separate it from siblings 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?
It gives explicit routing rules: use query_documents for full-text/advanced queries, use the relevant lookup tool first to resolve tag/correspondent/type/storage-path IDs, and use get_document_content for text. Both a positive path and named alternatives are provided, plus the ID-resolution prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_document_typesA
List all document types. IMPORTANT: When a user query may refer to a document type or tag, you should fetch all document types and all tags up front (with a large enough page_size), cache them for the session, and search locally for matches by name or slug before making further API calls. This reduces redundant requests and handles ambiguity between tags and document types efficiently.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| ordering | No | ||
| page_size | No | ||
| name__iexact | No | ||
| name__icontains | No | ||
| name__iendswith | No | ||
| name__istartswith | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose meaningful behavior: this is a cheap, cacheable, session-level lookup best fetched with a large page_size. It omits auth requirements, pagination/return shape, and what happens at the page_size limit, which keeps it short of a 5.
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?
Front-loads the one-line purpose before the IMPORTANT block, and the guidance sentences each add operational value. Slightly verbose for a list endpoint, but nothing is padded.
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?
No output schema and no annotations, so the description should cover more ground. It handles the workflow/caching story well but says nothing about return values or the seven input parameters, leaving an agent partially equipped for anything beyond the 'fetch everything and filter locally' path.
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?
Seven parameters at 0% schema description coverage, yet the description only alludes to page_size and never explains the name__iexact, name__icontains, name__istartswith, or name__iendswith filters or the ordering parameter. It actually advises client-side filtering instead of using the server-side name filters, leaving their semantics entirely unexplained.
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 specific verb and resource ('List all document types') that cleanly separates it from the sibling get_document_type, create_document_type, and update_document_type. An agent can identify the operation 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?
Gives explicit when-to-use guidance: fetch this alongside all tags up front when a user query may reference a document type or tag, cache for the session, and match locally before further API calls. It also frames why (reduces redundant requests, resolves tag/document-type ambiguity), which is stronger than a bare 'use this to list'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mail_accountsB
List Paperless mail accounts for selecting the account ID needed by mail rules. Does not expose account passwords.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| page_size | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses a security-relevant trait ('Does not expose account passwords') and 'List' implies a read-only operation, but it says nothing about pagination, ordering, or what happens when no accounts exist.
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 short sentences, purpose front-loaded before the security caveat, with no filler or restated schema text.
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?
There is no output schema, so the description should ideally sketch the return shape (IDs, names) and pagination, which it does not. What it does cover — purpose and the password caveat — is accurate but leaves an agent guessing about result structure and paging.
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 the two parameters (page, page_size). For a paginated list tool, pagination semantics are relevant and are left entirely undocumented in both places.
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 specific verb ('List') and resource ('mail accounts'), plus the downstream purpose of obtaining an account ID for mail rules. It implicitly separates itself from get_mail_account (singular) and list_mail_rules, though it never names 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?
The description tells the agent why one would call it (to get an account ID for mail rules), which is useful implied guidance, but it gives no when-not-to-use condition and never points to a sibling for fetching a single account's details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mail_rulesC
List Paperless mail rules with optional pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| page_size | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and delivers little: it implies a read-only listing but never states it, and says nothing about ordering, default result size, pagination limits, or permissions.
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 efficient sentence with the resource front-loaded and no filler. It is appropriately sized, though the size reflects under-specification rather than discipline.
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 tool with 0% schema coverage and no annotations or output schema, the description should explain pagination defaults, ordering, and result shape. It does none of this, leaving key invocation details 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 coverage is 0%, so the two parameters ('page', 'page_size') are undocumented by type, default, or bounds. The description only gestures at 'optional pagination' without explaining either parameter's semantics or defaults.
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 specific verb (List) and resource (Paperless mail rules), which distinguishes it from the sibling get_mail_rule and the mail account tools. It lacks explicit sibling differentiation text, but the name and scope are 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 on when to use this versus get_mail_rule or list_mail_accounts, and no conditions or prerequisites are given. The agent must infer usage purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsB
List all tags. IMPORTANT: When a user query may refer to a tag or document type, you should fetch all tags and all document types up front (with a large enough page_size), cache them for the session, and search locally for matches by name or slug before making further API calls. This reduces redundant requests and handles ambiguity between tags and document types efficiently.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| ordering | No | ||
| page_size | No | ||
| name__iexact | No | ||
| name__icontains | No | ||
| name__iendswith | No | ||
| name__istartswith | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses a caching/pagination usage pattern (use a large page_size, cache the result), which is genuinely useful behavioral context, but says nothing about authentication, rate limits, return format, or what happens on large result sets.
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?
Front-loaded with the core action ('List all tags') before the guidance block, which is good structure. However, the trailing justification sentence ('This reduces redundant requests and handles ambiguity...') restates benefits already implied and pads the 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?
No annotations, no output schema, and 7 parameters with 0% documentation. The description covers a workflow strategy but leaves the actual input semantics and the shape of the returned tags unexplained, so an agent cannot reliably construct filtered or paginated calls from 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 coverage is 0% across 7 parameters, so the schema explains none of them. The description only hints at page_size; it entirely omits page, ordering, and the four name__i* filter parameters, leaving the agent to guess at filtering and pagination 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 a clear verb+resource ('List all tags') and even acknowledges the adjacent resource (document types), so the agent can place it among the list_* siblings. It falls short of 5 because it never distinguishes itself from other list_* tools such as list_correspondents or list_custom_fields, which behave identically at the surface level.
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?
Gives strong prescriptive guidance: fetch tags and document types up front with a large page_size, cache for the session, and resolve ambiguity by local name/slug matching. It clearly says when to call this tool, though it stops short of explicit when-not conditions or naming list_document_types as the paired call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_documentA
Upload a new document to Paperless-NGX with optional metadata like title, correspondent, document type, tags, and custom fields. Provide either 'file' (base64-encoded content) or 'file_path' (absolute path to a file on the server's filesystem). Using file_path avoids base64 encoding overhead for large files. SECURITY: When using file_path, set PAPERLESS_MCP_UPLOAD_PATHS environment variable to restrict uploads to specific directories (colon-separated paths).
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Base64-encoded file content. Either 'file' or 'file_path' must be provided. | |
| tags | No | ||
| title | No | ||
| created | No | ||
| filename | No | Filename for the uploaded document. Required when using 'file', optional when using 'file_path' (defaults to the basename of the path). | |
| file_path | No | Absolute path to a file on the server's filesystem. Either 'file' or 'file_path' must be provided. The filename is derived from the path unless 'filename' is also specified. For security, configure PAPERLESS_MCP_UPLOAD_PATHS to restrict allowed directories. | |
| storage_path | No | ||
| correspondent | No | ||
| custom_fields | No | ||
| document_type | No | ||
| archive_serial_number | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does add real context: the server-side filesystem read implied by file_path, the filename derivation default, and the PAPERLESS_MCP_UPLOAD_PATHS security restriction. It omits failure behavior and whether processing is synchronous, which keeps it short of a 5.
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 sentences, front-loaded with purpose before the file/file_path mechanics and security note. The uppercase SECURITY sentence is slightly heavy but the content 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 mutation tool with no annotations or output schema and 11 partially documented parameters, the description covers the upload mechanics well but leaves several parameters and the response/processing outcome unexplained. Adequate but with clear 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 coverage is only 27% across 11 parameters. The description names the major fields (title, correspondent, document type, tags, custom fields) and explains the file/file_path/filename relationship, but says nothing about created, storage_path, or archive_serial_number, leaving those opaque.
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 ('Upload a new document to Paperless-NGX') and enumerates the optional metadata it accepts. This clearly separates it from sibling operations like update_document, create_document_note, or download_document.
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?
It gives clear usage conditions: supply either 'file' (base64) or 'file_path' (server path), and prefer file_path to avoid base64 overhead for large files. It does not name alternative tools, but for a create/upload operation there is no close sibling to route against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_mail_accountB
Manually run Paperless mail processing for one account. This can consume matching mails according to enabled Paperless mail rules.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It does disclose a key side effect: processing 'can consume matching mails according to enabled Paperless mail rules', which warns that mail may be removed/changed. However, it omits permissions required, idempotency, whether the run is synchronous, and failure 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?
Two compact sentences with the action front-loaded and the side-effect caveat second. No filler, though the second sentence is somewhat hedged ('can consume').
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 trigger/mutation tool with no annotations and no output schema, the description covers the core action and the consuming side effect but leaves meaningful gaps: prerequisites, whether the account must be enabled, sync/async behavior, and result reporting. Adequate but not 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% for the single 'id' parameter, so the description must compensate. Saying 'for one account' hints that id is a mail account identifier, but it adds no format, valid-range, or sourcing detail beyond what the bare integer schema 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?
States a specific verb and resource: 'manually run Paperless mail processing for one account'. This clearly distinguishes it from read-oriented siblings like get_mail_account and list_mail_accounts. It is not fully differentiated from other triggering actions, but the action 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 word 'Manually' implies this is an on-demand trigger rather than a scheduled process, which is useful context, but the description never states when to use this versus letting rules run automatically, nor any prerequisites (e.g., account must be configured/enabled). Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_documentsA
Query documents using the full-text query engine plus structured Paperless filters. Use this for complex filtering, custom field conditions, or any documented /api/documents/ query parameters that are not exposed as first-class arguments. Prefer the dedicated top-level arguments where available. custom_field_query supports [field_name_or_id, operator, value] leaves or ['AND'|'OR', [clause1, clause2]] groups. Note: Document content is excluded from results by default. Use 'get_document_content' when you need the document text.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| page | No | ||
| query | No | ||
| search | No | ||
| ordering | No | ||
| page_size | No | ||
| more_like_id | No | ||
| storage_path | No | ||
| correspondent | No | ||
| document_type | No | ||
| paperless_filters | No | Additional documented /api/documents/ Paperless filters. Keys must match Paperless query parameter names exactly. Prefer first-class arguments when available. | |
| created__date__gte | No | ||
| created__date__lte | No | ||
| custom_field_query | No | Paperless custom field query. Use [field_name_or_id, operator, value] for a single clause or ['AND'|'OR', [clause1, clause2]] for grouped clauses. | |
| archive_serial_number | No | ||
| custom_fields__icontains | No | ||
| archive_serial_number__isnull | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden, and it does disclose one important behavior (document content is excluded by default) plus the custom_field_query grammar. It omits pagination behavior, result shape, and auth/permission requirements, so significant behavioral ground is left uncovered.
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?
Purpose is front-loaded, followed by usage, syntax detail, and a closing caveat. Sentences are dense and mostly earn their place, though the two 'prefer top-level arguments' statements feel slightly redundant.
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 17-parameter, nested-object tool with no annotations and no output schema, the description covers purpose, usage, one behavioral caveat, and query grammar. It still leaves the majority of the parameters and the pagination/return behavior unexplained, so it is adequate but incomplete.
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 only 12% across 17 parameters, so the description must compensate. It explains custom_field_query leaf/group syntax and paperless_filters purpose well, but the many first-class args (tag, correspondent, document_type, ordering, page_size, date bounds) remain undocumented in both schema and description.
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 specific verb+resource ('Query documents') and scopes it to the full-text engine plus structured Paperless filters, routing the agent to get_document_content for text. It does not, however, differentiate itself from the very similar siblings list_documents and search_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?
Explicitly says to use it for complex filtering, custom field conditions, and undocumented /api/documents/ parameters, and to prefer dedicated top-level arguments when available. It lacks any exclusion against the closest alternatives (search_documents, list_documents), leaving the primary routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documentsA
Deprecated compatibility wrapper for full-text document search. Use 'query_documents' with the 'query' argument for new integrations. Note: Document content is excluded from results by default. Use 'get_document_content' to retrieve content when needed.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it discloses two important traits: deprecated status and that document content is excluded from results by default. It does not cover pagination, result limits, or auth requirements, but the content-exclusion note is the key non-obvious behavior an agent needs.
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 tight sentences, front-loaded with the deprecation warning, then the replacement route, then the content caveat. No filler 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?
For a single-parameter deprecated wrapper with no output schema and no annotations, the description covers purpose, migration path, and the notable return-content caveat. Only the query parameter's semantics remain undocumented.
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 single 'query' parameter has no documentation. The description only indirectly hints at the parameter by referencing query_documents' 'query' argument; it adds no syntax, format, or matching-semantics detail for this tool's own parameter.
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 specific verb and resource ('full-text document search') and immediately frames it as a deprecated compatibility wrapper, which lets an agent distinguish it from the live sibling, query_documents, without opening any 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?
Explicitly names the alternative ('Use query_documents with the query argument for new integrations') and gives a second routing rule ('Use get_document_content to retrieve content when needed'). Both the when-to-use and when-not-to-use conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_correspondentC
Update an existing correspondent's name, matching pattern, or matching algorithm.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| name | Yes | ||
| match | No | ||
| matching_algorithm | No | Matching algorithm: 0=None, 1=Any word, 2=All words, 3=Exact match, 4=Regular expression, 5=Fuzzy word, 6=Automatic |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies mutation and lightly signals that the target must already exist ('an existing correspondent'), but says nothing about permissions, whether fields are optional/partial, or reversibility of changes.
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 zero filler. It is efficient, though extremely terse for a mutation tool with four 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 simple update tool with no output schema and no annotations, the description is minimally viable: the agent knows the resource and mutable fields. But with low schema coverage and no disclosure of return behavior or partial-update semantics, it stops short of full context.
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 only 25% (only matching_algorithm is documented in-schema). The description partly compensates by naming the updatable fields (name, match, matching_algorithm), but it leaves the required 'id' identifier and the 'match' pattern semantics unexplained, so it adds only marginal 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?
States a specific verb (update) plus the resource (correspondent) and enumerates the mutable fields (name, matching pattern, matching algorithm). The intent is unmistakable, though it doesn't call out how it differs from siblings like 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?
No when-to-use guidance and no alternatives named. An agent must infer from the naming convention alone that bulk_edit_correspondents handles multiple records and that create_correspondent is the creation path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_custom_fieldC
Update an existing custom field's name, data type, or extra configuration data.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| name | No | ||
| data_type | No | ||
| extra_data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It says 'update' but does not disclose whether this is a partial or full replacement, what permissions are required, whether omitted fields are preserved, or how the change is confirmed. This is a significant gap for a mutation tool with zero annotation coverage.
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 efficient sentence with the operation front-loaded. Nothing is wasted, though it is too terse to convey the semantics it omits.
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 mutation tool with no annotations, no output schema, and 0% parameter coverage, the description is insufficient. It should explain update semantics, required permissions, and the meaning of the required id and enum-constrained data_type.
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, and it only loosely maps to three of the four parameters (name, data_type, extra_data). It never explains the required id, the allowed data_type enum values, or the shape of extra_data, leaving key parameter meaning undocumented in both schema and description.
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 gives a specific verb (update) and resource (existing custom field), and names the updatable aspects (name, data type, configuration data). It implies the tool operates on existing fields but does not explicitly differentiate itself from siblings like bulk_edit_custom_fields or create_custom_field.
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 when-to-use guidance and no mention of alternatives such as bulk_edit_custom_fields for multi-field edits. The word 'existing' hints that the field must already exist, but nothing states prerequisites or when this tool is preferred over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_documentA
Update a specific document with new values (title, correspondent, document type, storage path, tags, custom fields, and more). Top-level fields you omit are left unchanged. IMPORTANT: custom_fields is the exception — see its parameter description; it replaces the document's entire custom-field set.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The ID of the document to update | |
| tags | No | Array of tag IDs to assign to the document | |
| owner | No | The ID of the user who owns the document | |
| title | No | The new title for the document (max 128 characters) | |
| content | No | The raw text content of the document (used for searching) | |
| created | No | The creation date in YYYY-MM-DD format | |
| storage_path | No | The ID of the storage path to assign | |
| correspondent | No | The ID of the correspondent to assign | |
| custom_fields | No | Custom field values for the document. ⚠️ REPLACES the document's entire custom-field set — any field not included here will be CLEARED. To update or add a single field without losing the others, first call get_document to read the existing custom_fields, then pass the full merged array. To add/set fields additively without fetching, use bulk_edit_documents with method 'modify_custom_fields' instead. | |
| document_type | No | The ID of the document type to assign | |
| archive_serial_number | No | The archive serial number (0-4294967295) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the safety burden and does well: it discloses PATCH-style merge semantics ("Top-level fields you omit are left unchanged") and the destructive exception (custom_fields replaces the entire set, omitting a field CLEARS it), plus the merge workflow to avoid data loss. It does not mention permission requirements, error behavior for invalid IDs, or reversibility.
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 sentences, front-loaded with the operation and its default semantics, then the critical exception flagged with IMPORTANT. Nothing is redundant with the schema 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?
For an 11-parameter mutation tool with no annotations and no output schema, the description covers the two behaviors most likely to cause damage (partial update semantics and the custom-field wipe) and links to the mitigating workflow. It is only slightly short of complete given the 100% schema coverage; return values and auth needs remain unaddressed.
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 100%, so the baseline is 3, but the description adds real semantics the schema lacks: the omit-means-unchanged contract for all top-level params and the contrast between that contract and custom_fields' replace-everything behavior, mirrored by a pointer to the detailed parameter description.
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 specific verb and resource ("Update a specific document") and enumerates the mutable field categories, which lets an agent distinguish this from post_document (create) and bulk_edit_documents (batch) 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?
It routes the agent away from this tool for additive custom-field edits ("use bulk_edit_documents with method 'modify_custom_fields' instead") and tells it to call get_document first for merge-based updates. It gives no guidance about permission prerequisites or when to prefer bulk_edit_documents for other field types, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_document_typeC
Update an existing document type's name, matching pattern, or matching algorithm.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| name | Yes | ||
| match | No | ||
| matching_algorithm | No | Matching algorithm: 0=None, 1=Any word, 2=All words, 3=Exact match, 4=Regular expression, 5=Fuzzy word, 6=Automatic |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It never states required permissions, whether omitted fields are left untouched or cleared, or that this is a destructive mutation — all important for a write tool with zero annotation coverage.
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 tight sentence with the verb and resource front-loaded and no filler. It is efficient, though the brevity is partly under-specification rather than pure concision.
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?
A four-parameter mutation tool with no annotations, no output schema, and 25% schema coverage needs considerably more from the description than one sentence. Critical information about required fields, side effects, and failure modes is absent.
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 only 25% (just matching_algorithm), but the description partly compensates by glossing 'match' as 'matching pattern' and naming the algorithm field. It still doesn't explain the required 'id', the meaning/format of the pattern value, or how it interacts with the chosen algorithm.
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 specific verb ('Update') and resource ('document type') plus the three mutable attributes, so an agent can distinguish it from the sibling create/delete/list/get_document_type operations. It stops short of explicitly naming those siblings or the conditions that separate 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 when-to-use guidance, no prerequisites (e.g., that the document type must already exist), and no mention of the create/delete/bulk_edit siblings that could be mistaken for it. The agent must infer usage from the verb alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_mail_ruleB
Patch an existing Paperless mail rule. Only supplied fields are changed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| name | No | ||
| order | No | ||
| owner | No | ||
| action | No | Mail rule action: 1=Delete, 2=Move to specified folder, 3=Mark as read/don't process read mails, 4=Flag/don't process flagged mails, 5=Tag/don't process tagged mails | |
| folder | No | ||
| account | No | ||
| enabled | No | ||
| filter_to | No | ||
| pdf_layout | No | PDF layout for full-mail consumption: 0=System default, 1=Text then HTML, 2=HTML then text, 3=HTML only, 4=Text only | |
| assign_tags | No | ||
| filter_body | No | ||
| filter_from | No | ||
| maximum_age | No | ||
| filter_subject | No | ||
| attachment_type | No | Attachment type: 1=Only process attachments, 2=Process all files including inline attachments | |
| action_parameter | No | ||
| assign_title_from | No | Title assignment: 1=Use subject as title, 2=Use attachment filename as title, 3=Do not assign title from rule | |
| consumption_scope | No | Consumption scope: 1=Only process attachments, 2=Process full mail as .eml, 3=Process full mail and attachments separately | |
| assign_correspondent | No | ||
| assign_document_type | No | ||
| assign_owner_from_rule | No | ||
| assign_correspondent_from | No | Correspondent assignment: 1=Do not assign, 2=Use mail address, 3=Use sender name or address, 4=Use assign_correspondent | |
| filter_attachment_filename_exclude | No | ||
| filter_attachment_filename_include | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses patch semantics (unspecified fields are left untouched), which an agent cannot infer from the schema alone, but it says nothing about permissions, reversibility, side effects on existing rules, or error behavior for a 25-parameter mutation.
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 short, front-loaded sentences with no filler; the operation and its partial-update nature come first. It is efficiently written, though arguably under-specified for a tool of this 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?
A 25-parameter mutation tool with 24% schema coverage, no annotations, and no output schema needs substantially more description than two sentences. Nothing tells the agent about the required id, the meaning of the many filter/assignment fields, or what a successful patch returns.
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 only 24% across 25 parameters, so the schema leaves most fields undocumented. The description compensates with nothing beyond the blanket "only supplied fields are changed" statement, providing no syntax, format, or meaning for fields like account, action_parameter, or filter_from.
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 (patch) and resource (Paperless mail rule) and clarifies it operates on an existing rule, which implicitly distinguishes it from create_mail_rule and get_mail_rule. It does not explicitly name those siblings, so it falls 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?
"Only supplied fields are changed" implies the partial-update use case and tells the agent it need not send a full rule object, but there is no explicit when-to-use vs. alternatives guidance, no prerequisites, and no mention of required authentication or the required id field.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tagC
Update an existing tag's name, color, matching pattern, or matching algorithm.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| name | Yes | ||
| color | No | ||
| match | No | ||
| matching_algorithm | No | Matching algorithm: 0=None, 1=Any word, 2=All words, 3=Exact match, 4=Regular expression, 5=Fuzzy word, 6=Automatic |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden for a mutation tool. It doesn't say which fields are optional vs required, whether updates are partial or full replacement, what happens on an unknown id, or what permissions are needed.
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 tight sentence with no waste, front-loaded with the verb and resource. It is efficient, though arguably terse given the missing behavioral detail.
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 5-parameter mutation tool with no annotations, no output schema, and 20% schema coverage, the description is too thin — it should state required vs optional behavior, partial-update semantics, and error conditions. The field list alone leaves significant 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 coverage is only 20%, so the description partially compensates by naming the four updatable attributes (name, color, matching pattern, matching algorithm), which map to color, match, and matching_algorithm. However it adds no format or value semantics — notably nothing about the enum meaning of matching_algorithm beyond the schema's own description.
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?
Clear verb (Update) plus resource (tag) and enumerates the mutable fields, so it's distinguishable from create_tag/delete_tag by name. It never explicitly references siblings, but the operation 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 on when to use this versus bulk_edit_tags or update_document-style alternatives, no prerequisites (e.g. tag must already exist), and no note on whether unspecified fields are left unchanged.
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.
44 tool updates
v2.2.1- Changed
bulk_edit_correspondents5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / confirmAdded value: +{ + "description": "Must be true when operation is 'delete' to confirm destructive operation", + "type": "boolean" +} - removed
Input schema / properties / permissions / additionalPropertiesRemoved value: -false - removed
Input schema / properties / permissions / properties / change / additionalPropertiesRemoved value: -false - removed
Input schema / properties / permissions / properties / view / additionalPropertiesRemoved value: -false
- Added
bulk_edit_custom_fields - Changed
bulk_edit_document_types5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / confirmAdded value: +{ + "description": "Must be true when operation is 'delete' to confirm destructive operation", + "type": "boolean" +} - removed
Input schema / properties / permissions / additionalPropertiesRemoved value: -false - removed
Input schema / properties / permissions / properties / change / additionalPropertiesRemoved value: -false - removed
Input schema / properties / permissions / properties / view / additionalPropertiesRemoved value: -false
- Changed
bulk_edit_documents9 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / add_custom_fieldsAdded value: +{ + "items": { + "properties": { + "field": { + "type": "number" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "type": "number" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "The value for the custom field. For monetary fields, use currency code prefix format (e.g., USD10.00, GBP123.45, EUR9.99) — NOT trailing symbol format (e.g., 10.00$). For documentlink fields, use a single document ID (e.g., 123) or an array of document IDs (e.g., [123, 456]). For select fields, pass the option's label (the display text from get_custom_field / list_custom_fields); the server translates it to the encoding Paperless expects." + } + }, + "required": [ + "field", + "value" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / confirmAdded value: +{ + "description": "Must be true when method is 'delete' to confirm destructive operation", + "type": "boolean" +} - added
Input schema / properties / mergeAdded value: +{ + "description": "For set_permissions: true adds to existing permissions and keeps the current owner; false (default) replaces the listed users/groups", + "type": "boolean" +} - changed
Input schema / properties / method / enumPrevious value: -[ - "set_correspondent", - "set_document_type", - "set_storage_path", - "add_tag", - "remove_tag", - "modify_tags", - "delete", - "reprocess", - "set_permissions", - "merge", - "split", - "rotate", - "delete_pages" -]New value: +[ + "set_correspondent", + "set_document_type", + "set_storage_path", + "add_tag", + "remove_tag", + "modify_tags", + "modify_custom_fields", + "delete", + "reprocess", + "set_permissions", + "merge", + "split", + "rotate", + "delete_pages" +] - added
Input schema / properties / ownerAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "For set_permissions: new owner user ID, or null to remove the owner. Unless merge is true, omitting owner also clears the current owner." +} - removed
Input schema / properties / permissionsRemoved value: -{ - "additionalProperties": false, - "properties": { - "merge": { - "type": "boolean" - }, - "owner": { - "type": [ - "number", - "null" - ] - }, - "set_permissions": { - "additionalProperties": false, - "properties": { - "change": { - "additionalProperties": false, - "properties": { - "groups": { - "items": { - "type": "number" - }, - "type": "array" - }, - "users": { - "items": { - "type": "number" - }, - "type": "array" - } - }, - "required": [ - "users", - "groups" - ], - "type": "object" - }, - "view": { - "additionalProperties": false, - "properties": { - "groups": { - "items": { - "type": "number" - }, - "type": "array" - }, - "users": { - "items": { - "type": "number" - }, - "type": "array" - } - }, - "required": [ - "users", - "groups" - ], - "type": "object" - } - }, - "required": [ - "view", - "change" - ], - "type": "object" - } - }, - "type": "object" -} - added
Input schema / properties / remove_custom_fieldsAdded value: +{ + "items": { + "type": "number" + }, + "type": "array" +} - added
Input schema / properties / set_permissionsAdded value: +{ + "additionalProperties": false, + "description": "For set_permissions: view/change permissions to apply. Omitted actions (view/change) and omitted users/groups lists are left untouched; an empty list [] removes all (unless merge is true). Omit entirely for owner-only changes.", + "properties": { + "change": { + "additionalProperties": false, + "properties": { + "groups": { + "items": { + "type": "number" + }, + "type": "array" + }, + "users": { + "items": { + "type": "number" + }, + "type": "array" + } + }, + "type": "object" + }, + "view": { + "additionalProperties": false, + "properties": { + "groups": { + "items": { + "type": "number" + }, + "type": "array" + }, + "users": { + "items": { + "type": "number" + }, + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" +}
- Changed
bulk_edit_tags5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / confirmAdded value: +{ + "description": "Must be true when operation is 'delete' to confirm destructive operation", + "type": "boolean" +} - removed
Input schema / properties / permissions / additionalPropertiesRemoved value: -false - removed
Input schema / properties / permissions / properties / change / additionalPropertiesRemoved value: -false - removed
Input schema / properties / permissions / properties / view / additionalPropertiesRemoved value: -false
- Changed
create_correspondent6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / matching_algorithm / descriptionAdded value: +"Matching algorithm: 0=None, 1=Any word, 2=All words, 3=Exact match, 4=Regular expression, 5=Fuzzy word, 6=Automatic" - removed
Input schema / properties / matching_algorithm / enumRemoved value: -[ - "any", - "all", - "exact", - "regular expression", - "fuzzy" -] - added
Input schema / properties / matching_algorithm / maximumAdded value: +6 - added
Input schema / properties / matching_algorithm / minimumAdded value: +0 - changed
Input schema / properties / matching_algorithm / typePrevious value: -"string"New value: +"integer"
- Added
create_custom_field - Added
create_document_note - Changed
create_document_type6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / matching_algorithm / descriptionAdded value: +"Matching algorithm: 0=None, 1=Any word, 2=All words, 3=Exact match, 4=Regular expression, 5=Fuzzy word, 6=Automatic" - removed
Input schema / properties / matching_algorithm / enumRemoved value: -[ - "any", - "all", - "exact", - "regular expression", - "fuzzy" -] - added
Input schema / properties / matching_algorithm / maximumAdded value: +6 - added
Input schema / properties / matching_algorithm / minimumAdded value: +0 - changed
Input schema / properties / matching_algorithm / typePrevious value: -"string"New value: +"integer"
- Added
create_mail_rule - Changed
create_tag3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / matching_algorithm / descriptionAdded value: +"Matching algorithm: 0=None, 1=Any word, 2=All words, 3=Exact match, 4=Regular expression, 5=Fuzzy word, 6=Automatic" - changed
Input schema / properties / matching_algorithm / maximumPrevious value: -4New value: +6
- Changed
delete_correspondent3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / confirmAdded value: +{ + "description": "Must be true to confirm this destructive operation", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "id" -]New value: +[ + "id", + "confirm" +]
- Added
delete_custom_field - Added
delete_document_note - Changed
delete_document_type3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / confirmAdded value: +{ + "description": "Must be true to confirm this destructive operation", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "id" -]New value: +[ + "id", + "confirm" +]
- Added
delete_mail_rule - Changed
delete_tag3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / confirmAdded value: +{ + "description": "Must be true to confirm this destructive operation", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "id" -]New value: +[ + "id", + "confirm" +]
- Changed
download_document4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / id / exclusiveMinimumAdded value: +0 - added
Input schema / properties / id / maximumAdded value: +9007199254740991 - changed
Input schema / properties / id / typePrevious value: -"number"New value: +"integer"
- Changed
get_correspondent1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Added
get_custom_field - Changed
get_document1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Added
get_document_content - Added
get_document_thumbnail - Changed
get_document_type1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Added
get_mail_account - Added
get_mail_rule - Changed
list_correspondents1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Added
list_custom_fields - Added
list_document_notes - Changed
list_document_types1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_documents9 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / archive_serial_numberAdded value: +{ + "type": "number" +} - added
Input schema / properties / archive_serial_number__isnullAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / created__date__gteAdded value: +{ + "type": "string" +} - added
Input schema / properties / created__date__lteAdded value: +{ + "type": "string" +} - removed
Input schema / properties / created__gteRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / created__lteRemoved value: -{ - "type": "string" -} - added
Input schema / properties / custom_field_queryAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / custom_fields__icontainsAdded value: +{ + "minLength": 1, + "type": "string" +}
- Added
list_mail_accounts - Added
list_mail_rules - Changed
list_tags1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
post_document6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / archive_serial_number / typePrevious value: -"string"New value: +"number" - added
Input schema / properties / file / descriptionAdded value: +"Base64-encoded file content. Either 'file' or 'file_path' must be provided." - added
Input schema / properties / file_pathAdded value: +{ + "description": "Absolute path to a file on the server's filesystem. Either 'file' or 'file_path' must be provided. The filename is derived from the path unless 'filename' is also specified. For security, configure PAPERLESS_MCP_UPLOAD_PATHS to restrict allowed directories.", + "type": "string" +} - added
Input schema / properties / filename / descriptionAdded value: +"Filename for the uploaded document. Required when using 'file', optional when using 'file_path' (defaults to the basename of the path)." - removed
Input schema / requiredRemoved value: -[ - "file", - "filename" -]
- Added
process_mail_account - Added
query_documents - Changed
search_documents1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
update_correspondent6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / matching_algorithm / descriptionAdded value: +"Matching algorithm: 0=None, 1=Any word, 2=All words, 3=Exact match, 4=Regular expression, 5=Fuzzy word, 6=Automatic" - removed
Input schema / properties / matching_algorithm / enumRemoved value: -[ - "any", - "all", - "exact", - "regular expression", - "fuzzy" -] - added
Input schema / properties / matching_algorithm / maximumAdded value: +6 - added
Input schema / properties / matching_algorithm / minimumAdded value: +0 - changed
Input schema / properties / matching_algorithm / typePrevious value: -"string"New value: +"integer"
- Added
update_custom_field - Added
update_document - Changed
update_document_type6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / matching_algorithm / descriptionAdded value: +"Matching algorithm: 0=None, 1=Any word, 2=All words, 3=Exact match, 4=Regular expression, 5=Fuzzy word, 6=Automatic" - removed
Input schema / properties / matching_algorithm / enumRemoved value: -[ - "any", - "all", - "exact", - "regular expression", - "fuzzy" -] - added
Input schema / properties / matching_algorithm / maximumAdded value: +6 - added
Input schema / properties / matching_algorithm / minimumAdded value: +0 - changed
Input schema / properties / matching_algorithm / typePrevious value: -"string"New value: +"integer"
- Added
update_mail_rule - Changed
update_tag3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / matching_algorithm / descriptionAdded value: +"Matching algorithm: 0=None, 1=Any word, 2=All words, 3=Exact match, 4=Regular expression, 5=Fuzzy word, 6=Automatic" - changed
Input schema / properties / matching_algorithm / maximumPrevious value: -4New value: +6
23 tool updates
v1.0.0- 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_document_type - First observed
create_tag - First observed
delete_correspondent - First observed
delete_document_type - First observed
delete_tag - First observed
download_document - First observed
get_correspondent - First observed
get_document - First observed
get_document_type - First observed
list_correspondents - First observed
list_document_types - First observed
list_documents - First observed
list_tags - First observed
post_document - First observed
search_documents - First observed
update_correspondent - First observed
update_document_type - First observed
update_tag
TDQS
Scored across 44 tools
Most tools target a distinct resource+action, and descriptions clearly differentiate get_document (metadata) vs get_document_content vs get_document_thumbnail vs download_document. However, the document-listing trio (list_documents, query_documents, and the deprecated search_documents) overlaps, forcing the agent to reason about which to pick even though the descriptions do explain the boundary.
The set follows a strong verb_noun convention (list_/get_/create_/update_/delete_/bulk_edit_ + resource) applied uniformly across tags, correspondents, document types, and custom fields. The only notable deviation is post_document (instead of create_document), a minor inconsistency in an otherwise predictable scheme.
At 44 tools this is heavy, well above the typical 3-15 sweet spot, though the breadth is partly justified by six distinct resource domains (documents, tags, correspondents, document types, custom fields, mail). Repetition such as five near-identical bulk_edit_* tools and the deprecated search_documents adds weight without fully earning its place.
The surface is comprehensive: full CRUD plus bulk operations across all major entities, document content/thumbnail/download, notes, and mail accounts/rules. Minor gaps remain—storage paths are referenced as filters but have no management tools, and single-document deletion is only reachable through bulk_edit_documents' 'delete' method.
Maintenance
Related MCP Connectors
MCP server for the PDFGate API. Generate PDFs, manage documents and handle e-signatures.
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
DocBase MCP server for AI agents
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- FlicenseAqualityBmaintenanceA privacy-first MCP server for Paperless-ngx that lets an LLM agent search, organize, tag, and reference documents without exposing full text unless explicitly requested.13-
- FlicenseAqualityCmaintenanceMCP server for Paperless-ngx document management. Enables AI models to search, retrieve, update documents and manage metadata.7-
- AlicenseNot gradedqualityCmaintenanceA read-only and write MCP server for Paperless-ngx, enabling document listing, metadata retrieval, and creation of tags, correspondents, document types, and sorting workflows via natural language.MIT
- 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.-