zotero-local-mcp
Zotero Local MCP is a local-first MCP server + CLI that lets AI agents search, read, annotate, manage, and organize a local Zotero library via the Zotero 10 local API.
Search & discovery: keyword/title/creator/year search, advanced structured-field search, tag search, citation-key lookup, and semantic/topic search across the active or all libraries.
Reading: retrieve full-text content, read specific PDF page ranges, extract PDF outlines, get local attachment paths, and list child attachments/notes.
Annotations & notes: create text highlights and area annotations on PDFs, update/trash annotations, get/synthesize annotations, and create/update/trash Markdown/HTML notes.
Item management: add items by DOI, arXiv, URL, ISBN, BibTeX, CSL JSON, or local file; attach files to existing items; update metadata, creators, tags, and collections; move items to the trash (recoverable).
Collections: list, search, create, and delete collections; assign items to collections; page through collection contents.
Library operations: list and switch libraries, view recently added items, batch-update tags/Extra fields, and export formatted bibliographies (APA, MLA, Chicago, IEEE, BibTeX).
Local-first features: local authorization without API keys, files stored directly in Zotero local storage, reversible trash-based deletes, WebDAV sync handled by Zotero desktop, and a
zotero-clifor scripted use.
Supports importing references by arXiv identifier, adding metadata and optionally downloading open-access PDF attachments to local storage.
Supports importing references by DOI, automatically adding metadata and downloading available open-access PDFs to the local Zotero storage.
Provides tools for searching, reading, annotating, and managing a local Zotero library, including items, collections, notes, attachments, and safe deletion to the trash.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@zotero-local-mcpFind papers about resource dependence theory in my Zotero library."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
项目介绍
Zotero Local MCP 基于 Zotero 10 本地 API(http://localhost:23119/api/)构建,提供 Model Context Protocol (MCP) 服务与配套命令行工具 (zotero-cli)。
支持 Claude Desktop、Cursor、Oh My Pi (OMP) 等 AI 客户端直接检索、读取、批注与管理本地 Zotero 文献库。附件在本地文件系统直接落盘,不经由 Zotero 官方云端存储转发。
Related MCP server: zotero-mcp-lite
架构特性
1. 本地落盘与存储兼容
本地存储:通过 DOI、arXiv、URL 或本地路径添加的 PDF 附件直接复制至本地
storage/<key>/目录,不向 Zotero 云端上传文件。WebDAV 同步:条目与文件写入本地后,由 Zotero 桌面端按自身设置执行 WebDAV 同步,MCP 不介入网络同步链路。
2. 本地授权与凭据安全
基于 Zotero 10
POST /api/local/authorize规范握手。授权 Token 存储于本地
~/.config/pyzotero/local-api-key.json(文件权限0600)。客户端配置无需显式填写明文 API Key。
3. 可逆删除
文献、笔记与注释的删除通过
PATCH {"deleted": 1}移至 Zotero 回收站,可在桌面客户端中手动恢复,不执行物理删除。
4. 环回代理保护
服务端绑定
NO_PROXY=127.0.0.1,localhost,防止本机系统代理导致本地 API 请求被误路由。
5. 双接口支持
MCP 服务:提供 30+ 项工具,供 AI 客户端调用。
命令行工具 (
zotero-cli):支持无 AI 环境下的脚本批处理,提供--json输出。
功能清单
模块 | 核心能力 | MCP 工具 / CLI 命令 |
文献检索 | 关键词检索、多字段组合检索、跨文库检索、标签检索 |
|
论文阅读 | PDF/EPUB 文本提取、目录书签解析、指定页码读取 |
|
批注与笔记 | PDF 文本高亮、图形区域框选标注、Markdown/HTML 笔记读写 |
|
文献录入 | 基于 DOI、arXiv、URL、ISBN、BibTeX 或本地文件导入 |
|
集合整理 | 集合创建与删除、条目分类转移、批量标签更新 |
|
条目维护 | 条目移入回收站、元数据更新、重复项排查 |
|
安装与配置
1. 前提要求
安装 Zotero 10+。
在 Zotero 设置中允许本机通信:
macOS:
Settings→Advanced→ 勾选 Allow other applications on this computer to communicate with Zotero。Windows/Linux:
Edit→Preferences→Advanced→ 勾选相同选项。
2. 安装
使用 uv 安装:
# 从源码安装
git clone https://github.com/JingYangYuan/zotero-local-mcp.git
cd zotero-local-mcp
uv tool install .
# 或直接通过 pip 安装
pip install .3. 本地授权
确保 Zotero 桌面端正在运行,执行本地授权:
pyzotero authorize --app-name "Zotero MCP Local"Zotero 桌面端将弹出确认窗口,选择 Always Allow。凭据将自动保存至本地。
检查状态:
zotero-cli --json config输出 ZOTERO_LOCAL: true 且无错误即表示配置完成。
客户端配置
1. Oh My Pi (OMP)
在 ~/.omp/agent/mcp.json 中添加:
{
"mcpServers": {
"zotero": {
"type": "stdio",
"command": "zotero-mcp-server",
"args": ["serve"],
"env": {
"ZOTERO_LOCAL": "true",
"ZOTERO_MCP_SCHEMA_REFRESH": "0"
}
}
}
}2. Claude Desktop
在 Claude Desktop 配置文件(macOS: ~/Library/Application Support/Claude/claude_desktop_config.json,Windows: %APPDATA%\Claude\claude_desktop_config.json)中添加:
{
"mcpServers": {
"zotero": {
"command": "zotero-mcp-server",
"args": ["serve"],
"env": {
"ZOTERO_LOCAL": "true",
"ZOTERO_MCP_SCHEMA_REFRESH": "0"
}
}
}
}3. Cursor
在 .cursor/mcp.json 中添加:
{
"mcpServers": {
"zotero": {
"command": "zotero-mcp-server",
"args": ["serve"],
"env": {
"ZOTERO_LOCAL": "true",
"ZOTERO_MCP_SCHEMA_REFRESH": "0"
}
}
}
}命令行 (zotero-cli) 使用
# 1. 检索文献
zotero-cli search "关键词"
zotero-cli --json search "关键词" --limit 5
# 2. 查看元数据与子附件
zotero-cli get metadata <ITEM_KEY>
zotero-cli get children <ITEM_KEY>
# 3. 添加文献与附件
zotero-cli add doi 10.1145/3708319
zotero-cli add file --filepath /path/to/paper.pdf --title "论文标题"
# 4. 集合管理
zotero-cli collections search "分类名"
zotero-cli collections manage --item-keys <ITEM_KEY> --add-to <COLL_KEY_A> --remove-from <COLL_KEY_B>
# 5. 移入回收站
zotero-cli delete item <ITEM_KEY>常见问题
Q: 是否需要配置 ZOTERO_API_KEY 或 ZOTERO_LIBRARY_ID?
A: 不需要。Zotero 10 本地 API 支持本地授权与写入,读写操作均在本地执行,无需云端 API Key。
Q: 本地添加的文献与附件是否会自动同步到其他设备?
A: 会。只要在 Zotero 桌面端配置了 WebDAV 或官方同步,附件写入本地 storage/ 后,桌面端会按既有规则自动同步。
Q: 误删条目如何恢复?
A: 打开 Zotero 桌面端,在左侧侧边栏进入“回收站”,右键目标条目选择“恢复到文库”。
许可证
本项目基于 MIT License 开源。
Available Tools
38 toolszotero_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 local Zotero write authorization. Attached files are copied into local Zotero storage; subsequent syncing is determined by Zotero desktop settings. Run Example: zotero_add_item(source='10.1145/3708319', collections=['9SU943GB'], if_exists='file').
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| title | No | ||
| source | Yes | ||
| if_exists | No | duplicate | |
| attach_mode | No | auto | |
| collections | No | ||
| source_type | No | auto | |
| create_missing_collections | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers extensively: it discloses write authorization requirements, file copying into local storage, validation failures for ambiguous collections, idempotency semantics for if_exists='file', and the caveat that URL-derived items may be bare webpages. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence adds functional value. It is front-loaded with the purpose, then systematically covers routing, collections, existence handling, attachment modes, and file specifics. No redundancy or fluff; each clause clarifies a decision the agent must make.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 parameters, multiple input types, conditional behaviors) and the presence of an output schema, the description covers all necessary operational details: source formats, collection validation, idempotency, attachment modes, and auth requirements. The only omission, tags, is minor and does not hinder correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It thoroughly explains source, source_type, collections, create_missing_collections, if_exists, attach_mode, and title. The only gap is the 'tags' parameter, which is never mentioned; while its purpose is fairly obvious, the description omits it entirely, a minor but real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Add item(s) to Zotero from any source' and enumerates supported input types (DOI, URL, ISBN, BibTeX, CSL JSON, local file). It clearly distinguishes this from sibling tools by framing it as the universal add operation and even tells the agent to use it for every 'add this to Zotero' request.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use for every add this to Zotero request' and provides detailed routing guidance for each source type, including when to prefer a DOI over a URL and when to resolve to a DOI first. It also explains conditional behaviors like if_exists and create_missing_collections, giving the agent clear decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_advanced_searchA
Advanced item search with multiple structured-field conditions joined by AND or OR. Use this when you need to filter by fields that zotero_search_items and zotero_search_by_tag can't express (date ranges, specific itemTypes, etc.). For plain text use zotero_search_items; for tags use zotero_search_by_tag; for topic discovery use zotero_semantic_search. conditions: list of {field, operation, value} dicts (also accepts a JSON string). Common fields: title, creator, date, dateAdded, dateModified, tag, itemType, publicationTitle, abstractNote, collection. Supported operations (exhaustive): is, isNot, contains, doesNotContain, beginsWith, endsWith, isGreaterThan, isLessThan, isBefore, isAfter. For 'added in the last N days', use field='dateAdded' with operation='isAfter' and an ISO date value (e.g. '2026-03-22'). join_mode: 'all' (AND, default) or 'any' (OR). sort_by: dateAdded, dateModified, title, creator, etc. sort_direction: 'asc' (default) or 'desc'. limit: max results (default 50, max 500). include_subcollections: make a 'collection' condition match items anywhere in that collection's subtree, for the is/isNot operations (default False). search_all_libraries: search every accessible library at once, labelling each result with its library; needs ZOTERO_SEARCH_BACKEND=sqlite. 'tag' conditions work; 'collection' conditions and include_subcollections do not. Example: zotero_advanced_search(conditions=[{'field': 'itemType', 'operation': 'is', 'value': 'preprint'}, {'field': 'dateAdded', 'operation': 'isAfter', 'value': '2026-03-22'}], join_mode='all').
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| sort_by | No | Field to sort by (dateAdded, dateModified, title, creator, etc.) | |
| join_mode | No | Whether all conditions must match ("all") or any condition can match ("any") | all |
| conditions | Yes | List of search condition dictionaries, each containing: - field: The field to search (title, creator, date, tag, etc.) - operation: The operation to perform (is, isNot, contains, etc.) - value: The value to search for | |
| sort_direction | No | Direction to sort (asc or desc) | asc |
| search_all_libraries | No | Search every accessible library at once instead of the active one (#163). Requires the SQLite backend; each result is labelled with its source library. A `collection` condition is rejected in this mode — collection keys are per-library — while `tag` conditions work, since Zotero stores tags in one database-wide table shared by every library. | |
| include_subcollections | No | Make a `collection` condition match items filed anywhere in that collection's subtree rather than in it directly. Applies to the `is` and `isNot` operations, which are the membership questions; other operators keep comparing keys as before. Defaults to False, matching Zotero's own "Search subcollections" checkbox. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 covers many behaviors: search_all_libraries labeling, backend dependency, collection condition rejection, tag condition behavior, include_subcollections semantics, sorting, and limiting. It does not explicitly state that the operation is read-only, but that is strongly implied for a search tool. It also omits error handling details, so a 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense and well-structured. It front-loads purpose and usage, then systematically covers parameters, operations, and examples. Every sentence adds value, and the example is practical. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 params, nested conditions, multiple modes) and the existence of an output schema, the description is remarkably complete. It covers all necessary aspects for correct invocation: fields, operations, join modes, sorting, limiting, subcollections, library-wide search, and limitations. An agent can call this tool correctly without needing additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds extensive meaning beyond the schema. It explains the conditions structure with common fields and an exhaustive list of operations, gives a concrete example, clarifies join_mode, sort_by, limit, include_subcollections, and search_all_libraries. It also notes backend requirements and edge cases. This significantly exceeds the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Advanced item search with multiple structured-field conditions'. It distinguishes itself from siblings by explicitly naming zotero_search_items, zotero_search_by_tag, and zotero_semantic_search and explaining what it can express that they cannot (date ranges, specific itemTypes). The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance: 'Use this when you need to filter by fields that zotero_search_items and zotero_search_by_tag can't express... For plain text use zotero_search_items; for tags use zotero_search_by_tag; for topic discovery use zotero_semantic_search.' It also covers limitations like the SQLite backend requirement and collection condition rejection in search_all_libraries mode.
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_from_file 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 local Zotero write authorization. Files are copied into local Zotero storage; subsequent syncing is determined by Zotero desktop settings. 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').
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| filename | No | ||
| item_key | Yes | ||
| file_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses idempotency ('Idempotent: if the item already has an attachment with the same filename or identical content (MD5), nothing is re-uploaded'), authorization requirements ('Requires local Zotero write authorization'), storage and sync behavior ('Files are copied into local Zotero storage; subsequent syncing is determined by Zotero desktop settings'), return value ('Returns the created attachment's key'), and a recommended follow-up action ('Run zotero_update_search_database afterwards to index the new file for semantic search'). This is exceptionally transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. It follows a logical structure: core purpose, usage context, parameter details, behavioral notes, and a concrete example. Critical constraints (exactly one of file_path/url) and error cases are front-loaded. The example at the end illustrates usage without redundancy. This is appropriately detailed for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 params, 0% schema coverage, no annotations, and a return value), the description covers everything an agent needs: purpose, usage context, parameter semantics, constraints, idempotency, authorization, storage effects, return value, post-action guidance, and an example. The output schema is present, and the description explicitly states the return key, so nothing is left to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully explain each parameter. It does: item_key is described as 'key of the existing REGULAR item' with the caveat about attachment/note keys; file_path specifies allowed formats and 'ABSOLUTE local path'; url is restricted to 'direct http(s) link, downloaded server-side — PDF-only'; filename explains override behavior, defaults, and extension handling. It also clarifies the exclusivity constraint ('Exactly one of file_path/url must be given') and the fallback naming logic. This adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Attach a file to an EXISTING Zotero item as an imported child attachment (uploads the file bytes).' It also explicitly differentiates from the sibling zotero_add_from_file by stating 'To create a NEW item from a file, use zotero_add_from_file instead.' This gives a clear, unambiguous purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states when to use the tool: 'Use when the item is already in the library and you have its key — e.g. attaching a PDF you found for a reference.' It also gives a direct alternative and exclusion: 'To create a NEW item from a file, use zotero_add_from_file instead.' Additionally, it warns about invalid input: 'Passing an attachment/note key fails with a hint to use its parent.' This fully covers when and when not to use it.
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']).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| limit | No | ||
| query | No | ||
| add_tags | No | ||
| set_keys | No | ||
| item_keys | No | ||
| remove_keys | No | ||
| remove_tags | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 (web API key or hybrid mode). 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').
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| rect | No | ||
| tags | No | ||
| text | No | ||
| color | No | #ffd400 | |
| comment | No | ||
| attachment_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: it requires PyMuPDF and a writable library, fails on scanned/image-only PDFs, uses a normalized coordinate system with origin at top-left, and restricts EPUB to highlights. It also notes the error case of providing both or neither text and rect, and explains the exact matching behavior for text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite its length, every sentence adds essential information. The structure is logical: purpose and mode constraint first, then detailed parameter semantics, then requirements, then examples. No fluff or redundancy; the density 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all parameters, error conditions, prerequisites, coordinate system, EPUB limitations, and provides examples. An output schema exists, so the absence of return-value details is acceptable. The description is complete for an agent to correctly select and invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate fully. It does: attachment_key is clarified as the attachment key not the parent item, page is 1-indexed (chapter for EPUB), text must match the text layer exactly, rect is a normalized [x,y,width,height] array with origin and fitting constraints, and optional params (comment, color, tags) are listed with defaults. Examples illustrate parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the verb 'Create' and resource 'annotation on a PDF attachment', clarifies EPUB limitation (highlights only), and distinguishes from siblings like zotero_update_annotation and zotero_delete_annotation. The two modes (text vs rect) are clearly defined, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains the exactly-one-mode rule and the error condition of passing both or neither. Directs users to call zotero_get_page_layout first for accurate rect coordinates, and specifies prerequisites (PyMuPDF, writable library). It also differentiates usage from related tools by describing when to use each mode.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| parent_collection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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
Move a Zotero annotation to the Trash. Trashed annotations are recoverable from Zotero's Trash — empty the Trash in the Zotero UI for permanent deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| annotation_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It explicitly discloses that the operation is a soft delete (recoverable) and details the only way to make it permanent, which is critical behavioral information beyond what the schema could convey. This adds meaningful value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the core action front-loaded and the recovery nuance as a supporting clause. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter) and has an output schema, so the description does not need to explain return values. It covers the action, the recoverable nature, and how to achieve permanent deletion—enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate. It does not explain annotation_key beyond what the name and context imply, but since there is only one parameter and it is self-evident from the tool name, the omission is not critical. Still, a brief note on the key format would have been more helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (move), resource (Zotero annotation), and destination (Trash), which clearly distinguishes it from sibling tools like zotero_delete_item or zotero_delete_collection. The mention of recoverability adds precision about the action's effect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it is for trashing an annotation with recovery in mind, and it explains how to achieve permanent deletion via the Zotero UI. It does not explicitly name alternatives or exclusions, but the context is sufficient for an agent to infer appropriate use cases.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| collection_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_delete_note — 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.
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes | Zotero item key/ID to trash | |
| allow_note | No | If True, permits trashing note items. Default False directs callers to zotero_delete_note for notes (which has the same mechanism but is explicit about what it affects). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it clarifies this is a soft delete (Trash), that items are recoverable, that permanent deletion requires emptying the Trash in the UI, and that notes are protected by default with an explicit override. This is unusually thorough for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all substantive, with the primary action first and the most important caveats (note safety, recoverability) immediately following. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers scope, safety, recovery, and permanent deletion, and an output schema exists so return values need not be described. It leaves a small ambiguity about whether 'any item type' includes annotations and doesn't mention the delete_annotation sibling, but the core call path is fully specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so item_key and allow_note are already documented. The description adds behavioral meaning by stating that notes are refused by default and allow_note=True overrides that safeguard, which goes slightly beyond the schema's phrasing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific action and object: 'Move a Zotero item to the Trash.' It also scopes the tool by item type and immediately distinguishes it from note deletion, so an agent can tell it apart from delete_annotation and delete_collection without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'For notes, use zotero_delete_note' and explains the default refusal with allow_note override. This is strong routing guidance, though zotero_delete_note does not appear in the provided sibling list, so the referenced alternative may not be selectable by the agent.
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').
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | CSL style short name (default "apa"). | apa |
| item_keys | No | Optional list of item keys (or JSON/comma string). | |
| export_format | No | "bib", "citation", or "bibtex". | bib |
| collection_key | No | Optional collection to export. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of annotations to return | |
| format | No | ``markdown`` for human-readable output or ``json`` for normalized structured records. | markdown |
| item_key | No | Optional Zotero item key/ID to filter annotations by parent item | |
| use_pdf_extraction | No | Whether to attempt direct PDF extraction as a fallback |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of items to return | |
| detail | No | summary | |
| offset | No | Index of the first item to return, for paging through a collection larger than `limit`. | |
| collection_key | Yes | The collection key/ID | |
| include_subcollections | No | Also 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
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of collections to return | |
| include_trashed | No | if 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
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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']).
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes | One item key, a list of keys, or a JSON/comma-separated string of keys |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it 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.
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.
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.
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.
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.
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 full extracted text of a Zotero item's primary attachment (PDF or EPUB). WARNING: returns the entire 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. 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').
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes | Zotero 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
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: warns about token size, discloses the extraction path (SQLite, server index, download), notes image-only PDFs may return little text, and explains the parent vs. attachment key behavior. This is rich, actionable disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the most critical warning (token size), followed by usage exclusions, then parameter details, scope, extraction path, and an example. Every sentence earns its place; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists (so return values are already documented), the description covers everything else needed: how to specify the item, the attachment resolution process, limitations (scanned PDFs), and an example. Complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already describes the parameter at 100% coverage, but the description adds meaning: explains '8-character Zotero item key', the parent vs. attachment distinction, the priority preference, and how to read a specific attachment via zotero_get_item_children. This goes well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Return') and resource ('full extracted text of a Zotero item's primary attachment (PDF or EPUB)'). It explicitly distinguishes from siblings by naming zotero_semantic_search for topic search and zotero_get_item_metadata for metadata, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('explicitly wants to READ the paper') and when-not-to-use ('not for searching or browsing'), names alternatives, and adds a warning against calling on multiple papers unless specifically requested. This is model-level guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_item_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').
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format - 'markdown' for a readable summary, 'json' for the complete raw Zotero item, or 'bibtex' for BibTeX citation | markdown |
| item_key | Yes | Zotero item key/ID | |
| include_abstract | No | Whether to include the abstract in the output (markdown format only) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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').
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| item_key | No | ||
| raw_html | No | ||
| truncate | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | 1-indexed PDF page number | |
| attachment_key | Yes | PDF attachment key (e.g., "NHZFE5A7") |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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').
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of items to return | |
| collection_key | No | Optional collection key to scope results to a specific collection |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tags to return |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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().
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 (web API key or hybrid mode). Example: (action='create', item_key='ABC12345', note_title='Reading notes', note_text='Key claim ...').
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| action | Yes | ||
| append | No | ||
| item_key | Yes | ||
| note_text | No | ||
| note_title | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility. It discloses append behavior (replace vs concatenate), trash recoverability, HTML support, and the fact that notes are the only supported resource. It also notes the writable-library requirement. This is comprehensive behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence contributes: it opens with the core actions, then systematically details each parameter and action-specific behavior, and ends with an example. No fluff or repetition; information is well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all necessary context for correct invocation: required parameters, per-action semantics, formatting preservation, library permissions, and a concrete example. With an output schema present, not explaining return values is acceptable. The tool is fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain all parameters. It does so thoroughly: action semantics, item_key distinction per action, note_text HTML rules, note_title as heading, tags optional, and append behavior. The example further clarifies parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool creates, updates, or deletes (trashes) a Zotero note, and clearly distinguishes it from item/collection/attachment operations. It also names the sibling zotero_get_notes for locating keys, providing clear differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance per action (create, update, delete), clarifies which item_key applies to each, and instructs how to preserve formatting via zotero_get_notes(raw_html=True). It also notes the requirement for a writable library, effectively stating prerequisites and alternatives.
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. Returns Markdown with the page's heading structure preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| end_page | No | Last page to read (1-indexed). If omitted, reads only start_page. | |
| item_key | Yes | Zotero item key/ID of the paper or its PDF attachment. | |
| start_page | Yes | First page to read (1-indexed). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses key behaviors: pages are 1-indexed (though the schema also states this) and the return format is Markdown with heading structure preserved. It does not mention error handling or side effects, but for a read-only operation with clear output description, this is sufficient. It adds value beyond the schema by describing the output structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence states the action and usage condition; the second adds indexing and output format. It is front-loaded and every sentence carries meaningful information, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 3 parameters, full schema coverage, and an output schema present, the description covers all essential aspects: what it does, when to use it, indexing, and return format. It is complete for an agent to decide when to call it and to interpret the response. No critical gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add new parameter-specific details beyond what the schema already provides (e.g., 1-indexing, optional end_page). However, it does add context on when to use the tool, which is useful but not directly about parameter semantics. It adequately meets the baseline without further elaboration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Read specific page range(s)') on a clear resource ('PDF attachment of a Zotero item'), and explicitly ties usage to knowing which pages to read, referencing the sibling tool zotero_get_pdf_outline for context. This distinguishes it from related tools like zotero_get_pdf_outline and zotero_get_item_fulltext without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Use this when you know which pages to read — for example after getting the PDF outline via zotero_get_pdf_outline.' This tells the agent when to invoke it and implies the complementary tool to use beforehand, effectively routing to the correct sibling.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| citekey | Yes | The BetterBibTeX citation key to search for (e.g., 'Smith2024') |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | List 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 | |
| limit | No | Maximum number of results to return | |
| item_type | No | Type of items to search for. Use "-attachment" to exclude attachments. | -attachment |
| collection_key | No | Optional collection key to scope the search to a specific collection | |
| include_subcollections | No | Also search collections nested beneath collection_key. Ignored when collection_key is not given. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| include_trashed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 ZOTERO_SEARCH_BACKEND=sqlite; excludes collection_key. Example: zotero_search_items(query='Cladder-Micus') or zotero_search_items(query='Brewer 2011', search_all_libraries=True).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Tag 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. | |
| limit | No | Maximum number of results to return | |
| qmode | No | Query mode (titleCreatorYear or everything) | titleCreatorYear |
| query | Yes | Search query string | |
| item_type | No | Type of items to search for. Use "-attachment" to exclude attachments. | -attachment |
| collection_key | No | Optional collection key to scope the search to a specific collection. When provided, bypasses the fallback cascade and searches the collection directly. | |
| search_all_libraries | No | Search 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_subcollections | No | Also 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
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden — and it discloses the most surprising behaviors: the automatic fallback to simplified queries and then semantic search, the counterintuitive narrowing of results as words are added, the ZOTERO_SEARCH_BACKEND=sqlite environment prerequisite, and per-library labelling of results. This is unusually rich behavioral disclosure for a search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded: core behavior, the IMPORTANT short-query warning, sibling routing, and the fallback cascade all appear before the parameter glossary. Nearly every sentence earns its place, with only minor redundancy (the fallback cascade is mentioned twice) and a parameter list that partly restates an already-rich schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with a fallback cascade, a backend prerequisite, and 36 siblings, the description is remarkably complete: it covers fallback behavior, parameter exclusions (collection_key vs search_all_libraries), subcollection semantics, and the closest sibling alternatives. Minor gaps remain — zotero_advanced_search is never mentioned as an alternative, and sorting/pagination are left to the output schema — but 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the 3 baseline applies, but the description adds meaning the schema lacks: what qmode values actually match ('everything' also searches abstract), that item_type '-attachment' excludes attachments, that tag conditions are ANDed, that collection_key is an 8-char key, and that search_all_libraries requires the sqlite backend. The schema already explains most parameters well, so this is meaningful enrichment rather than rescue.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — 'Search Zotero items by substring match against metadata' — and specifies the target fields (title, creators, year, abstract) and return format (metadata + abstracts as markdown). It also explicitly names sibling tools it is not ('For topic discovery, use zotero_semantic_search instead; for tag filtering use zotero_search_by_tag'), making the tool's identity unambiguous among 36 siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: keep queries SHORT and SIMPLE, use 'Author Year' (e.g. 'Brewer 2011') or a bare author name, because substring matching narrows with each added word. It names alternatives with their selection conditions and provides situation-specific advice such as 'use it when you don't know which library holds the item' for search_all_libraries and 'bypasses the fallback cascade' for collection_key.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_semantic_searchA
Prioritized topic-search tool. Find papers by semantic similarity to a query using AI embeddings — the BEST tool for finding papers on a topic (e.g. 'papers about mindfulness-based therapy'), far more efficient than scanning collection items or reading abstracts. Searches the ACTIVE library by default; pass search_all_libraries=True to cover every indexed library. query: the topic or concept; natural-language phrases work well. limit: max results (default 10). filters: optional metadata filters as a dict (e.g. {'itemType': 'journalArticle', 'year': '2023'}); also accepts a JSON string. library_id: optional — scope to one library other than the active one: 0 or 'user' for personal, else a groupID (see zotero_list_libraries). search_all_libraries: search every indexed library at once, labelling each result with its library; needs ZOTERO_SEARCH_BACKEND=sqlite, excludes library_id. Requires the semantic search database to be POPULATED — run zotero_update_search_database first if you just installed the server or added new items; check readiness with zotero_get_search_database_status. Available only when the [semantic] optional dependency is installed. Example: zotero_semantic_search(query='mindfulness-based cognitive therapy for depression', limit=5).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default: 10) | |
| query | Yes | Search query text - can be concepts, topics, or natural language descriptions | |
| filters | No | Optional metadata filters as dict or JSON string. Example: {"item_type": "note"} | |
| library_id | No | Optional library scope — 0/"user" for the personal library or a groupID for a group library. Defaults to the active library. | |
| search_all_libraries | No | Search every indexed library at once (#163). Requires the SQLite backend; results are labelled with their source library. Mutually exclusive with library_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility. It discloses the requirement for a populated search database, availability only with the optional semantic dependency, default library scope behavior, and the labeling of results when searching all libraries. It also notes the mutual exclusivity of library_id and search_all_libraries. This is thorough and transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite being longer than average, every sentence serves a purpose. The description front-loads the core purpose and usage guidance, then systematically covers parameters, prerequisites, and an example. It is well-organized and avoids redundancy, earning its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters and an output schema, the description covers all necessary aspects: when to use, how to use each parameter, prerequisites, availability constraints, and a clear example. It also cross-references the status-check sibling, making it 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds substantial value beyond the schema. It explains query semantics (natural-language phrases work well), filter format examples, library_id interpretation (0/'user' vs groupID), and the exact conditions and implications of search_all_libraries. It also clarifies the relationship between parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool performs semantic similarity search on papers using AI embeddings, and positions it as the best tool for topic-based discovery. It distinguishes itself from siblings like zotero_search_items by emphasizing topic focus and efficiency over scanning collections or reading abstracts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use this tool (for topic search) and implies when not to (when scanning collections is more appropriate). It also provides explicit conditions for search_all_libraries, prerequisites (populated database, semantic dependency), and gives a concrete example. It even references a sibling tool for checking database status.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| add_to | No | ||
| item_keys | Yes | ||
| remove_from | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes | ||
| parent_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden 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.
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.
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.
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.
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.
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').
| Name | Required | Description | Default |
|---|---|---|---|
| library_id | Yes | The 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_type | No | "user", "group", or "default" to reset to env var defaults. | group |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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').
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Optional tag filter (string, JSON list, or list). | |
| limit | No | Maximum annotations/notes to scan. | |
| format | No | ``markdown`` for a readable digest or ``json`` for structured per-paper annotation and note records. | markdown |
| collection_key | No | Optional collection to restrict the digest to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| text | No | ||
| color | No | ||
| comment | No | ||
| add_tags | No | ||
| remove_tags | No | ||
| annotation_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_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']).
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| fields | No | mapping (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_tags | No | ||
| creators | No | full replacement creators list (also accepted as ``fields['creators']``). | |
| item_key | Yes | 8-character Zotero item key of the item to update. | |
| collections | No | ||
| remove_tags | No | ||
| collection_names | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Limit number of items to process (useful for testing) | |
| force_rebuild | No | Whether to rebuild the entire database from scratch |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses 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.
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.
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.
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.
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.
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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
38 tool updates
v0.1.0- First observed
zotero_add_item - First observed
zotero_advanced_search - First observed
zotero_attach_file - First observed
zotero_batch_update - First observed
zotero_create_annotation - First observed
zotero_create_collection - First observed
zotero_delete_annotation - First observed
zotero_delete_collection - First observed
zotero_delete_item - First observed
zotero_export_bibliography - First observed
zotero_get_annotations - First observed
zotero_get_attachment_path - First observed
zotero_get_collection_items - First observed
zotero_get_collections - First observed
zotero_get_item_children - First observed
zotero_get_item_fulltext - First observed
zotero_get_item_metadata - First observed
zotero_get_notes - First observed
zotero_get_page_layout - First observed
zotero_get_pdf_outline - First observed
zotero_get_recent - First observed
zotero_get_search_database_status - First observed
zotero_get_tags - First observed
zotero_list_libraries - First observed
zotero_manage_note - First observed
zotero_read_pdf_pages - First observed
zotero_search_by_citation_key - First observed
zotero_search_by_tag - First observed
zotero_search_collections - First observed
zotero_search_items - First observed
zotero_semantic_search - First observed
zotero_set_item_collections - First observed
zotero_set_item_parent - First observed
zotero_switch_library - First observed
zotero_synthesize_annotations - First observed
zotero_update_annotation - First observed
zotero_update_item - First observed
zotero_update_search_database
TDQS
Scored across 38 tools
The tools are largely distinct resource/action pairs, and descriptions repeatedly steer agents toward the correct search tool (semantic vs substring vs tag vs advanced). A few close pairs remain, such as zotero_get_annotations vs zotero_synthesize_annotations and zotero_add_item vs zotero_attach_file, but their intended uses are clearly separated.
All 38 tools follow a uniform zotero_<verb>_<object> snake_case pattern with consistent verbs like get, create, update, delete, search, and set. The few generic names, such as zotero_manage_note and zotero_get_recent, do not break the overall pattern.
38 tools is large, but the scope matches Zotero's breadth: items, collections, annotations, notes, search, PDFs, citations, libraries, and semantic search. It is slightly heavier than ideal and has some redundancy among search and annotation readers, but each tool addresses a distinct workflow.
Core CRUD is covered for items, notes, annotations, and collections, along with search, file attachment, PDF reading, bibliography export, and library switching. Minor gaps remain: collections cannot be renamed/updated, there is no restore-from-trash tool, and zotero_delete_item references a zotero_delete_note tool that does not exist, though zotero_manage_note covers note deletion.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Academic literature search, retrieval, and private library management on top of OpenAlex.
AI research library. Save, organise and reuse notes and webpages as clean markdown context.
Federated search of books and papers, BibTeX/RIS citations, open-access retrieval and reading.
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Related MCP Servers
- AlicenseAqualityAmaintenanceConnects your Zotero research library with Claude and other AI assistants via the Model Context Protocol, allowing you to search your library, access content, discuss papers, get summaries, and analyze citations.384,897MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to search, read, and manage Zotero references locally with customizable research workflows.94MIT
- AlicenseAqualityCmaintenanceA Model Context Protocol server for Zotero integration that gives any LLM full access to your Zotero library, including search, organization, DOI-based paper addition, PDF import, full-text reading, and citation injection into Word documents.153237MIT
- AlicenseNot gradedqualityDmaintenanceConnects your Zotero research library with AI assistants (Claude, ChatGPT, etc.) via the Model Context Protocol, enabling paper review, summaries, annotations, and semantic search both locally and through the web API.MIT