zotero-mcp-server
The Zotero MCP server lets you fully manage a Zotero reference library via the Zotero Web API:
Search & Retrieve
Search items by text query, item type, tag, or collection
Get full metadata for a specific item by its key
List child items (attachments and notes) of a parent item
List collections (including sub-collections) and their contents
List/filter tags in your library
Create
Create new reference items (journal articles, books, webpages, etc.) with full metadata, creators, tags, and collection assignments
Create standalone notes or notes attached to an existing item
Create collections (top-level or nested)
Update
Update existing item fields (title, date, tags, collections, etc.) with version-conflict protection
Add items to a collection without managing version numbers directly
Delete
Delete items by moving them to trash (recoverable) or permanently erasing them
Provides read and write access to a Zotero library, enabling searching items, reading notes and attachments, browsing collections, and creating/updating/deleting items, notes, and collections.
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-mcp-serverFind recent items about climate change in my 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 Toolkit
Tools for Zotero: MCP servers, Zotero plugins and agent skills for reference management and systematic/scoping review workflows.
Built for real review work - screening decisions, exclusion logging, PRISMA record accounting - rather than as a demo.
What's here
Component | Runs where | Status |
Any MCP client, or as a standalone CLI | v1.2.0 | |
| Inside the Zotero desktop app ( | v1.0.1 |
Loaded by an AI agent | planned | |
Shared libraries | not yet needed | |
Cross-package documentation | in progress |
zotero-toolkit/
├── mcp/ # MCP servers (npm workspaces)
│ └── zotero-mcp-server/ # 24 tools + 3 prompts over the Zotero Web API, plus a CLI
├── plugins/ # Zotero .xpi add-ons, using Zotero's internal API
├── agent-skills/ # research workflows for AI agents
├── core/ # shared libraries, once >1 package needs them
└── docs/ # cross-package documentationAutoAttach matches downloaded PDFs to the items you already have by reading what is inside each file — DOI, arXiv ID, embedded metadata, first-page text — rather than comparing filenames. Every match carries the evidence it was made on, and nothing is written until you confirm:

It runs inside Zotero, and every command ends in that same reviewed dialog:


Two different integration points, deliberately:
MCP servers talk to the Zotero Web API over HTTPS. They work from any machine against your synced library and need no desktop app, but only see items that have synced.
Plugins run inside Zotero using its internal API. They work offline and can touch local files and attachments, but must be installed in the app.
Related MCP server: zotero-mcp
Quick start
The MCP server is the finished piece. Requires Node.js 18+.
git clone https://github.com/adolinjonathan-bot/zotero-toolkit.git
cd zotero-toolkit
npm install
npm run build
npm run verify # 7 checks, no credentials neededThen follow mcp/zotero-mcp-server/README.md to
create a Zotero API key and connect a client - Claude Desktop, Claude Code, Cursor,
Zed, Continue, VS Code, LM Studio, or a local open-source model.
It also runs as a plain CLI with no AI involved at all:
node mcp/zotero-mcp-server/dist/cli.js search "youth employability" --limit 10Repository conventions
npm installonce at the root; workspaces covermcp/*andcore/*.agent-skills/is documentation, not code, and is deliberately excluded.npm run buildandnpm run verifyfan out across every package.Build output (
dist/,build/,*.xpi) is not committed. Plugin.xpifiles ship as GitHub Release assets so each download traces to a source commit.Every package carries its own README; this file stays an index.
Licence
MIT - see LICENSE.
Credits
Initial implementation generated with Claude, then debugged, hardened and tested against a live research library.
Available Tools
12 toolszotero_add_items_to_collectionAdd Items To Zotero CollectionAIdempotent
Add one or more existing items to a Zotero collection, without needing to fetch or manage version numbers.
Args:
collection_key (string, required)
item_keys (string[], required, max 50)
This adds to the collection; it does not remove the items from any collection they're already in, and does not affect other items already in the target collection.
| Name | Required | Description | Default |
|---|---|---|---|
| item_keys | Yes | Up to 50 item keys to file into the collection | |
| collection_key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations: it states that version numbers are not needed and clarifies that items are not removed from other collections. Annotations already indicate mutation (readOnlyHint=false) and non-destructive nature (destructiveHint=false), but the description enriches understanding of idempotency and safety.
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 adequately structured but includes an 'Args' section that largely duplicates the schema. The first sentence is concise and front-loaded, but the next lines could be more compact. It earns its space but is not optimally tight.
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 additive operation with no output schema, the description covers the action and side effects. However, it does not mention the return value or success/failure behavior, which would be helpful for an AI agent to handle the response properly.
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 50%, with only item_keys having a description. The tool description repeats the schema details for both parameters without adding new semantic meaning (e.g., what a collection_key represents or how to obtain it). It fails to compensate for the lack of schema documentation for collection_key.
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 'add' and the resource 'existing items to a Zotero collection'. It specifies that no version number management is needed, distinguishing this tool from other operations like creating 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 explains that this tool only adds items to a collection without removing them from other collections or affecting existing items. This guides the agent on when to use it (additive action) and what it does not do. It lacks an explicit statement about when not to use it or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_create_collectionCreate Zotero CollectionA
Create a new collection (folder) in the Zotero library.
Args:
name (string, required)
parent_collection_key (string, optional): nest under this collection; omit for a top-level collection
Returns the new collection's key, for use with zotero_add_items_to_collection.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| parent_collection_key | No | Omit to create a top-level collection |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false, so the description's mention of 'Create' is consistent. The description adds that the tool returns the new collection's key, but does not elaborate on side effects or error conditions. The behavioral disclosure is adequate but not enhanced significantly beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a single line for purpose, then an Args section, then a Returns line. Every sentence is necessary and informative. No redundant or verbose language.
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 params, no output schema), the description covers the essential: creation, nesting, and return value with cross-tool hint. It does not address potential duplicate name behavior, but overall it is complete enough for a straightforward creation 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?
The schema has only 50% description coverage (parent_collection_key has a description, but name does not). The description adds meaning by explicitly listing name as required and parent_collection_key as optional with nesting explanation. This compensates for the schema gap, providing useful 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 clearly states 'Create a new collection (folder) in the Zotero library.' It uses a specific verb and resource, and distinguishes from sibling tools like zotero_create_item and zotero_create_note by specifying 'collection'. Also mentions the return value for use with another tool, adding clarity.
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 explains when to use the tool (create a new collection) and gives guidance on nesting with the optional parameter. However, it does not explicitly state when not to use it or compare with alternatives like zotero_list_collections. The hint about the return key being used with zotero_add_items_to_collection provides some workflow context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_create_itemCreate Zotero ItemA
Create a new top-level item (reference) in the Zotero library.
Args:
item_type (string, required): Zotero item type, e.g. "journalArticle", "book", "report", "webpage"
title, creators, date, abstract_note, url, doi (optional)
tags (string[], optional): tag labels to attach
collection_keys (string[], optional): file the item into these collections immediately
extra_fields (object, optional): any other valid Zotero field for the item type, e.g. {"publicationTitle": "Journal of X", "volume": "12", "issue": "3", "pages": "1-10"}
Returns the created item's key and version. This is a destructive/write operation - it permanently adds to the user's library.
Examples:
Use when: "Add this journal article to my Zotero library" -> item_type="journalArticle", title=..., creators=[...], extra_fields={publicationTitle: ..., volume: ...}
Don't use when: the item might already exist (search first with zotero_search_items to avoid duplicates)
| Name | Required | Description | Default |
|---|---|---|---|
| doi | No | ||
| url | No | ||
| date | No | Free-form date string, e.g. '2026' or '2026-03-15' | |
| tags | No | Tag labels to attach to the new item | |
| title | No | ||
| creators | No | ||
| item_type | Yes | Zotero item type, e.g. 'journalArticle', 'book', 'report', 'webpage', 'conferencePaper' | |
| extra_fields | No | Any other valid Zotero field for this item type not covered above, e.g. {publicationTitle: 'Journal of X', volume: '12'} | |
| abstract_note | No | ||
| collection_keys | No | Collection keys to file the new item under |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description claims 'This is a destructive/write operation - it permanently adds to the user's library', but annotations set destructiveHint=false, contradicting the description.
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?
Well-structured with clear sections (Args, Returns, Examples) and no fluff. Slightly long but justified by 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?
Covers purpose, parameters, return value, and usage guidance. No output schema exists, but description mentions return fields; could mention error handling.
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?
Adds meaningful context for complex parameters like extra_fields and creators, and gives examples. Schema coverage is 50%, but description compensates well.
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?
Clearly states 'Create a new top-level item (reference) in the Zotero library.' and provides examples differentiating it from other tools like zotero_create_collection and zotero_create_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly includes 'Use when' and 'Don't use when' scenarios, advising to search for duplicates first with zotero_search_items.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_create_noteCreate Zotero NoteA
Create a standalone note or a child note attached to an existing item.
Args:
note_html (string, required): note content as HTML (sanitised automatically by Zotero)
parent_item_key (string, optional): attach as a child note under this item; omit for a standalone note
tags (string[], optional)
Use for recording reading notes, screening decisions, or extraction summaries against a reference.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| note_html | Yes | Note content as HTML, e.g. '<p>This paper argues...</p>' | |
| parent_item_key | No | If set, attach the note as a child of this item; omit to create a standalone note |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false, so description adds value by noting HTML is sanitised automatically. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two sentences plus bullet args. Purpose is front-loaded. Every line adds value with no 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?
Covers all key aspects: creation mode, HTML handling, use cases. For a 3-parameter tool with no output schema, the description is fully complete for correct agent 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?
Adds behavioral info to note_html (sanitisation) and clarifies parent_item_key semantics (attach vs standalone). Tags are mentioned but schema already covers them. With 67% schema coverage, description compensates well.
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?
Clearly states verb 'Create' and resource 'note', distinguishes standalone vs child note, and lists specific use cases (reading notes, screening decisions, extraction summaries). Differentiates from siblings like zotero_create_item and zotero_update_item.
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 context for when to use (recording notes against a reference) and how to attach to parent. Lacks explicit when-not-to-use or comparison with siblings, but context is clear enough for appropriate selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_delete_itemDelete Zotero ItemADestructiveIdempotent
Delete an item from the Zotero library.
Args:
item_key (string, required)
current_version (number, required): the item's version from zotero_get_item, to confirm you're deleting the version you expect
permanent (boolean, default false): false moves the item to the trash (recoverable); true erases it irreversibly
This is a destructive operation, and the library is synced - the deletion propagates to the user's desktop Zotero and any other synced device. Always confirm with the user before calling this. Never pass permanent=true unless the user has explicitly asked for irreversible deletion; the default trash behaviour leaves them able to undo it.
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes | ||
| permanent | No | false (default) moves the item to the Zotero trash, where the user can restore it. true deletes it outright with NO way to recover it. Only pass true if the user explicitly asked for permanent/irreversible deletion. | |
| current_version | Yes | The item's current 'version', from zotero_get_item - required to confirm you are deleting the version you intended |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already indicating destructiveHint=true, the description adds critical context: the deletion propagates across synced devices, the difference between trash and permanent deletion, and the need for user confirmation. This goes beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized with an Args section but could be slightly more concise. However, every sentence adds value, and the structure is clear.
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 is destructive with no output schema, the description fully covers safety (user confirmation, syncing propagation, trash vs permanent), parameter usage, and expected behavior. It is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Each parameter is explained: item_key required, current_version for version confirmation (referencing zotero_get_item), and permanent with default false and behavioral consequences. Schema description covers 67% of parameters, but description adds meaning for item_key and clarifies rationale.
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 'Delete an item from the Zotero library,' using a specific verb and resource. It distinguishes from sibling tools like zotero_update_item and zotero_create_item.
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 instructs to confirm with the user before calling, warns against passing permanent=true unless irreversible deletion is requested, and clarifies that default trash behavior allows undo. This provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_collection_itemsGet Items In Zotero CollectionARead-onlyIdempotent
List the items filed under a specific Zotero collection.
Args:
collection_key (string, required)
limit (number, default 50, max 100)
start (number, default 0): pagination offset
response_format ('markdown' | 'json', default 'markdown')
Returns the items in the collection (not sub-collections). For a broader text search restricted to a collection, use zotero_search_items with collection_key instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| start | No | ||
| collection_key | Yes | The collection's Zotero key | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds minor context: returns items in the collection (not sub-collections). 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?
Structured with Args list, concise (4 lines plus one sentence), no fluff. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all parameters, pagination, response format, and provides alternative usage. No output schema exists, but the description explains what is returned (items in collection, not sub-collections). Could optionally mention response structure, but adequate given annotations.
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 50% (only collection_key and response_format have descriptions in schema). The description adds default and max for limit, default for start, and enum values for response_format, compensating for 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?
Clear verb 'List' with specific resource 'items under a Zotero collection'. Distinguishes from siblings by noting it returns items in a collection (not sub-collections) and provides an alternative for broader search.
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 (list items in a collection) and when not (not sub-collections). Provides an alternative tool (zotero_search_items with collection_key) for broader text search restricted to a collection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_itemGet Zotero ItemARead-onlyIdempotent
Fetch full metadata for a single Zotero item by its key.
Args:
item_key (string, required)
response_format ('markdown' | 'json', default 'markdown')
Returns all fields for the item, including the current 'version' number, which is required for zotero_update_item and zotero_delete_item to avoid overwriting concurrent changes.
Error Handling:
Returns "Error: ... Not Found (404)" if the key does not exist in this library
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes | The Zotero item key, e.g. 'ABCD1234' | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond annotations: returns version number important for concurrent updates, and error messages for not-found. Annotations already cover read-only and idempotent.
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?
Well-structured with sections for Args, Returns, Error Handling. Front-loaded with main purpose. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Sufficient for a simple read tool with no output schema. Covers return content, version importance, and error handling. Sibling tools are related but not confusing.
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 3. Description repeats parameter info and adds version importance, but no extra semantics beyond what schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb 'Fetch' and specific resource 'single Zotero item by its key'. Distinct from sibling tools like zotero_search_items and 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?
Explicitly states version is required for update/delete tools, guiding when to use. Lacks explicit when-not-to-use or alternative comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_item_childrenGet Zotero Item ChildrenARead-onlyIdempotent
List the child items (attachments and notes) of a parent Zotero item.
Args:
item_key (string, required): the parent item's key
response_format ('markdown' | 'json', default 'markdown')
Returns attachments (PDFs, links) and notes attached to the item, each with its own key. Use this to find a PDF attachment's key or to read existing notes before adding a new one.
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes | The parent item's Zotero key | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, open-world, idempotent, non-destructive. Description adds that it returns attachments and notes each with their own key, and explains the practical purpose. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentence main description then Args list (some redundancy with schema). Front-loaded with purpose, no wasted sentences. Minor redundancy reduces from perfect 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 read-only list tool with only 2 scalar parameters and no output schema, the description fully covers what the tool does and when to use it. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline 3. Description restates parameter info but adds little beyond schema (e.g., 'parent item's key' and output format descriptions are already in schema). No new semantic 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?
Clearly states it lists child items (attachments and notes) of a parent Zotero item. Specific verb and resource, distinct from siblings like 'zotero_get_item' or 'zotero_search_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?
Explicitly says 'Use this to find a PDF attachment's key or to read existing notes before adding a new one', providing clear usage context. Lacks explicit when-not-to-use or direct sibling comparisons, but adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_list_collectionsList Zotero CollectionsARead-onlyIdempotent
List collections (folders) in the Zotero library.
Args:
parent_collection_key (string, optional): list sub-collections of this collection; omit for top-level collections
response_format ('markdown' | 'json', default 'markdown')
Returns each collection's key, name, and item count. Use a collection's key with zotero_get_collection_items or zotero_add_items_to_collection.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
| parent_collection_key | No | If set, list sub-collections of this collection instead of top-level collections |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, etc., so the description does not need to repeat safety. It adds that it lists collections and returns specific fields, which is consistent. 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?
The description is two short paragraphs: purpose, then parameter details, then return info and usage tips. Every sentence adds value, no unnecessary text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with two parameters, the description covers purpose, parameter behavior, return values, and even suggests next steps with sibling tools. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. The description adds value by explaining parent_collection_key's role ('list sub-collections; omit for top-level') and specifying the default for response_format ('markdown'). It goes beyond the schema's bare 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 clearly states 'List collections (folders)' and specifies that it returns key, name, and item count. It distinguishes from siblings by mentioning the parent_collection_key for sub-collections and referencing related tools like zotero_get_collection_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 explains when to use the parent_collection_key parameter (top-level vs. sub-collections) and suggests follow-up actions with other tools. It does not explicitly state when not to use the tool, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_list_tagsList Zotero TagsARead-onlyIdempotent
List tags used in the Zotero library, optionally filtered by substring.
Args:
filter (string, optional): only return tags containing this text
limit (number, default 100, max 200)
Useful for discovering the exact tag spelling before using it in zotero_search_items or zotero_update_item.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| filter | No | Only return tags containing this substring |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint. The description adds that tags are listed and optionally filtered, which is consistent but does not go beyond the annotations to explain any side effects or nuances.
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: purpose, argument details, and usage hint. Every sentence provides value, no redundancy, and it is front-loaded with the main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, rich annotations, and lack of output schema, the description covers purpose, parameters, and usage context comprehensively. The agent has sufficient information to decide when and how to use the 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?
The input schema provides descriptions for the 'filter' parameter (50% coverage). The description adds default and max values for 'limit', which are not described in the schema, thus adding meaning beyond the schema for that parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List tags used in the Zotero library' with a specific verb and resource. It also mentions optional filtering, which distinguishes it from sibling tools that handle items, collections, or notes.
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 the use case: 'Useful for discovering the exact tag spelling before using it in zotero_search_items or zotero_update_item.' This provides clear context and references sibling tools, though it does not specify 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_search_itemsSearch Zotero ItemsARead-onlyIdempotent
Search the Zotero library for items (references), matching against title, creator names, and full text of attached PDFs.
Args:
query (string, optional): search text. Omit it to browse by filter alone.
item_type (string, optional): filter to one Zotero item type (e.g. "journalArticle")
tag (string, optional): filter to items carrying this exact tag
collection_key (string, optional): search within one collection only
limit (number, default 25, max 100)
start (number, default 0): pagination offset
response_format ('markdown' | 'json', default 'markdown')
Returns matching items with key, title, creators, date, tags, and abstract. Use the item 'key' with zotero_get_item, zotero_update_item, or zotero_get_item_children for further work.
Does NOT create or modify anything - read-only.
Examples:
Use when: "Find items in my library about digital youth mentorship" -> query="digital youth mentorship"
Use when: "Show journal articles tagged 'AI literacy'" -> omit query, item_type="journalArticle", tag="AI literacy"
Don't use when: you already have the item key (use zotero_get_item instead)
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Restrict to items with this exact tag | |
| limit | No | Max results to return (1-100) | |
| query | No | Search text, matched against title, creators, and full text (Zotero 'quicksearch'). Omit to list items filtered only by item_type/tag/collection_key. | |
| start | No | Offset for pagination | |
| item_type | No | Restrict to a Zotero item type, e.g. 'journalArticle', 'book', 'report' | |
| collection_key | No | Restrict the search to a single collection, by its key | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false; the description reinforces this and adds that it searches full text of PDFs. 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?
Well-structured with paragraphs, args, and examples. Every sentence adds value; no redundancy. Front-loaded with core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet description clearly states return fields and how to use item keys with other tools. Covers all parameters, behavior, and caveats. Complete for a search tool with 7 optional params.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds significant value: clarifies query matching fields, explains omitting query, provides example values for item_type, specifies exact tag matching, and notes pagination defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches Zotero items across multiple fields, including PDF full text. It distinguishes from siblings like zotero_get_item and zotero_get_collection_items, and explicitly notes it is read-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?
Provides explicit when-to-use and when-not-to-use examples, including alternatives (e.g., 'Don't use when: you already have the item key (use zotero_get_item instead)') and guidance on omitting query to browse by filter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_update_itemUpdate Zotero ItemAIdempotent
Apply a partial update to an existing Zotero item.
Args:
item_key (string, required)
current_version (number, required): the item's version at the time you last read it (from zotero_get_item). Prevents accidentally overwriting a concurrent edit.
fields (object, required): the fields to change, e.g. {"title": "Corrected Title", "date": "2026"}. Array-valued fields (tags, collections) are REPLACED entirely, so include the full desired array, not just the additions.
Returns the updated item. Fails with a version-mismatch error if the item changed since current_version was read - in that case, call zotero_get_item again and retry.
Don't use when: adding the item to a collection is the only goal - zotero_add_items_to_collection is simpler and avoids the version-conflict risk.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | Partial field updates to apply, e.g. {"title": "New Title", "tags": [{"tag": "reviewed"}]}. Only listed fields are changed; array fields like 'tags' and 'collections' are replaced wholesale, not merged - fetch the item first if you need to append rather than overwrite. | |
| item_key | Yes | The Zotero key of the item to update | |
| current_version | Yes | The item's current 'version', from zotero_get_item or zotero_search_items - required to prevent overwriting concurrent changes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: the tool applies partial updates, array fields are replaced entirely (not merged), and it fails with a version-mismatch error. Annotations already indicate non-readonly (readOnlyHint=false) and non-destructive (destructiveHint=false), so the description adds context about versioning and array replacement, though the annotation coverage slightly reduces the burden.
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 with clear sections, but it is somewhat lengthy. Each sentence adds value, and the main purpose is front-loaded. Minor improvements could be made to reduce verbosity while retaining key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (partial update, versioning, array replacement) and the absence of an output schema, the description is complete. It covers the operation, prerequisites (current_version), behavior on arrays, error handling, and when to use an alternative, making it fully informative for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds significant meaning: it provides an example of the fields parameter, explains the purpose of current_version (preventing overwrites), and clarifies that array fields are replaced wholesale. This goes beyond the schema descriptions and helps agents use the tool correctly.
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 'Apply a partial update to an existing Zotero item', clearly identifying the verb (update) and resource (Zotero item). It also distinguishes from sibling tools by advising against using this tool when only adding to a collection, where a simpler alternative exists.
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 guidance on when to use the tool (partial update of an item), explicitly states when not to use it (only adding to a collection, recommending zotero_add_items_to_collection), and explains version conflict handling. It also includes a retry procedure for version mismatch errors.
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.
12 tool updates
v1.0.0- First observed
zotero_add_items_to_collection - First observed
zotero_create_collection - First observed
zotero_create_item - First observed
zotero_create_note - First observed
zotero_delete_item - First observed
zotero_get_collection_items - First observed
zotero_get_item - First observed
zotero_get_item_children - First observed
zotero_list_collections - First observed
zotero_list_tags - First observed
zotero_search_items - First observed
zotero_update_item
TDQS
Scored across 12 tools
Each tool targets a distinct action on a specific resource (collections, items, tags, notes). The descriptions clearly differentiate purposes, and there is no overlap or ambiguity.
All tool names follow a consistent 'zotero_verb_noun' pattern in snake_case, such as 'zotero_create_collection' and 'zotero_search_items'. No mixing of conventions.
12 tools cover the core operations for a Zotero library (CRUD for items, collections, notes, search, tags). Each tool is justified and well-scoped for the domain.
The tool set is mostly complete but lacks delete/update operations for collections and a remove-items-from-collection tool. These gaps can hinder certain workflows.
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
Remote MCP server for full read/write access to a Zotero library
Federated search of books and papers, BibTeX/RIS citations, open-access retrieval and reading.
Academic literature search, retrieval, and private library management on top of OpenAlex.
Read, create, update and delete records; inspect objects, fields and schema in your Knack database.
Related MCP Servers
- AlicenseBqualityDmaintenanceIntegrates with Zotero's local API to search your reference library, retrieve bibliographic details, and extract full text from PDF attachments.41MIT
- AlicenseAqualityDmaintenanceIntegrates with Zotero's local API to search, retrieve, read PDFs, and add items by DOI from your Zotero library.53MIT
- AlicenseCqualityDmaintenanceEnables interaction with Zotero libraries for searching, managing collections, items, tags, and attachments, plus optional semantic search across PDFs via local embeddings.382MIT
- FlicenseNot gradedqualityDmaintenanceEnables Poke to search and manage Zotero research library, including items, tags, collections, notes, full text, and annotations.-