Skip to main content
Glama
54yyyu
by 54yyyu

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: Stratosphere MCP Zotero

πŸš€ 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_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.8/5.0
Behavior5/5

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

With zero annotations, the description carries the full disclosure burden and handles it exceptionally. It reveals idempotency semantics for if_exists='file' ('reuses the item... never removing'), hard failure behavior (unknown collection spec 'fails the call rather than leaving an unfiled item'), data-quality caveats (ISBN 'noisy β€” verify after'; non-doi.org/arxiv.org URLs 'become a bare webpage item that is often not citable'), and the writable-library requirement. These are precisely the behaviors an agent cannot infer from 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 but well-structured: purpose first, then per-parameter guidance in a consistent order, then routing rules, then a concrete example call. The length is justified by 8 parameters, six source types, and idempotency logic; every sentence adds operational value and none merely restates the schema.

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 every invocation-critical aspect: accepted input forms, per-source resolution behavior, multi-item handling, collection validation and failure mode, if_exists/attach_mode semantics, environment constraints, the post-call search-index step, and a worked example. Since an output schema exists, omitting return-value prose 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.

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 supply all parameter meaning, and it does comprehensively: source (multi-item lists, inline vs file path), source_type (all six enum values with routing behavior), collections (keys/names/'/'-paths and validation), if_exists (all three enum behaviors), attach_mode (all four values), create_missing_collections, and title. Only the tags parameter is left to the schema, a minor gap against 7 of 8 params richly explained.

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: 'Add item(s) to Zotero from any source' and enumerates the six accepted input types (DOI, URL, ISBN, BibTeX, CSL JSON, file). It explicitly claims the territory 'Use for every add this to Zotero request', which differentiates it from siblings like zotero_update_item, zotero_attach_file, and zotero_batch_update. The routing section further clarifies what the tool is versus what other tools handle.

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?

States when to use the tool explicitly ('Use for every add this to Zotero request') and gives strong source-selection guidance ('prefer a DOI when you have one', 'resolve to a DOI first' for arbitrary URLs). It names a required follow-up sibling (zotero_update_search_database) and a hard runtime constraint (fails in local-only mode). It stops short of explicit exclusions with named alternative tools, but the context is clear enough for correct selection.

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

zotero_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?

With no annotations provided, the description carries the full burden of behavioral disclosure, and it does so thoroughly. It reveals idempotency via filename or MD5, failure in local-only mode, cloud storage quota implications, WebDAV exception, extension auto-append behavior, and the return value. This gives an agent a realistic model of side effects and constraints beyond the raw 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?

Although long, the description is densely packed with necessary operational detail and includes a concrete example. The main purpose is front-loaded, followed by parameter semantics, behavioral caveats, and post-condition guidance. Every sentence adds decision-relevant information; none is redundant 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 file-upload tool with no annotations, this description covers when to use it, how to use it, failure modes, side effects, follow-up indexing, and return value. It is complete enough for an agent to select and invoke the tool correctly without additional context.

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 richly documents every parameter: item_key must be a regular item key, file_path must be absolute and lists accepted extensions, url is HTTP(S) and PDF-only, and filename has detailed defaulting rules. It also states the mutual-exclusion constraint that exactly one of file_path/url must be given, which the schema alone 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 states a specific verb and resource: attach a file to an EXISTING Zotero item as an imported child attachment, with the explicit detail that it uploads file bytes. It also differentiates itself from the sibling zotero_add_item by saying add_item is for creating a NEW item from a file. This leaves no ambiguity about what the 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 gives explicit use conditions: use when the item is already in the library and you have its key, with a concrete example. It names the alternative tool (zotero_add_item) and when to choose it instead. It also notes prerequisites such as a writable library and the follow-up action to run zotero_update_search_database.

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

zotero_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 provided, the description carries the full disclosure burden and does so thoroughly. It reveals that the tool blocks until the user answers a dialog, explains the difference between Always Allow and Allow keys, notes rate-limiting, and instructs the agent to tell the user to switch to Zotero.

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 context: purpose, blocking behavior, user guidance, key semantics, invocation conditions, parameter meanings, rate limits, and an example. The most critical information is front-loaded, and the example anchors the expected call form.

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 interactive/blocking nature and the presence of an output schema, the description covers all needed operational knowledge: when to call, what the user will see, the two key types, timeout bounds, rate limits, and when to skip the call. No major 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%, so the description must explain both parameters, and it does. app_name is defined as the name shown in the dialog, and timeout is defined as seconds to wait with an explicit range (5-55) and default. This is meaningful guidance 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 opens with a clear verb-resource pair: request permission to write to the local Zotero library. It also specifies scope (Zotero 10+) and distinguishes the tool from sibling write tools by framing it as an authorization step rather than a direct 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?

The description gives explicit when-to-use conditions: call it 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 due to rate limits.

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

zotero_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

A5/5.0
Behavior5/5

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

With no annotations, the description fully carries the behavioral burden. It discloses that add_tags/remove_tags preserve other tags (not replace-all), describes set_keys upsert semantics (case-insensitive key match, in-place replacement vs append), remove_keys deletion, preservation of non-colon lines, skipping of attachments and unchanged items, and the limit default. These details go beyond generic expectations and prevent misinterpretation.

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 critical information. It is structured logically: purpose β†’ selection criteria β†’ requirements β†’ action semantics β†’ edge cases β†’ prerequisite β†’ example. The key scoping rules (item_keys wins, AND/OR logic) are front-loaded. There is no fluff 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?

Given the tool's complexity (8 parameters, multiple actions, selection logic), the description covers all necessary aspects: what it does, how to select items, how each action behaves, constraints (at least one selector/action), limit default, handling of attachments, and the writable library requirement. An output schema exists, so return values are presumably covered there. Nothing essential for correct invocation 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?

Schema description coverage is 0%, so the description must explain each parameter. It does so comprehensively: item_keys, query, tag, limit, add_tags, remove_tags, set_keys, remove_keys are all described with their behavior and interactions. The set_keys explanation includes the case-insensitive key prefix matching and append behavior. The example ties the parameters together. This fully compensates for the missing schema 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 precise statement of what the tool does: 'Edit metadata across many items in one call' and enumerates the specific actions (add/remove tags, upsert/remove Key: value lines). It clearly distinguishes itself from single-item tools like zotero_update_item by emphasizing 'batch' and the multi-selector capability. 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 Guidelines5/5

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

The description explicitly explains when to use it (batch edits across many items) and provides detailed selection logic: item_keys vs query vs tag, ANDing of query and tag, ORing of tag list, item_keys precedence, and the requirement for at least one selector and one action. It also states prerequisites (writable library) and gives a concrete example, leaving no ambiguity about invocation.

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

zotero_create_annotationA

Create an annotation on a PDF attachment (EPUB: highlights only). Exactly one of two modes per call: text= HIGHLIGHTS selectable text; rect= draws an AREA box over a figure, table, or other non-text region (PDF only). Passing both or neither 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
pageYes
rectNo
tagsNo
textNo
colorNo#ffd400
commentNo
attachment_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?

No annotations are provided, so the description carries the full behavioral burden and meets it: passing both or neither mode is an error, scanned PDFs fail to match, the box must fit the page, and PyMuPDF plus a writable library (local Zotero 10+ or web API key) are required. These are precisely the failure modes and prerequisites an agent needs before invoking.

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?

Front-loads purpose and the mode rule, then flows through parameter semantics, prerequisites, and two worked examples. Though long (~200 words), every sentence earns its place because the schema provides zero parameter descriptions.

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

Completeness5/5

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

An output schema exists, so return-value documentation is not the description's job; everything else for this complex two-mode tool is covered: error conditions, EPUB-versus-PDF differences, coordinate rules, dependencies, and examples. The only omission β€” naming zotero_update_annotation/zotero_delete_annotation as alternatives β€” is trivial given the sibling verbs.

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?

With 0% schema description coverage across 7 parameters, the description fully compensates: it explains attachment_key is NOT the parent item key, 1-indexed page versus EPUB chapter indexing, rect's normalized [0, 1] coordinates with top-left origin, and the color default. Every parameter gains meaning that the schema's bare types cannot 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?

Opens with a specific verb and resource β€” 'Create an annotation on a PDF attachment' β€” and immediately disambiguates its two modes: 'text= HIGHLIGHTS selectable text; rect= draws an AREA box.' The EPUB-only-highlights constraint further separates it from the annotation update/delete/get siblings.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance for each mode and names prerequisite siblings: zotero_get_item_children to find the attachment key and zotero_get_page_layout before supplying rect coordinates. The when-not side is also explicit: EPUB supports highlights only, rect is PDF-only, and scanned/image-only PDFs will not match text.

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

zotero_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?

With no annotations provided, the description carries the full burden. It discloses behavioral details about parent_collection (accepting a key or name, and not parent_key), which is valuable. However, it does not mention potential side effects such as duplicate name handling, permission requirements, or reversibility, leaving gaps for a creation 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 three sentences with no fluff. The primary action is front-loaded, and the subcollection details and search hint are presented concisely without redundancy.

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

Completeness4/5

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

For a simple two-parameter creation tool with an output schema, the description covers the main usage, subcollection creation, and how to find collection keys. Minor gaps remain, such as duplicate name behavior or depth of nesting, but these are not critical for basic 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. It explains the parent_collection parameter's accepted formats (key or name) and clarifies the distinction from parent_key, adding significant meaning beyond the bare schema. The name parameter is self-explanatory, but the description provides enough context for both parameters.

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 verb 'Create' and the resource 'new collection (project/folder)' in the Zotero library, and it distinguishes this tool from siblings by explaining subcollection creation and referencing zotero_search_collections. It is specific and unambiguous.

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

