Skip to main content
Glama
adolinjonathan-bot

zotero-mcp-server

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

mcp/zotero-mcp-server

Any MCP client, or as a standalone CLI

v1.2.0

plugins/pdf-file-attacher (AutoAttach)

Inside the Zotero desktop app (.xpi)

v1.0.1

agent-skills/

Loaded by an AI agent

planned

core/

Shared libraries

not yet needed

docs/

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 documentation

AutoAttach 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:

The AutoAttach review dialog: 171 PDFs scanned against 268 items, 146 matches,
each row showing its score and the evidence behind
it

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

The review dialog open over the Zotero library
window

The item context menu, with the online commands carrying a globe icon and an
Online label

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 needed

Then 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 10

Repository conventions

  • npm install once at the root; workspaces cover mcp/* and core/*. agent-skills/ is documentation, not code, and is deliberately excluded.

  • npm run build and npm run verify fan out across every package.

  • Build output (dist/, build/, *.xpi) is not committed. Plugin .xpi files 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 tools
zotero_add_items_to_collectionAdd Items To Zotero CollectionA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_keysYesUp to 50 item keys to file into the collection
collection_keyYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
parent_collection_keyNoOmit to create a top-level collection

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

Given the tool's simplicity (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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
doiNo
urlNo
dateNoFree-form date string, e.g. '2026' or '2026-03-15'
tagsNoTag labels to attach to the new item
titleNo
creatorsNo
item_typeYesZotero item type, e.g. 'journalArticle', 'book', 'report', 'webpage', 'conferencePaper'
extra_fieldsNoAny other valid Zotero field for this item type not covered above, e.g. {publicationTitle: 'Journal of X', volume: '12'}
abstract_noteNo
collection_keysNoCollection keys to file the new item under

TDQS

A3.9/5.0
Behavior1/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
note_htmlYesNote content as HTML, e.g. '<p>This paper argues...</p>'
parent_item_keyNoIf set, attach the note as a child of this item; omit to create a standalone note

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ItemA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_keyYes
permanentNofalse (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_versionYesThe item's current 'version', from zotero_get_item - required to confirm you are deleting the version you intended

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 CollectionA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
startNo
collection_keyYesThe collection's Zotero key
response_formatNoOutput format: 'markdown' for human-readable or 'json' for machine-readablemarkdown

TDQS

A4.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ItemA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
item_keyYesThe Zotero item key, e.g. 'ABCD1234'
response_formatNoOutput format: 'markdown' for human-readable or 'json' for machine-readablemarkdown

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ChildrenA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_keyYesThe parent item's Zotero key
response_formatNoOutput format: 'markdown' for human-readable or 'json' for machine-readablemarkdown

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CollectionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
response_formatNoOutput format: 'markdown' for human-readable or 'json' for machine-readablemarkdown
parent_collection_keyNoIf set, list sub-collections of this collection instead of top-level collections

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 TagsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
filterNoOnly return tags containing this substring

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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

Given the tool's simplicity, 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ItemsA
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoRestrict to items with this exact tag
limitNoMax results to return (1-100)
queryNoSearch text, matched against title, creators, and full text (Zotero 'quicksearch'). Omit to list items filtered only by item_type/tag/collection_key.
startNoOffset for pagination
item_typeNoRestrict to a Zotero item type, e.g. 'journalArticle', 'book', 'report'
collection_keyNoRestrict the search to a single collection, by its key
response_formatNoOutput format: 'markdown' for human-readable or 'json' for machine-readablemarkdown

TDQS

A4.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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

Although schema coverage is 100%, the description adds significant 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.

Purpose5/5

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.

Usage Guidelines5/5

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

Provides explicit when-to-use and when-not-to-use 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 ItemA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYesPartial 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_keyYesThe Zotero key of the item to update
current_versionYesThe item's current 'version', from zotero_get_item or zotero_search_items - required to prevent overwriting concurrent changes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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

Given the tool's complexity (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.

Parameters4/5

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

Although schema coverage is 100%, the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 12 tool updatesv1.0.0
    • First observedzotero_add_items_to_collection
    • First observedzotero_create_collection
    • First observedzotero_create_item
    • First observedzotero_create_note
    • First observedzotero_delete_item
    • First observedzotero_get_collection_items
    • First observedzotero_get_item
    • First observedzotero_get_item_children
    • First observedzotero_list_collections
    • First observedzotero_list_tags
    • First observedzotero_search_items
    • First observedzotero_update_item

TDQS

A4.3/5.0

Scored across 12 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivitySlowing
ResponsivenessNo issues

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

Related MCP Servers