Skip to main content
Glama

Zotero MCP: Chat with your Research Libraryβ€”Local or Webβ€”in Claude, ChatGPT, and more.

Zotero MCP connects your Zotero research library with ChatGPT, Claude, and other AI assistants (e.g., Cherry Studio, Chorus, Cursor) via the Model Context Protocol. Search your library, read and annotate papers, add and organize items, and find research by meaning.

AI agents: read docs/for-agents.md first. It covers which route to use, setup, and the commands in one place.

✨ What it does

  • πŸ” Search by title, author, tag, collection, full text, or meaning (semantic search with local, OpenAI, Gemini, or Ollama embeddings)

  • πŸ“š Read metadata, BibTeX, full text, and page ranges of PDFs, with page images where text extraction garbles math, figures, and tables

  • πŸ“ Annotate: highlights and area boxes placed on the exact words, figure, table, or equation; notes; PDF annotation extraction

  • ✏️ Write: add papers by DOI, URL, ISBN, BibTeX, or file (with open-access PDFs), manage collections and tags, merge duplicates

  • πŸ’» Local or web: in local mode reads come straight from zotero.sqlite; writes go to the running Zotero 10+ or through the web API

  • πŸͺΆ Two ways in: an MCP server for chat apps, or zotero-cli plus an agent skill for coding agents

  • πŸ“Š Scite citation tallies and retraction alerts (optional)

Related MCP server: zotero-library-mcp

πŸš€ Quick start

1. Install (Python 3.10+):

uv tool install zotero-mcp-server     # or: pip install zotero-mcp-server

New to the command line? Try the community-built Zotero MCP Setup: a macOS GUI installer, one-click scripts for Mac and Windows, and a step-by-step guide.

2. Enable Zotero's local API: in Zotero 7+, open Settings β†’ Advanced and tick Allow other applications on this computer to communicate with Zotero.

3. Connect your assistant:

zotero-mcp setup      # auto-configures Claude Desktop

or add the server by hand (Claude Desktop: claude_desktop_config.json; Claude Code: ~/.claude.json):

{
  "mcpServers": {
    "zotero": {
      "command": "zotero-mcp",
      "env": { "ZOTERO_LOCAL": "true" }
    }
  }
}

4. Writes (optional): on Zotero 10+, run zotero-mcp authorize-local once and choose Always Allow. On older Zotero, add ZOTERO_API_KEY and ZOTERO_LIBRARY_ID to write through the web API.

Then ask things like "Find papers in my library on attention mechanisms", "Summarize the key findings of this paper", or "Highlight the main claims of this PDF".

ChatGPT, Cherry Studio, Chorus, Autohand, and other clients: see Getting started.

Optional extras

The base install covers search, reading, annotations, and writes. Heavier features are extras:

Extra

What it adds

Install command

semantic

Semantic search via ChromaDB, sentence-transformers, OpenAI/Gemini embeddings

pip install "zotero-mcp-server[semantic]"

pdf

PDF outlines, page layout and page images (PyMuPDF), EPUB annotations

pip install "zotero-mcp-server[pdf]"

scite

Scite citation tallies and retraction alerts (no account needed)

pip install "zotero-mcp-server[scite]"

all

Everything above

pip install "zotero-mcp-server[all]"

Update any time with zotero-mcp update.

πŸͺΆ MCP server or agent skill?

If your agent has a shell (Claude Code, Cursor, Codex, Windsurf, Gemini CLI, Amp, OpenCode …), one command teaches it to drive zotero-cli:

zotero-mcp install-skill

An MCP server sends every tool's schema on every request, before you type anything. The skill costs 98 tokens until the agent decides it is relevant:

Route

In context

Paid

MCP server, default profile (38 tools)

13,448

every request

Agent skill, frontmatter only

98

always

Agent skill, body loaded

1,368

when it fires

Use the MCP server when your client speaks MCP but has no shell (Claude Desktop, ChatGPT); use the skill when it has a shell. Both share one config. Details: CLI and agent skill.

πŸ“– Documentation

Guide

What's in it

Getting started

Connecting Claude Desktop and Claude Code, ChatGPT, Cherry Studio, Chorus, Autohand, and other MCP clients

Configuration

Environment variables, local writes, web and hybrid modes, the SQLite read backend, global search, text extraction, command-line options

Semantic search

Embedding models, building and updating the index

Tools

Every MCP tool, tool groups (ZOTERO_MCP_TOOLSETS), related items, PDF annotation extraction

CLI and agent skill

zotero-cli command reference, --json output, install-skill

Docker

Container images and runtime modes

Troubleshooting

Common problems and fixes

For AI agents

One guide for an agent setting up or using Zotero MCP

Website: stevenyuyy.com/zotero-mcp Β· Changelog

🀝 Contributing

Issues and pull requests are welcome. Run the tests with uv run pytest tests/. A live integration test plan, meant to be run by Claude against a real library, is in docs/integration-test-plan.md.

β˜• Support

Zotero MCP is free and MIT-licensed.

If it saves you or your lab time, sponsoring helps cover the unglamorous parts: Windows and WSL2 edge cases, Zotero schema changes, group-library support, and the embedding/search infrastructure.

Labs and institutions: the $50 and $200 tiers are meant to be expensable, and include priority triage on the issues affecting your workflow.

Contributors

Thanks to everyone who has contributed code, fixes, and ideas to Zotero MCP.

πŸ“„ License

MIT

Available Tools

41 tools
zotero_add_itemZotero Add ItemA

Add item(s) to Zotero from any source: DOI, URL, ISBN, BibTeX, CSL JSON, or a local file. Use for every 'add this to Zotero' request. source: the identifier, URL, citation text, or ABSOLUTE file path. DOI/URL/ISBN also take many at once (list or comma/newline-separated), each resolved independently. BibTeX/CSL JSON may be inline (many entries per call) or a path to .bib/.bibtex/.json/.csljson; documents are .pdf, .epub, .docx and similar. source_type: 'auto' (default) detects it, incl. comma/newline DOI lists; override for URL/ISBN batches. Routing: doi β†’ CrossRef (best metadata β€” prefer a DOI when you have one); url β†’ doi.org/arxiv.org get full metadata, anything else becomes a bare 'webpage' item that is often not citable, so resolve to a DOI first; isbn β†’ Open Library then Google Books (noisy β€” verify after); bibtex/csl_json β†’ one item per entry, citation key kept in Extra; file β†’ extracts the PDF's DOI and enriches via CrossRef, else guesses from filename/text, then attaches the file. collections: keys, names, or '/'-paths ('_project/topic'), validated before anything is created β€” an unknown or ambiguous spec fails the call rather than leaving an unfiled item; create_missing_collections=True creates them instead. if_exists: 'duplicate' (default) always creates; 'file' is idempotent β€” reuses the item matching the DOI/ISBN/URL, adding missing collections/tags, never removing; 'skip' leaves a match untouched. attach_mode: 'auto' (default) attaches an OA PDF, 'linked_url' bookmarks it, 'none' skips, 'required' fails without one. title: file sources only, when extraction misses. Requires a writable library (fails in local-only mode). Run zotero_update_search_database afterwards for semantic search. Example: zotero_add_item(source='10.1145/3708319', collections=['9SU943GB'], if_exists='file').

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
titleNo
sourceYes
if_existsNoduplicate
attach_modeNoauto
collectionsNo
source_typeNoauto
create_missing_collectionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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 so thoroughly: it discloses metadata-source quality, validation-before-create failure behavior, idempotence semantics, attachment resolution, local-only mode failure, and the follow-up search-database step.

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

Conciseness5/5

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

The description is long but dense and every clause carries useful behavioral or routing information. It front-loads the core purpose, walks through each source type and parameter in order, and closes with a concrete example.

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

Completeness4/5

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

For a complex 8-parameter tool with no annotations, the description is nearly complete: it covers source routing, edge cases, failure modes, prerequisites, and post-conditions. The only notable gap is the undocumented 'tags' parameter; output-return concerns are reasonably deferred to the output schema.

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

Parameters4/5

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

Despite 0% schema description coverage, the description compensates for most parameters in detail: source, source_type, collections, create_missing_collections, if_exists, attach_mode, and title. However, 'tags' is never described, so an agent must guess whether it expects a list, a single string, or what behavior it triggers.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Add item(s) to Zotero from any source: DOI, URL, ISBN, BibTeX, CSL JSON, or a local file.' It also states its role directly with 'Use for every add this to Zotero request,' distinguishing it from update/delete/attachment sibling tools.

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

Usage Guidelines4/5

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

It gives explicit when-to-use guidance ('Use for every add this to Zotero request') and rich routing heuristics, such as preferring a DOI and resolving URLs to DOIs first. It does not explicitly name sibling alternatives or when-not cases, but the context is otherwise clear.

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

zotero_attach_fileZotero Attach FileA

Attach a file to an EXISTING Zotero item as an imported child attachment (uploads the file bytes). Use when the item is already in the library and you have its key β€” e.g. attaching a PDF you found for a reference. To create a NEW item from a file, use zotero_add_item(source=) instead. item_key: key of the existing REGULAR item. Passing an attachment/note key fails with a hint to use its parent. file_path: ABSOLUTE local path (.pdf, .epub, .djvu, .doc, .docx, .odt, .rtf). url: direct http(s) link, downloaded server-side β€” PDF-only; for other formats download locally and use file_path. Exactly one of file_path/url must be given. filename: optional stored-filename override; defaults to the file's basename or the URL's last path segment (falling back to .pdf); a missing extension is appended automatically. Returns the created attachment's key. Idempotent: if the item already has an attachment with the same filename or identical content (MD5), nothing is re-uploaded. Requires a writable library (fails in local-only mode). Uploads count against the Zotero cloud storage quota unless WebDAV sync is configured. Run zotero_update_search_database afterwards to index the new file for semantic search. Example: zotero_attach_file(item_key='ABCD2345', file_path='/Users/me/smith-2020.pdf').

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
filenameNo
item_keyYes
file_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

There are no annotations, so the description carries the full burden of behavioral disclosure. It thoroughly covers side effects: uploads file bytes, idempotence (same filename or MD5 content prevents re-upload), cloud storage quota implications, local-only mode failure, and automatic extension handling. This is far more transparent than typical tool descriptions.

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

Conciseness5/5

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

The description is long but every sentence earns its place. It starts with the core purpose, then usage context, then parameter semantics, then behavior and follow-up, and ends with a concrete example. The structure is logical and front-loaded; nothing is repetitive or extraneous. The format is scannable despite its thoroughness.

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

Completeness5/5

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

For a tool with 4 parameters, no annotations, and an output schema, the description is complete. It covers parameter constraints, failure modes, idempotence, quota, required permissions (writable library), and post-call indexing. Since an output schema exists, the explicit return key mention is a bonus rather than a necessity. No critical gap remains.

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

Parameters5/5

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

Schema description coverage is 0%, but the description compensates fully. It explains item_key (must be a REGULAR item, attachment/note keys fail), file_path (absolute path with allowed extensions), url (direct http(s), PDF-only, server-side download), and filename (defaults and extension behavior). It also enforces the mutual-exclusion constraint between file_path and url, which the schema does not express.

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

Purpose5/5

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

The description opens with a specific action: 'Attach a file to an EXISTING Zotero item as an imported child attachment (uploads the file bytes)'. It clearly distinguishes itself from the sibling zotero_add_item by explicitly naming it as the alternative for creating a new item from a file. This gives the agent a precise, unambiguous understanding of the tool's scope.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance ('Use when the item is already in the library and you have its key') and when-not-to-use ('To create a NEW item from a file, use zotero_add_item instead'). Also covers constraints like 'Exactly one of file_path/url must be given', the writable-library requirement, and the follow-up action 'Run zotero_update_search_database afterwards'. No inference is required.

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

zotero_authorize_local_writesZotero Authorize Local WritesA

Request permission to write to the local Zotero library (Zotero 10+). BLOCKS until the user answers a dialog that appears in the Zotero app, so tell them to switch to Zotero before calling this. "Always Allow" grants a reusable key that is saved for future sessions; "Allow" grants a key good for exactly ONE write. Call this when a write tool reports that no writable backend is configured and zotero_write_capabilities says the server supports local writes but no key is held. Not needed in web API mode. app_name: the name shown to the user in the dialog. timeout: seconds to wait for the answer (5-55, default 45). Zotero rate-limits this to about 5 prompts per minute β€” do not retry in a loop. Example: zotero_authorize_local_writes().

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNo
app_nameNoZotero MCP

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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 so thoroughly: it warns that the call BLOCKS until a user answers a dialog, instructs the agent to tell the user to switch to Zotero, explains the Always Allow vs Allow key semantics, and discloses the rate limit of about 5 prompts per minute with a do-not-retry warning.

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

Conciseness5/5

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

The description is dense but every sentence adds necessary information: purpose, blocking behavior, user guidance, grant semantics, precondition, exclusions, parameter semantics, rate limit, and a usage example. The most critical warning (BLOCKS) is front-loaded.

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

Completeness5/5

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

The description covers the trigger condition, user interaction, parameter meaning, behavioral side effects/constraints, and exclusion cases. Since an output schema exists, the lack of explicit return-format detail is not a gap, and the description is complete for correct invocation.

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

Parameters5/5

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

Schema coverage is 0% because the input schema only provides types and defaults, so the description must explain the parameters. It does: app_name is the name shown in the dialog, and timeout is described as seconds to wait with a valid range (5-55) and default 45.

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

Purpose5/5

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

The description names a specific action (request permission), a specific target (local Zotero library, Zotero 10+), and the context that triggers it. It distinguishes itself from sibling write tools by clarifying it is about authorization, not performing writes, and notes when web API mode makes it unnecessary.

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

Usage Guidelines5/5

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

It gives an explicit trigger: call when a write tool reports no writable backend and zotero_write_capabilities indicates local writes are supported but no key is held. It also states when it is not needed (web API mode) and warns against retrying in a loop, providing clear when-to-use and when-not-to-use guidance.

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

zotero_batch_updateZotero Batch UpdateA

Edit metadata across many items in one call: add/remove tags and upsert/remove Key: value lines in Extra (Better BibTeX keys, tex.* fields). Select items by item_keys, and/or a free-text query, and/or an existing tag (query and tag are ANDed; tag may be a list to OR); item_keys wins. At least one selector AND one action are required. add_tags/remove_tags keep the item's other tags β€” not a replace-all. set_keys upserts Extra lines, matching a line case-insensitively by its key: prefix and replacing it in place, else appending; remove_keys deletes those lines; lines without a colon are preserved. limit: max items for query/tag selection (default 50). Attachments and items needing no change are skipped and counted. Requires a writable library. Example: zotero_batch_update(tag='to-read', add_tags=['reviewed'], remove_tags=['to-read']).

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNo
limitNo
queryNo
add_tagsNo
set_keysNo
item_keysNo
remove_keysNo
remove_tagsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and meets it well: it discloses non-replace-all tag behavior, upsert-vs-append semantics, case-insensitive line matching, preservation of lines without colons, skipping/counting of attachments and no-op items, and the writable-library prerequisite. These are genuine behavioral facts beyond the schema.

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

Conciseness5/5

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

Despite being a dense paragraph, it is front-loaded with the core function and every sentence carries a distinct rule or constraint. No filler or repetition; the length is justified by the tool's complexity.

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

Completeness5/5

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

For an 8-parameter batch mutation tool with no annotations, the description covers selector semantics, action semantics, constraints, edge cases (no-op items, colons), and a prerequisite. An output schema exists, so the lack of return-format detail in prose is not a gap.

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

Parameters5/5

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 does: every selector and action parameter is given operational meaning (tag can be a list ORed, limit caps query/tag selection, item_keys takes precedence, set_keys matches by key: prefix, remove_keys deletes those lines). The example further ties tag/add_tags/remove_tags together.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Edit metadata across many items in one call'), names two concrete operation families (tags and Extra key/value lines), and is clearly distinct from the single-item sibling zotero_update_item and the read/search tools. No ambiguity about what the tool accomplishes.

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

Usage Guidelines4/5

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

It states the selection model (item_keys, query, tag), AND/OR semantics, 'item_keys wins' priority, and the requirement that at least one selector and one action be present. It does not explicitly say 'use this instead of zotero_update_item for batch edits,' but 'across many items in one call' supplies clear context for when it applies.

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

zotero_create_annotationZotero Create AnnotationA

Create an annotation on a PDF attachment (EPUB: highlights only). Exactly one mode per call: text= HIGHLIGHTS selectable text; rect= draws an AREA box over a figure, table, or other non-text region (PDF only); note=[x, y] places a STICKY NOTE centered on that normalized point, its text in comment (PDF only). Passing several or none is an error. attachment_key: the PDF/EPUB attachment key, NOT the parent item key (zotero_get_item_children finds it). page: 1-indexed page (EPUB: 1-indexed chapter). text: exact text to highlight, matched against the text layer β€” scanned/image-only PDFs will not match. rect: [x, y, width, height] normalized to [0, 1], with (0, 0) at the page's top-left; width/height are page-relative and the box must fit the page. Call zotero_get_page_layout first and reuse a detected region's bbox instead of guessing coordinates. comment, color (hex, default '#ffd400'), tags: optional. Requires PyMuPDF (the [pdf] extra) and a writable library: local writes (Zotero 10+) or a web API key. Examples: (attachment_key='NHZFE5A7', page=4, text='working memory'); (attachment_key='NHZFE5A7', page=7, rect=[0.15, 0.22, 0.6, 0.35], comment='Figure 3').

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNo
pageYes
rectNo
tagsNo
textNo
colorNo#ffd400
commentNo
attachment_keyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure and succeeds: it states the PyMuPDF dependency (the [pdf] extra), the writable-library requirement (local writes Zotero 10+ or web API key), the scanned/image-only PDF text-matching limitation, the EPUB highlights-only constraint, and the rect-must-fit-page rule. For a mutation tool with zero annotation coverage this is comprehensive and honest.

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

Conciseness4/5

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

The description is long, but length is justified by 8 parameters with 0% schema coverage and a three-mode API. It is front-loaded with the core purpose and mode distinction, and the trailing examples clarify exact argument formats. Minor redundancy exists between the parameter prose and the examples, which could have been trimmed, so it falls just short of a 5.

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

Completeness5/5

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

Given the tool's complexity (3 modes, EPUB/PDF differences, normalized coordinates, prerequisites) the description is essentially complete. The output schema already covers return values, so no return-format prose is needed. Missing items are negligible: the description covers prerequisites, error conditions, coordinate conventions, limitations, and provides concrete examples.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully compensate, and it does: it explains attachment_key is the attachment key NOT the parent item key, page is 1-indexed (chapter for EPUB), text matches the text layer exactly, rect is normalized [x,y,width,height] with (0,0) at top-left and page-relative dims, note is a normalized [x,y] point with text in comment, plus color default and tags. Every one of the 8 parameters is semantically covered in prose.

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

Purpose5/5

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

The description opens with a specific verb-resource pair ('Create an annotation on a PDF attachment') and immediately distinguishes three mutually exclusive modes (text, rect, note) with clear semantics for each. It differentiates cleanly from siblings like zotero_get_annotations (read), zotero_update_annotation (modify), and zotero_delete_annotation (delete), so an agent can select this tool unambiguously.

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

Usage Guidelines5/5

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

The description explicitly routes to sibling tools for correct usage: it names zotero_get_item_children for finding the attachment key and instructs the agent to call zotero_get_page_layout first and reuse a detected bbox instead of guessing coordinates. It also spells out the error condition ('Passing several or none is an error') and the EPUB-vs-PDF applicability split, giving the agent clear when/how guidance.

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

zotero_create_collectionZotero Create CollectionA

Create a new collection (project/folder) in your Zotero library. To create a subcollection, pass parent_collection (not parent_key) as either a collection key (8-character string like 'KMMQDFQ4') or a collection name. Use zotero_search_collections to find collection keys.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
parent_collectionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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 discloses the create (write) behavior and the dual-acceptance of parent_collection (key or name, and explicitly not parent_key), which is useful behavioral context. However, it does not disclose success behavior, return value shape, duplicate-name handling, or error conditions. Since there is no annotation coverage, more behavioral disclosure would be warranted.

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

Conciseness5/5

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

Two sentences with no waste. The primary function is front-loaded, the subcollection edge case follows, and the pointer to find keys closes it out. Every clause earns its place without repetition or padding.

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

Completeness4/5

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

The tool is low-complexity (2 params, 1 required, no nested objects) and an output schema exists, so return-value documentation isn't the description's burden. The description covers the core behavior, the subcollection nuance with exact key format, and the key-lookup path. Minor gaps remain β€” duplicate-name handling and what the tool returns β€” but overall it's adequate for correct invocation.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate β€” and it does. For parent_collection it adds significant meaning: what it's for (subcollections), accepted formats (key like 'KMMQDFQ4' or name), and the exclusion of parent_key. It also maps name to its purpose implicitly. This substantially exceeds what the bare schema provides, though it doesn't elaborate on formatting rules for name (e.g., uniqueness).

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

Purpose5/5

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

The description states a specific verb (create) and resource (collection), clarifies that 'collection' means project/folder, and distinguishes itself from siblings: this is create, not search (zotero_search_collections), not get (zotero_get_collections), not update/delete. The 'not parent_key' clarification adds precision. An agent can immediately tell this tool apart from its Zotero siblings.

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

Usage Guidelines4/5

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

The description gives explicit context on when to use parent_collection (for subcollections) and the exact accepted formats (8-character key or name). It also routes the agent to zotero_search_collections for finding collection keys. It doesn't explicitly state when NOT to use this tool versus update/delete, but the guidance provided is specific and actionable for the primary use case.

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

zotero_delete_annotationZotero Delete AnnotationA

Permanently delete a Zotero annotation. This cannot be undone. Annotations are deleted outright, as Zotero's own PDF reader does: a trashed annotation stays visible in the reader with no way to remove it there.

ParametersJSON Schema
NameRequiredDescriptionDefault
annotation_keyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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 discloses that deletion is permanent, cannot be undone, and is outright, and it contrasts this with the reader's trashed-annotation behavior, which adds meaningful context beyond the name.

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

Conciseness5/5

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

Two compact sentences get straight to the operation and consequence. The critical permanence warning is front-loaded, and every sentence contributes new information.

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

Completeness4/5

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

For a single-parameter destructive operation, the description covers the action, the permanence, and the deletion semantics. An output schema exists, so return values need not be explained; the main residual gap is the lack of a pointer to how annotation_key should be obtained.

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

Parameters2/5

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

The schema has 0% description coverage for annotation_key, and the description never explains what an annotation_key is or where to obtain it. The property name is somewhat self-explanatory, but the description adds no parameter-level guidance.

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

Purpose5/5

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

The first sentence is a direct verb+resource statement: 'Permanently delete a Zotero annotation.' The resource is narrowed to 'annotation,' which distinguishes it from sibling delete tools like zotero_delete_item and zotero_delete_collection.

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

Usage Guidelines2/5

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

There is no explicit guidance about when to choose this tool over alternatives such as zotero_update_annotation or zotero_delete_item. The only usage-related information is the permanence warning, which cautions rather than provides selection criteria.

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

zotero_delete_collectionZotero Delete CollectionA

Delete a collection (folder) from your Zotero library by its 8-character key. Items inside the collection are NOT deleted β€” they remain in the library (and in any other collections they belong to). Subcollections ARE deleted along with the parent. This is a hard delete β€” Zotero's API does not trash collections, so the operation cannot be undone via the API. Use zotero_search_collections to find the key first. Example: zotero_delete_collection(collection_key="KMMQDFQ4").

ParametersJSON Schema
NameRequiredDescriptionDefault
collection_keyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations provided, the description carries full disclosure burden. It clearly states that items inside are NOT deleted, subcollections ARE deleted, and that the delete is hard and irreversible via the API. This is exemplary transparency for a mutation operation.

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

Conciseness4/5

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

The description is well-organized: purpose first, then side effects, irreversibility, and prerequisite. Each sentence earns its place. It's slightly long but not verbose; the example is helpful and adds clarity.

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

Completeness5/5

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

For a simple delete operation with a single parameter and no annotations, the description covers all necessary aspects: what it does, side effects, undoability, how to obtain the required key, and an example. Nothing essential is missing.

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

Parameters4/5

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

The schema provides no description for collection_key (0% coverage), but the description compensates by specifying the key format ('8-character key') and giving a concrete example (KMMQDFQ4). This adds meaningful semantic value beyond the bare schema.

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

Purpose5/5

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

The description states a specific verb and resource ('Delete a collection (folder) from your Zotero library') and clarifies it operates on collections by key, distinguishing it from sibling deletion tools like zotero_delete_item and zotero_delete_annotation. The 8-character key detail adds precision.

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

Usage Guidelines4/5

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

It explicitly instructs the agent to use zotero_search_collections to find the key first, which is a clear prerequisite and usage hint. It doesn't explicitly state when not to use this tool, but the resource type (collection vs item/annotation) implicitly differentiates it from other delete tools.

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

zotero_delete_itemZotero Delete ItemA

Move a Zotero item to the Trash. Works for any item type (book, journalArticle, webpage, attachment, etc.). For notes, use zotero_manage_note(action='delete') β€” identical mechanism, constrained to notes for safety. Trashed items are recoverable from Zotero's Trash β€” empty the Trash in the Zotero UI for permanent deletion. By default refuses to trash notes; set allow_note=True to override.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_keyYesZotero item key/ID to trash
allow_noteNoIf True, permits trashing note items. Default False directs callers to zotero_manage_note(action='delete') for notes (same mechanism, explicit about what it affects).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the action is a move-to-Trash (not permanent deletion), that trashed items are recoverable, that permanent deletion requires emptying the Trash in the UI, and that the tool refuses notes by default. This is strong behavioral context, though it doesn't mention what the response looks like or whether the operation requires write authorization.

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

Conciseness5/5

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

Four sentences, each earning its place: the core action, the scope, the sibling alternative, the recovery behavior, and the safety override. The most important information is front-loaded, and there is zero filler.

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

Completeness4/5

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

The description is complete for a delete/trash tool: it covers scope, safety, recovery, and the alternative path. The output schema exists, so return values need not be described. A minor gap is that it doesn't mention whether write authorization is required, but the sibling zotero_authorize_local_writes and zotero_write_capabilities tools suggest that context is handled elsewhere.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents both parameters. The description adds value by explaining the safety rationale behind allow_note's default and explicitly routing note deletion to zotero_manage_note. It doesn't add syntax details for item_key, but the schema covers that adequately.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Move a Zotero item to the Trash.' It explicitly states the tool works for any item type and names the sibling alternative (zotero_manage_note) for notes, making the tool's scope unmistakable. This clearly distinguishes it from the many sibling tools.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: use this for any item type, but for notes use zotero_manage_note(action='delete') instead, with the safety rationale. It also explains the allow_note override condition, so an agent knows exactly when to use this tool versus the alternative.

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

zotero_export_bibliographyZotero Export BibliographyA

Render a formatted bibliography or in-text citations for a set of Zotero items using Zotero's own CSL citation engine, so you can drop references straight into a manuscript. item_keys: optional list of 8-character item keys (also accepts a JSON list string); takes precedence over collection_key. collection_key: optional collection to export instead; if neither is given, the active library is exported (capped). style: CSL style short name (default 'apa'); e.g. 'modern-language-association', 'chicago-note-bibliography', 'ieee'. Ignored for bibtex. export_format: 'bib' (formatted reference-list entries, default), 'citation' (in-text citation strings), or 'bibtex' (raw BibTeX for .bib files). Output: markdown naming the style/format, then the rendered entries (a fenced block for bibtex, a numbered list otherwise). Rendering uses Zotero's own CSL engine and works in local mode with no API credentials, as well as over the web API. Capped at 100 items per call; scope with item_keys or collection_key for anything larger. Example: zotero_export_bibliography(item_keys=['RTKZQI8E'], style='apa', export_format='bib').

ParametersJSON Schema
NameRequiredDescriptionDefault
styleNoCSL style short name (default "apa").apa
item_keysNoOptional list of item keys (or JSON/comma string).
export_formatNo"bib", "citation", or "bibtex".bib
collection_keyNoOptional collection to export.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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 so thoroughly: it discloses the 100-item cap, output format as markdown with numbered list vs fenced code block, credential-free local mode, and the CSL engine behavior. It also clarifies the precedence and fallback behavior when no keys or collection are provided.

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

Conciseness5/5

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

The description is dense but every sentence adds essential information: purpose, parameter behavior, output shape, execution modes, cap, and a concrete example. It is front-loaded with the core purpose and then flows logically through parameters to edge cases and usage guidance.

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

Completeness5/5

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

The tool is moderate in complexity with four optional parameters.closeThe description covers output schema implications, parameter interactions, operational constraints, and even provides a full invocation example. An agent has everything needed to select and correctly call this tool without further inference.

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

Parameters5/5

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

Although schema coverage is 100%, the description goes well beyond the schema by explaining that item_keys accepts a JSON list string, that item_keys takes precedence over collection_key, that style is ignored for bibtex, and by giving concrete style examples. This adds meaningful operational semantics that the schema alone does not convey.

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

Purpose5/5

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

The description opens with a specific verb ('Render') and resource ('formatted bibliography or in-text citations'), and explains the intended use case of dropping references into a manuscript. The output formats and modes are clearly named, fully distinguishing this export tool from the many sibling retrieval/manipulation tools.

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

Usage Guidelines5/5

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

The description specifies how to choose among item_keys, collection_key, and the active library, including precedence and the 100-item cap with a scoping recommendation for larger exports. It also notes when style is ignored ('bibtex') and that the tool works both locally and via the web API, giving an agent clear decision guidance.

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

zotero_get_annotationsZotero Get AnnotationsA

Get annotations (highlights and attached notes on PDF/EPUB attachments) for a specific item or across the active Zotero library. item_key: pass the parent item key OR an attachment key β€” both work; attachment-to-parent resolution is automatic. ALWAYS pass item_key when you know which item you want; calling without it returns every annotation in the library (potentially thousands). use_pdf_extraction=True falls back to direct PDF parsing when the Zotero API has no stored annotation record β€” useful for annotations made outside Zotero desktop. limit: cap on annotations returned; None (default) returns all. format='markdown' (default) returns a readable list; format='json' returns normalized records with stable keys for downstream scripts and other MCP tools. Uses Better BibTeX when Zotero desktop is running locally, otherwise the Zotero web API. Example: zotero_get_annotations(item_key='ABC12345') β†’ every highlight/note on that paper.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of annotations to return
formatNo``markdown`` for human-readable output or ``json`` for normalized structured records.markdown
item_keyNoOptional Zotero item key/ID to filter annotations by parent item
use_pdf_extractionNoWhether to attempt direct PDF extraction as a fallback

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure, and it excels: it explains automatic attachment-to-parent resolution, the fallback to PDF extraction, the difference between markdown and json output (with 'stable keys for downstream scripts'), and the backend selection (Better BibTeX vs web API). It also warns about the scale of results without item_key. This is thorough, non-obvious behavior that an agent needs to know.

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

Conciseness5/5

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

The description is a single dense paragraph, front-loaded with the core purpose and scoping rule, then covering parameters and behavior. It includes an example at the end for clarity. Every sentence adds valueβ€”no filler, no repetition of schema details. It is concise yet complete for a tool with four optional parameters.

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

Completeness5/5

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

Given the tool's moderate complexity (4 optional params, no required, output schema present), the description covers all necessary context: main use, key parameter behavior, fallback logic, output formats, backend selection, and a concrete example. The output schema handles return structure details, so the description need not enumerate return fields. Nothing an agent needs to call this correctly is missing.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds significant meaning beyond the schema. For item_key it clarifies that either parent or attachment keys work and resolution is automatic. For limit it explains the default returns all. For format it contrasts human-readable vs machine-stable output. For use_pdf_extraction it explains the fallback scenario. This goes well beyond the baseline 3 and provides actionable parameter semantics.

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

Purpose5/5

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

The description states a specific verb ('Get') and resource ('annotations (highlights and attached notes on PDF/EPUB attachments)'), and clarifies scope ('for a specific item or across the active Zotero library'). It distinguishes itself from sibling tools like zotero_get_notes by specifying it targets annotations on attachments, not standalone notes. The purpose is immediately clear and not a tautology.

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

Usage Guidelines4/5

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

The description provides explicit usage guidance: 'ALWAYS pass item_key when you know which item you want' and warns against calling without it ('returns every annotation in the library (potentially thousands)'). It also explains when to use use_pdf_extraction=True ('when the Zotero API has no stored annotation record'). However, it does not explicitly mention alternative sibling tools (e.g., zotero_get_notes or zotero_synthesize_annotations) or state when to prefer this tool over them, so it stops short of a full routing guide.

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

zotero_get_attachment_pathZotero Get Attachment PathA

Return the local filesystem path(s) of a Zotero item's attachments. Local mode only. Useful when you want to read a large PDF directly (e.g., a book) instead of going through zotero_get_item_fulltext, which is page-limited.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_keyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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 tool is 'Local mode only' and returns paths rather than content, which is useful. However, it does not mention potential error cases (e.g., item has no attachments), whether multiple paths are returned (though 'path(s)' implies it), or any permissions/requirements. The description adds some context but lacks rich behavioral detail expected for a tool with no 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.

Conciseness5/5

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

The description is two sentences with no wasted words. The primary function is stated first, followed by the use case. It is efficient and front-loaded, making it easy for an agent to parse quickly.

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

Completeness4/5

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

Given the tool's simplicity (one parameter, output schema present), the description covers the main purpose and a key use case. It mentions the local-only constraint and the alternative to fulltext. However, it does not address edge cases like missing attachments or whether it returns all paths or just one. Since an output schema exists, the return structure is not required in the description, but a bit more context on prerequisites or error behavior would improve completeness. Overall, it is adequate for a simple getter.

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

Parameters1/5

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

The schema has 0% description coverage, and the description does not explain the single parameter 'item_key' at all. It does not add any meaning beyond the parameter name itself. Since the schema provides no description, the description must compensate, but it fails to do so, leaving the agent to infer the parameter's purpose from the tool name alone.

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

Purpose5/5

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

The description clearly states the tool's function: returning local filesystem paths of a Zotero item's attachments. It specifies the resource (attachments) and the verb (return), and distinguishes it from the sibling zotero_get_item_fulltext by noting the use case for large PDFs. This makes the purpose unambiguous and differentiates it from related tools.

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

Usage Guidelines5/5

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

The description explicitly provides a when-to-use scenario: 'Useful when you want to read a large PDF directly (e.g., a book) instead of going through zotero_get_item_fulltext, which is page-limited.' It names the alternative tool and the condition that selects this one, giving clear guidance on when to use it versus the sibling.

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

zotero_get_collection_itemsZotero Get Collection ItemsA

Get all items in a specific Zotero collection. Supports detail='keys_only' (minimal), 'summary' (default, no abstracts), or 'full' (with abstracts). Includes PDF/notes indicators. include_subcollections=True also returns items filed in collections nested beneath this one (default False, matching Zotero's own 'Search subcollections' checkbox). For a collection larger than limit, page through it with offset (the response names the next offset to pass). TIP: To find papers on a specific topic, use zotero_semantic_search instead β€” it's faster and returns only relevant results.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of items to return
detailNosummary
offsetNoIndex of the first item to return, for paging through a collection larger than `limit`.
collection_keyYesThe collection key/ID
include_subcollectionsNoAlso return items in collections nested beneath this one. Defaults to False, matching Zotero's own "Search subcollections" checkbox and this tool's previous behaviour.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

There are no annotations, so the description carries the full behavioral burden. It discloses the three detail levels, the presence of PDF/notes indicators, the subcollection expansion behavior, and the pagination convention where 'the response names the next offset to pass.' This is rich, concrete behavioral information that goes well beyond the input schema.

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

Conciseness5/5

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

The description is well-organized, front-loading the core purpose before covering options, pagination, and a routing tip. Every sentence adds information, and the TIP earns its place by pointing to a faster sibling tool. No redundant or verbose language is used.

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

Completeness5/5

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

Given the tool has an output schema and moderately complex behavior, the description covers purpose, detail modes, subcollection semantics, paging, and the key alternative tool. An agent has everything needed to call this tool correctly without consulting additional documentation.

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

Parameters4/5

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

Schema coverage is 80%, so the schema already documents most parameters. The description adds value beyond that by explaining the meaning of the detail enum values ('keys_only', 'summary', 'full'), the pagination naming convention for offset, and the practical consequence of include_subcollections. This is useful, though some parameter semantics are already present in the schema.

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

Purpose5/5

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

The description opens with 'Get all items in a specific Zotero collection,' which is a specific verb-resource pair that clearly states the action and scope. It further distinguishes the tool from sibling search tools by describing its collection-based focus and by mentioning the alternative zotero_semantic_search for topic-based discovery.

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

Usage Guidelines5/5

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

The TIP explicitly provides a when-not-to-use condition: for finding papers on a specific topic, use zotero_semantic_search instead, and gives the reason ('faster and returns only relevant results'). The description also clarifies the default subcollection behavior relative to Zotero's own 'Search subcollections' checkbox, giving agents clear context for when include_subcollections matters.

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

zotero_get_collectionsZotero Get CollectionsA

List all collections in the currently active Zotero library as a hierarchical tree (parents and nested subcollections, each with its 8-character key). Use this when the user wants to see the full library structure. If you already know a name and just need the key, prefer zotero_search_collections β€” it returns only matches. Scope is limited to the active library β€” switch libraries with zotero_switch_library before listing. Deep hierarchies render inline without truncation, so very deep trees can be long. limit: cap on collections returned; pass None (default) to use 100, or raise to 5000 for libraries with thousands of collections. include_trashed: when True, also show collections in the Zotero Trash (annotated as such). Default False, matching Zotero desktop's default view. Example output:

  • Orals (Key: MT53KB66)

    • Early America (Key: 3249BZKE)

      • I. Historiography & Methodology (Key: XFN79DUT)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of collections to return
include_trashedNoif True, merge collections currently in Zotero's Trash into the listing, annotated with ``[trashed]``. Default False matches the Zotero desktop default and the prior behavior of this tool. Trashed collections are normally invisible to automated clients (#233) β€” turn this on when you need to know they exist.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries full behavioral disclosure. It covers the hierarchical output, the 8-character key format, the lack of truncation for deep trees (with the consequence that output may be long), the limit behavior (default 100, up to 5000), and the include_trashed behavior (annotated as [trashed], default matching the desktop view). No contradictions with annotations were found.

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

Conciseness5/5

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

Every sentence serves a purpose: purpose, usage guidance, scope caveat, output length warning, parameter explanations, and a concrete example. The front-loaded purpose sentence immediately tells an agent what this tool is for. The example output makes the return format tangible with no wasted words.

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

Completeness5/5

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

The description covers the essential context for both selection and invocation: what the tool returns, its scope, how to change scope, parameter behavior, and a representative example. An output schema exists, so return-value documentation is not needed. No significant gaps remain for the agent to resolve through trial and error.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents both parameters. The description adds practical context: passing None for limit uses 100, and raising to 5000 is suggested for large libraries. For include_trashed, it restates the default but reinforces the desktop-matching semantics already present in the schema. This goes slightly beyond the baseline without adding non-essential detail.

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

Purpose5/5

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

The description opens with a specific verb ('List all collections') and a precise resource scope (the currently active Zotero library, as a hierarchical tree with 8-character keys). It also explicitly distinguishes itself from zotero_search_collections, which finds single matches by name, leaving no ambiguity about what this tool does.

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

Usage Guidelines5/5

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

It tells the agent when to use this tool ('when the user wants to see the full library structure') and when to prefer an alternative ('If you already know a name and just need the key, prefer zotero_search_collections'). It also instructs the agent to switch libraries with zotero_switch_library if the active library is not the desired scope.

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

zotero_get_item_childrenZotero Get Item ChildrenA

List the child items (attachments, notes, annotations under an attachment) of one OR MANY parent Zotero items. Use it to find an item's PDF/EPUB attachment key before zotero_create_annotation or zotero_get_pdf_outline β€” those take an attachment key, NOT the parent item key. item_key: one 8-character parent key, or an ARRAY of keys (a JSON-encoded list string also works). Pass every key you have in ONE call: a batch is one API round trip instead of N, and a bad key is reported in its own section instead of aborting. Returns markdown β€” one key: attachments (content type, filename) and notes in full under the parent title; several keys: one compact line per child, grouped under each parent. Scope: active library only. Examples: zotero_get_item_children(item_key='RTKZQI8E'); zotero_get_item_children(item_key=['RTKZQI8E', '9UZR8GXT']).

ParametersJSON Schema
NameRequiredDescriptionDefault
item_keyYesOne item key, a list of keys, or a JSON/comma-separated string of keys

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description fully carries the burden of behavioral disclosure. It reveals that the tool returns markdown, describes the output format for single vs. multiple keys, states the scope (active library only), and notes that bad keys are reported in their own section rather than aborting. This is comprehensive and goes well beyond minimal requirements.

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

Conciseness4/5

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

The description is dense and front-loaded with purpose and usage, followed by parameter details, output format, scope, and examples. Every sentence contributes value; however, it is slightly long and could be tightened. Still, it is well-structured and efficient for the amount of information conveyed.

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

Completeness5/5

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

The description covers all necessary aspects: purpose, usage conditions, parameter semantics, output format, scope, and examples. Even with an output schema present, the description supplements it with practical details like error handling and batching. There is nothing an agent needs to know to correctly invoke the tool that is missing.

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

Parameters5/5

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

Although schema coverage is 100% (item_key is described), the description adds significant semantic value: it explains accepted formats (single key, array, JSON string), provides concrete examples, and explains the batch behavior (one API round trip, per-key error reporting). This materially enhances the agent's understanding of how to construct the parameter correctly.

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

Purpose5/5

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

The description clearly states the tool lists child items (attachments, notes, annotations) of one or many parent items, and explicitly distinguishes it from sibling tools like zotero_create_annotation and zotero_get_pdf_outline by noting it returns the attachment key needed by those tools. It identifies the specific verb and resource with high precision.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool: to find an attachment key before zotero_create_annotation or zotero_get_pdf_outline, and clarifies that those tools require an attachment key, not the parent key. It also provides batching guidance (one call for multiple keys) and explains error handling for bad keys. This is exemplary guidance for selecting this tool over alternatives.

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

zotero_get_item_fulltextZotero Get Item FulltextA

Return the extracted text of a Zotero item's primary attachment (PDF or EPUB). WARNING: returns most or all of the paper (often 10K+ tokens). Use ONLY when the user explicitly wants to READ the paper β€” not for searching or browsing. For topic search use zotero_semantic_search; for metadata only use zotero_get_item_metadata. PDFs are read up to fulltext_display_max_pages (10 by default); when that cuts a document short the heading names the page range and TRUNCATED β€” read on with zotero_read_pdf_pages. Avoid calling this on multiple papers in one conversation unless the user specifically asked to read several. item_key: 8-character Zotero item key. Normally the parent item β€” the tool locates the attached PDF/EPUB itself, preferring PDF unless attachment_priority says otherwise. Passing an attachment's own key instead reads exactly that file and skips the priority order, which is how you read one specific attachment of an item that has several (find keys via zotero_get_item_children). Scope: active library only. Extraction path (in order): local Zotero storage via SQLite when running in local mode (fastest, respects pdf_max_pages config); Zotero's server-side fulltext index; direct download and parsing as a last resort. Image-only scanned PDFs without OCR may return little or no text. Example: zotero_get_item_fulltext(item_key='RTKZQI8E').

ParametersJSON Schema
NameRequiredDescriptionDefault
item_keyYesZotero item key/ID. Normally the parent item, whose best attachment is chosen by ``attachment_priority``. Passing an *attachment's* own key is also supported and reads exactly that file, bypassing the priority order β€” pair it with ``zotero_get_item_children`` to read one specific attachment of an item that has several (#378).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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 succeeds. It discloses large token output (often 10K+), truncation behavior with fulltext_display_max_pages, the TRUNCATED heading, follow-up via zotero_read_pdf_pages, extraction path order, and image-only OCR limitations. This goes well beyond what structured fields would reveal.

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

Conciseness5/5

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

The description is long but every sentence earns its place: warning, alternatives, truncation behavior, extraction path, attachment semantics, and a final example. The critical warning is front-loaded, and the example anchors correct invocation.

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

Completeness5/5

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

The description covers purpose, when to use, what to expect, truncation follow-up, attachment priority behavior, library scope, extraction paths, and limitations. Since an output schema exists, return-value shape does not need separate explanation. Nothing essential is missing for an agent to invoke this tool correctly.

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

Parameters4/5

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

The schema coverage is 100% and already documents parent-item versus attachment-key semantics. The description supplements this with the 8-character key format, PDF preference unless attachment_priority says otherwise, and a concrete pointer to zotero_get_item_children for finding attachment keys. These additions justify a small uplift above the high-coverage baseline.

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

Purpose5/5

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

The first sentence states a precise verb and resource: 'Return the extracted text of a Zotero item's primary attachment (PDF or EPUB).' It also distinguishes itself from siblings by naming zotero_semantic_search and zotero_get_item_metadata, so an agent can tell them apart 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.

Usage Guidelines5/5

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

Usage is explicitly gated: 'Use ONLY when the user explicitly wants to READ the paper β€” not for searching or browsing.' It names the alternatives for topic search and metadata-only requests, and warns against calling it on multiple papers unless the user asked to read several. This is model-ready guidance.

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

zotero_get_item_metadataZotero Get Item MetadataA

Fetch detailed metadata (title, creators, date, DOI, publisher, tags, abstract, URL, etc.) for ONE Zotero item by key. If the metadata and abstract don't contain what you need, call zotero_get_item_fulltext to read the paper β€” but that is resource-intensive (10K+ tokens) and should NEVER be used for searching; use zotero_search_items or zotero_semantic_search instead. item_key: the 8-character Zotero item key (NOT a DOI or title). include_abstract=True (default) includes the abstractNote in markdown output; pass False to trim tokens when you don't need it. (Ignored in bibtex/json formats.) format='markdown' (default) returns a human-readable block; format='json' returns the complete raw Zotero item record; format='bibtex' returns a BibTeX citation string suitable for .bib files. Scope: active library only (switch with zotero_switch_library). Unlike list endpoints, this returns items EVEN IF THEY ARE IN THE TRASH β€” a Status: In Trash line is surfaced when the item is trashed (recoverable via the Zotero UI). Collection membership is shown as keys rather than a bare count so the caller can verify entries against zotero_search_collections (the Zotero API does not cascade collection-delete to items, so dangling references can linger). Example: zotero_get_item_metadata(item_key='RTKZQI8E', format='bibtex').

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoOutput format - 'markdown' for a readable summary, 'json' for the complete raw Zotero item, or 'bibtex' for BibTeX citationmarkdown
item_keyYesZotero item key/ID
include_abstractNoWhether to include the abstract in the output (markdown format only)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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 β€” and it meets it thoroughly. It surfaces the surprising behavior that trashed items ARE returned, that a 'Status: In Trash' line is shown, and that collection membership is exposed as keys rather than counts, even explaining the API root cause ('the Zotero API does not cascade collection-delete to items, so dangling references can linger'). It also discloses format-specific quirks like include_abstract being ignored in bibtex/json.

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

Conciseness5/5

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

Dense but every sentence earns its place: core purpose first, then alternative routing, then parameter clarifications, then edge cases, closing with a concrete example invocation. The key-format warning and fulltext-cost caution each prevent a distinct real failure mode, and the example ties the format parameter to a realistic call.

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

Completeness5/5

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

Covers the full decision space for an agent: primary function, when to defer to fulltext vs search tools, param semantics, library scope, trash/collection edge cases, and a worked example. With an output schema present, omitting detailed return-value descriptions is appropriate and keeps the description complete without redundancy.

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

Parameters4/5

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

Schema coverage is 100%, setting the baseline at 3, but the description adds meaning beyond the schema. The item_key warning ('8-character Zotero item key (NOT a DOI or title)') prevents a common agent error, and format outputs are characterized more richly ('sufficient for .bib files', 'complete raw Zotero item record'). The only reason it is not a 5 is that the schema already documents most parameter behavior well, leaving the description to add clarifications rather than foundational semantics.

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

Purpose5/5

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

Opens with a specific verb and resource: 'Fetch detailed metadata (title, creators, date, DOI, publisher, tags, abstract, URL, etc.) for ONE Zotero item by key.' The emphasis on 'ONE' distinguishes it from list endpoints, and naming zotero_get_item_fulltext as the sibling for reading full text clarifies what this tool is not. No ambiguity remains about what is fetched, for how many items, or by what identifier.

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

Usage Guidelines5/5

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

Gives explicit routing conditions: 'call zotero_get_item_fulltext' when metadata is insufficient, and 'should NEVER be used for searching; use zotero_search_items or zotero_semantic_search instead.' It also announces the active-library-only scope with a pointer to zotero_switch_library, leaving no doubt about when this tool applies versus its alternatives.

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

zotero_get_notesZotero Get NotesA

Read notes from the active Zotero library. Omit query to LIST notes: with item_key, that item's child notes; without it, notes library-wide (capped by limit). Pass query to SEARCH note and annotation text instead β€” case-insensitive substring over the stripped-text body, library-wide, so query and item_key cannot be combined. limit: max results (default 20). truncate=True (default) shortens long bodies for display; pass False for complete content (list mode only). raw_html=True returns a note's original HTML instead of stripped text β€” use it when you intend to edit and round-trip via zotero_manage_note(action='update'). Scope: active library only (zotero_switch_library to change). Example: zotero_get_notes(item_key='ABC12345', raw_html=True); zotero_get_notes(query='mindfulness').

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
item_keyNo
raw_htmlNo
truncateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description carries full behavioral disclosure. It describes case-insensitive substring matching, stripped-text vs raw HTML output, truncation behavior, limit capping, and the constraint that query and item_key cannot be combined. This is more than enough for an agent to predict side effects and output shape.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: core action, mode selection, parameter semantics, caveats, scope, and examples. It is front-loaded with the primary behavior and uses concrete examples to illustrate usage.

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

Completeness5/5

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

For a tool with five parameters, two main modes, an output schema, and important interaction constraints, the description is complete. It covers all parameter effects, mode limitations, scope behavior, and a practical example, so an agent has everything needed to invoke it correctly.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must document all parameters, and it does: limit (max results, default 20), query (search text), item_key (child notes scope), raw_html (original HTML for round-trip), and truncate (shortening long bodies). This adds meaning well beyond the bare schema.

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

Purpose5/5

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

Description opens with a specific verb and resource: 'Read notes from the active Zotero library.' It clearly distinguishes two modes (list vs search) and child-note vs library-wide scoping, which separates it from sibling tools like zotero_get_annotations and zotero_manage_note.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance: 'Omit query to LIST notes... Pass query to SEARCH...' It also states when not to combine query and item_key, and points to zotero_manage_note for round-tripping raw HTML and zotero_switch_library for changing scope. An agent can select the right call mode without ambiguity.

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

zotero_get_page_layoutZotero Get Page LayoutA

Detect candidate figure/table regions on a PDF page and return their normalized bounding boxes, so area annotations can be placed on detected content instead of guessed positions. ALWAYS call this before zotero_create_annotation's area mode unless exact coordinates are already known. Returns each region's bounding box (x, y, width, height in [0, 1]), source (image/drawing/table/merged), associated caption (e.g. 'Figure 3: ...'), confidence level, and a ready-to-paste zotero_create_annotation call. Note: detection is geometric β€” boxes cover the graphical core of a figure/table; text labels inside figures or unruled table headers may fall outside the box. Confidence reflects caption matching, not box completeness. attachment_key: PDF attachment key β€” NOT the parent item key (use zotero_get_item_children to find attachments). page: 1-indexed page number (page 1 is the first page). Scope: PDFs only β€” EPUB attachments are NOT supported. Read-only: works in both local and web API modes. Example: zotero_get_page_layout(attachment_key='NHZFE5A7', page=7).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageYes1-indexed PDF page number
attachment_keyYesPDF attachment key (e.g., "NHZFE5A7")

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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 detection is geometric, that boxes may exclude text labels or unruled table headers, and that confidence reflects caption matchingβ€”not box completeness. It also states read-only nature and web/local API support, giving a complete behavioral picture.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: purpose, usage directive, return contents, behavioral caveats, parameter clarifications, scope, read-only note, and an example. Information is front-loaded; the most critical 'ALWAYS call' instruction appears early. No fluff or redundancy.

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

Completeness5/5

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

For a tool with two parameters, an output schema, and important interaction with sibling tools, the description covers all necessary aspects: what it returns, how to use it correctly, what pitfalls exist (attachment key type, geometric detection), and a concrete usage example. An agent has everything needed to invoke it correctly without further research.

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

Parameters4/5

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

Schema coverage is 100% and both parameters have descriptions, but the tool description adds practical nuance: attachment_key is clarified as NOT the parent item key (directing to zotero_get_item_children) and page is emphasized as 1-indexed. The example further disambiguates usage, going beyond the basic schema.

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

Purpose5/5

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

The description states a specific action ('Detect candidate figure/table regions') and resource ('on a PDF page') and immediately clarifies its role in the annotation workflow. It names the sibling it feeds into (zotero_create_annotation), making the distinction from other tools explicit.

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

Usage Guidelines5/5

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

It explicitly instructs 'ALWAYS call this before zotero_create_annotation's area mode unless exact coordinates are already known', provides an alternative for finding attachment keys (zotero_get_item_children), and limits scope to PDFs (excluding EPUB). Clear when-to-use and when-not-to-use guidance.

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

zotero_get_pdf_outlineZotero Get Pdf OutlineA

Extract the table of contents (outline/bookmarks) from a PDF attachment, returned as a hierarchical markdown list with each entry's page number. Use this to orient in a paper before calling zotero_get_item_fulltext β€” the outline is typically < 200 tokens versus 10K+ for the full text. If the PDF has no embedded outline, returns a short 'no outline' message rather than failing. item_key: the PDF ATTACHMENT key OR the parent item key β€” both are accepted; attachment-to-parent resolution is automatic. Find the right key with zotero_get_item_children if unsure. Scope: PDFs only (EPUBs have no outline extraction here). Requires PyMuPDF (the [pdf] extra). Read-only; works in local or web mode. Example: zotero_get_pdf_outline(item_key='RTKZQI8E').

ParametersJSON Schema
NameRequiredDescriptionDefault
item_keyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the return format, the graceful handling of missing outlines, the dual key acceptance with automatic resolution, the PyMuPDF dependency, compatibility with local/web modes, and read-only nature. This is thorough and goes beyond a basic statement of function.

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

Conciseness5/5

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

The description is long but every sentence adds value. It front-loads the core purpose, then covers usage, parameter semantics, scope, dependencies, and an example. There is no redundancy or filler; the structure logically guides the agent from understanding to invocation.

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

Completeness5/5

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

For a single-parameter tool, the description is remarkably complete. It covers the return format (hierarchical markdown with page numbers), the edge case of no outline, input key flexibility, dependency requirements, mode support, and read-only status. Given the output schema exists and the description aligns with it, nothing essential is missing for correct invocation.

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

Parameters5/5

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

The schema provides no description for the single parameter item_key (0% coverage). The description compensates fully by explaining that it accepts either the PDF attachment key or the parent item key, that resolution is automatic, and how to find the correct key using zotero_get_item_children. This adds crucial meaning beyond the bare schema.

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

Purpose5/5

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

The description clearly states the tool extracts the table of contents from a PDF attachment and returns a hierarchical markdown list with page numbers. It uses specific verbs and resources, and distinguishes itself from zotero_get_item_fulltext by positioning it as a lightweight orienting step. The purpose is unambiguous and well-differentiated from sibling tools.

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

Usage Guidelines5/5

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

The description explicitly recommends using this tool before zotero_get_item_fulltext, with a concrete rationale (token size comparison: <200 vs 10K+). It also states the PDF-only scope and that it returns a friendly 'no outline' message instead of failing, which guides when to expect success or failure. No alternatives are named for EPUBs, but the exclusion is clear.

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

zotero_get_recentZotero Get RecentA

List the most recently ADDED items (by dateAdded) in the active library, optionally scoped to a single collection. Use this for 'what did I add recently?' questions β€” NOT for general topic search (use zotero_semantic_search) or for a collection's full contents (use zotero_get_collection_items). limit: how many recent items to return (default 10). collection_key: optional 8-character collection key to restrict results to that collection; when omitted, returns the N most recent items across the whole library. Ordering is dateAdded DESC. All item types are returned, INCLUDING standalone notes and attachments β€” so results can mix papers, notes, and loose PDFs. If you only want parent items, filter client-side by itemType in the output. Scope: active library only (switch with zotero_switch_library). Example: zotero_get_recent(limit=20) or zotero_get_recent(collection_key='MT53KB66', limit=5).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of items to return
collection_keyNoOptional collection key to scope results to a specific collection

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does so well: it discloses ordering (dateAdded DESC), inclusion of standalone notes and attachments, client-side filtering advice, and active-library scoping. It does not discuss potential edge cases like limit caps or error behavior, but these are minor for a read-only 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.

Conciseness5/5

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

The description is dense but every sentence earns its place: purpose, usage exclusions, parameter semantics, behavioral caveats, scope, and an example. It is front-loaded with the core purpose and uses formatting (capitalization, dashes, examples) to aid scanning.

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

Completeness5/5

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

For a two-parameter read tool with an output schema, the description covers everything an agent needs: what it returns, how it orders, what it includes, how to scope, when to use alternatives, and a usage example. No critical gap remains.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real value: it explains the default limit, the 8-character collection key format, the behavior when collection_key is omitted, and provides concrete examples. This goes beyond the schema's minimal parameter descriptions.

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

Purpose5/5

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

States a specific verb ('List'), resource ('most recently ADDED items'), and scope ('active library'), with optional collection scoping. It also explicitly distinguishes itself from zotero_semantic_search and zotero_get_collection_items, making its purpose unmistakable.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance ('what did I add recently?') and names specific alternatives with conditions for choosing them ('NOT for general topic search... NOT for a collection's full contents'). Also clarifies active-library scope and how to switch libraries.

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

zotero_get_search_database_statusZotero Get Search Database StatusA

Report the semantic search database's readiness and stats: item count, last update time, embedding provider / model, and whether the [semantic] optional dependency is installed. Use this to decide whether zotero_semantic_search will return useful results, or whether the user should run zotero_update_search_database first. Takes no parameters; no side effects. Returns a human-readable status block. If the [semantic] extras are not installed, returns an install hint instead of stats. Example: zotero_get_search_database_status() β†’ count, last sync, provider summary.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states 'no side effects', describes the conditional install-hint behavior when the semantic extras are absent, and indicates the output format is a human-readable status block. This covers the essential behavioral traits, though it could add minor operational details such as potential latency or failure modes.

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

Conciseness5/5

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

The description is compact and every sentence earns its place: purpose, guiding decision, parameter/side-effect note, return behavior, and an illustrative example. It is front-loaded with the primary purpose and avoids unnecessary filler.

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

Completeness5/5

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

For a zero-parameter status tool with an output schema, the description is complete. It covers what the tool reports, when to invoke it, side effects, the fallback behavior, and an example result. The sibling tool list provides enough surrounding context for an agent to select it correctly.

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

Parameters4/5

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

The tool has zero parameters, so the schema already documents everything. The description reaffirms 'Takes no parameters' and explains what the no-input call will yield, which is sufficient given the empty input schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Report the semantic search database's readiness and stats', then enumerates the exact stats returned (item count, last update time, embedding provider/model, optional dependency installed). This clearly distinguishes the tool from siblings like zotero_semantic_search and zotero_update_search_database.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool: 'Use this to decide whether zotero_semantic_search will return useful results, or whether the user should run zotero_update_search_database first.' It names the applicable alternatives and the decision condition, leaving no ambiguity.

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

zotero_get_tagsZotero Get TagsA

List all tags used in the currently active Zotero library, as a flat markdown list (one tag per line). Use this for tag discovery before filtering with zotero_search_by_tag or batch-editing with zotero_batch_update. Scope is the active library only β€” switch with zotero_switch_library before listing. The list is flat: tags have no parent/child structure in Zotero, only a colon convention ("area/subtag") that this tool preserves verbatim. limit: cap on tags returned; None (default) returns all. Example output:

  • to-read

  • methods/qualitative

  • AI agents

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of tags to return

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the burden and discloses meaningful behavior: output is a flat markdown list, tags preserve the colon convention, limit defaults to None meaning all, and scope is active-library only. It leaves out only minor details such as ordering, which a read-only listing tool can reasonably omit.

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

Conciseness5/5

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

The primary action and output format are front-loaded, and every sentence adds needed context: use case, scope, flat-tag convention, limit semantics, and a concrete example. Nothing is wasted.

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

Completeness5/5

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

For a one-parameter read-only listing tool with an output schema, the description covers purpose, scope, output shape, parameter default, and relationship to sibling tools. No meaningful gap remains for an agent to invoke it correctly.

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

Parameters4/5

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

Schema already documents the single 'limit' parameter at 100% coverage, so baseline is 3. The description adds value by clarifying the default behavior ('None (default) returns all') and showing an example use of the limit.

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

Purpose5/5

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

States a specific verb ('List') and resource ('all tags used in the currently active Zotero library') plus the output format ('flat markdown list'). It is clearly differentiated from sibling tools by naming downstream uses such as zotero_search_by_tag and zotero_batch_update.

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

Usage Guidelines5/5

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

Explicitly says to use this tool for tag discovery before filtering or batch-editing, and points to zotero_switch_library to change scope. This gives an agent clear when and how to route to the tool.

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

zotero_list_librariesZotero List LibrariesA

List every Zotero library this MCP can address: the user's personal library (libraryID=1 conventionally), all group libraries the user is a member of (with groupID), and (in local mode) RSS feed libraries. Each entry shows the library/group ID, display name, and item count. Use this to discover a library ID before calling zotero_switch_library β€” the two form a read-then-switch workflow. If the user only wants to see Zotero collections inside the CURRENT library, use zotero_get_collections instead. No parameters. In local mode: reads the local Zotero SQLite DB (fast, includes RSS feeds). In web mode: queries /groups via the Zotero web API (no feeds). Read-only; no side effects. The active library isn't flagged in the output β€” track it yourself from the last successful zotero_switch_library call (or the ZOTERO_LIBRARY_ID env var if none). Example: zotero_list_libraries().

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations supplied, the description carries the full behavioral burden, and it delivers: it states the tool is read-only with no side effects, explains local vs. web mode data sources, and warns that the active library is not flagged in the output, telling the agent to track state from zotero_switch_library or the env var. This is rich, non-obvious behavioral context.

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

Conciseness5/5

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

The description is long but every sentence earns its place: purpose, scope, entry contents, workflow relationship, exclusion, mode differences, read-only guarantee, state caveat, and an example. It is front-loaded with the core list behavior and progressively adds operational details without redundancy.

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

Completeness5/5

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

For a parameterless list tool with an output schema, the description is complete: it covers mode-dependent behavior, the workflow with zotero_switch_library, the sibling alternative, side effects, and an important state-tracking caveat. Nothing an agent needs to invoke this tool correctly is missing.

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

Parameters4/5

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

There are zero parameters and the schema already confirms that (100% coverage), so there is little semantic work for the description to do. The description still explicitly states "No parameters" and includes an example call, fully closing the loop; baseline 4 is appropriate.

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

Purpose5/5

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

The description states a precise verb and resource: "List every Zotero library this MCP can address," and enumerates exactly what is included (personal library, group libraries, RSS feeds in local mode). It also explicitly differentiates from zotero_get_collections, so an agent can distinguish it from its nearest sibling without inspecting schemas.

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

Usage Guidelines5/5

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

The description gives concrete when-to-use guidance: use it to discover a library ID before calling zotero_switch_library, framing the two as a read-then-switch workflow. It also names the alternative (zotero_get_collections) when the user wants collections inside the current library, providing a clear exclusion.

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

zotero_manage_noteZotero Manage NoteA

Create, update, or trash a Zotero note. item_key: the PARENT item's key for action='create', the NOTE's own key for 'update' and 'delete' (zotero_get_notes finds it). create: needs note_text β€” plain text, or simple HTML (p, strong, em, ul/li, a, code), which is preserved; Markdown is NOT supported β€” Markdown syntax is stored as literal text, and the create response carries a warning when it is detected; note_title becomes a heading; tags optional. update: needs note_text. append=False (default) REPLACES the whole body, append=True concatenates. To keep formatting, fetch with zotero_get_notes(raw_html=True), edit that HTML, and pass it back whole. delete: moves the note to the Trash β€” recoverable; emptying the Trash is manual in Zotero. Notes only, not items/collections/attachments. Requires a writable library: local writes (Zotero 10+, via zotero_authorize_local_writes) or a web API key. Example: (action='create', item_key='ABC12345', note_title='Reading notes', note_text='Key claim ...').

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
actionYes
appendNo
item_keyYes
note_textNo
note_titleNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

No annotations are present, so the description carries the full behavioral burden, and it delivers: Markdown is NOT supported and stored literally, append=True vs False behavior is explained, delete goes to Trash and is recoverable, and local-write or API-key prerequisites are stated. This goes well beyond the schema.

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

Conciseness5/5

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

Dense and well organized: action summary, key semantics, per-action rules, exclusions, prerequisites, then a concrete example. Although long, each sentence adds necessary information and the most important scoping comes first.

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

Completeness4/5

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

Complete for all three actions, with formatting caveats, key sourcing, recovery semantics, and an example. The only minor gap is that note_title/tags are described as create-time behaviors, so it is not fully explicit whether they can be changed during update.

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

Parameters5/5

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

Schema description coverage is 0%, but the description compensates by defining the overloaded item_key semantics per action, which parameters each action needs, the plain/HTML note_text format, append's interaction with body replacement, note_title as heading, and tags being optional. Every parameter is given operational meaning.

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

Purpose5/5

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

Opens with a specific verb+resource: 'Create, update, or trash a Zotero note.' It also distinguishes itself from siblings with 'Notes only, not items/collections/attachments,' so an agent won't confuse it with zotero_update_item or zotero_delete_item.

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

Usage Guidelines4/5

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

Provides clear context: how to obtain the correct item_key via zotero_get_notes, that a writable library is required, and that note-level operations are in scope while items/collections/attachments are excluded. It doesn't explicitly name the alternative tool for non-note entities, but the exclusion is clear enough.

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

zotero_read_pdf_pagesZotero Read Pdf PagesA

Read specific page range(s) from a PDF attachment of a Zotero item. Use this when you know which pages to read β€” for example after getting the PDF outline via zotero_get_pdf_outline. Pages are 1-indexed. format='text' (default) returns Markdown with the heading structure preserved and flags pages whose equations, figures or tables the text garbles. format='image' returns the pages as PNG images (up to 10) so those can be read exactly; rect=[x, y, width, height] (normalized 0-1, e.g. from zotero_get_page_layout) returns just that region of start_page, zoomed in.

ParametersJSON Schema
NameRequiredDescriptionDefault
rectNoWith format="image", crop start_page to [x, y, width, height].
formatNo"text" for Markdown, "image" for PNG page images.text
end_pageNoLast page to read (1-indexed). If omitted, reads only start_page.
item_keyYesZotero item key/ID of the paper or its PDF attachment.
start_pageYesFirst page to read (1-indexed).

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden, and it delivers: pages are 1-indexed, text output preserves headings and flags garbled equations/figures/tables, image output returns PNGs up to 10 pages, and rect uses normalized 0-1 coordinates and zooms into start_page. This goes well beyond a generic 'read PDF' statement and tells the agent what to expect.

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

Conciseness5/5

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

Three dense, purposeful sentences front-load the core action, then cover the text format, image format, and rect behavior without repetition. No filler or redundant restating of the schema is present.

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

Completeness5/5

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

For a 5-parameter, no-output-schema tool with no annotations, the description is remarkably complete: it covers when to use it, what both formats return, page indexing, image limits, and the rect coordinate convention. An agent has enough information to invoke the tool and interpret the result correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful meaning: it explains that pages are 1-indexed, that rect coordinates are normalized 0-1 and can come from zotero_get_page_layout, and that image output is capped at 10 pages. This is useful context beyond the raw schema field descriptions.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Read specific page range(s) from a PDF attachment of a Zotero item.' It clearly distinguishes this tool from siblings like zotero_get_item_fulltext by emphasizing page-specific reading and by referencing zotero_get_pdf_outline as the precursor. The two output formats are also stated, so an agent can tell exactly what this tool is for.

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

Usage Guidelines4/5

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

The description explicitly says 'Use this when you know which pages to read β€” for example after getting the PDF outline via zotero_get_pdf_outline.' That gives clear context for when to invoke it and points to a related sibling tool. It does not explicitly name alternatives to avoid, such as full-text extraction, so it stops short of a full when-not list.

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

zotero_search_by_citation_keyZotero Search By Citation KeyA

Look up a single Zotero item by its BetterBibTeX citation key (e.g. 'Smith2024' or 'cladderMicus2018'). Returns that one item's metadata, or a not-found message if no item has that key. citekey: the citation key exactly as assigned by BetterBibTeX (case-sensitive). In local mode: queries the running Better BibTeX plugin via its HTTP API (Zotero desktop must be running and have BBT installed). In web mode: scans the 'Extra' field of items for 'Citation Key:' lines β€” slower, and may miss items whose keys aren't persisted to Extra. Requires the Better BibTeX plugin in the user's Zotero install. For partial-key or free-text lookup, use zotero_search_items. Example: zotero_search_by_citation_key(citekey='hasan2026mcp') β†’ metadata for that single item.

ParametersJSON Schema
NameRequiredDescriptionDefault
citekeyYesThe BetterBibTeX citation key to search for (e.g., 'Smith2024')

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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 the return behavior (metadata or not-found message), local/web execution differences, the requirement that Zotero desktop and Better BibTeX are running, and the limitation that web mode may miss keys not persisted to Extra. This is thorough for a read-style lookup tool.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, then efficiently covers modes, limitations, and alternatives. Every sentence adds useful information, and the final example reinforces practical usage without padding.

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

Completeness5/5

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

Given that the tool has a single parameter, an output schema is present, and there are many sibling search tools, the description is complete. It covers prerequisites, mode-specific behavior, failure cases, alternative routing, and parameter nuance, leaving no critical gap for correct invocation.

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

Parameters5/5

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

Although the schema already describes citekey at 100% coverage, the description adds crucial semantics beyond it: the key must be 'exactly as assigned by BetterBibTeX' and is 'case-sensitive.' It also provides a concrete invocation example, which helps the agent construct valid calls.

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

Purpose5/5

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

The description states a specific action ('Look up a single Zotero item by its BetterBibTeX citation key') and gives concrete examples. It clearly distinguishes this tool from sibling zotero_search_items by emphasizing exact-key lookup versus partial/free-text search.

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

Usage Guidelines5/5

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

The description explicitly says when not to use this tool: 'For partial-key or free-text lookup, use zotero_search_items.' It also explains the two operational modes (local vs web) and the plugin requirement, so an agent can determine when invocation is appropriate.

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

zotero_search_by_tagZotero Search By TagA

Find items carrying one or more tags, with boolean syntax support. tag: list of tag strings; each entry is a condition ANDed with the others, and within an entry you can use ' OR ' for disjunction and a leading '-' for exclusion. Example: tag=['methods OR methodology', '-draft'] matches items tagged 'methods' OR 'methodology' AND NOT tagged 'draft'. item_type: '-attachment' (default) excludes attachments; pass 'journalArticle', 'book', etc. to filter. limit: max results (default 10). collection_key: optional 8-char key to scope to a collection. include_subcollections: also search collections nested beneath it (default False). Use zotero_get_tags to discover available tag names first. For free-text content search, use zotero_search_items or zotero_semantic_search instead. Example: zotero_search_by_tag(tag=['to-read'], limit=20).

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYesList of tag conditions. Items are returned only if they satisfy ALL conditions in the list. Each tag condition can be expressed in two ways: As alternatives: tag1 OR tag2 (matches items with either tag1 OR tag2) As exclusions: -tag (matches items that do NOT have this tag) For example, a tag field with ["research OR important", "-draft"] would return items that: Have either "research" OR "important" tags, AND Do NOT have the "draft" tag
limitNoMaximum number of results to return
item_typeNoType of items to search for. Use "-attachment" to exclude attachments.-attachment
collection_keyNoOptional collection key to scope the search to a specific collection
include_subcollectionsNoAlso search collections nested beneath collection_key. Ignored when collection_key is not given.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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 key behavioral traits: boolean AND/OR/exclusion semantics, default attachment exclusion, default limit of 10, and collection scoping behavior. It doesn't state edge cases like case sensitivity or error behavior, but the read-only nature is clearly implied by 'find items' and the output schema covers return shape.

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

Conciseness5/5

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

The description is front-loaded with a purpose sentence, then uses a compact list to cover each parameter, followed by routing guidance and an example. Every sentence adds either behavioral or semantic value; there is no filler.

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

Completeness5/5

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

For a read/search tool with a complete input schema and an output schema, the description covers the only missing pieces: how to construct tag queries, defaults, scoping, and when to choose a sibling tool. Nothing needed to invoke it correctly is omitted.

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

Parameters4/5

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

Although schema coverage is 100%, the description adds practical meaning: it gives a worked example of boolean tag syntax, specifies examples of item_type values ('journalArticle', 'book'), and explains defaults and the collection_key scoping interaction. These details go beyond the schema's property descriptions.

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

Purpose5/5

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

The opening line 'Find items carrying one or more tags, with boolean syntax support' names a specific verb, resource, and scope. It also names sibling alternatives for free-text search, making it distinguishable from zotero_search_items, zotero_semantic_search, and zotero_search_by_citation_key. The example call reinforces the operation.

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

Usage Guidelines5/5

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

It explicitly advises using zotero_get_tags first to discover valid tag names, which is a concrete prerequisite. It also states when NOT to use this tool: 'For free-text content search, use zotero_search_items or zotero_semantic_search instead.' These exclusions give the agent clear routing among siblings.

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

zotero_search_collectionsZotero Search CollectionsA

Search collections by name in the active library and return their 8-character keys. Matching is case-insensitive substring and applies ONLY to the collection's own name β€” not to parent names, descriptions, or items inside the collection. Multi-word queries are ANDed across words (NOT OR-ed): query 'reading list' matches only collections whose name contains both 'reading' AND 'list'. To match either word, issue two separate searches. Leading/trailing whitespace is ignored and empty words are dropped. Returns the collection's key plus its parent (if any). include_trashed: when True, also match collections currently in the Zotero Trash (results annotated as such). Default False β€” trashed collections are otherwise invisible to automated clients. Performance: scans all collections in the active library (O(n)); for very large libraries expect a full-list pagination under the hood. Example: zotero_search_collections(query="orals") β†’ keys for every collection with "orals" in its name.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
include_trashedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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 is exceptionally transparent. It discloses case-insensitive substring matching, AND semantics across words, whitespace handling, trash behavior, return of parent keys, and even performance characteristics (O(n) scan, pagination). This goes well beyond what a schema or annotation would reveal.

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

Conciseness5/5

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

The description is long but every sentence earns its place: matching rules, AND vs OR behavior, whitespace handling, return format, trash parameter, performance note, and an example. It is front-loaded with the core purpose and progressively adds detail in a logical order.

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

Completeness5/5

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

Given the two simple parameters and an output schema, the description leaves no important gap. It covers matching semantics, return fields, parameter behavior, performance expectations, and gives a practical example. The presence of an output schema means it does not need to detail return structure further.

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

Parameters5/5

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 entirely for parameter meaning. It fully explains query semantics including multi-word AND behavior and whitespace trimming, and it explains include_trashed's default, effect, and annotation of trashed results. Both parameters are completely clarified.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Search collections by name in the active library and return their 8-character keys.' It clearly distinguishes this from item/tag searches by stating the match applies only to the collection's own name, not parent names, descriptions, or items. The example further anchors the purpose.

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

Usage Guidelines4/5

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

The description gives clear context: use this tool when searching collection names in the active library, and it explicitly sets boundaries (only own name, not items/parents/descriptions). It also provides actionable guidance for multi-word queries ('To match either word, issue two separate searches'). However, it does not name sibling alternatives such as zotero_get_collections or zotero_search_items as explicit 'use this instead' routing.

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

zotero_search_itemsZotero Search ItemsA

Search Zotero items by substring match against metadata (title, creators, year, and β€” in 'everything' mode β€” abstract). Returns metadata + abstracts as markdown. IMPORTANT: keep queries SHORT and SIMPLE β€” 'Author Year' (e.g. 'Brewer 2011') or just an author name ('Cladder-Micus'). This is substring matching, not web search: each extra word NARROWS the match, so adding topic words usually returns fewer results, not more. For topic discovery, use zotero_semantic_search instead; for tag filtering use zotero_search_by_tag. If a query finds nothing, this tool automatically falls back to simplified queries and then semantic search. query: required substring. qmode: 'titleCreatorYear' (default) matches only title/authors/year; 'everything' also searches abstract. item_type: '-attachment' (default) excludes attachments; pass 'journalArticle', 'book', etc. to filter. tag: optional list of tag conditions (ANDed). limit: max results (default 10). collection_key: 8-char key to restrict to a collection (bypasses the fallback cascade). include_subcollections: also search collections nested beneath it (default False). search_all_libraries: search personal + all group libraries at once, labelling each result with its library β€” use it when you don't know which library holds the item. Needs the SQLite backend (the default in local mode); excludes collection_key. Example: zotero_search_items(query='Cladder-Micus') or zotero_search_items(query='Brewer 2011', search_all_libraries=True).

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoTag filter. Accepts ["tagA", "tagB"] (preferred), a bare string "tagA", a JSON-string list '["tagA", "tagB"]', or the dict-shape [{"tag": "tagA"}] sometimes emitted by clients that confuse the filter form with Zotero's stored-tag form. All are normalized internally to the list[str] form pyzotero expects.
limitNoMaximum number of results to return
qmodeNoQuery mode (titleCreatorYear or everything)titleCreatorYear
queryYesSearch query string
item_typeNoType of items to search for. Use "-attachment" to exclude attachments.-attachment
collection_keyNoOptional collection key to scope the search to a specific collection. When provided, bypasses the fallback cascade and searches the collection directly.
search_all_librariesNoSearch every accessible library at once instead of the active one (#163). Requires the SQLite backend; each result is labelled with the library it came from. Cannot be combined with collection_key, which names a collection inside one library.
include_subcollectionsNoAlso search collections nested beneath collection_key. Ignored when collection_key is not given. Defaults to False, matching Zotero's own "Search subcollections" checkbox.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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 the fallback cascade (auto-fallback to simplified queries then semantic search), the exclusion of attachments by default, and the requirement for SQLite backend for search_all_libraries. These are important behavioral traits beyond the schema, though it does not state return format details (mitigated by output schema) or any 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.

Conciseness3/5

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

The description is detailed but a bit long, mixing essential usage guidance with less critical parameter details. The most critical guidance (short queries, fallback behavior) is front-loaded, but the length might dilute attention. It could be tightened by moving example calls and some parameter clarifications to a separate 'examples' section.

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

Completeness5/5

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

For a tool with 8 parameters and only 1 required, the description covers all key aspects: query format, qmode, item_type, tag, limit, collection scoping, subcollections, and multi-library search. The output schema exists, so return values need no elaboration. It also provides two examples and clear caveats about backend requirements.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds significant value by explaining the meaning of 'everything' mode and clarifying that collection_key bypasses the fallback cascade, and that search_all_libraries labels results. It also warns against combining search_all_libraries with collection_key, which enriches the schema's descriptions.

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

Purpose5/5

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

The description clearly states the tool searches Zotero items by substring match against metadata, and it explicitly differentiates from siblings like zotero_semantic_search and zotero_search_by_tag. The verb 'search' plus the resource 'items' and the matching mode are specific, making the purpose unmistakable.

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

Usage Guidelines5/5

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

The description gives explicit guidance on when to use this tool vs alternatives: use it for short author-year queries, and directs to zotero_semantic_search for topic discovery and zotero_search_by_tag for tags. It also advises keeping queries simple, which is a crucial usage rule.

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

zotero_set_item_collectionsZotero Set Item CollectionsA

Change which collections existing items belong to β€” an incremental add/remove of item membership, NOT collection creation (use zotero_create_collection / zotero_delete_collection for that). item_keys must be an ARRAY of item keys, e.g. ["KEY1", "KEY2"] β€” not a single string. add_to and remove_from accept arrays of collection keys, names, or '/'-separated paths (resolved and validated automatically; unknown, trashed, or ambiguous specs fail before anything is changed). Existing memberships not named in remove_from are left alone; to replace an item's memberships wholesale use zotero_update_item. Use zotero_search_items to find item keys and zotero_search_collections to find collection keys.

ParametersJSON Schema
NameRequiredDescriptionDefault
add_toNo
item_keysYes
remove_fromNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations, the description carries the full burden. It discloses the incremental, non-destructive nature, explains that unknown/trashed/ambiguous specs fail before any changes, and states that unspecified existing memberships are preserved. This gives the agent a clear mental model of side effects and error handling.

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

Conciseness5/5

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

The description is compact yet information-dense, front-loading the primary action and differentiation before parameter details. Every sentence contributes valueβ€”no fluff or redundancy.

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

Completeness5/5

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

For a tool with 3 parameters, no annotations, and 0% schema coverage, the description covers the operation, alternatives, parameter formats, failure behavior, and key discovery. An agent has everything needed to invoke it correctly.

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

Parameters5/5

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

Schema coverage is 0%, so the description compensates fully. It specifies that item_keys must be an array (not a string), explains that add_to and remove_from accept arrays of keys, names, or paths, and clarifies their role in membership changes. This adds essential meaning beyond the raw schema.

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

Purpose5/5

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

The description clearly states the tool's action: 'Change which collections existing items belong to β€” an incremental add/remove of item membership.' It explicitly distinguishes from sibling tools like zotero_create_collection, zotero_delete_collection, and zotero_update_item, making its purpose unambiguous.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance: 'NOT collection creation' and 'to replace an item's memberships wholesale use zotero_update_item.' Also instructs how to find necessary keys via zotero_search_items and zotero_search_collections, leaving no ambiguity about when to invoke this tool versus alternatives.

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

zotero_set_item_parentZotero Set Item ParentA

Set or clear the parent of a Zotero item. Pass a parent item key to assign or change the parent, or null to make the item top-level. Zotero validates whether the requested parent-child relationship is allowed.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_keyYes
parent_keyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations present, the description carries the behavioral burden. It discloses that this is a mutating operation, that null makes the item top-level, and that Zotero validates allowed parent-child relationships. However, it does not mention write-authorization requirements or side effects on child items, which are relevant 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.

Conciseness5/5

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

Three short sentences front-load the core purpose, immediately give the null behavior, and add the validation caveat. There is no filler or restatement of schema information.

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

Completeness4/5

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

The tool is simple, has an output schema, and the description covers the main invocation semantics and validation behavior. The only notable gaps are the implicit role of item_key and the absence of write-authorization notes, but for a low-complexity tool this is close to complete.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It clearly explains parent_key semantics (parent key or null for top-level), but item_key is only implied as the item being modified and is never explicitly described. This partial parameter coverage warrants a 3.

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

Purpose5/5

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

The description states a specific verb and resource: 'Set or clear the parent of a Zotero item.' It also clarifies the null case (make top-level), which distinguishes this from read-only sibling tools like zotero_get_item_children and from collection operations like zotero_set_item_collections.

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

Usage Guidelines4/5

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

The description gives clear usage context: passing a parent key assigns/changes the parent, and passing null clears it. It stops short of a 5 because it does not explicitly mention alternatives or when not to use this tool, but the usage context is unambiguous.

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

zotero_switch_libraryZotero Switch LibraryA

Switch the active library context. EVERY subsequent read/write tool call (collections, items, annotations, search β€” all of them) operates on the library set here. Changes persist for the rest of the session or until the next switch. Discover valid library IDs/types via zotero_list_libraries first; don't guess. library_id: library ID string as returned by zotero_list_libraries (numeric for user/group, numeric for feeds). library_type: 'user' β€” the personal library; 'group' (default) β€” a group library; 'feeds' β€” a local RSS feed library; 'default' β€” RESET to whatever the ZOTERO_LIBRARY_ID / ZOTERO_LIBRARY_TYPE env vars configure (library_id is ignored in this mode). Fails fast if the library_id isn't accessible under the current credentials. Example: zotero_switch_library(library_id='5294983', library_type='group') or zotero_switch_library(library_id='', library_type='default').

ParametersJSON Schema
NameRequiredDescriptionDefault
library_idYesThe library/group ID to switch to. For user library: "0" (local mode) or your user ID (web mode). For group libraries: the groupID (e.g. "6069773").
library_typeNo"user", "group", or "default" to reset to env var defaults.group

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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. It does so thoroughly: changes persist for the session, 'default' resets to env-var configuration, library_id is ignored in that mode, and it 'Fails fast if the library_id isn't accessible under the current credentials.' This goes well beyond a bare 'switch' statement and gives the agent clear expectations for side effects, failure, and reset behavior.

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

Conciseness5/5

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

The description is long but every sentence earns its place. It front-loads the core state-changing behavior, then persistence, then discovery guidance, then param semantics, then fail-fast behavior, and ends with examples. There is no filler or repetition; the density is high and each piece is needed for correct invocation.

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

Completeness5/5

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

The description is complete for a session-state tool: it covers the state transition, persistence, all parameter modes, reset behavior, credential checks, and how to look up valid values. An output schema exists, so return values don't need to be explained. There is nothing an agent needs to know to call this tool correctly and safely that is missing.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds substantial semantic value beyond the schema. For library_type, it explains each value in plain language and adds 'feeds' β€” a value not present in the schema description β€” with its meaning. It also clarifies that library_id is ignored in 'default' mode and gives concrete examples for both parameters, which the schema does not provide. This is a model of parameter enrichment.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Switch the active library context.' It then explicitly defines the scope of that switch β€” 'EVERY subsequent read/write tool call ... operates on the library set here' β€” leaving no ambiguity about what the tool does. It is the only switching tool among siblings, and this definition clearly differentiates it from the read/write tools that operate within that context.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: switch before any other library-scoped calls, and persist for the session. It also instructs to 'Discover valid library IDs/types via zotero_list_libraries first; don't guess,' and documents the reset behavior via the 'default' type. There are no alternative switching tools, so no exclusion is needed; the guidance is complete and actionable.

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

zotero_synthesize_annotationsZotero Synthesize AnnotationsA

Collect every highlight, annotation comment, and child note across a scope and organize them into a structured, per-paper digest that YOU (the agent) can then synthesize into a literature summary. This tool does NOT call an LLM β€” it only gathers and groups the raw material, so the synthesis step is yours. collection_key: optional 8-character collection key; when given, only annotations/notes whose resolved paper is a member of that collection are included. When omitted, the whole active library is scanned (capped by limit). tag: optional tag or list of tags to filter items by (accepts a string, a JSON list, or a list). limit: cap on annotations/notes scanned (default 200) to keep the call tractable. format='markdown' (default) groups the digest by paper; format='json' returns the same highlights and notes as structured records for downstream processing. Markdown output has each paper heading followed by its highlights (with attached comments) and any note excerpts β€” plus a top summary line counting papers, highlights, and notes. Use this before writing a thematic review so you can spot themes and contradictions across sources. Example: zotero_synthesize_annotations(collection_key='MT53KB66').

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOptional tag filter (string, JSON list, or list).
limitNoMaximum annotations/notes to scan.
formatNo``markdown`` for a readable digest or ``json`` for structured per-paper annotation and note records.markdown
collection_keyNoOptional collection to restrict the digest to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries full burden and handles it well: it states the tool does NOT call an LLM, only gathers and groups raw material, caps scans by limit, and describes the markdown vs json output behavior plus the summary count line. This goes well beyond the structured schema.

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

Conciseness4/5

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

The description is dense and front-loaded with purpose, then behavior, parameters, output, and usage. A few output details are repeated ('groups the digest by paper' and the later markdown-output sentence), so it is not maximally tight, but no sentence is filler.

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

Completeness5/5

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

For a four-parameter, no-annotation tool with an output schema, this is complete: it explains scope resolution, filtering, limits, output formats and counts, and gives a concrete example call. An agent has what it needs to invoke correctly and know what to expect.

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

Parameters5/5

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

Even though schema coverage is already 100%, the description adds meaning: collection_key is 8 characters and filters by resolved-paper membership, omitted means whole active library, tag accepts string/JSON list/list, limit caps scan tractability, and format differences are explained. This is exactly the added semantic value parameter descriptions should provide.

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

Purpose5/5

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

The description names a specific action and resource: 'collect every highlight, annotation comment, and child note' and 'organize them into a structured, per-paper digest.' It also clarifies what the tool is not (it does not call an LLM), which separates it from synthesis-like workflows and sibling retrieval tools.

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

Usage Guidelines4/5

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

It gives a clear use case: 'Use this before writing a thematic review so you can spot themes and contradictions across sources.' It does not explicitly name sibling tools like zotero_get_annotations or zotero_get_notes as alternatives, nor state when not to use this tool, so it misses 'when-not' guidance.

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

zotero_update_annotationZotero Update AnnotationA

Update an existing Zotero annotation. Editable fields: text (highlight text), comment, color (hex like '#ffd400'), and tags. Tags can be replaced wholesale via tags, or edited incrementally via add_tags/remove_tags (mutually exclusive with tags). Position/page/sortIndex are anchored to the PDF/EPUB geometry and are not editable.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
textNo
colorNo
commentNo
add_tagsNo
remove_tagsNo
annotation_keyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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 that geometry fields are anchored and non-editable and explains the tag mutation modes. However, it does not say whether passing null leaves a field unchanged or clears it, and it does not describe response/error behavior 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.

Conciseness5/5

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

Three sentences, each doing real work: purpose, editable fields, and non-editable constraints. No filler or repetition of the schema; front-loaded with the most important fact. This is near-ideal density.

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

Completeness4/5

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

Given an output schema exists and sibling names are known, the description covers the calling decision: which field parameters mean, how tags work, and which properties cannot be changed. The missing piece is update semantics around null values and error cases, which would matter for a mutation tool, so it is strong but not fully complete.

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

Parameters4/5

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

Schema description coverage is 0%, so the description is the only source of parameter meaning. It defines text/comment/color with a concrete hex example and explains the three tag-related parameters and their mutual exclusivity. The required `annotation_key` is only implied by 'existing annotation', and null/default behavior is not explained, so not perfect.

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

Purpose5/5

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

Opens with a specific verb and object ('Update an existing Zotero annotation'), then lists exactly which fields are editable. Explicitly excluding position/page/sortIndex sets it apart from create/delete/geometry tools. No ambiguity about what this tool does.

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

Usage Guidelines4/5

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

The phrase 'existing' plus the requirement of an `annotation_key` signals this is for modifying an already-created annotation, not creating one. It also gives actionable sub-guidance for tags: wholesale replacement via `tags` vs incremental `add_tags`/`remove_tags`, and states they are mutually exclusive. It does not explicitly name sibling tools or give when-not-to-use conditions, but the context is clear.

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

zotero_update_collectionZotero Update CollectionA

Rename a collection or move it under a different parent, keeping its key, subcollections and item membership (#517). collection_key: the 8-character key of the collection to change. name: the new name, or omit to keep it. parent_collection: key or name of the new parent; a collection cannot be moved under itself or one of its own subcollections. to_top_level=True moves it out of any parent. Pass at least one change. Use zotero_search_collections to find keys. Example: zotero_update_collection(collection_key="KMMQDFQ4", name="AI & ML").

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
to_top_levelNo
collection_keyYes
parent_collectionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided; the description gives important behavioral constraints, such as the impossibility of moving under itself or subcollections, and the option to move to top level. It mentions error context (#517) but does not specify whether changes are reversible or what the response format is. It effectively explains core behavior constraints but misses some details.

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

Conciseness4/5

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

The description is efficient and packs relevant details into a few sentences, but it includes a parenthetical issue reference (#517) that adds little value for an agent. The front-loading of the purpose is good.

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

Completeness4/5

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

Despite having an output schema, expected return details are not explained in the description, but given that an output schema exists, the burden is reduced. The description explains how to find keys (via zotero_search_collections) and provides an example, making it sufficiently complete for most agent use cases.

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

Parameters5/5

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

Schema description coverage is 0%, but the description documents each parameter explicitly: collection_key as the key to change, name as optional new name, parent_collection as key or name, and to_top_level as moving out of any parent. It even provides an example that shows typical usage.

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

Purpose5/5

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

Clearly states topics of an update, mentions two specific actions (rename, move parent), and explains the impact on preservation (keeps key, subcollections, membership).

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

Usage Guidelines4/5

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

Provides guidance on usage by mentioning that at least one change is required and that a collection cannot be moved under itself or its own subcollections. Could be strengthened by explicitly contrasting with zotero_create_collection or zotero_delete_collection, but the restriction is stated.

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

zotero_update_itemZotero Update ItemA

Update metadata on an existing Zotero item by key. Only what you pass is changed. fields: {name: value} of metadata to set (a JSON object string is accepted). Names may be snake_case (title, date, doi, url, abstract, publication_title, access_date, short_title, book_title, citation_key, item_type, place, extra, volume, issue, pages, publisher, issn, isbn, edition, language) or any raw Zotero API field name. An unknown name fails the call and lists the valid ones; a name that is not valid for this item's type is reported as skipped. item_type migrates the item (overlapping fields kept, type-specific ones dropped). TAG SEMANTICS (easy to get wrong): tags REPLACES the whole tag list; add_tags/remove_tags are incremental and preferred. They are mutually exclusive with tags. collections (keys) and collection_names likewise REPLACE membership β€” pass collections=[] to clear it; for incremental moves use zotero_set_item_collections. creators: full replacement list of {creatorType, firstName, lastName} objects. Requires a writable library (fails in local-only mode). To edit notes use zotero_manage_note. Example: zotero_update_item(item_key='RTKZQI8E', fields={'doi': '10.1145/3708319'}, add_tags=['reviewed']).

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
fieldsNomapping (or JSON object string) of field name -> value. Names may be snake_case aliases (``publication_title``, ``short_title``, ``citation_key``) or raw Zotero API keys (``publicationTitle``). ``place`` is the publication city (e.g. ``"New York"``) and is valid on book, bookSection, thesis, manuscript, report and conferencePaper. ``citation_key`` writes Zotero's native ``data.citationKey`` (the BetterBibTeX citation key); BBT auto-pins from metadata on creation and provides no programmatic refresh path in 9.x, so a direct write here is the only programmatic remediation for malformed pinned keys. ``item_type`` migrates the item across types: overlapping fields are preserved and type-specific fields that do not map are dropped.
add_tagsNo
creatorsNofull replacement creators list (also accepted as ``fields['creators']``).
item_keyYes8-character Zotero item key of the item to update.
collectionsNo
remove_tagsNo
collection_namesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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 delivers: it discloses failure modes (unknown names fail and list valid ones, invalid-for-type names are skipped), item_type migration semantics, tag replacement vs incremental behavior, collection replacement semantics, full-replacement creator semantics, and the local-only write failure. This goes well beyond a generic 'update item' statement.

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

Conciseness5/5

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

The description is long, but it is dense, front-loaded, and internally structured with explicit warning sections like 'TAG SEMANTICS (easy to get wrong)'. Every sentence adds operational value, including the example call at the end. The length is justified by the tool's complexity and the absent annotations.

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

Completeness5/5

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

Given 8 parameters, no annotations, and a complex mutation tool, this description is complete: it covers update semantics, parameter edge cases, validation behavior, access requirements, and routing to alternatives. The presence of an output schema means return-value documentation is not required from the description.

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

Parameters5/5

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

Schema description coverage is only 38%, so the description must compensate. It does so thoroughly: it enumerates accepted field names, explains tag/collection replacement vs incremental modes, clarifies collections=[] clears membership, defines creators as a full replacement list with object shape, and notes the JSON-string-accepted form for fields. This adds substantial meaning beyond the bare schema.

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

Purpose5/5

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

The description states an explicit verb and resource: 'Update metadata on an existing Zotero item by key.' It also clarifies the partial-update behavior ('Only what you pass is changed') and distinguishes the tool from related siblings like zotero_manage_note and zotero_set_item_collections.

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

Usage Guidelines5/5

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

The description gives concrete when-to-use and when-not-to-use guidance: it warns that tags replaces the whole list and that add_tags/remove_tags are 'preferred,' routes incremental collection moves to zotero_set_item_collections, and directs note editing to zotero_manage_note. It also states the writable-library requirement.

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

zotero_update_search_databaseZotero Update Search DatabaseA

Build or refresh the semantic search embedding database from Zotero items. Run this: (a) after first install, (b) after adding items via zotero_add_item, or (c) when the user has added items directly in Zotero desktop since the last update. By default the update is INCREMENTAL β€” only new or changed items are re-embedded, so repeated calls are cheap. force_rebuild=True re-embeds ALL items from scratch (slow; use when changing the embedding model or recovering from corruption). limit: optional cap on items processed (useful for smoke-testing). Progress is reported via the MCP context; on large libraries an incremental update is seconds, a full rebuild can take minutes. Requires the [semantic] optional dependency and a configured embedding provider (see config.json). Check status with zotero_get_search_database_status. Example: zotero_update_search_database() after adding a batch of papers.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoLimit number of items to process (useful for testing)
force_rebuildNoWhether to rebuild the entire database from scratch

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries full burden. It discloses incremental vs full-rebuild behavior, performance expectations (seconds vs minutes), dependency requirements ([semantic] and configured provider), progress reporting via MCP context, and even the purpose of the limit parameter for smoke-testing. This is comprehensive behavioral disclosure.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, then uses numbered scenarios for readability. Every sentence adds valueβ€”trigger conditions, cost trade-offs, dependencies, and an example. No fluff; it is long but efficiently organized for a tool with this complexity.

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

Completeness5/5

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

Given the tool's complexity (semantic indexing, incremental vs full rebuild, dependencies, performance), the description covers all critical aspects: when to run, how it behaves, prerequisites, progress reporting, and a status-check sibling. It also provides an example call. Nothing essential is missing for correct invocation.

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

Parameters4/5

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

Schema already covers both parameters with descriptions (100% coverage), so baseline is 3. The description adds operational meaning: force_rebuild is for changing models or corruption recovery, and limit is for smoke-testing. This extra context elevates it above the baseline.

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

Purpose5/5

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

The description states a specific verb ('Build or refresh'), a resource ('semantic search embedding database'), and source ('from Zotero items'). It clearly distinguishes from siblings by naming zotero_get_search_database_status and implying semantic_search is the consumer, so an agent can route correctly 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.

Usage Guidelines5/5

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

Explicitly lists three triggering conditions (first install, after zotero_add_item, after manual additions) and differentiates incremental vs force_rebuild with performance guidance. It also points to the sibling status tool for verification, leaving no ambiguity about when to call this versus alternatives.

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

zotero_write_capabilitiesZotero Write CapabilitiesA

Report whether and how this server can write to Zotero: local API, web API, hybrid (local reads + cloud writes), or nothing. Read-only and instant β€” it never opens a dialog. Call it when a write tool reports that no writable backend is configured, to find out which fix applies before asking the user for anything: if the local server supports writes but no key is held, call zotero_authorize_local_writes; otherwise web API credentials are needed. Takes no arguments. Example: zotero_write_capabilities().

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and delivers: it states the call is read-only, instant, and never opens a dialog. This is important behavioral context because the tool name could misleadingly suggest a write action, and it reassures the agent there are no interactive side effects.

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

Conciseness5/5

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

Every sentence earns its place: the capability scope, behavioral safety, trigger condition, follow-up routing, parameter note, and example. The most important information is front-loaded and the routing guidance is kept tight.

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

Completeness5/5

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

For a zero-argument diagnostic whose output shape is already covered by an output schema, the description covers what the tool reports, when to call it, and what to do next. Nothing an agent needs to decide between this tool and its siblings is missing.

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

Parameters4/5

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

The input schema is empty and the description confirms 'Takes no arguments' with an example call. There is nothing further to document, so this earns the zero-parameter baseline; the explicit no-arguments statement adds slight reassurance but not new semantic information.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Report whether and how this server can write to Zotero' and enumerates the exact possible outcomes (local API, web API, hybrid, nothing). It also distinguishes itself from the many write-oriented siblings by explicitly framing the call as a read-only diagnostic, so an agent will not mistake it for a write operation.

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

Usage Guidelines5/5

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

Usage is explicitly conditional: call it when a write tool reports no writable backend, before asking the user for anything. It even routes the follow-up action by naming zotero_authorize_local_writes for the local-no-key case and specifying web API credentials otherwise.

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.

  1. 41 tool updatesv0.1.0
    • First observedzotero_add_item
    • First observedzotero_advanced_search
    • First observedzotero_attach_file
    • First observedzotero_authorize_local_writes
    • First observedzotero_batch_update
    • First observedzotero_create_annotation
    • First observedzotero_create_collection
    • First observedzotero_delete_annotation
    • First observedzotero_delete_collection
    • First observedzotero_delete_item
    • First observedzotero_export_bibliography
    • First observedzotero_get_annotations
    • First observedzotero_get_attachment_path
    • First observedzotero_get_collection_items
    • First observedzotero_get_collections
    • First observedzotero_get_item_children
    • First observedzotero_get_item_fulltext
    • First observedzotero_get_item_metadata
    • First observedzotero_get_notes
    • First observedzotero_get_page_layout
    • First observedzotero_get_pdf_outline
    • First observedzotero_get_recent
    • First observedzotero_get_search_database_status
    • First observedzotero_get_tags
    • First observedzotero_list_libraries
    • First observedzotero_manage_note
    • First observedzotero_read_pdf_pages
    • First observedzotero_search_by_citation_key
    • First observedzotero_search_by_tag
    • First observedzotero_search_collections
    • First observedzotero_search_items
    • First observedzotero_semantic_search
    • First observedzotero_set_item_collections
    • First observedzotero_set_item_parent
    • First observedzotero_switch_library
    • First observedzotero_synthesize_annotations
    • First observedzotero_update_annotation
    • First observedzotero_update_collection
    • First observedzotero_update_item
    • First observedzotero_update_search_database
    • First observedzotero_write_capabilities

TDQS

A4.2/5.0

Scored across 41 tools

Disambiguation5/5

Each tool targets a distinct resource and action, and the many search/read tools are explicitly differentiated by purpose (substring vs. tag vs. structured vs. semantic search; metadata vs. fulltext vs. outline vs. page-range reading). Cross-references in descriptions steer the agent to the right tool, so overlap is minimal.

Naming Consistency4/5

All names use snake_case with a uniform `zotero_` prefix and mostly follow verb_noun (get_item_metadata, create_collection, delete_item). A few deviations (write_capabilities, advanced_search, semantic_search, manage_note) are minor but prevent a perfect 5.

Tool Count2/5

41 tools is far above the typical 3–15 range and exceeds the 25+ threshold for 'too many'; despite the broad Zotero domain, the surface is granular enough that agent selection becomes burdensome. Several tools could be grouped behind modes (e.g., PDF operations, search variants) or conditionally loaded.

Completeness5/5

The surface covers full CRUD for items, collections, annotations, and notes, plus attachment handling, multiple search backends, semantic indexing, bibliography export, library switching, and authentication. No major lifecycle gap is apparent for core Zotero workflows.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A lightweight MCP server that connects AI agents to a local Zotero library for paper management and metadata retrieval. It enables users to search titles and abstracts, browse collections, and automatically ingest papers via arXiv ID or DOI with PDF attachments.
    8
    15
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server that exposes 45 tools for Zotero reference management, enabling AI agents to read/write items, search, extract PDF text, and manage workspaces via the Zotero CLI.
    211
    AGPL 3.0