Usage Guidelines4/5

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

It gives explicit guidance for creating subcollections by using parent_collection and points to zotero_search_collections for finding keys, which covers the main alternative usage. However, it does not explicitly state when not to use this tool (e.g., for items or annotations), though the naming makes this mostly implicit.

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

zotero_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 burden and does disclose the destructive, irreversible nature and the subtle PDF-reader behavior. It explains what 'deleted outright' means and notes that trashed annotations remain visible. It omits permission requirements and error behavior, but the core destructive behavior is clearly transparent.

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, with the action and primary consequence front-loaded. The PDF-reader comparison adds useful nuance without bloating the description. Every sentence earns its place.

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

Completeness4/5

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

For a one-parameter destructive tool with an output schema, the description covers the essential context: the operation, irreversibility, and a subtle behavioral consequence. Minor gaps like authorization requirements and behavior for invalid keys do not obstruct correct invocation.

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?

Schema description coverage is 0%, and the description never explains annotation_key or how to obtain/format it. While the parameter name is somewhat self-explanatory as an identifier, the description adds no semantic detail to compensate for the schema gap.

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

Purpose5/5

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

The description states a specific verb ('delete') and resource ('Zotero annotation'), and explicitly says 'permanently', which clearly differentiates it from create_annotation and update_annotation. The scope is unambiguous.

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

Usage Guidelines2/5

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

No guidance is given about when to use this tool versus alternatives such as update_annotation or delete_item. The description only warns that deletion is irreversible; it does not state conditions, prerequisites, or when another tool would be more appropriate.

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

zotero_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.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 full responsibility for behavioral disclosure. It comprehensively explains the destructive nature: hard delete, irreversible via API, subcollections deleted, items preserved. This fully informs the agent about side effects and irreversibility, exceeding typical expectations for a delete 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 concise yet information-dense, front-loading the core action and key details. It includes an example and critical caveats (items not deleted, subcollections deleted, irreversibility) without any fluff. Every sentence serves a purpose, making it well-structured.

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 fully complete for a delete operation: it covers what is deleted (collection and subcollections), what is preserved (items), the permanence, and how to obtain the required key. Even with an output schema present, the description alone gives the agent everything needed to call the tool correctly and anticipate outcomes.

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 input schema provides only the parameter name and type with zero description coverage. The description compensates by specifying the key format (8-character), giving an example, and clarifying that it identifies a collection. This adds essential meaning beyond the schema, ensuring correct 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?

The description states a specific action (delete a collection) with a precise target (by 8-character key) and distinguishes it from deleting items or subcollections. It clearly identifies the resource and the operation, making it easy to differentiate from sibling tools like zotero_delete_item or zotero_search_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 explicitly advises using zotero_search_collections to find the key first, which is a direct usage instruction. It also implicitly indicates that items are not deleted, suggesting that a different tool is needed for item deletion, but it doesn't explicitly name an alternative for that case. The guidance is clear but lacks an explicit when-not-to-use statement.

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

zotero_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.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 of behavioral disclosure. It clearly explains that the action moves to Trash rather than permanently deleting, that items are recoverable, that permanent deletion requires emptying the Trash in the UI, and that note deletion is guarded until allow_note=True. This is strong transparency 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?

The description is three sentences with no filler. The primary action is front-loaded, and each subsequent sentence adds essential operational detail: item type coverage, the safe alternative for notes, and recoverability/permanence behavior.

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 tool with a full output schema, the description covers the core behavior, the key edge case (notes), the safety override, and the recovery path. It is sufficiently complete for an agent to select and invoke the tool correctly without needing additional context.

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 already documents both parameters at 100% coverage, so the baseline is 3. The description adds meaningful context beyond the schema by clarifying the default refusal behavior for notes and the intended use of allow_note, thereby enriching the 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 opens with a specific verb and resource: 'Move a Zotero item to the Trash.' It states the scope ('any item type') and explicitly distinguishes the note case by routing to zotero_manage_note, making it easy to differentiate from delete-related siblings like zotero_delete_annotation.

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 tool explicitly states when not to use it ('By default refuses to trash notes') and identifies the alternative (zotero_manage_note(action='delete')), including the condition under which the alternative is preferred. This is direct, actionable usage guidance.

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

zotero_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

A4.4/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. It discloses that rendering works in local mode with no API credentials and over the web API, mentions the 100-item cap, describes the output structure (markdown naming the style/format, then a fenced block for bibtex or a numbered list otherwise), and notes that style is ignored for bibtex. It does not mention error handling or side effects, but the tool is clearly read-only and non-destructive, so this is adequate.

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

Conciseness4/5

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

The description is dense but well-structured: a purpose sentence, then parameter explanations, output details, mode/cap constraints, and an example. Every sentence adds useful information, and the structure is logical, though it could be broken into paragraphs for readability. It is not bloated given the complexity of the tool.

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 everything an agent needs to invoke the tool correctly: purpose, parameter semantics with precedence, defaults, output format, mode of operation, cap, and a concrete example. Even though an output schema is mentioned in context, the description itself fully specifies the return format, making it self-contained.

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 already has 100% description coverage, so the baseline is 3. The description adds substantial extra value: item_keys accepts a JSON list string, precedence over collection_key, style examples, export_format details, and specifics about the output format. This goes well beyond the schema's terse descriptions, helping the agent understand usage nuances.

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: 'Render a formatted bibliography or in-text citations for a set of Zotero items using Zotero's own CSL citation engine.' It clearly states the tool's function and its use case (dropping references into a manuscript). It is distinct from sibling tools, which are all search/retrieval or annotation tools, making this the only export/rendering tool.

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 guidance on parameter selection: item_keys takes precedence over collection_key, and if neither is given, the active library is exported (capped). It also notes the 100-item cap and advises scoping with item_keys or collection_key for larger sets. It doesn't explicitly state when not to use this tool versus alternatives, but no sibling offers this capability, so the guidance is sufficient.

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

zotero_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

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 behavioral burden. It discloses that the tool auto-resolves attachment-to-parent keys, falls back to direct PDF parsing when the API lacks stored records, and uses Better BibTeX locally or the web API otherwise. It also describes output formats and the default return-all behavior, giving agents a complete behavioral picture without contradiction.

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

Conciseness5/5

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

The description is concise despite its lengthβ€”every sentence serves a purpose. It front-loads the core purpose, then logically walks through key parameters, then provides a concrete example. No redundancy or 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?

With an output schema present, the description need not enumerate return fields, but it covers all necessary invocation details: scope (specific item or whole library), parameter behavior, fallback logic, format selection, and an example. Nothing an agent needs to call 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?

Even though schema coverage is 100%, the description adds significant value beyond field names: it clarifies that item_key accepts both parent and attachment keys, explains the limit default (None returns all), details the markdown vs json format trade-offs, and contextualizes use_pdf_extraction as a fallback. These enrich the schema and enable correct parameter choice.

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 retrieves annotations (highlights and attached notes) for a specific item or across the active library, using a specific verb and resource. It distinguishes from sibling tools like zotero_get_notes (standalone notes vs annotations) and create/update/delete variants by focusing on retrieval.

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?

Explicit guidance is provided: ALWAYS pass item_key when the target is known, with a warning that omitting it returns potentially thousands of annotations. It also explains when to use use_pdf_extraction (fallback for annotations made outside Zotero desktop) and how format selection affects downstream use. This directly informs when and how to invoke the 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_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

A4.1/5.0
Behavior3/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 mentions 'Local mode only' and implies a read-only operation (returning paths) but does not address edge cases like missing attachments, multiple attachments, or error behavior. It also doesn't explicitly state that it does not read the file content, though that is implied. Given the simplicity of the tool, the description covers the main behavior but lacks detail on potential outcomes.

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 extremely conciseβ€”two sentences. The primary purpose is stated first, followed by a single usage context that adds value. There is no redundant or filler content, and every sentence earns its place.

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

Completeness4/5

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

Given the tool's simplicity (one parameter) and the existence of an output schema (which likely documents the return format), the description is largely complete. It explains the purpose, usage context, and a key constraint (local mode). Minor gaps remain, such as behavior when there are no attachments or multiple attachments, but these are not critical for basic invocation. The output schema covers return details, so the description does not need to repeat them.

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 input schema provides zero description for the required parameter 'item_key' (0% schema description coverage). The description does not explicitly explain what 'item_key' is or where to obtain it (e.g., from a search result). It relies on the tool name and context, which may be insufficient for an AI agent unfamiliar with Zotero's internal identifiers. The description should have clarified the parameter's meaning and expected format.

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 action ('Return'), the resource ('local filesystem path(s) of a Zotero item's attachments'), and differentiates it from sibling zotero_get_item_fulltext by explicitly mentioning its use case (reading large PDFs directly instead of page-limited fulltext). This makes it unambiguous and distinguishes it from similar 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 states when to use this tool: '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 and provides a clear condition, effectively guiding the agent on tool selection. It also notes 'Local mode only' as a constraint.

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

zotero_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.5/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 explains the detail levels (keys_only, summary, full) and what each includes/excludes, states that PDF/notes indicators are included, describes the include_subcollections behavior and its default matching Zotero's own checkbox, and notes that the response names the next offset for pagination. It doesn't cover error cases or authentication, but for a read operation these are minor gaps; the description gives substantial transparency.

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

Conciseness4/5

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

The description is compact yet dense with useful information. It front-loads the core purpose, then explains the detail options, subcollections, and pagination, and ends with a practical tip. Each sentence adds value; there is no filler or redundancy. The structure is logical and easy to parse.

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

Completeness4/5

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

Given that an output schema exists, the description does not need to explain return values. It covers all key operational aspects: how to control detail, handle subcollections, and paginate large collections. It also mentions the availability of PDF/notes indicators. The tool is fully specified for an agent to call it correctly, with no missing critical context.

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 80%, so most parameters already have descriptions. The description adds meaningful semantics beyond the schema: it explains the detail enum values (keys_only is minimal, summary has no abstracts, full has abstracts), clarifies that include_subcollections returns items from nested collections, and explains that offset is used for paging with the response providing the next offset. This enriches the parameter understanding 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 verb and resource: 'Get all items in a specific Zotero collection.' It further distinguishes this tool from zotero_semantic_search by explicitly saying it returns all items in a collection, not filtered by topic. This makes it easy for an agent to select this tool when the goal is to retrieve an entire collection, and differentiate it from siblings like zotero_get_collections (which lists collections, not items).

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 provides explicit when-to-use guidance: it states that for finding papers on a specific topic, zotero_semantic_search is faster and returns only relevant results. This gives a clear alternative and implies this tool is for when you need all items in a collection, regardless of topic. It also explains pagination usage for large collections, guiding the agent on how to page through results.

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

zotero_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

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 disclosure. It covers the hierarchical tree structure, the fact that deep hierarchies render inline without truncation (so long output is expected), the meaning of the limit parameter (None default 100, up to 5000), and the include_trashed behavior (default False, matching Zotero desktop, with an annotation for trashed items). It even mentions that trashed collections are normally invisible to automated clients (#233). These are substantive behavioral traits 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 front-loaded with the core purpose, then usage guidance, then behavioral notes, then parameter details, and closes with a concrete example output. Every sentence earns its placeβ€”no filler. Despite being longer than average, it is structured to be scannable and information-dense.

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 optional parameters and an output schema, this description is complete. It covers the return format, scope, parameter behavior, edge cases (deep trees, trash), and provides an example. It also explains the relationship to a sibling tool, making it self-contained for an agent to call 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?

Even though the schema already describes both parameters (100% coverage), the description adds meaningful operational guidance: for limit it explains the default and how to increase it ('pass None (default) to use 100, or raise to 5000'), and for include_trashed it explains the default and why it exists (matching Zotero desktop and visibility to automated clients). This goes well beyond the schema's terse 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: 'List all collections in the currently active Zotero library as a hierarchical tree.' It names the output format (parents and nested subcollections with 8-character keys) and explicitly contrasts itself with the sibling zotero_search_collections, which returns only matches. This makes its purpose unambiguous and distinct 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?

It gives explicit usage context: 'Use this when the user wants to see the full library structure' and provides a clear alternative for a different need: 'If you already know a name and just need the key, prefer zotero_search_collections.' It also notes the scope limitation and how to switch libraries (zotero_switch_library), leaving no ambiguity about when to invoke it.

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

zotero_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.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 it delivers: it reveals return format (markdown, with different structures for single vs. multiple keys), scope (active library only), error handling (bad key reported in its own section), and input flexibility (array or JSON string). This gives the agent a complete picture of behavior 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.

Conciseness4/5

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

The description is lengthy but every sentence carries unique value: purpose, use-case routing, input format, batching advice, error behavior, return structure, scope, and examples. It is front-loaded with the core purpose and ends with practical examples. Slightly dense but not padded; could be trimmed without losing meaning, hence a 4 rather than 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?

For a single-parameter tool with an output schema, the description covers all necessary aspects: what it does, when to use it, how to pass inputs (including edge cases like JSON strings), what to expect in return (markdown with different layouts), scope, and error behavior. It also ties into sibling tools to prevent misuse. Nothing critical 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 already describes the parameter as 'One item key, a list of keys, or a JSON/comma-separated string of keys' (100% coverage). The description adds concrete examples, clarifies the 8-character format, and explains the performance benefit of batching, which goes beyond the schema's generic wording. It enriches but does not fully reinvent the 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 opens with a precise action and resource: 'List the child items (attachments, notes, annotations under an attachment) of one OR MANY parent Zotero items.' It distinguishes itself from siblings by explicitly naming the downstream tools (zotero_create_annotation, zotero_get_pdf_outline) that require an attachment key rather than a parent key, making its role in the toolchain 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 states exactly when to use this tool ('Use it to find an item's PDF/EPUB attachment key') and explicitly says what those other tools require ('those take an attachment key, NOT the parent item key'). It also gives operational guidance on batching keys in one call and how bad keys are handled, which informs efficient and correct usage. No explicit when-not-to-use, but the context is strong enough.

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

zotero_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 burden, and it delivers: it warns about large outputs, explains page-limit truncation and TRUNCATED headings, specifies parent-item vs. attachment-key behavior, lists the extraction path, and notes that scanned PDFs without OCR may return little text. This far exceeds the minimum required transparency.

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 first, then usage exclusions, alternatives, truncation behavior, parameter semantics, extraction order, caveats, and a concrete example. It is front-loaded with the most decision-relevant information.

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 and the absence of annotations, the description is remarkably complete. It covers what the tool returns, when to use it, how the item_key selects the attachment, what happens with page limits, extraction fallbacks, limitations, and an example call. Nothing needed to invoke it 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?

The input schema already documents item_key well (100% coverage), but the description adds further meaning: 8-character key format, the parent-item convention, attachment_priority behavior, and reading a specific attachment via its own key. This goes beyond the schema, though some detail overlaps with the schema's own description.

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: 'Return the extracted text of a Zotero item's primary attachment (PDF or EPUB).' It immediately distinguishes the tool from semantic search and metadata retrieval by naming those siblings explicitly, so an agent can select this tool correctly without ambiguity.

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 rules are explicit: 'Use ONLY when the user explicitly wants to READ the paper β€” not for searching or browsing.' It names alternatives for those cases (zotero_semantic_search, zotero_get_item_metadata) and even advises against calling it on multiple papers unless specifically requested.

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

zotero_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

A5/5.0
Behavior5/5

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

With no annotations, the description carries full behavioral burden. It discloses that items in trash are returned with a 'Status: In Trash' line, that collection membership is shown as keys (with rationale about dangling references), and that include_abstract is ignored in bibtex/json formats. These go beyond the schema and give the agent accurate expectations.

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, alternatives, parameter clarifications, edge cases, and an example. It front-loads the primary function and then layers caveats logically. No redundancy or 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?

Given the tool's moderate complexity (3 params, output schema, many siblings), the description is complete: covers usage, alternatives, parameter behavior, trash handling, collection representation, and even gives an example call. Nothing an agent needs to call it 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 meaning: it specifies item_key as an 8-character key (not DOI/title), explains include_abstract's default and token-saving option, and describes the three format outputs (markdown block, raw JSON, BibTeX string). This materially enhances schema info.

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 ('Fetch'), resource ('metadata for ONE Zotero item'), and mechanism ('by key'), and explicitly distinguishes it from siblings like zotero_get_item_fulltext and search tools. It is immediately clear what this tool does and what it does not do.

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: directs to zotero_get_item_fulltext when metadata/abstract insufficient, warns against using it for searching, and names zotero_search_items or zotero_semantic_search for that purpose. Also clarifies scope (active library) and trash behavior, leaving no ambiguity about appropriate invocation.

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

zotero_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

A4.5/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 of behavioral disclosure. It explains the list vs search behavior, truncation behavior (including that truncate=False is list-mode only), raw_html return behavior, and the active-library scope. It also warns that query and item_key cannot be combined. It does not cover error cases or pagination, but for a read-only tool the disclosed behaviors are substantial and sufficient.

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 a single dense paragraph but is well organized: purpose first, then modes, then parameter explanations, then scope, then examples. Every sentence adds value, though it is a bit long. It is front-loaded with the core purpose and uses bold-like emphasis (capitals for LIST/SEARCH) 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 tool with 5 optional parameters, no annotations, and an existing output schema, this description covers all needed semantics: param meanings, defaults, mode restrictions, scope, and usage examples. The output schema handles return structure, so nothing an agent needs to call it 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?

Schema description coverage is 0%, so the description must explain every parameter. It does: limit (with default 20), query (search substring), item_key (child notes), truncate (shortening behavior and mode constraint), and raw_html (return original HTML, with use case). It even provides concrete examples demonstrating both list and search modes. This fully compensates for the lack of schema 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 notes from the active Zotero library.' It clearly distinguishes between listing and searching modes, and notes that it covers both note and annotation text. This makes it unmistakable what the tool does and how it differs from siblings like zotero_get_annotations or zotero_get_item_children.

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 conditions for when to use list mode vs search mode (with or without query), and notes that query and item_key cannot be combined. It also explains when raw_html is appropriate (for editing and round-tripping via zotero_manage_note) and mentions scope changes via zotero_switch_library. It does not explicitly name alternative tools for annotation-only retrieval, but the guidance is otherwise clear and actionable.

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

zotero_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

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 full behavioral disclosure. It details the geometric nature of detection ('boxes cover the graphical core... text labels inside figures or unruled table headers may fall outside'), explains confidence semantics ('reflects caption matching, not box completeness'), and notes the attachment_key distinction ('NOT the parent item key'). It also states it is read-only and works in both local and web API modes, fully covering the tool's operational 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 information-dense yet well-organized, with each sentence serving a purpose: purpose, usage, output contents, limitations, parameter clarification, scope, and example. It is front-loaded with the core purpose and usage directive, and every element earns its place 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?

Given the tool's complexity (detection, output format, limitations) and the presence of an output schema, the description still adds value by explaining the returned fields (bounding box, source, caption, confidence, ready-to-paste call) and clarifying edge cases. It covers scope, read-only behavior, and parameter pitfalls. Nothing an agent needs to call this tool 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?

Schema coverage is 100%, but the description adds critical semantic clarification: 'attachment_key: PDF attachment key β€” NOT the parent item key (use zotero_get_item_children to find attachments)' and 'page: 1-indexed page number (page 1 is the first page)'. These go beyond the schema's generic descriptions, preventing common mistakes, and a concrete example is provided. This adds significant value.

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 purpose: '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.' This specifies a specific verb (detect), resource (PDF page), and intended use, distinguishing it from sibling tools like zotero_create_annotation and zotero_read_pdf_pages.

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 it: 'ALWAYS call this before zotero_create_annotation's area mode unless exact coordinates are already known.' It also provides scope limitations ('PDFs only β€” EPUB attachments are NOT supported') and read-only behavior. This gives clear guidance on when to invoke and when not, referencing the dependent sibling tool.

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

zotero_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. It discloses read-only nature ('Read-only'), the graceful 'no outline' message on failure, the dependency on PyMuPDF, and the automatic key resolution behavior. It also notes it works in local or web mode. No behavioral gaps or contradictions.

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-structured: it front-loads the core purpose, then usage guidance, parameter semantics, and a concrete example. Every sentence adds value, and there is no redundant or filler content. The length is justified by the information density.

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 a single parameter, an output schema (present), and no annotations, the description covers all necessary aspects: purpose, usage, parameter handling, expected outputs, and constraints. Nothing essential is missing for an agent to invoke the tool 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 must compensate. It explains that item_key accepts both attachment and parent keys, notes automatic resolution, and gives an example with a realistic key. This adds essential meaning beyond the bare schema definition.

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 ('Extract the table of contents') and a resource ('PDF attachment'), and clearly specifies the output format ('hierarchical markdown list with each entry's page number'). It distinguishes itself from sibling tools by explicitly referencing zotero_get_item_fulltext as an alternative and noting the scope (PDFs only). No ambiguity about what the 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?

Provides explicit when-to-use guidance: 'Use this to orient in a paper before calling zotero_get_item_fulltext' and explains the token advantage. Also gives an exclusion ('EPUBs have no outline extraction here') and directs users to zotero_get_item_children for key discovery. This is clear, actionable routing with alternatives.

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

zotero_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

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 handles it well. It discloses ordering (dateAdded DESC), the inclusion of all item types including notes and attachments, the client-side filtering for parent items, and the behavior of omitted collection_key (returns across whole library). It also clarifies the default limit and the 8-character key format. This is thorough 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 longer than average, but every sentence earns its place. It front-loads the core purpose, then gives usage exclusions, parameter details, ordering, item-type caveats, filtering guidance, scope, and a concrete example. No filler; the structure logically flows from purpose to specifics to example.

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 simplicity (2 optional params) and the presence of an output schema, the description covers all necessary operational details: what is returned (recent items, all types, ordered), how to restrict by collection, how to filter for parent items, active-library scope, and example calls. It is complete for an agent to invoke correctly without further clarification.

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?

Though schema coverage is 100% with basic descriptions, the tool description adds significant meaning: the default limit (10), the 8-character requirement for collection_key, the semantic of omission (returns recent items across whole library), and the effect on result composition. It explains exactly how each parameter influences the output, going well beyond the schema's minimal text.

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 by dateAdded'), and scope ('active library', 'optionally scoped to a single collection'). It distinguishes itself from siblings by naming alternatives: zotero_semantic_search for topic search and zotero_get_collection_items for a collection's full contents. The purpose is unmistakable and non-tautological.

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 specifies when to use this tool ('what did I add recently?' questions) and when not to (general topic search, full collection contents), naming the exact alternative tools. It also states the active-library scope and how to switch libraries (zotero_switch_library). No ambiguity about selection.

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_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.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 full burden. It discloses no side effects, describes the conditional return (install hint if extras missing), and states it returns a human-readable status block. This is transparent about behavior 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?

The description is well-structured, front-loading the purpose, then usage, behavior, and an example. Every sentence adds value, and the example clarifies the return. It is appropriately sized for the tool's simplicity.

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

Completeness5/5

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

Given an output schema exists (per context signals), the description doesn't need to detail return structure, but it still provides a human-readable status block and an example. It also covers the conditional install-hint behavior and ties to sibling tools. Complete for an agent to call 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?

There are zero parameters, so the schema already covers everything (coverage 100%). The description adds no parameter information since none exist, but it does add context about return values. Baseline for 0 params is 4, which 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 clearly states the tool reports readiness and stats for the semantic search database, listing specific items (item count, last update, provider/model, optional dependency). It also ties to sibling tools, distinguishing from zotero_semantic_search and zotero_update_search_database. This is a specific verb+resource with clear 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?

Explicitly states when to use: to decide whether zotero_semantic_search will return useful results or whether to run zotero_update_search_database first. It also notes it takes no parameters and has no side effects, giving clear context and routing to alternatives.

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

zotero_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.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 the flat output format (one per line), the preservation of colon convention, the default behavior of returning all tags, and the optional limit cap. It also clarifies that tags have no hierarchical structure in Zotero, which is a key behavioral fact. No contradictions.

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: purpose, usage, scope, flatness, limit, and an example output. The description is front-loaded with the main action, and the example helps visualize the format. No redundancy or fluff.

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 read-only tool with one optional parameter, the description covers output format, scope, limit behavior, and even provides an example. It fully equips an agent to call the tool correctly without needing to open the schema or output schema. 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 only parameter 'limit' is already described in the schema ('Maximum number of tags to return') with 100% coverage, so baseline is 3. The description adds the default value (None) and the term 'cap', which provides practical context. It does not repeat the schema but enriches it slightly, so a 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 specific verb and resource: 'List all tags used in the currently active Zotero library.' It clearly distinguishes from siblings by naming usage before filtering with zotero_search_by_tag or batch-editing with zotero_batch_update, and clarifies scope as the active library only.

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 says when to use this tool ('Use this for tag discovery before filtering... or batch-editing...') and when to switch libraries ('switch with zotero_switch_library before listing'). It also implies not for direct search, which is handled by siblings. This is clear, unambiguous guidance.

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

zotero_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 provided, the description carries the full burden. It states 'Read-only; no side effects,' which is a clear behavioral trait. It also discloses that the active library isn't flagged and instructs how to track it, and explains the difference between local and web modes in terms of data sources. This is comprehensive behavioral disclosure beyond what structured fields could convey.

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

Conciseness5/5

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

The description is information-dense but well-organized. It front-loads the core purpose, then provides usage guidance, mode differences, and operational notes, each sentence earning its place. The example at the end is useful but not redundant. Despite length, there is no fluff.

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 tool with an output schema (not shown), the description explains the output fields (library/group ID, display name, item count), the mode-specific behavior, and the workflow with zotero_switch_library. It also addresses the limitation of not flagging the active library. Nothing an agent needs to call it 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?

The tool has zero parameters, so the schema is empty. The description explicitly says 'No parameters,' which is consistent with the schema. Since there are no parameters, the baseline is 4, and the description adds no parameter-specific meaning because there is nothing to explain. It does not detract, so a 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 clearly states the action ('List every Zotero library'), the specific resource types (personal, group, RSS feeds), and distinguishes it from siblings like zotero_get_collections and zotero_switch_library. The verb and resource are explicit, and the differentiation is built into the description.

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

Usage Guidelines5/5

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

It explicitly instructs when to use the tool: 'Use this to discover a library ID before calling zotero_switch_library' and provides a direct alternative for a related task: 'If the user only wants to see Zotero collections inside the CURRENT library, use zotero_get_collections instead.' It also explains mode-specific behavior (local vs web), leaving no ambiguity about selection.

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

zotero_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; 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

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 excels. It discloses the writable-library requirement, the append/replace behavior, the recoverable trash semantics, and the formatting preservation technique (fetch raw HTML, edit, pass back). This goes well beyond the schema fields and gives the agent a realistic picture of the tool's 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?

The description is dense but every sentence earns its place. It front-loads the purpose, then systematically covers each action's requirements, constraints, and auth needs, ending with a useful example. For a 3-action tool with 6 parameters, this is appropriately concise and well-organized.

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 dimensions: actions, parameter semantics, formatting preservation, writable-library prerequisites, and even an example. Since an output schema exists, return value details are not needed. The tool's complexity is fully addressed with no critical gaps.

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 must compensate, and it does comprehensively. It explains item_key's dual meaning (parent key for create, note's own key for update/delete), the per-action note_text requirements, the append flag behavior, and the optional role of note_title and tags. The example also illustrates parameter values in a concrete way.

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 'Create, update, or trash a Zotero note,' clearly stating the verb and resource. It explicitly scopes to notes with 'Notes only, not items/collections/attachments,' distinguishing it from sibling tools like zotero_update_item or zotero_delete_item. This makes the tool's 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 provides clear when-to-use context: any note create/update/delete operation. It gives exclusions ('Notes only, not items/collections/attachments') and points to helper workflows (zotero_get_notes for finding keys/HTML, zotero_authorize_local_writes for auth). This explicitly routes the agent to the correct tool and prerequisite steps.

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

zotero_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.8/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 richly discloses behavior: pages are 1-indexed, text format returns Markdown with heading preservation and flags garbled content, image format returns PNGs with a 10-page cap, and rect crops exactly the specified region with normalized coordinates. This goes far beyond a simple mutation/read label and gives the agent realistic expectations of output and quirks.

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 in this description carries useful information. It is organized logically: purpose, usage context, format options, and rect parameter details. It is not overly long for the amount of behavioral nuance it communicates, and it avoids repeating schema descriptions. The structure is easy to parse and front-loads the most important information.

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 main behavioral aspects, parameter semantics, and concrete usage guidance. Given that the input schema fully documents all parameters and there is no output schema, the description sufficiently explains both input semantics and expected outputs. It also ties into related tools (zotero_get_pdf_outline, zotero_get_page_layout) to place itself within the larger workflow, making it complete for an agent.

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 already 100%, but the description adds substantial value beyond the schema. It explains that pages are 1-indexed, clarifies that 'end_page' defaults to reading only 'start_page', and gives crucial context for 'rect' by defining normalized 0-1 coordinates and referencing zotero_get_page_layout. This makes parameter usage concrete and reduces the chance of misuse.

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 clear verb and object: 'Read specific page range(s) from a PDF attachment of a Zotero item.' It distinguishes itself by specifying that it is for when the agent already knows which pages to read, and references related tools like zotero_get_pdf_outline. This makes the tool's function unambiguous and easy to differentiate from 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 explicitly states when to use it: 'Use this when you know which pages to read.' It also gives a concrete example ('for example after getting the PDF outline via zotero_get_pdf_outline') and differentiates format='text' vs format='image' with clear use cases. Missing are explicit instructions on when not to use it or when to prefer alternatives like full-text retrieval, but the provided context is still strong.

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_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

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 full burden, and it delivers: discloses case-sensitivity, exact-key requirement, return behavior (metadata or not-found), operational differences between local and web modes, and the limitation that web mode may miss items. This is thorough 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.

Conciseness4/5

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

The description is moderately long but well-structured: main action first, then return behavior, parameter detail, mode differences, requirement, alternative, and example. Each sentence adds value; it is not redundant. Slight verbosity in mode explanation but acceptable.

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 an output schema exists and annotations are absent, the description covers all necessary aspects: what it does, return behavior, parameter semantics, prerequisites, modes, and an example. Nothing an agent needs to correctly call this tool 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?

Schema coverage is 100% with a clear citekey description. The description adds meaningful semantics beyond the schema: case-sensitivity, exactness as assigned by BetterBibTeX, and an example. It could add more (e.g., key format patterns) but already elevates understanding beyond 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?

States a specific verb and resource: 'Look up a single Zotero item by its BetterBibTeX citation key' with concrete examples. Clearly distinguishes itself from siblings by explicitly routing partial-key lookups to zotero_search_items, so the agent knows exactly what this tool does and what it does not.

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 and when-not-to-use guidance. It names the alternative (zotero_search_items) for partial/free-text lookups, explains the two modes (local vs web) with requirements, and notes that Better BibTeX plugin is required. No ambiguity remains about selection.

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

zotero_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.6/5.0
Behavior4/5

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

With no annotations, the description must disclose behavioral traits. It clearly explains the AND/OR/exclusion logic, default values (limit=10, item_type='-attachment', include_subcollections=False), and the condition that include_subcollections is ignored when collection_key is absent. It does not explicitly state the operation is read-only, but 'find' strongly implies no mutation; this minor omission keeps it from a 5.

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

Conciseness4/5

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

The description is fairly long but each sentence earns its place: it covers purpose, parameter semantics, usage guidance, and an example. It is logically organized (purpose β†’ parameters β†’ usage β†’ example) and front-loaded with the main function. While not terse, it avoids redundancy and stays efficient for the complexity it explains.

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 an agent to call the tool correctly: it explains the boolean syntax, all parameters with defaults, the scoping rules, and gives a runnable example. It also points to the sibling tools for alternative searches. Since an output schema exists, return format is documented elsewhere, so 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?

Schema coverage is 100%, so the schema already documents each parameter. The description adds value beyond that by explaining the boolean syntax with a concrete example (tag=['methods OR methodology', '-draft']), clarifying the relationship between collection_key and include_subcollections, and stating defaults in plain language. This goes beyond the schema's own descriptions, earning a 4.

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 ('Find items carrying one or more tags') and immediately clarifies scope via boolean syntax. It also distinguishes itself from siblings by naming zotero_search_items and zotero_semantic_search for free-text search, and zotero_get_tags for tag discovery. This makes the tool's purpose unambiguous and sets it apart.

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 explicit when-to-use guidance: 'Use zotero_get_tags to discover available tag names first' and 'For free-text content search, use zotero_search_items or zotero_semantic_search instead.' It also provides a concrete call example (tag=['to-read'], limit=20), which directly shows invocation. This fully addresses when and when not to use the tool.

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

zotero_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, the description carries the full burden and meets it comprehensively: it discloses case-insensitivity, substring matching, AND semantics, whitespace/empty-word handling, return of key and parent, include_trashed behavior with default, performance O(n), and internal pagination. This exceeds typical transparency expectations.

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 value: purpose first, then matching rules, edge cases, parameter semantics, performance, and an example. It is well-structured and front-loaded with the core purpose, making it efficient despite its length.

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 complexity of the matching logic and the presence of an output schema (which likely defines return structure), the description covers all necessary operational details: matching rules, whitespace handling, trash behavior, performance, and an example. No critical information is missing 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.

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 explain both parameters. It does: 'query' is the search string with matching rules (case-insensitive substring, multi-word AND), and 'include_trashed' is explained with its True/False behavior and default. The example also demonstrates usage. Fully compensates for the schema gap.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Search collections by name in the active library and return their 8-character keys.' This clearly distinguishes it from other search tools (e.g., zotero_search_items) and states the exact output. 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 provides detailed behavioral semantics (case-insensitive substring, AND across words, whitespace handling) that effectively tell an agent when to use this tool, but it does not explicitly name alternative tools or state when NOT to use it. The context is clear enough to infer appropriate usage, though a direct comparison would elevate it.

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

zotero_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

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 the automatic fallback cascade ('falls back to simplified queries and then semantic search'), the condition that bypasses it (collection_key), backend requirements (SQLite), and behavioral caveats such as search_all_libraries labelling results. This is substantive behavioral context beyond a mere 'searches items' 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 every sentence earns its place: the critical usage warning is front-loaded, each parameter gets a compact clause, alternatives and exclusions are stated, and concrete examples close it out. The structured one-sentence-per-parameter format makes it easy to scan despite its length.

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 search tool with an output schema and zero annotations, the description covers invocation strategy, fallback behavior, parameter interactions, and library-selection guidance. There is no obvious missing piece an agent would need to call this tool 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?

Although schema coverage is 100%, the description adds meaningful usage nuance beyond each schema field: keep queries short, query modes expand what is searched, item_type defaults to excluding attachments, collection_key bypasses the fallback cascade, and search_all_libraries is for when the library is unknown. The description teaches correct invocation rather than just restating parameter names.

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 ('Search Zotero items') plus the exact mechanism ('substring match against metadata... in 'everything' mode β€” abstract'), and notes the return format ('metadata + abstracts as markdown'). It also distinguishes itself from siblings by naming two alternatives, so an agent can tell it 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?

The description gives explicit guidance: keep queries SHORT and SIMPLE, explains why substring matching behaves differently from web search, and names alternatives for distinct needs ('For topic discovery, use zotero_semantic_search instead; for tag filtering use zotero_search_by_tag'). It also gives concrete examples such as 'Brewer 2011' and 'Cladder-Micus', leaving little to inference.

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

zotero_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

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries full disclosure burden. It states that add_to/remove_from accept arrays of keys, names, or paths, are resolved and validated automatically, and that unknown/trashed/ambiguous specs fail before any change. It also clarifies that unspecified memberships are left alone. Missing details like atomicity across multiple items or permission requirements, but the provided behavior is solid.

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 but each sentence adds value: purpose, distinction, parameter types, validation, and usage guidance. It front-loads the core purpose and the most critical usage constraint (array not string). Slightly long but not verbose; no wasted words.

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

Completeness4/5

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

Given the tool's complexity (3 params, 1 required) and that an output schema exists (so return values are covered), the description covers purpose, parameter semantics, validation, and routing to sibling tools. It doesn't explain what happens if some item_keys are invalid, but that's a minor gap. Overall, it provides what an agent needs to call correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It does: it specifies that item_keys must be an ARRAY (not a single string) and explains add_to/remove_from accept arrays of collection keys, names, or paths, and mentions validation behavior. This adds meaning beyond the raw schema, though it doesn't enumerate every edge case for the string forms.

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 verb ('Change which collections existing items belong to'), the resource (item-collection memberships), and its incremental add/remove nature. It explicitly distinguishes from collection creation tools and names the wholesale replacement tool (zotero_update_item), making it unambiguous among 37 siblings.

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

Usage Guidelines5/5

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

The description explicitly says 'NOT collection creation' and names zotero_create_collection / zotero_delete_collection as alternatives. It also tells when to use zotero_update_item for wholesale replacement, and directs the agent to search tools for finding keys. This is explicit when/when-not/alternatives guidance.

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

zotero_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.2/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 and does meaningful work: it discloses that the operation is a mutation, that null clears the relationship, and that Zotero validates whether the parent-child relationship is allowed. It stops short of describing failure behavior, side effects on existing child items, or reversibility, but the core behavioral traits are honestly surfaced.

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 earning its place: the core operation, the parameter semantics for both modes, and a relevant validation note. The primary verb and resource are front-loaded, and there is zero filler or repetition of schema content.

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

Completeness4/5

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

For a low-complexity tool (two flat scalar parameters, no enums, output schema already present), the description covers the operation, the parameter behavior, and the validation constraintβ€”enough for an agent to invoke it correctly. The only omissions are minor: no mention of prerequisites (the item and parent must exist) and no disclosure of cascading effects when reparenting an item that has its own children.

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 the critical parameter: parent_key's dual meaning (key to assign/change, null to make top-level) is explicitly documented. item_key's role as the item being reparented is only implied by the first sentence rather than stated, which is the main gap.

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

Purpose5/5

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

The description opens with a specific verb+resource combination ('Set or clear the parent of a Zotero item') that precisely defines the operation. It also explains both modesβ€”assigning/changing a parent or clearing it to top-levelβ€”making the tool's scope unambiguous and naturally distinct from siblings like zotero_get_item_children or 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 Guidelines3/5

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

The description gives clear how-to instructions for the two operational modes ('Pass a parent item key... or null to make the item top-level'), so usage context is implied rather than absent. However, it never explicitly states when to prefer this tool over alternatives such as zotero_update_item or zotero_set_item_collections, and names no exclusions.

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

zotero_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

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 clearly explains that the change persists for the session, affects all subsequent tool calls, fails fast on inaccessible library IDs, and that library_id is ignored in default mode. These are critical stateful behaviors that the agent must know.

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 longer than average, but every sentence provides operational value: persistence, scope, discovery, mode semantics, failure behavior, and examples. It is front-loaded with the most important stateful behavior and remains structured and readable.

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 stateful configuration tool, the description covers everything needed for correct invocation: how to find valid IDs, persistence semantics, all library_type modes, reset behavior, failure mode, and examples. The existence of an output schema means return-value details are not required here.

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?

While the schema covers both parameters, the description adds meaning beyond the schema by documenting the 'feeds' library_type, which is missing from the schema's type list, and by clarifying the behavior of 'default' mode. It also clarifies the relationship between library_id and library_type beyond the schema's basic 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 uses a specific verb and resource: 'Switch the active library context,' and clearly states that this determines the target of every subsequent read/write tool call. It also distinguishes itself from sibling tools like zotero_list_libraries, which discovers libraries rather than switching 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?

It explicitly instructs users to discover valid library IDs/types via zotero_list_libraries first and warns not to guess. It also explains when each library_type value should be used, including the 'default' reset mode, and provides concrete examples.

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

zotero_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.4/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 tool is non-LLM (only gathers and groups), explains the output format differences, and mentions the limit to keep calls tractable. It does not explicitly state the tool is read-only, though that is strongly implied. Given the tool's benign nature, this is solid coverage.

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 fairly long but every sentence earns its place. It front-loads the core purpose, then systematically covers each parameter, the output structure, usage guidance, and an example. It could be tightened slightly, but it is well-organized and not wasteful.

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 (4 optional parameters, an output schema, and a clear role in a synthesis workflow), the description covers purpose, parameters, output, behavioral expectations, usage context, and a concrete example. Nothing an agent needs to correctly invoke it 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?

Schema coverage is 100% and the schema already includes descriptions for each parameter. The tool description goes further by explaining collection_key's 8-character format and scope behavior, tag's accepted input formats, limit's purpose, and format's output differences. This adds meaningful context beyond the schema, though not an enormous amount since the schema is already descriptive.

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 ('Collect... organize') and a clear resource (highlights, annotations, notes) across a scope, and it explicitly distinguishes itself from siblings by noting it does NOT call an LLM and produces a per-paper digest. This leaves no ambiguity about what the tool does relative to the many other Zotero 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 clearly says 'Use this before writing a thematic review' and gives an example call. It also explains what the tool does NOT do (no LLM), which sets expectations. However, it does not explicitly name alternatives (like zotero_get_annotations or zotero_get_notes) or state when one would prefer those, so it falls just short of fully explicit when/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_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 behavioral disclosure burden. It reveals that position/page/sortIndex are immutable and explains tag editing semantics (wholesale vs. incremental, mutual exclusivity). However, it does not state whether only provided fields are updated (partial update) or if null values reset fields, which is a key behavioral trait. It also omits any permission or error-handling details, but these may be covered by the output 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 two sentences with no filler. It front-loads the main purpose, then efficiently lists editable fields and constraints. The tag behavior is explained clearly in one sentence, and the non-editable fields are mentioned at the end. This is exemplary conciseness.

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 7-parameter tool and no schema descriptions, the description covers the key fields and their constraints. The existence of an output schema reduces the need to explain return values. However, it leaves the partial-update semantics ambiguous (whether only provided fields are changed), which is important for an agent to know before invoking the tool. This minor gap prevents a perfect score.

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. It explains text, comment, color (with hex format example), and the tags/add_tags/remove_tags relationship, including their mutual exclusivity. It does not explicitly describe annotation_key, but that is self-evident from the name. Overall, it adds significant 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 action ('Update an existing Zotero annotation') and lists the editable fields (text, comment, color, tags), which distinguishes it from create/delete/other operations. It also names the non-editable fields, making the tool's scope unambiguous.

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 clear context on when to use the tool (to modify an existing annotation) and explains constraints (position/page/sortIndex are not editable). It does not explicitly name alternatives like zotero_create_annotation or zotero_delete_annotation, but the update vs. create distinction is implicit. The tag editing modes (wholesale vs. incremental) and their mutual exclusivity give practical usage guidance.

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

zotero_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.5/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 transparency burden. It discloses important behavioral traits: the key, subcollections, and item membership are preserved; a collection cannot be moved under itself or a descendant; to_top_level removes it from any parent; and at least one change must be supplied. It does not cover write-permission requirements or error/conflict behavior, so it is strong but not exhaustive.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, followed by concise parameter guidance, a constraint, a helper-tool pointer, and a concrete example. Each sentence earns its place, and the structure makes the tool easy to scan and use correctly.

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 4-parameter mutation with no annotations and no schema descriptions, this definition is largely complete: all parameters are documented, constraints are stated, and an output schema exists so return-value details are not required. A minor gap is the lack of explicit guidance on combining parent_collection with to_top_level or handling conflicting inputs, keeping it from a perfect score.

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 parameter is explained beyond its schema type: collection_key is the 8-character key, name can be omitted, parent_collection accepts a key or name and has a self/descendant restriction, and to_top_level moves the collection out of any parent. The 'pass at least one change' rule adds useful guardrail 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 opens with a specific verb and object: 'Rename a collection or move it under a different parent, keeping its key, subcollections and item membership.' This clearly distinguishes it from related siblings like zotero_create_collection, zotero_delete_collection, and zotero_update_item. The mention of the 8-character collection key adds practical 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?

The description gives clear context for when to use this tool: renaming or reparenting a collection while preserving its contents. It also explicitly directs the agent to zotero_search_collections to find keys. It does not name alternative tools to avoid, but the action is specific enough that an agent can infer the appropriate situation.

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

zotero_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

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 meets it thoroughly. It discloses failure modes (unknown name fails and lists valid ones, invalid name skipped), the replacement semantics for tags and collections, the mutual exclusivity of tags vs add_tags/remove_tags, the item_type migration behavior, and the writable-library prerequisite. Nothing is hidden; every behavioral quirk is surfaced.

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 carries essential information. It is front-loaded with the core action and scope, then proceeds through the most error-prone semantics (tags, collections, creators) with clear formatting. The example at the end reinforces understanding without redundancy. It earns its length through density.

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 complexity of an 8-parameter mutation tool with a rich output schema, the description is remarkably complete. It covers all replacement vs incremental semantics, failure handling, library requirements, and pointers to sibling tools for related operations. The provided example demonstrates realistic usage. An agent has everything needed to invoke the tool correctly without additional 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?

Schema coverage is only 38%, but the description compensates extensively. It enumerates the snake_case aliases, explains the tags/add_tags/remove_tags semantics, clarifies collections/collection_names replacement, defines creators as a full replacement list, and details the fields parameter including item_type migration. This goes far beyond the sparse schema descriptions, making parameter usage unambiguous.

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 precise verb+resource statement: 'Update metadata on an existing Zotero item by key.' It immediately clarifies scope ('Only what you pass is changed') and lists supported field names, distinguishing itself from sibling tools by naming zotero_set_item_collections and zotero_manage_note for related tasks. This leaves no ambiguity about what the tool does or how it differs from alternatives.

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 clear context: it states that the tool requires a writable library and fails in local-only mode, and it explicitly routes note editing to zotero_manage_note and incremental collection moves to zotero_set_item_collections. However, it does not explicitly state when NOT to use this tool in favor of the broader batch_update sibling, leaving that distinction implicit. It offers strong guidance but stops short of a full when/when-not matrix.

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

zotero_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

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 incremental vs. full-rebuild behavior, progress reporting via MCP context, performance expectations (seconds vs minutes), dependencies ([semantic] optional dependency and configured embedding provider), and the side effect of re-embedding items. It also notes that force_rebuild is slow, which is critical for agent planning. This is thorough 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 well-structured and front-loaded with the main purpose. It uses a numbered list for usage scenarios, bold for key modes, and includes a concrete example. Every sentence adds valueβ€”no fluff. It is appropriately detailed for a tool with two parameters and complex behavior.

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 complex (builds an embedding database with incremental and full modes, requires dependencies). The description covers when to use it, how it behaves, performance expectations, prerequisites, and a status-check alternative. It also provides a usage example. Given the output schema exists (per context), the description doesn't need to explain return values, so nothing critical 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?

The input schema already covers both parameters with descriptions, and schema coverage is 100%. The description adds significant context beyond the schema: force_rebuild re-embeds ALL items from scratch and is for model changes or corruption recovery; limit is described as an optional cap for smoke-testing. This enriches the schema meaning and helps the agent choose appropriate values.

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 purpose: 'Build or refresh the semantic search embedding database from Zotero items.' It specifies the verb (build/refresh), the resource (embedding database), and the scope (from Zotero items). It also distinguishes this from sibling tools like zotero_get_search_database_status (status check) and zotero_semantic_search (which consumes the database), 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?

The description explicitly enumerates when to run the tool: (a) after first install, (b) after adding items via zotero_add_item, (c) when the user added items directly in Zotero desktop. It also explains when to use force_rebuild (changing embedding model or recovering from corruption) and mentions checking status with zotero_get_search_database_status. This is explicit when/when-not guidance with a named alternative.

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

zotero_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.7/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 'Read-only and instant β€” it never opens a dialog,' which covers safety and UI behavior. It could add detail on how the result is returned, but an output schema exists to cover that.

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 its length, every sentence earns its place: purpose, behavioral traits, trigger condition, routing logic, and an example. Information is front-loaded with the core purpose before the usage details.

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?

Output schema exists so return format needs no explanation. The description covers purpose, safety, when-to-use, and post-call routing. Nothing an agent needs to correctly invoke this zero-arg diagnostic 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?

Zero parameters, so the baseline is 4. The description reinforces this with 'Takes no arguments' and a concrete example call 'zotero_write_capabilities()', leaving no ambiguity about invocation.

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 ('Report') and resource (whether/how the server can write to Zotero), enumerating the four distinct modes (local API, web API, hybrid, nothing). This fully distinguishes it from the sibling write tools and diagnostic tools like zotero_get_search_database_status.

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 an explicit trigger condition β€” 'when a write tool reports that no writable backend is configured' β€” and provides a decision tree: call zotero_authorize_local_writes if local writes are possible but no key is held, otherwise web API credentials are needed. This is model-guidance at its best.

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. 5 tool updatesv0.12.4
    • Addedzotero_authorize_local_writes
    • Changedzotero_delete_item1 field changed
      • changedInput schema / properties / allow_note / description
        Previous value: -"If True, permits trashing note items. Default False\ndirects callers to zotero_delete_note for notes (which has the\nsame mechanism but is explicit about what it affects)."New value: +"If True, permits trashing note items. Default False\ndirects callers to zotero_manage_note(action='delete') for\nnotes (same mechanism, explicit about what it affects)."
    • Changedzotero_read_pdf_pages3 fields changed
      • addedInput schema / properties / format
        Added value: +{
        +  "default": "text",
        +  "description": "\"text\" for Markdown, \"image\" for PNG page images.",
        +  "enum": [
        +    "text",
        +    "image"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / rect
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "number"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With format=\"image\", crop start_page to [x, y, width, height]."
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Addedzotero_update_collection
    • Addedzotero_write_capabilities
  2. 7 tool updatesv0.11.0
    • Changedzotero_advanced_search5 fields changed
      • addedInput schema / properties / conditions / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / conditions / items
        Removed value: -{
        -  "additionalProperties": {
        -    "type": "string"
        -  },
        -  "type": "object"
        -}
      • removedInput schema / properties / conditions / type
        Removed value: -"array"
      • addedInput schema / properties / include_subcollections
        Added value: +{
        +  "default": false,
        +  "description": "Make a `collection` condition match items filed\nanywhere in that collection's subtree rather than in it directly.\nApplies to the `is` and `isNot` operations, which are the\nmembership questions; other operators keep comparing keys as\nbefore. Defaults to False, matching Zotero's own \"Search\nsubcollections\" checkbox.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / search_all_libraries
        Added value: +{
        +  "default": false,
        +  "description": "Search every accessible library at once instead\nof the active one (#163). Requires the SQLite backend; each result\nis labelled with its source library. A `collection` condition is\nrejected in this mode β€” collection keys are per-library β€” while\n`tag` conditions work, since Zotero stores tags in one\ndatabase-wide table shared by every library.",
        +  "type": "boolean"
        +}
    • Changedzotero_create_annotation1 field changed
      • changedInput schema / properties / rect / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "number"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "type": "number"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedzotero_get_collection_items2 fields changed
      • addedInput schema / properties / include_subcollections
        Added value: +{
        +  "default": false,
        +  "description": "Also return items in collections nested beneath\nthis one. Defaults to False, matching Zotero's own \"Search\nsubcollections\" checkbox and this tool's previous behaviour.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": 0,
        +  "description": "Index of the first item to return, for paging through a\ncollection larger than `limit`."
        +}
    • Changedzotero_search_by_tag1 field changed
      • addedInput schema / properties / include_subcollections
        Added value: +{
        +  "default": false,
        +  "description": "Also search collections nested beneath\ncollection_key. Ignored when collection_key is not given.",
        +  "type": "boolean"
        +}
    • Changedzotero_search_items2 fields changed
      • addedInput schema / properties / include_subcollections
        Added value: +{
        +  "default": false,
        +  "description": "Also search collections nested beneath\ncollection_key. Ignored when collection_key is not given. Defaults\nto False, matching Zotero's own \"Search subcollections\" checkbox.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / search_all_libraries
        Added value: +{
        +  "default": false,
        +  "description": "Search every accessible library at once instead\nof the active one (#163). Requires the SQLite backend; each result\nis labelled with the library it came from. Cannot be combined with\ncollection_key, which names a collection inside one library.",
        +  "type": "boolean"
        +}
    • Changedzotero_semantic_search2 fields changed
      • changedInput schema / properties / library_id / description
        Previous value: -"Optional library scope β€” 0/\"user\" for the personal library, a\ngroupID for a group library, or None (default) to search every\nindexed library."New value: +"Optional library scope β€” 0/\"user\" for the personal library\nor a groupID for a group library. Defaults to the active library."
      • addedInput schema / properties / search_all_libraries
        Added value: +{
        +  "default": false,
        +  "description": "Search every indexed library at once (#163).\nRequires the SQLite backend; results are labelled with their\nsource library. Mutually exclusive with library_id.",
        +  "type": "boolean"
        +}
    • Addedzotero_set_item_parent
  3. 38 tool updatesv0.9.0
    • Removedfetch
    • Removedscite_check_retractions
    • Removedscite_enrich_item
    • Removedscite_enrich_search
    • Removedsearch
    • Removedzotero_add_by_bibtex
    • Removedzotero_add_by_csl_json
    • Removedzotero_add_by_doi
    • Removedzotero_add_by_isbn
    • Removedzotero_add_by_url
    • Removedzotero_add_from_file
    • Addedzotero_add_item
    • Removedzotero_add_item_relation
    • Addedzotero_batch_update
    • Removedzotero_batch_update_extra
    • Removedzotero_batch_update_tags
    • Changedzotero_create_annotation10 fields changed
      • removedInput schema / properties / attachment_key / description
        Removed value: -"Attachment key (e.g., \"NHZFE5A7\")"
      • removedInput schema / properties / color / description
        Removed value: -"Highlight color in hex format (default: \"#ffd400\" yellow)"
      • removedInput schema / properties / comment / description
        Removed value: -"Optional comment on the annotation"
      • removedInput schema / properties / page / description
        Removed value: -"For PDF: 1-indexed page number. For EPUB: 1-indexed chapter number."
      • addedInput schema / properties / rect
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "number"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / text / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / text / default
        Added value: +null
      • removedInput schema / properties / text / description
        Removed value: -"Exact text to highlight (used to find coordinates/CFI)"
      • removedInput schema / properties / text / type
        Removed value: -"string"
      • changedInput schema / required
        Previous value: -[
        -  "attachment_key",
        -  "page",
        -  "text"
        -]New value: +[
        +  "attachment_key",
        +  "page"
        +]
    • Removedzotero_create_area_annotation
    • Removedzotero_create_note
    • Removedzotero_delete_note
    • Removedzotero_find_duplicates
    • Removedzotero_find_related_papers
    • Removedzotero_get_feed_items
    • Changedzotero_get_item_children3 fields changed
      • addedInput schema / properties / item_key / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / item_key / description
        Previous value: -"Zotero item key/ID"New value: +"One item key, a list of keys, or a JSON/comma-separated\nstring of keys"
      • removedInput schema / properties / item_key / type
        Removed value: -"string"
    • Changedzotero_get_item_fulltext1 field changed
      • changedInput schema / properties / item_key / description
        Previous value: -"Zotero item key/ID"New value: +"Zotero item key/ID. Normally the parent item, whose best\nattachment is chosen by ``attachment_priority``. Passing an\n*attachment's* own key is also supported and reads exactly that\nfile, bypassing the priority order β€” pair it with\n``zotero_get_item_children`` to read one specific attachment of\nan item that has several (#378)."
    • Removedzotero_get_item_related
    • Removedzotero_get_items_children
    • Changedzotero_get_notes5 fields changed
      • removedInput schema / properties / item_key / description
        Removed value: -"Optional Zotero item key/ID to filter notes by parent item"
      • removedInput schema / properties / limit / description
        Removed value: -"Maximum number of notes to return"
      • addedInput schema / properties / query
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • removedInput schema / properties / raw_html / description
        Removed value: -"If True, return the note's raw HTML instead of stripped text.\nUseful for fetching exact content to pass to zotero_update_note."
      • removedInput schema / properties / truncate / description
        Removed value: -"Whether to truncate long notes for display"
    • Removedzotero_library_coverage
    • Removedzotero_list_feeds
    • Removedzotero_manage_collections
    • Addedzotero_manage_note
    • Removedzotero_merge_duplicates
    • Removedzotero_remove_item_relation
    • Removedzotero_search_notes
    • Addedzotero_set_item_collections
    • Changedzotero_update_item23 fields changed
      • removedInput schema / properties / abstract
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / access_date
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / book_title
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / citation_key
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "BetterBibTeX / Zotero native citation key. Writes to data.citationKey. Useful when BBT auto-pinned the key from incomplete metadata and the programmatic refresh path is blocked (see https://github.com/retorquere/zotero-better-bibtex/issues/3522)."
        -}
      • addedInput schema / properties / creators / description
        Added value: +"full replacement creators list (also accepted as\n``fields['creators']``)."
      • removedInput schema / properties / date
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / doi
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / edition
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / extra
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • addedInput schema / properties / fields
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "mapping (or JSON object string) of field name -> value.\nNames may be snake_case aliases (``publication_title``,\n``short_title``, ``citation_key``) or raw Zotero API keys\n(``publicationTitle``). ``place`` is the publication city\n(e.g. ``\"New York\"``) and is valid on book, bookSection,\nthesis, manuscript, report and conferencePaper.\n``citation_key`` writes Zotero's native ``data.citationKey``\n(the BetterBibTeX citation key); BBT auto-pins from metadata\non creation and provides no programmatic refresh path in 9.x,\nso a direct write here is the only programmatic remediation\nfor malformed pinned keys. ``item_type`` migrates the item\nacross types: overlapping fields are preserved and\ntype-specific fields that do not map are dropped."
        +}
      • removedInput schema / properties / isbn
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / issn
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / issue
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / item_type
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / language
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / pages
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / place
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Publication place (city), e.g., 'New York' or 'Cambridge, MA'."
        -}
      • removedInput schema / properties / publication_title
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / publisher
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / short_title
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / title
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / url
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / volume
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
    • Removedzotero_update_note
  4. 2 tool updatesv0.7.0
    • Changedzotero_get_annotations1 field changed
      • addedInput schema / properties / format
        Added value: +{
        +  "default": "markdown",
        +  "description": "``markdown`` for human-readable output or ``json`` for\nnormalized structured records.",
        +  "enum": [
        +    "markdown",
        +    "json"
        +  ],
        +  "type": "string"
        +}
    • Changedzotero_synthesize_annotations1 field changed
      • addedInput schema / properties / format
        Added value: +{
        +  "default": "markdown",
        +  "description": "``markdown`` for a readable digest or ``json`` for structured\nper-paper annotation and note records.",
        +  "enum": [
        +    "markdown",
        +    "json"
        +  ],
        +  "type": "string"
        +}
  5. 2 tool updatesv0.6.4
    • Addedzotero_attach_file
    • Changedzotero_semantic_search1 field changed
      • addedInput schema / properties / library_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional library scope β€” 0/\"user\" for the personal library, a\ngroupID for a group library, or None (default) to search every\nindexed library."
        +}
  6. 12 tool updatesv0.6.0
    • Changedzotero_add_by_bibtex2 fields changed
      • addedInput schema / properties / create_missing_collections
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / if_exists
        Added value: +{
        +  "default": "duplicate",
        +  "enum": [
        +    "duplicate",
        +    "file",
        +    "skip"
        +  ],
        +  "type": "string"
        +}
    • Changedzotero_add_by_csl_json2 fields changed
      • addedInput schema / properties / create_missing_collections
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / if_exists
        Added value: +{
        +  "default": "duplicate",
        +  "enum": [
        +    "duplicate",
        +    "file",
        +    "skip"
        +  ],
        +  "type": "string"
        +}
    • Changedzotero_add_by_doi2 fields changed
      • addedInput schema / properties / create_missing_collections
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / if_exists
        Added value: +{
        +  "default": "duplicate",
        +  "enum": [
        +    "duplicate",
        +    "file",
        +    "skip"
        +  ],
        +  "type": "string"
        +}
    • Changedzotero_add_by_isbn2 fields changed
      • addedInput schema / properties / create_missing_collections
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / if_exists
        Added value: +{
        +  "default": "duplicate",
        +  "enum": [
        +    "duplicate",
        +    "file",
        +    "skip"
        +  ],
        +  "type": "string"
        +}
    • Changedzotero_add_by_url2 fields changed
      • addedInput schema / properties / create_missing_collections
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / if_exists
        Added value: +{
        +  "default": "duplicate",
        +  "enum": [
        +    "duplicate",
        +    "file",
        +    "skip"
        +  ],
        +  "type": "string"
        +}
    • Changedzotero_add_from_file2 fields changed
      • addedInput schema / properties / create_missing_collections
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / if_exists
        Added value: +{
        +  "default": "duplicate",
        +  "enum": [
        +    "duplicate",
        +    "file",
        +    "skip"
        +  ],
        +  "type": "string"
        +}
    • Addedzotero_batch_update_extra
    • Addedzotero_export_bibliography
    • Addedzotero_find_related_papers
    • Addedzotero_library_coverage
    • Addedzotero_synthesize_annotations
    • Changedzotero_update_item1 field changed
      • addedInput schema / properties / citation_key
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "BetterBibTeX / Zotero native citation key. Writes to data.citationKey. Useful when BBT auto-pinned the key from incomplete metadata and the programmatic refresh path is blocked (see https://github.com/retorquere/zotero-better-bibtex/issues/3522)."
        +}
  7. 1 tool updatev0.5.0
    • Addedzotero_get_page_layout
  8. 55 tool updatesv0.4.1
    • Addedfetch
    • Addedscite_check_retractions
    • Addedscite_enrich_item
    • Addedscite_enrich_search
    • Addedsearch
    • Addedzotero_add_by_bibtex
    • Addedzotero_add_by_csl_json
    • Addedzotero_add_by_doi
    • Addedzotero_add_by_isbn
    • Addedzotero_add_by_url
    • Addedzotero_add_from_file
    • Addedzotero_add_item_relation
    • Addedzotero_advanced_search
    • Addedzotero_batch_update_tags
    • Addedzotero_create_annotation
    • Addedzotero_create_area_annotation
    • Addedzotero_create_collection
    • Addedzotero_create_note
    • Addedzotero_delete_annotation
    • Addedzotero_delete_collection
    • Addedzotero_delete_item
    • Addedzotero_delete_note
    • Addedzotero_find_duplicates
    • Addedzotero_get_annotations
    • Addedzotero_get_attachment_path
    • Addedzotero_get_collection_items
    • Addedzotero_get_collections
    • Addedzotero_get_feed_items
    • Addedzotero_get_item_children
    • Addedzotero_get_item_fulltext
    • Addedzotero_get_item_metadata
    • Addedzotero_get_item_related
    • Addedzotero_get_items_children
    • Addedzotero_get_notes
    • Addedzotero_get_pdf_outline
    • Addedzotero_get_recent
    • Addedzotero_get_search_database_status
    • Addedzotero_get_tags
    • Addedzotero_list_feeds
    • Addedzotero_list_libraries
    • Addedzotero_manage_collections
    • Addedzotero_merge_duplicates
    • Addedzotero_read_pdf_pages
    • Addedzotero_remove_item_relation
    • Addedzotero_search_by_citation_key
    • Addedzotero_search_by_tag
    • Addedzotero_search_collections
    • Addedzotero_search_items
    • Addedzotero_search_notes
    • Addedzotero_semantic_search
    • Addedzotero_switch_library
    • Addedzotero_update_annotation
    • Addedzotero_update_item
    • Addedzotero_update_note
    • Addedzotero_update_search_database
  9. 10 tool updatesv0.1.6
    • Removedzotero_advanced_search
    • Removedzotero_batch_update_tags
    • Removedzotero_get_collection_items
    • Removedzotero_get_collections
    • Removedzotero_get_item_children
    • Removedzotero_get_item_fulltext
    • Removedzotero_get_item_metadata
    • Removedzotero_get_recent
    • Removedzotero_get_tags
    • Removedzotero_search_items
  10. 10 tool updatesv1.0.0
    • First observedzotero_advanced_search
    • First observedzotero_batch_update_tags
    • 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_recent
    • First observedzotero_get_tags
    • First observedzotero_search_items

TDQS

A4.2/5.0

Scored across 41 tools

Disambiguation5/5

Every tool targets a distinct resource/action pair, and the few overlapping families (search variants, note vs annotation readers) are explicitly cross-referenced with 'use X instead' guidance. No two tools are interchangeable, so an agent can reliably select the right one.

Naming Consistency5/5

All 41 tools share a uniform `zotero_` prefix and a predictable verb_noun pattern (get_, create_, update_, delete_, search_, list_, switch_, set_, manage_). Even the search family follows the pattern consistently (search_items, search_by_tag, search_collections), with only minor generic verbs like manage_note that still fit the style.

Tool Count2/5

At 41 tools the set is too large for smooth agent operation; many subfamilies (search variants, PDF reading, status/infrastructure) could be consolidated into fewer parameterized tools. The breadth is real, but the count exceeds even the 'heavy' range and will burden context and tool-picking.

Completeness4/5

The surface covers items, collections, notes, annotations, attachments, libraries, tags, bibliography export, batch updates, auth, and search β€” essentially full CRUD/lifecycle for the domain. Minor gaps exist (e.g., no standalone note creation without a parent item, no direct 'list all library items' endpoint), but they are workaroundable.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers