Zotero MCP
The Zotero MCP server allows AI assistants like Claude to interact with your Zotero research library via the Model Context Protocol. With this server, you can:
Search: Find items using simple queries or advanced criteria, and access recently added items
Access Content: Retrieve detailed metadata, full text, attachments, notes, and annotations (including direct PDF extraction)
Manage Collections: List all collections and get items within specific collections
Work with Tags: View all tags and perform batch updates to tags across multiple items
Create Content: Add new notes to items
Flexible Setup: Configure with environment variables and command-line options for local or web API access
Connects to your Zotero research library, allowing you to search for papers, articles and books, retrieve metadata, access full-text content, and browse collections, tags, and recent additions.
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 MCPfind papers about climate change adaptation strategies"
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 MCP: Chat with your Research LibraryβLocal or Webβin Claude, ChatGPT, and more.
Zotero MCP seamlessly connects your Zotero research library with ChatGPT, Claude, and other AI assistants (e.g., Cherry Studio, Chorus, Cursor) via the Model Context Protocol. Review papers, get summaries, analyze citations, extract PDF annotations, and more!
β¨ Features
π§ AI-Powered Semantic Search
Vector-based similarity search over your entire research library (requires
[semantic]extra)Multiple embedding models: Default (free, local), OpenAI, Gemini, and Ollama
Intelligent results with similarity scores and contextual matching
Auto-updating database with configurable sync schedules
π Search Your Library
Find papers, articles, and books by title, author, or content
Perform complex searches with multiple criteria
Browse collections, tags, and recent additions
Semantic search for conceptual and topic-based discovery
π Access Your Content
Retrieve detailed metadata for any item (markdown or BibTeX export)
Get full text content (when available)
Look up items by BetterBibTeX citation key
π Work with Annotations
Extract and search PDF annotations with page numbers
Access Zotero's native annotations
Create and update notes and annotations
Extract PDF table of contents / outlines (requires
[pdf]extra)
βοΈ Write Operations
Add papers by DOI with auto-fetched metadata and open-access PDF cascade (Unpaywall, arXiv, Semantic Scholar, PMC)
Add papers by URL (arXiv, DOI links, generic webpages) or from local files
Create and manage collections, update item metadata, batch-update tags
Find and merge duplicate items with dry-run preview
Hybrid mode: local reads + web API writes for local-mode users
π Scite Citation Intelligence (optional [scite] extra)
Citation tallies: See how many papers support, contrast, or mention each item β the MCP version of the Scite Zotero Plugin
Retraction alerts: Scan your library for retracted or corrected papers
No Scite account required β uses public API endpoints
π Flexible Access Methods
Local mode for offline access (no API key needed)
Web API for cloud library access
Hybrid mode: read from local Zotero, write via web API
β¨οΈ Standalone CLI (zotero-cli)
Search, browse, and edit your library directly from the terminal β no AI assistant required
Ideal for scripting, automation, and quick lookups
--jsonon every command for pipelines and agents; short aliases (s,g,ann,coll) for interactive use
πͺΆ Agent skill β the same library for ~1% of the context
If your agent has shell access (Claude Code, Cursor, Codex, Windsurf, Gemini CLI, Amp, OpenCode β¦), one command teaches it to drive zotero-cli directly:
zotero-mcp install-skillIt detects the harnesses in your project and installs to each β no flags, no per-tool instructions to look up.
Why it matters: an MCP server sends every tool's schema on every request, before you type anything. The skill sits at 98 tokens until the agent decides it is relevant.
Route | In context | Paid |
MCP server, default profile (38 tools) | 13,448 | every request |
Agent skill, frontmatter only | 98 | always |
Agent skill, body loaded | 1,368 | when it fires |
~137x cheaper before either is used, ~10x once the skill has fired. Re-measure any time with python scripts/measure_context_cost.py. This is the fixed context cost only β it does not measure task success or round trips, and a cheaper surface that gets the answer wrong is not cheaper. Details below.
Both routes work, and they share one config. Use the MCP server when your client speaks MCP but has no shell (Claude Desktop, ChatGPT); use the skill when it has a shell.
Related MCP server: Zotero MCP Server
π Quick Install
New to the command line? Try the community-built Zotero MCP Setup β includes a macOS GUI installer (DMG), one-click install scripts for Mac/Windows, and a step-by-step guide. No Terminal experience needed.
Default Installation (core tools only)
The base install is lightweight β it includes search, metadata retrieval, annotations, and write operations. No ML/AI dependencies are pulled in.
Installing via uv (recommended)
uv tool install zotero-mcp-server
zotero-mcp setup # Auto-configure (Claude Desktop supported)Installing via pip
pip install zotero-mcp-server
zotero-mcp setup # Auto-configure (Claude Desktop supported)Installing via pipx
pipx install zotero-mcp-server
zotero-mcp setup # Auto-configure (Claude Desktop supported)Optional Extras
Heavy ML/PDF dependencies are separated into optional extras so the base install stays fast and small:
Extra | What it adds | Install command |
| Semantic search via ChromaDB, sentence-transformers, OpenAI/Gemini embeddings |
|
| PDF outline extraction (PyMuPDF) and EPUB annotation support |
|
| Scite citation intelligence β tallies and retraction alerts (no account needed) |
|
| Everything above |
|
For example, with uv:
uv tool install "zotero-mcp-server[all]" # Full install with all features
uv tool install "zotero-mcp-server[semantic]" # Just semantic searchIf you only need basic library access (search, read, annotate, write), the default install with no extras is all you need.
Updating Your Installation
Keep zotero-mcp up to date with the smart update command:
# Check for updates
zotero-mcp update --check-only
# Update to latest version (preserves all configurations)
zotero-mcp updateπ§ Semantic Search
Zotero MCP now includes powerful AI-powered semantic search capabilities that let you find research based on concepts and meaning, not just keywords.
Setup Semantic Search
During setup or separately, configure semantic search:
# Configure during initial setup (recommended)
zotero-mcp setup
# Or configure semantic search separately
zotero-mcp setup --semantic-config-onlyAvailable Embedding Models:
Default (all-MiniLM-L6-v2): Free, runs locally, good for most use cases
OpenAI: Better quality, requires API key (
text-embedding-3-smallortext-embedding-3-large)Gemini: Better quality, requires API key (
gemini-embedding-001)Ollama: Runs locally via Ollama API (requires model name, e.g., 'qwen3-embedding')
Using Ollama embeddings:
Install and start Ollama, then pull an embedding model before running zotero-mcp update-db:
ollama serve
# Small model: fast and lightweight
ollama pull nomic-embed-text
# Medium model: better multilingual retrieval quality
ollama pull bge-m3When prompted by zotero-mcp setup --semantic-config-only, choose Ollama and use either nomic-embed-text or bge-m3 as the model name. If you change embedding models later, rebuild the index:
zotero-mcp update-db --force-rebuildTwo semantic_search.embedding_config keys tune the Ollama path for slower
hardware or very large libraries:
"embedding_config": {
"model_name": "bge-m3",
"timeout": 600, // HTTP timeout per /api/embed call (default 120s)
"request_batch_size": 64 // documents per request (default 64)
}Raise timeout if indexing reports Read timed out; lower
request_batch_size to make each request cover less GPU work, which usually
fixes timeouts more reliably than raising the timeout alone.
When you choose OpenAI, setup also asks whether database updates should use OpenAI Batch API. Batch updates are cheaper for large libraries, but they are asynchronous: submit the batch, wait for completion, then import the embeddings.
Update Frequency Options:
Manual: Update only when you run
zotero-mcp update-dbAuto on startup: Update database every time the server starts
Daily: Update once per day automatically
Every N days: Set custom interval
Using Semantic Search
After setup, initialize your search database:
# Build the semantic search database (fast, metadata-only)
zotero-mcp update-db
# Submit OpenAI embeddings through Batch API for this update
zotero-mcp update-db --openai-batch
# Check and import completed OpenAI Batch API embeddings
zotero-mcp openai-batch-status
zotero-mcp openai-batch-import
# Force realtime OpenAI embeddings even if Batch API is enabled in config
zotero-mcp update-db --no-openai-batch
# Build with full-text extraction (slower, more comprehensive)
zotero-mcp update-db --fulltext
# Use your custom zotero.sqlite path
zotero-mcp update-db --fulltext --db-path "/Your_custom_path/zotero.sqlite"
# If you have embedding conflicts or changed models, force a rebuild
zotero-mcp update-db --force-rebuild
# Check database status
zotero-mcp db-statusExample Semantic Queries in your AI assistant:
"Find research similar to machine learning concepts in neuroscience"
"Papers that discuss climate change impacts on agriculture"
"Research related to quantum computing applications"
"Studies about social media influence on mental health"
"Find papers conceptually similar to this abstract: [paste abstract]"
The semantic search provides similarity scores and finds papers based on conceptual understanding, not just keyword matching.
Text Extraction Settings
PDFs are parsed with pdf-inspector, which produces Markdown with the document's heading structure intact. These keys live under semantic_search.extraction in ~/.config/zotero-mcp/config.json:
{
"semantic_search": {
"extraction": {
"pdf_max_pages": 50,
"fulltext_display_max_pages": 10,
"attachment_priority": ["markdown", "pdf", "html", "other"]
}
}
}Key | Default | What it does |
|
| Pages extracted per PDF when indexing. Raising it does not widen what search sees on its own β that is bounded by the embedding model's token limit or |
|
| Pages returned by |
|
| Order in which attachment kinds are tried when an item has several readable files. |
attachment_priority exists for the case where you have converted a paper to clean Markdown yourself and attached it next to the original PDF. By default the PDF still wins; listing "markdown" first makes your converted copy the one that gets read and indexed. Valid entries are pdf, html, markdown, text and other. other is a catch-all matching every kind not named elsewhere in the list, so the default sweeps Markdown and plain text into one bucket where the larger file wins. Omitting other means anything unlisted is never chosen.
Changing this setting marks affected items for re-extraction, so a following zotero-mcp update-db refreshes text that came from a now-deprioritized attachment rather than leaving stale embeddings behind.
To read one specific attachment regardless of priority, pass that attachment's own key to zotero_get_item_fulltext (find it with zotero_get_item_children) β an attachment key bypasses the priority order and reads exactly that file.
π₯οΈ Setup & Usage
Full documentation is available at Zotero MCP docs.
Requirements
Python 3.10+
Zotero 7+ (for local API with full-text access)
An MCP-compatible client (e.g., Claude Desktop, ChatGPT Developer Mode, Cherry Studio, Chorus)
For ChatGPT setup: see the Getting Started guide.
Configure Zotero
The Zotero local API must be enabled for the MCP server to work.
In Zotero 9, the local API toggle is under Settings β Advanced β 'Allow other applications on this computer to communicate with Zotero'.
Here is a screenshot:

For Claude Desktop / Claude Code (MCP client)
Configuration
After installation, either:
Auto-configure (recommended):
zotero-mcp setupManual configuration: For Claude Desktop, add this to
claude_desktop_config.json. For Claude Code, add this to~/.claude.json:{ "mcpServers": { "zotero": { "command": "zotero-mcp", "env": { "ZOTERO_LOCAL": "true", "ZOTERO_API_KEY": "YOUR_API_KEY", "ZOTERO_LIBRARY_ID": "YOUR_LIBRARY_ID" } } } }For local read-only use,
ZOTERO_LOCAL: "true"is all you need β drop theZOTERO_API_KEYandZOTERO_LIBRARY_IDlines entirely.The local API is fast but read-only, so the MCP server uses the Zotero web API for write operations.
To enable write mode:
Keep
ZOTERO_LOCAL: "true"β with API credentials set, the server runs in hybrid mode (fast local reads, web API writes)Click here to generate a Zotero API key and replace
YOUR_API_KEYwith itZOTERO_LIBRARY_IDis your numeric userID, shown on that same page (for a group library, use the group's ID and also setZOTERO_LIBRARY_TYPE: "group").
Important Note: Environmental variables set in the shell you run
claudein will override these values.Tip: If Claude Desktop reports it can't find the
zotero-mcpcommand, use the absolute path instead (runzotero-mcp setup-infoorwhich zotero-mcpto find it) β GUI apps don't always inherit your shellPATH.
Usage
Start Zotero desktop (make sure local API is enabled in preferences)
Launch Claude Desktop / Claude Code
For Claude Desktop, access the Zotero-MCP tool through Claude Desktop's tools interface. For Claude Code, run the
/mcpcommand, and make sure the Zotero MCP server is connected.
Example prompts:
"Search my library for papers on machine learning"
"Find recent articles I've added about climate change"
"Summarize the key findings from my paper on quantum computing"
"Extract all PDF annotations from my paper on neural networks"
"Search my notes and annotations for mentions of 'reinforcement learning'"
"Show me papers tagged '#Arm' excluding those with '#Crypt' in my library"
"Search for papers on operating system with tag '#Arm'"
"Export the BibTeX citation for papers on machine learning"
"Find papers conceptually similar to deep learning in computer vision" (semantic search)
"Research that relates to the intersection of AI and healthcare" (semantic search)
"Papers that discuss topics similar to this abstract: [paste text]" (semantic search)
For Autohand Code
After installing Zotero MCP, add a local read-only server with:
autohand mcp add zotero env ZOTERO_LOCAL=true zotero-mcpAdd --scope project after add to keep the server configuration in the current project. For hybrid or web API access, add the credentials described above to the env command. See Autohand Code for current installation and CLI details.
For Cherry Studio
Configuration
Go to Settings -> MCP Servers -> Edit MCP Configuration, and add the following:
{
"mcpServers": {
"zotero": {
"name": "zotero",
"type": "stdio",
"isActive": true,
"command": "zotero-mcp",
"args": [],
"env": {
"ZOTERO_LOCAL": "true"
}
}
}
}Then click "Save".
Cherry Studio also provides a visual configuration method for general settings and tools selection.
π§ Advanced Configuration
Using Web API Instead of Local API
For accessing your Zotero library via the web API (useful for remote setups):
zotero-mcp setup --no-local --api-key YOUR_API_KEY --library-id YOUR_LIBRARY_IDEnvironment Variables
Zotero Connection:
ZOTERO_LOCAL=true: Use the local Zotero API (default: false)ZOTERO_API_KEY: Your Zotero API key (for web API)ZOTERO_LIBRARY_ID: Your Zotero library ID (for web API)ZOTERO_LIBRARY_TYPE: The type of library (user or group, default: user)ZOTERO_WEBDAV_URL: Optional WebDAV folder URL for direct attachment downloads in remote modeZOTERO_WEBDAV_USERNAME: Optional WebDAV usernameZOTERO_WEBDAV_PASSWORD: Optional WebDAV password
Semantic Search:
ZOTERO_EMBEDDING_MODEL: Embedding model to use (default, openai, gemini, ollama)OPENAI_API_KEY: Your OpenAI API key (for OpenAI embeddings)OPENAI_EMBEDDING_MODEL: OpenAI model name (text-embedding-3-small, text-embedding-3-large)OPENAI_BASE_URL: Custom OpenAI endpoint URL (optional, for use with compatible APIs)OpenAI Batch API indexing is configured by
zotero-mcp setupand can be overridden withzotero-mcp update-db --openai-batchor--no-openai-batchGEMINI_API_KEY: Your Gemini API key (for Gemini embeddings)GEMINI_EMBEDDING_MODEL: Gemini model name (gemini-embedding-001)GEMINI_BASE_URL: Custom Gemini endpoint URL (optional, for use with compatible APIs)OLLAMA_EMBEDDING_MODEL: Ollama embedding model name (qwen3-embedding by default)OLLAMA_BASE_URL: Ollama server URL (default: http://localhost:11434)ZOTERO_DB_PATH: Customzotero.sqlitepath (optional). When unset, the database is located automatically: a data directory configured in Zotero's preferences (read from the profile'sprefs.js) is tried first, then the default~/Zoterolocation.
Search backend:
ZOTERO_SEARCH_BACKEND=sqlite: Routezotero_search_itemsandzotero_advanced_searchthrough direct SQL againstzotero.sqliteinstead of fetching over the API and filtering in Python (default:api). RequiresZOTERO_LOCAL=true, since it reads the database off disk. Substantially faster on large libraries β anadvanced_searchthat pages the whole library over the API drops from minutes to well under a second. Any query the backend doesn't cover falls back to the API path automatically, so the results are either the same or better, never worse.
Global search across libraries:
With the SQLite backend enabled, zotero_search_items, zotero_advanced_search
and zotero_semantic_search accept search_all_libraries=True (--all-libraries
on the CLI). One query then covers your personal library and every group library
at once, and each result is labelled with the library it came from:
**Library:** AI in entrepreneurship (groupID=6015547)This is deliberately gated on ZOTERO_SEARCH_BACKEND=sqlite. The Zotero API can
only search one library per request, so without direct SQL the best anyone could
do is replay a single-library search against each library in turn β a different
and far slower operation. Rather than emulate global search badly, the tools
refuse and say so.
Two limits follow from how Zotero stores things. Collections are per-library
(collections.libraryID is NOT NULL), so collection_key and collection
conditions cannot be combined with a global search. Tags are not β Zotero
keeps one database-wide tags table shared by every library β so tag filters and
tag conditions work globally and are the recommended way to slice a global
search.
Duplicates across libraries are returned as-is: the same paper filed in two libraries is two items, and collapsing them would hide where each copy lives.
Tool surface:
ZOTERO_MCP_TOOLSETS: Which optional tool groups to expose. Every tool the server registers is sent to the model on every request, so the tool list is a fixed cost on your context window. Groups that need an external service, serve maintenance rather than research, or apply only to some users are off by default. See Tool Groups below.
Item schema:
ZOTERO_MCP_SCHEMA_REFRESH=0: Disable the weekly background refresh of Zotero's item-type schema fromapi.zotero.org. The schema is what routes a generictitle=update to the field a type actually stores it under (a statute'snameOfAct, a case'scaseName). A copy ships with the package, so disabling the refresh only means new item types added by Zotero after this release won't be picked up until you upgrade.zotero-mcp schema-refreshstill refreshes on demand.ZOTERO_MCP_SCHEMA_CACHE: Custom path for the refreshed schema cache (default:~/.cache/zotero-mcp/schema.json).
Command-Line Options
# Run the server directly
zotero-mcp serve
# Specify transport method
zotero-mcp serve --transport stdio|streamable-http|sse
# Setup and configuration
zotero-mcp setup --help # Get help on setup options
zotero-mcp setup --semantic-config-only # Configure only semantic search
zotero-mcp setup-info # Show installation path and config info for MCP clients
# Updates and maintenance
zotero-mcp update # Update to latest version
zotero-mcp update --check-only # Check for updates without installing
zotero-mcp update --force # Force update even if up to date
# Semantic search database management
zotero-mcp update-db # Update semantic search database (fast, metadata-only)
zotero-mcp update-db --openai-batch # Submit OpenAI embeddings through Batch API
zotero-mcp update-db --no-openai-batch # Force realtime OpenAI embeddings for this run
zotero-mcp openai-batch-status # Check latest OpenAI embedding batch status
zotero-mcp openai-batch-import # Import completed OpenAI batch embeddings
zotero-mcp update-db --fulltext # Update with full-text extraction (comprehensive but slower)
zotero-mcp update-db --force-rebuild # Force complete database rebuild
zotero-mcp update-db --fulltext --force-rebuild # Rebuild with full-text extraction
zotero-mcp update-db --fulltext --db-path "your_path_to/zotero.sqlite" # Customize your zotero database path
zotero-mcp db-status # Show database status and info
# General
zotero-mcp version # Show current versionπ³ Docker Images (GHCR)
This repository publishes multi-arch container images to GitHub Container Registry:
ghcr.io/<owner>/zotero-mcp:<tag>-core- lightweight install (no optional extras)ghcr.io/<owner>/zotero-mcp:<tag>-all- full install with[semantic,pdf,scite]Unsuffixed tags (for example
:latest,:vX.Y.Z) point to theallflavor
Detailed publishing and runtime notes are in docs/docker-images.md.
Tag strategy:
Release tags:
vX.Y.Z,vX.Y,vX(plus-coreand-allvariants)Main branch:
latest(pluslatest-coreandlatest-all)Immutable SHA tags:
sha-<shortsha>-core,sha-<shortsha>-all(and unsuffixed SHA forall)
Runtime modes in the container
The image supports both MCP server and standalone CLI modes.
Server mode (default): runs
zotero-mcp serve --transport stdioCLI mode: set
ZOTERO_APP=cliand pass normalzotero-cliarguments
Docker env vars and persistence
Container runtime vars:
ZOTERO_APP(serverorcli) andZOTERO_TRANSPORT(default:stdio)All standard Zotero MCP vars are supported in containers (
ZOTERO_LOCAL,ZOTERO_API_KEY,ZOTERO_LIBRARY_ID, embedding provider keys, etc.)ChromaDB persistence path in the container is
/home/app/.config/zotero-mcp/chroma_db/Persist config + ChromaDB by mounting
/home/app/.config/zotero-mcp
Examples:
# Default MCP server mode (stdio)
docker run --rm ghcr.io/<owner>/zotero-mcp:latest
# MCP server mode with explicit transport
docker run --rm ghcr.io/<owner>/zotero-mcp:latest serve --transport streamable-http --host 0.0.0.0 --port 8000
# Standalone CLI mode
docker run --rm -e ZOTERO_APP=cli ghcr.io/<owner>/zotero-mcp:latest search "machine learning"
# Persist config + ChromaDB across runs
docker run --rm -v zotero-mcp-data:/home/app/.config/zotero-mcp --env-file .env ghcr.io/<owner>/zotero-mcp:latestβ¨οΈ CLI Mode (zotero-cli)
zotero-cli is a standalone terminal interface to your Zotero library. It uses the same tools as the MCP server but without needing an AI assistant β useful for quick lookups, shell scripts, and automation.
Use zotero-mcp when your AI client supports MCP (Claude Desktop, ChatGPT). Use zotero-cli for shell scripts, cron jobs, or agentic pipelines with shell access (e.g. Claude Code) β CLI commands cost far fewer tokens than MCP tool schemas and compose naturally with Unix pipes.
Both share the same configuration set up by zotero-mcp setup.
How much context each route costs
The MCP server sends every enabled tool's name, description and JSON parameter schema to the model on every request, before you type anything. The CLI route puts only a skill description in context until the model decides it is relevant. Measured on this repo with python scripts/measure_context_cost.py:
Route | Tokens in context | When it is paid |
MCP, default profile (38 tools) | 13,448 | every request |
MCP, | 11,761 | every request |
MCP, | 17,414 | every request |
CLI skill, frontmatter only | 98 | always |
CLI skill, body loaded | 1,368 | once the skill fires |
CLI skill + full command reference | 4,389 | worst case |
That is the fixed cost only. It does not measure task success, output size, or how many round trips each route takes to finish a job β a cheaper surface that gets the answer wrong is not cheaper. Numbers are cl100k_base tokens and are re-measured, not estimated; tests/test_context_cost_claim.py fails if the relationship stops holding.
πͺΆ Agent skill: one command for any harness
zotero-mcp install-skillRun it in your project. It detects which agent harnesses are set up there and installs to each one, in that harness's own format:
Harness | Detected by | Installs |
Claude Code (project) |
|
|
Claude Code (user) |
|
|
Cursor |
|
|
Windsurf |
|
|
Codex, Amp, OpenCode, Jules β¦ |
| a pointer block in |
Gemini CLI |
| a pointer block in |
zotero-mcp install-skill --list-targets # what is detected here
zotero-mcp install-skill --target cursor # install one explicitly
zotero-mcp install-skill --force # overwrite an existing copyIt will not overwrite your work. A destination that exists and differs is reported, not replaced, unless you pass --force. For shared instruction files it is stricter: only the text between the zotero-cli markers is ever managed, so the rest of your AGENTS.md is untouchable by construction β re-running updates that block in place rather than appending a second one.
It keeps the context advantage. Shared instruction files get a short pointer block, not the whole skill; the body lands beside it and the agent opens it only when it decides Zotero is relevant. Pasting 1,400 tokens into every agent's always-loaded context would spend exactly the advantage this exists for.
The skill teaches the find-keys-then-act loop, --json, how to pick among the six search modes, paging, reading a PDF by outline-then-page-range rather than whole, and when an empty result means "the index is not built" rather than "you have no papers on that".
Machine-readable output (--json)
Every command accepts --json, before or after the command name. Output is one object per invocation:
zotero-cli --json search "attention" --limit 5 --detail keys_only
# {"ok": true, "command": "search", "schema": 1, "data": {"count": 5, "items": [...]}}Success carries data; failure carries error.message and a stable error.code, also on stdout, so one stream carries both outcomes. Read commands (search, get, annotations list, notes list, config) return real structure; commands whose answer is a status line return {"text": ...}. Run zotero-cli --json-schema for the full contract.
# Item keys are the currency of every command β pipe them onward
zotero-cli --json search "diffusion models" --limit 5 --detail keys_only \
| jq -r '.data.items[].key' \
| while read -r key; do zotero-cli --json get metadata "$key"; doneQuick reference
# Search
zotero-cli search "machine learning" # keyword search
zotero-cli s "neural networks" --limit 5 # short alias, limit results
zotero-cli search --mode semantic "attention mechanisms"
zotero-cli search --mode tag "important,reviewed"
# Get item details
zotero-cli get metadata ABC123 # markdown metadata
zotero-cli g metadata ABC123 --format bibtex # BibTeX export
zotero-cli get fulltext ABC123 # full text
zotero-cli get children ABC123 # attachments and notes
# Edit item metadata
zotero-cli edit ABC123 --title "New Title"
zotero-cli edit ABC123 --add-tags "reviewed,important" --date "2024"
# Notes and annotations
zotero-cli notes list ABC123
zotero-cli notes create --item-key ABC123 --text "My note" --tags "idea"
zotero-cli notes create --item-key ABC123 --text - # read from stdin
zotero-cli ann list --item-key ABC123 # annotations (short alias)
zotero-cli ann list --item-key ABC123 --format json # structured export
zotero-cli ann search "highlight text"
# Add items
zotero-cli add doi 10.1038/s41586-021-03819-2
zotero-cli add url https://arxiv.org/abs/2301.00001
zotero-cli add file --filepath /path/to/paper.pdf --title "Override Title"
zotero-cli add isbn 9780262046305
zotero-cli add bibtex --file refs.bib # or --bibtex '@article{...}'
zotero-cli add bibtex --bibtex - < refs.bib # stdin via -
zotero-cli add csl-json --file refs.json # or --json '...' / --json -
# --collections accepts keys, names, or parent/child paths β resolved and
# validated before the item is created (a typo fails the add, with suggestions,
# instead of leaving an unfiled item)
zotero-cli add doi 10.1038/s41586-021-03819-2 --collections "Reading List"
zotero-cli collections manage --item-keys ABC123 --add-to "_project/topic"
# Adds are idempotent by default (--if-exists file): if the item is already in
# the library it is reused β filed into any missing collections, given any
# missing tags β instead of duplicated. Re-running the same command is a no-op.
zotero-cli add doi 10.1038/s41586-021-03819-2 -c "Reading List" # run it twice: converges
zotero-cli add doi 10.1038/s41586-021-03819-2 --if-exists skip # never touch existing
zotero-cli add doi 10.1038/s41586-021-03819-2 --if-exists duplicate # old behavior
zotero-cli add doi 10.1038/s41586-021-03819-2 -c "New Topic" --create-collections
# -c/--collection is repeatable and never comma-split (names with commas work);
# --collections remains the comma-separated form
# Collections and tags
zotero-cli coll list # list collections (short alias)
zotero-cli coll search "PhD Research"
zotero-cli tags list
# Semantic search database
zotero-cli db update
zotero-cli db update --fulltext --force-rebuild
zotero-cli db status
# Library and duplicates
zotero-cli library info
zotero-cli duplicates find
# Reading PDFs β find the section first, then read only those pages
zotero-cli outline ABC123
zotero-cli read ABC123 --start-page 42 --end-page 55
zotero-cli path ABC123 # where the file lives on disk
# Attachments, deletion, bibliographies
zotero-cli attach ABC123 --file /path/to/paper.pdf
zotero-cli delete item ABC123
zotero-cli export --item-keys ABC123,DEF456 --style apa
zotero-cli export --collection COLL01 --format bibtex
# Discovery and synthesis
zotero-cli related 10.1038/s41586-021-03819-2 --direction citations
zotero-cli coverage --collection COLL01
zotero-cli synthesize --tag "to-read" --format json
# Bulk edits across many items
zotero-cli batch --item-keys ABC123,DEF456 --add-tags screened
zotero-cli batch --query "machine learning" --add-tags survey --limit 100Paging: listings cap at --limit and the response names the next offset.
zotero-cli --json get collection-items QS7TQPPA --limit 100 --offset 100Verbose mode
Add -v anywhere to see progress messages (e.g., which API calls are made):
zotero-cli -v search "CRISPR"π PDF Annotation Extraction
Zotero MCP includes advanced PDF annotation extraction capabilities:
Direct PDF Processing: Extract annotations directly from PDF files, even if they're not yet indexed by Zotero
Enhanced Search: Search through PDF annotations and comments
Image Annotation Support: Extract image annotations from PDFs
Seamless Integration: Works alongside Zotero's native annotation system
For optimal annotation extraction, it is highly recommended to install the Better BibTeX plugin for Zotero. The annotation-related functions have been primarily tested with this plugin and provide enhanced functionality when it's available.
The first time you use PDF annotation features, the necessary tools will be automatically downloaded.
π Managing Related Items
Zotero MCP supports managing relationships between items in your library. This is useful for linking related papers, tracking versions, or connecting preprints to their published versions.
These tools are in the opt-in
relationsgroup. Enable them withZOTERO_MCP_TOOLSETS=relationsβ see Tool Groups.
View Related Items
zotero_get_item_related(item_key="ABCD1234")Add a Relation
Create a bidirectional link between two items:
zotero_add_item_relation(
item_key="ABCD1234",
related_item_key="EFGH5678",
relation_type="dc:relation" # Optional, defaults to "dc:relation"
)Remove a Relation
zotero_remove_item_relation(
item_key="ABCD1234",
related_item_key="EFGH5678",
remove_bidirectional=True # Also remove the reverse relation (default: true)
)Relation Types:
dc:relationβ General related items (default)owl:sameAsβ Items that are the same work (e.g., preprint and published version)
π§° Tool Groups
Every tool this server registers is sent to the model on every request, so the tool list is a fixed tax on your context window before you type anything. To keep that cost proportionate, optional capabilities are grouped into toolsets that you turn on when you need them.
Set ZOTERO_MCP_TOOLSETS to control which groups are exposed:
Value | Effect |
(unset) | Default profile β core tools plus |
| Everything (the pre-0.9 behaviour) |
| Core tools only β the smallest surface |
| Core plus the named groups |
| Everything except the named groups |
Values are case-insensitive and may be comma- or space-separated. An unknown group name is an error at startup rather than a silent no-op.
Group | Default | Contents |
| off | Scite citation tallies and retraction checks (calls scite.ai; pairs with the |
| off | Find and merge duplicate items β library maintenance |
| off |
|
| off | Zotero RSS feed subscriptions |
| off | Explicit item-to-item "related items" links |
| on | List and switch between personal/group libraries |
| on | Build and inspect the semantic search index |
| on | Page layout and PDF outline β pairs with area annotations |
| auto | The |
chatgpt-connector is scoped by transport: it turns on automatically when the
server is served over streamable-http or sse (how ChatGPT reaches it) and
stays off for stdio. Name it explicitly to override either way.
Anything not listed above is core and always available.
Note: a disabled tool is genuinely absent β not merely hidden β so the model cannot call it. If you rely on a capability, enable its group.
Example (Claude Desktop / Claude Code):
"env": {
"ZOTERO_LOCAL": "true",
"ZOTERO_MCP_TOOLSETS": "scite,duplicates"
}π Available Tools
Availability depends on your
ZOTERO_MCP_TOOLSETSsetting β see Tool Groups above.
π§ Semantic Search Tools
zotero_semantic_search: AI-powered similarity search with embedding modelszotero_update_search_database: Manually update the semantic search databasezotero_get_search_database_status: Check database status and configuration
π Search Tools
zotero_search_items: Search your library by keywordszotero_advanced_search: Perform complex searches with multiple criteriazotero_get_collections: List collectionszotero_get_collection_items: Get items in a collectionzotero_get_tags: List all tagszotero_get_recent: Get recently added itemszotero_search_by_tag: Search your library using custom tag filters
π Content Tools
zotero_get_item_metadata: Get detailed metadata (supportsformat="markdown",format="json"for complete raw Zotero metadata, andformat="bibtex")zotero_get_item_fulltext: Get full text contentzotero_get_item_children: Get attachments and notes for one item or many (pass an array of keys)
π Annotation & Notes Tools
zotero_get_annotations: Get annotations (including direct PDF extraction); useformat="json"for normalized records suitable for scripts and other MCP toolszotero_synthesize_annotations: Build a per-paper annotation/note digest; supportsformat="json"for structured grouped outputzotero_get_notes: Retrieve notes from your Zotero library; passqueryto search note and annotation text instead of listingzotero_create_annotation: Create a highlight (text=) or an area annotation (rect=[x, y, width, height])zotero_manage_note: Create, update, or delete a note viaaction="create"|"update"|"delete"(beta feature)zotero_get_page_layout: Detect figure/table regions on a PDF page (with captions and normalized coordinates) for accurate area annotation placement β its reportedbboxcan be passed straight tozotero_create_annotation(rect=...)
π Scite Citation Intelligence Tools
Opt-in group: enable with
ZOTERO_MCP_TOOLSETS=sciteβ see Tool Groups.
scite_enrich_item: Get Scite citation tallies and retraction alerts for a paperscite_enrich_search: Search your Zotero library with Scite-enriched results (tallies + alerts inline)scite_check_retractions: Scan items for retractions and editorial notices
π¦ Item & Collection Management Tools
zotero_add_by_doi: Add a paper by DOI with automatic metadata and open-access PDF attachmentzotero_add_by_url: Add a paper by URL (arXiv, DOI URLs, and general webpages)zotero_add_by_isbn: Add a book by ISBN (Open Library + Google Books cascade)zotero_add_by_bibtex: Add one or more items from BibTeX (inline or .bib file)zotero_add_by_csl_json: Add one or more items from CSL JSON (inline or file)zotero_add_from_file: Import a local PDF or EPUB file with automatic DOI extraction
All add tools take a collections parameter accepting collection keys, names, or parent/child paths β resolved and validated before the item is created, so unknown or ambiguous specs fail with suggestions instead of producing an unfiled item. They also take if_exists ("duplicate" β default β always creates; "file" reuses an existing item matching the DOI/arXiv ID/ISBN/URL, filing it into missing collections and adding missing tags; "skip" leaves a match untouched) and create_missing_collections (create unknown collection specs, including path chains, instead of failing). The zotero-cli add commands default to --if-exists file.
zotero_attach_file: Attach a local file or a PDF URL to an existing item by key (no new item created; returns the attachment key; idempotent per filename and content hash)zotero_set_item_parent: Set, change, or clear an item's parent (parent_key=nullmakes it top-level)zotero_create_collection: Create a new collection (folder/project) in your libraryzotero_search_collections: Search for collections by name to find their keyszotero_manage_collections: Add or remove items from collections (accepts keys, names, orparent/childpaths)zotero_update_item: Update metadata for an existing item (title, tags, abstract, date, etc.)zotero_find_duplicates: Find duplicate items by title and/or DOI, paged withlimit/offsetzotero_merge_duplicates: Merge duplicate items with dry-run preview; consolidates all child items.auto=Truemerges every high-confidence (same-DOI) group in one pass behind a two-call plan/confirm gatezotero_get_pdf_outline: Extract the table of contents / outline from a PDF attachmentzotero_search_by_citation_key: Look up items by BetterBibTeX citation key (with Extra field fallback)
π Related Items Tools
zotero_get_item_related: Get all related items for a specific Zotero itemzotero_add_item_relation: Add a related item relationship (creates bidirectional link)zotero_remove_item_relation: Remove a related item relationship
π§ͺ Testing
Unit Tests
uv run pytest tests/ # 1596 tests, ~7 secondsIntegration Test Plan
A 45-point live integration test plan is included at docs/integration-test-plan.md. It's designed to be given to Claude in Claude Desktop, which will execute each test against your real Zotero library. Tests cover all tools, PDF attachment cascade, attach_mode, BetterBibTeX lookups, and multi-step showcase prompts. See the file for full instructions.
π Troubleshooting
General Issues
No results found: Ensure Zotero is running and the local API is enabled. You need to toggle on
Allow other applications on this computer to communicate with Zoteroin Zotero preferences.Can't connect to library: Check your API key and library ID if using web API
Full text not available: Make sure you're using Zotero 7+ for local full-text access
Local library limitations: Some functionality (tagging, library modifications) may not work with local JS API. Consider using web library setup for full functionality. (See the docs for more info.)
Installation/search option switching issues: Database problems from changing install methods or search options can often be resolved with
zotero-mcp update-db --force-rebuild
Semantic Search Issues
"Missing required environment variables" when running update-db: Run
zotero-mcp setupto configure your environment, or the CLI will automatically load settings from your MCP client config (e.g., Claude Desktop)ChromaDB / stale embedding model errors: If you changed embedding models and see 404 errors (e.g.,
text-embedding-004 is not found), runzotero-mcp update-db --force-rebuildto recreate the collection with your current model. If that doesn't work, delete~/.config/zotero-mcp/chroma_db/and rebuild.Database update takes long: By default,
update-dbis fast (metadata-only). For comprehensive indexing with full-text, use--fulltextflag. Use--limitparameter for testing:zotero-mcp update-db --limit 100Semantic search returns no results: Ensure the database is initialized with
zotero-mcp update-dband check status withzotero-mcp db-statusLimited search quality: For better semantic search results, use
zotero-mcp update-db --fulltextto index full-text content (requires local Zotero setup)OpenAI/Gemini API errors: Verify your API keys are correctly set and have sufficient credits/quota
Update Issues
Update command fails: Check your internet connection and try
zotero-mcp update --forceConfiguration lost after update: The update process preserves configs automatically, but check
~/.config/zotero-mcp/for backup files
β Support
Zotero MCP is free and MIT-licensed.
If it saves you or your lab time, sponsoring helps cover the unglamorous parts: Windows and WSL2 edge cases, Zotero schema changes, group-library support, and the embedding/search infrastructure.
Labs and institutions: the $50 and $200 tiers are meant to be expensable, and include priority triage on the issues affecting your workflow.
π License
MIT
Available Tools
38 toolszotero_add_itemA
Add item(s) to Zotero from any source: DOI, URL, ISBN, BibTeX, CSL JSON, or a local file. Use for every 'add this to Zotero' request. source: the identifier, URL, citation text, or ABSOLUTE file path. DOI/URL/ISBN also take many at once (list or comma/newline-separated), each resolved independently. BibTeX/CSL JSON may be inline (many entries per call) or a path to .bib/.bibtex/.json/.csljson; documents are .pdf, .epub, .docx and similar. source_type: 'auto' (default) detects it, incl. comma/newline DOI lists; override for URL/ISBN batches. Routing: doi β CrossRef (best metadata β prefer a DOI when you have one); url β doi.org/arxiv.org get full metadata, anything else becomes a bare 'webpage' item that is often not citable, so resolve to a DOI first; isbn β Open Library then Google Books (noisy β verify after); bibtex/csl_json β one item per entry, citation key kept in Extra; file β extracts the PDF's DOI and enriches via CrossRef, else guesses from filename/text, then attaches the file. collections: keys, names, or '/'-paths ('_project/topic'), validated before anything is created β an unknown or ambiguous spec fails the call rather than leaving an unfiled item; create_missing_collections=True creates them instead. if_exists: 'duplicate' (default) always creates; 'file' is idempotent β reuses the item matching the DOI/ISBN/URL, adding missing collections/tags, never removing; 'skip' leaves a match untouched. attach_mode: 'auto' (default) attaches an OA PDF, 'linked_url' bookmarks it, 'none' skips, 'required' fails without one. title: file sources only, when extraction misses. Requires a writable library (fails in local-only mode). Run zotero_update_search_database afterwards for semantic search. Example: zotero_add_item(source='10.1145/3708319', collections=['9SU943GB'], if_exists='file').
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| title | No | ||
| source | Yes | ||
| if_exists | No | duplicate | |
| attach_mode | No | auto | |
| collections | No | ||
| source_type | No | auto | |
| create_missing_collections | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries the full disclosure burden and handles it exceptionally. It reveals idempotency semantics for if_exists='file' ('reuses the item... never removing'), hard failure behavior (unknown collection spec 'fails the call rather than leaving an unfiled item'), data-quality caveats (ISBN 'noisy β verify after'; non-doi.org/arxiv.org URLs 'become a bare webpage item that is often not citable'), and the writable-library requirement. These are precisely the behaviors an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but well-structured: purpose first, then per-parameter guidance in a consistent order, then routing rules, then a concrete example call. The length is justified by 8 parameters, six source types, and idempotency logic; every sentence adds operational value and none merely restates the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers every invocation-critical aspect: accepted input forms, per-source resolution behavior, multi-item handling, collection validation and failure mode, if_exists/attach_mode semantics, environment constraints, the post-call search-index step, and a worked example. Since an output schema exists, omitting return-value prose is appropriate and keeps the description complete without redundancy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must supply all parameter meaning, and it does comprehensively: source (multi-item lists, inline vs file path), source_type (all six enum values with routing behavior), collections (keys/names/'/'-paths and validation), if_exists (all three enum behaviors), attach_mode (all four values), create_missing_collections, and title. Only the tags parameter is left to the schema, a minor gap against 7 of 8 params richly explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Add item(s) to Zotero from any source' and enumerates the six accepted input types (DOI, URL, ISBN, BibTeX, CSL JSON, file). It explicitly claims the territory 'Use for every add this to Zotero request', which differentiates it from siblings like zotero_update_item, zotero_attach_file, and zotero_batch_update. The routing section further clarifies what the tool is versus what other tools handle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use the tool explicitly ('Use for every add this to Zotero request') and gives strong source-selection guidance ('prefer a DOI when you have one', 'resolve to a DOI first' for arbitrary URLs). It names a required follow-up sibling (zotero_update_search_database) and a hard runtime constraint (fails in local-only mode). It stops short of explicit exclusions with named alternative tools, but the context is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_advanced_searchA
Advanced item search with multiple structured-field conditions joined by AND or OR. Use this when you need to filter by fields that zotero_search_items and zotero_search_by_tag can't express (date ranges, specific itemTypes, etc.). For plain text use zotero_search_items; for tags use zotero_search_by_tag; for topic discovery use zotero_semantic_search. conditions: list of {field, operation, value} dicts (also accepts a JSON string). Common fields: title, creator, date, dateAdded, dateModified, tag, itemType, publicationTitle, abstractNote, collection. Supported operations (exhaustive): is, isNot, contains, doesNotContain, beginsWith, endsWith, isGreaterThan, isLessThan, isBefore, isAfter. For 'added in the last N days', use field='dateAdded' with operation='isAfter' and an ISO date value (e.g. '2026-03-22'). join_mode: 'all' (AND, default) or 'any' (OR). sort_by: dateAdded, dateModified, title, creator, etc. sort_direction: 'asc' (default) or 'desc'. limit: max results (default 50, max 500). include_subcollections: make a 'collection' condition match items anywhere in that collection's subtree, for the is/isNot operations (default False). search_all_libraries: search every accessible library at once, labelling each result with its library; needs ZOTERO_SEARCH_BACKEND=sqlite. 'tag' conditions work; 'collection' conditions and include_subcollections do not. Example: zotero_advanced_search(conditions=[{'field': 'itemType', 'operation': 'is', 'value': 'preprint'}, {'field': 'dateAdded', 'operation': 'isAfter', 'value': '2026-03-22'}], join_mode='all').
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| sort_by | No | Field to sort by (dateAdded, dateModified, title, creator, etc.) | |
| join_mode | No | Whether all conditions must match ("all") or any condition can match ("any") | all |
| conditions | Yes | List of search condition dictionaries, each containing: - field: The field to search (title, creator, date, tag, etc.) - operation: The operation to perform (is, isNot, contains, etc.) - value: The value to search for | |
| sort_direction | No | Direction to sort (asc or desc) | asc |
| search_all_libraries | No | Search every accessible library at once instead of the active one (#163). Requires the SQLite backend; each result is labelled with its source library. A `collection` condition is rejected in this mode β collection keys are per-library β while `tag` conditions work, since Zotero stores tags in one database-wide table shared by every library. | |
| include_subcollections | No | Make a `collection` condition match items filed anywhere in that collection's subtree rather than in it directly. Applies to the `is` and `isNot` operations, which are the membership questions; other operators keep comparing keys as before. Defaults to False, matching Zotero's own "Search subcollections" checkbox. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden β and it delivers: the search_all_libraries mode limitation ('tag' conditions work; 'collection' conditions and include_subcollections do not), the ZOTERO_SEARCH_BACKEND=sqlite prerequisite, defaults (join_mode 'all', sort_direction 'asc', limit 50/max 500), the dateAdded+isAfter workaround for 'last N days', and an exhaustive operation list with a worked example.
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?
Long, but information-dense: purpose and sibling routing are front-loaded, and the closing example earns its place. However, the parameter rundown is one long semicolon-packed passage that partially overlaps the schema descriptions, so it is not maximally crisp.
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 7-parameter tool with no annotations and an output schema present, the description covers purpose, sibling routing, every parameter's semantics, mode-specific caveats, defaults, hard limits, and a worked example β everything an agent needs to invoke it correctly. The only slight ambiguity ('collection' conditions and include_subcollections do not) is scoped by context to search_all_libraries mode.
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%, giving a baseline of 3, but the description adds substantial meaning beyond the schema: the exhaustive operation vocabulary (schema only says 'etc.'), the concrete common-field list (title, creator, date, dateAdded, tag, itemType, publicationTitle, abstractNote, collection), the limit max of 500 (schema only gives default 50), the include_subcollections is/isNot scope clarification, and a complete example call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Advanced item search') with an immediate differentiator: multiple structured-field conditions joined by AND/OR. It names the sibling tools it is not ('filter by fields that zotero_search_items and zotero_search_by_tag can't express (date ranges, specific itemTypes, etc.)') and enumerates common fields and operations, so an agent can identify it without opening a schema.
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 routes usage: 'Use this when you need to filter by fields that zotero_search_items and zotero_search_by_tag can't express', then names each alternative with its condition ('For plain text use zotero_search_items; for tags use zotero_search_by_tag; for topic discovery use zotero_semantic_search'). Also flags the SQLite backend prerequisite for search_all_libraries, which is critical when-to-use information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_attach_fileA
Attach a file to an EXISTING Zotero item as an imported child attachment (uploads the file bytes). Use when the item is already in the library and you have its key β e.g. attaching a PDF you found for a reference. To create a NEW item from a file, use zotero_add_from_file instead. item_key: key of the existing REGULAR item. Passing an attachment/note key fails with a hint to use its parent. file_path: ABSOLUTE local path (.pdf, .epub, .djvu, .doc, .docx, .odt, .rtf). url: direct http(s) link, downloaded server-side β PDF-only; for other formats download locally and use file_path. Exactly one of file_path/url must be given. filename: optional stored-filename override; defaults to the file's basename or the URL's last path segment (falling back to .pdf); a missing extension is appended automatically. Returns the created attachment's key. Idempotent: if the item already has an attachment with the same filename or identical content (MD5), nothing is re-uploaded. Requires a writable library (fails in local-only mode). Uploads count against the Zotero cloud storage quota unless WebDAV sync is configured. Run zotero_update_search_database afterwards to index the new file for semantic search. Example: zotero_attach_file(item_key='ABCD2345', file_path='/Users/me/smith-2020.pdf').
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| filename | No | ||
| item_key | Yes | ||
| file_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses idempotency, quota implications, writable library requirement, need for post-attachment database update, and file format restrictions. Also explains error handling for incorrect key types.
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 somewhat lengthy but every sentence adds value. It is front-loaded with the core purpose and well-organized into logical segments. Minor redundancy could be trimmed, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 parameters, no nested objects, output schema present), the description covers all necessary context: usage, constraints, return value, side effects, and dependency on zotero_update_search_database.
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?
With 0% schema description coverage, the description thoroughly explains all four parameters: item_key (existing item, not attachment), file_path (absolute path with supported extensions), url (HTTP link, PDF-only), and filename (optional override with fallback). It also clarifies mutual exclusivity of file_path and url.
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 attaches a file to an existing Zotero item, using the verb 'attach' and specifying the resource. It distinguishes from the sibling tool zotero_add_from_file by noting that sibling creates a new item from a file.
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 ('item already in library'), what-not-to-do (passing attachment/note key), and an alternative tool (zotero_add_from_file for new items). Also includes examples and constraints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_batch_updateA
Edit metadata across many items in one call: add/remove tags and upsert/remove Key: value lines in Extra (Better BibTeX keys, tex.* fields). Select items by item_keys, and/or a free-text query, and/or an existing tag (query and tag are ANDed; tag may be a list to OR); item_keys wins. At least one selector AND one action are required. add_tags/remove_tags keep the item's other tags β not a replace-all. set_keys upserts Extra lines, matching a line case-insensitively by its key: prefix and replacing it in place, else appending; remove_keys deletes those lines; lines without a colon are preserved. limit: max items for query/tag selection (default 50). Attachments and items needing no change are skipped and counted. Requires a writable library. Example: zotero_batch_update(tag='to-read', add_tags=['reviewed'], remove_tags=['to-read']).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| limit | No | ||
| query | No | ||
| add_tags | No | ||
| set_keys | No | ||
| item_keys | No | ||
| remove_keys | No | ||
| remove_tags | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden, and it delivers. It discloses that set_keys upserts case-insensitively by key prefix and replaces in place else appends; remove_keys deletes lines while preserving colon-less lines; attachments and unchanged items are skipped and counted; and it requires a writable library. This is rich behavioral context beyond what any schema could convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and packed with meaningful content in a compact form, with the most important action verbs front-loaded. It uses specific technical terms (upsert, ANDed, case-insensitive prefix matching) to communicate efficiently. It's slightly long but every clause earns its place; a minor deduction for a run-on structure that could benefit from splitting.
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 8 parameters at 0% schema coverage, no annotations, and no sibling differentiation needed beyond what's possible, this description is impressively complete. It covers selection logic, action semantics, edge behaviors (attachments, unchanged items), prerequisites (writable library), and provides a full worked example. The output schema exists, so return-value documentation is not needed from the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for all 8 parameters. It does compensate for most: item_keys, query, tag, add_tags, remove_tags, set_keys, remove_keys, and limit are each described with their semantics. However, the limit default of 50 is noted but not its impact on partial selection beyond 'max items for query/tag selection' β a minor gap since it could note what happens to unprocessed items.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific, high-value statement: 'Edit metadata across many items in one call: add/remove tags and upsert/remove `Key: value` lines in Extra'. It clearly distinguishes this batch mutation tool from siblings like zotero_update_item (single item) and zotero_search_items (read-only search), making it the definitive batch-edit tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains the selector logic ('Select items by item_keys, and/or a free-text query, and/or an existing tag; query and tag are ANDed; item_keys wins'), differentiates selectors from actions ('At least one selector AND one action are required'), and clarifies tag behavior ('add_tags/remove_tags keep the item's other tags β not a replace-all'). The inclusion of an example invocation cements when/how 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_create_annotationA
Create an annotation on a PDF attachment (EPUB: highlights only). Exactly one of two modes per call: text= HIGHLIGHTS selectable text; rect= draws an AREA box over a figure, table, or other non-text region (PDF only). Passing both or neither is an error. attachment_key: the PDF/EPUB attachment key, NOT the parent item key (zotero_get_item_children finds it). page: 1-indexed page (EPUB: 1-indexed chapter). text: exact text to highlight, matched against the text layer β scanned/image-only PDFs will not match. rect: [x, y, width, height] normalized to [0, 1], with (0, 0) at the page's top-left; width/height are page-relative and the box must fit the page. Call zotero_get_page_layout first and reuse a detected region's bbox instead of guessing coordinates. comment, color (hex, default '#ffd400'), tags: optional. Requires PyMuPDF (the [pdf] extra) and a writable library (web API key or hybrid mode). Examples: (attachment_key='NHZFE5A7', page=4, text='working memory'); (attachment_key='NHZFE5A7', page=7, rect=[0.15, 0.22, 0.6, 0.35], comment='Figure 3').
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| rect | No | ||
| tags | No | ||
| text | No | ||
| color | No | #ffd400 | |
| comment | No | ||
| attachment_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, but the description carries that burden well: it discloses scanned/image-only PDF matching failures, coordinate-system origin and normalization, PDF vs. EPUB behavior, 1-indexed page/chapter semantics, and the PyMuPDF/writable-library requirement. These behavioral facts add critical context not discoverable from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense yet well organized: purpose and mode rules first, then key conventions, prerequisites, requirements, and concrete examples. Every sentence carries operational information, with no filler or unnecessary repetition of schema data.
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 7-parameter tool with no annotations and 0% schema description coverage, this definition covers all essential usage knowledge: mode selection, error conditions, coordinate semantics, matching limitations, dependencies, and examples. Since an output schema exists, omitting return-value details is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates by explaining attachment_key vs. parent key, page indexing, exact text matching against the text layer, and rect as normalized [x, y, width, height] with origin and fit constraints. It also adds useful context for optional parameters like color default, comment, and tags.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create an annotation on a PDF attachment,' giving a specific verb and resource that clearly distinguishes it from update/delete/get annotation tools. It also differentiates the two modes (text highlight vs. rect area box) and the EPUB/PDF constraints, so an agent knows exactly what the tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when each mode applies, warns that passing both or neither text and rect is an error, and directs the agent to companion tools for prerequisites (zotero_get_item_children to find attachment_key, zotero_get_page_layout before choosing rect coordinates). This provides actionable when-to-use guidance beyond a generic summary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_create_collectionA
Create a new collection (project/folder) in your Zotero library. To create a subcollection, pass parent_collection (not parent_key) as either a collection key (8-character string like 'KMMQDFQ4') or a collection name. Use zotero_search_collections to find collection keys.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| parent_collection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It indicates creation (a mutable operation) but does not disclose potential side effects such as duplicate handling, permission requirements, or confirmation prompts. The lack of behavioral detail is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each serving a distinct purpose: first stating the tool's primary action, second providing subcollection guidance. No extraneous words; front-loaded with essential 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 simplicity (2 params, output schema exists), the description covers basic usage but omits important context such as error handling for duplicate names, expected output structure, or whether subcollection keys must exist. It is adequate but could be more comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies that 'parent_collection' can be a key or name, and that it is for subcollections. However, it does not explain that 'name' is required (though schema indicates), nor does it describe constraints on name length or uniqueness, leaving gaps.
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 (project/folder) in your Zotero library,' with a specific verb and resource. It also mentions subcollection creation, but does not explicitly differentiate from siblings like 'zotero_delete_collection' or 'zotero_manage_collections', though it does reference 'zotero_search_collections' for finding keys.
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?
Guidance is provided on when to use parent_collection for subcollections and how to find collection keys using zotero_search_collections. However, it does not specify when not to use this tool (e.g., for managing existing collections) or mention alternatives beyond searching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_delete_annotationA
Move a Zotero annotation to the Trash. Trashed annotations are recoverable from Zotero's Trash β empty the Trash in the Zotero UI for permanent deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| annotation_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, description discloses the key behavioral trait: soft delete to Trash with recovery option. Does not mention permissions or side effects on child items, but adequate for a simple deletion action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. Action verb first, then additional context. Efficient and 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 a single required parameter and no annotations, the description covers the operation's effect but omits parameter details. With an existing output schema (not shown), return values are not explained, leaving some gaps 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?
With 0% schema description coverage, the parameter 'annotation_key' is completely unexplained in both schema and description. The description does not clarify how to obtain or format this key, relying solely on the parameter name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb+resource: 'Move a Zotero annotation to the Trash.' Clearly states the action and distinguishes from delete/update operations by noting recovery. No ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context on recoverability and permanent deletion via Trash, giving clear guidance on the deletion lifecycle. However, does not explicitly state when to use this tool over alternatives like zotero_delete_note or permanent deletion methods.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_delete_collectionA
Delete a collection (folder) from your Zotero library by its 8-character key. Items inside the collection are NOT deleted β they remain in the library (and in any other collections they belong to). Subcollections ARE deleted along with the parent. This is a hard delete β Zotero's API does not trash collections, so the operation cannot be undone via the API. Use zotero_search_collections to find the key first. Example: zotero_delete_collection(collection_key="KMMQDFQ4").
| Name | Required | Description | Default |
|---|---|---|---|
| collection_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that items are not deleted, subcollections are deleted, and the operation is irreversible. Missing details like required permissions or API rate limits, but the key behavioral traits are covered.
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: purpose first, then key details (items, subcollections, irreversibility), followed by usage guidance and an example. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter), the description covers purpose, parameter, side effects, and usage hint. An output schema exists but is not referenced; however, the description adequately informs the agent of the tool's behavior and context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for parameter description, but the single parameter (collection_key) is fully explained: it is an 8-character key with an example provided. This adds significant meaning beyond the schema's bare type definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool deletes a collection by its 8-character key, distinguishes it from item deletion, and specifies effects on items and subcollections. It uses a specific verb (delete) and resource (collection), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to use zotero_search_collections to find the key first, providing a clear usage prerequisite. It does not explicitly mention when not to use this tool versus other delete tools (e.g., zotero_delete_item), but the context implies it is for collections only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_delete_itemA
Move a Zotero item to the Trash. Works for any item type (book, journalArticle, webpage, attachment, etc.). For notes, use zotero_delete_note β identical mechanism, constrained to notes for safety. Trashed items are recoverable from Zotero's Trash β empty the Trash in the Zotero UI for permanent deletion. By default refuses to trash notes; set allow_note=True to override.
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes | Zotero item key/ID to trash | |
| allow_note | No | If True, permits trashing note items. Default False directs callers to zotero_delete_note for notes (which has the same mechanism but is explicit about what it affects). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that trashed items are recoverable and that empty trash is needed for permanent deletion. Though no annotations are provided, the description covers the non-destructive nature (recoverable) and the default refusal for notes. Could mention permissions but overall sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise with 4 sentences that front-load the purpose and scope. Minor redundancy ('Works for any item type') but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema exists (mentioned in context), the description covers key aspects: what it does, scope, sibling alternative, and recovery. Lacks mention of library/collection scope, but adequate for a simple delete tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage, so baseline 3. The description adds meaning by explaining the allow_note parameter's purpose and default behavior, and implies that item_key is the identifier. Adds value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool moves a Zotero item to the Trash, works for any item type, and explicitly distinguishes from the sibling zotero_delete_note tool. The verb 'Move' and resource 'Zotero item' are specific.
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 guidance: use this tool for any item type, for notes use zotero_delete_note, and allows overriding the note restriction via allow_note parameter. Also explains the recovery mechanism.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_export_bibliographyA
Render a formatted bibliography or in-text citations for a set of Zotero items using Zotero's own CSL citation engine, so you can drop references straight into a manuscript. item_keys: optional list of 8-character item keys (also accepts a JSON list string); takes precedence over collection_key. collection_key: optional collection to export instead; if neither is given, the active library is exported (capped). style: CSL style short name (default 'apa'); e.g. 'modern-language-association', 'chicago-note-bibliography', 'ieee'. Ignored for bibtex. export_format: 'bib' (formatted reference-list entries, default), 'citation' (in-text citation strings), or 'bibtex' (raw BibTeX for .bib files). Output: markdown naming the style/format, then the rendered entries (a fenced block for bibtex, a numbered list otherwise). Rendering uses Zotero's own CSL engine and works in local mode with no API credentials, as well as over the web API. Capped at 100 items per call; scope with item_keys or collection_key for anything larger. Example: zotero_export_bibliography(item_keys=['RTKZQI8E'], style='apa', export_format='bib').
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | CSL style short name (default "apa"). | apa |
| item_keys | No | Optional list of item keys (or JSON/comma string). | |
| export_format | No | "bib", "citation", or "bibtex". | bib |
| collection_key | No | Optional collection to export. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the 100-item cap, precedence behavior, output structure (markdown naming style/format plus fenced vs numbered blocks), and the fact that rendering uses Zotero's own CSL engine and works without API credentials. It also notes the active library is exported when neither key is given. The only gap is that it doesn't detail off-by-one/cap-trimming behavior or what happens with invalid/malformed item keys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but every sentence earns its place, covering purpose, all four parameters with defaults and interactions, output format, mode support, caps, and an example. It's moderately long, yet tightly packed with non-redundant instructions; a slightly more compact organization (e.g., separating usage rules from output details) could improve scannability but it is not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists (which relieves the description of explaining return types), the description nonetheless details output structure (fenced block for bibtex, numbered list otherwise), engine usage, mode support, cap, and scoping behavior. It is comprehensive for a 4-parameter, 0-required tool with rich enums. Minor gaps like error handling for invalid keys and precise cap-trim behavior leave small room for improvement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does add value by clarifying that item_keys 'takes precedence over collection_key', that style is 'Ignored for bibtex', naming example CSL styles, and explaining the enum values ('bib' formatted reference-list entries vs 'citation' in-text strings vs 'bibtex' raw BibTeX). However, these largely re-elaborate what the schema's descriptions already convey, so the added semantic margin is modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Render a formatted bibliography or in-text citations for a set of Zotero items using Zotero's own CSL citation engine'. It clearly distinguishes this export/rendering tool from the many retrieval and management siblings (e.g., search, metadata, annotations), and immediately communicates the output artifacts (bibliography, citations, BibTeX) for manuscript use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains precedence among the three input scoping options ('item_keys takes precedence over collection_key; if neither is given, the active library is exported'), covers format selection with defaults and exceptions ('Ignored for bibtex'), mentions the 100-item cap with a scoping recommendation, and states it works both in local mode and over the web API. It also provides a concrete example, making when/how to invoke very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_annotationsA
Get annotations (highlights and attached notes on PDF/EPUB attachments) for a specific item or across the active Zotero library. item_key: pass the parent item key OR an attachment key β both work; attachment-to-parent resolution is automatic. ALWAYS pass item_key when you know which item you want; calling without it returns every annotation in the library (potentially thousands). use_pdf_extraction=True falls back to direct PDF parsing when the Zotero API has no stored annotation record β useful for annotations made outside Zotero desktop. limit: cap on annotations returned; None (default) returns all. format='markdown' (default) returns a readable list; format='json' returns normalized records with stable keys for downstream scripts and other MCP tools. Uses Better BibTeX when Zotero desktop is running locally, otherwise the Zotero web API. Example: zotero_get_annotations(item_key='ABC12345') β every highlight/note on that paper.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of annotations to return | |
| format | No | ``markdown`` for human-readable output or ``json`` for normalized structured records. | markdown |
| item_key | No | Optional Zotero item key/ID to filter annotations by parent item | |
| use_pdf_extraction | No | Whether to attempt direct PDF extraction as a fallback |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description fully discloses key behaviors: the risk of returning thousands of records without item_key, the PDF extraction fallback, output format differences, backend selection (local Better BibTeX vs web API), and an example. This adds valuable transparency beyond the basic schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat lengthy but well-organized: it opens with the core purpose, then explains each parameter, adds a backend note, and ends with an example. No sentence is wasted, though it could be tightened without losing 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?
Given the tool has an output schema (per context signals), the description does not need to explain return structures. It sufficiently covers parameter behavior, fallback scenarios, and usage best practices, making it complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema covers all parameters, the description significantly enriches them: item_key accepts both parent and attachment keys, use_pdf_extraction is explained as a fallback for annotations not stored in the API, limit is caps the result, and format distinguishes human-readable vs normalized JSON. This goes well beyond the bare schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves annotations (highlights and attached notes) for a specific item or the active library. It uses a specific verb ('Get'), names the resource ('annotations'), and its scope distinguishes it from siblings like zotero_get_notes or zotero_synthesize_annotations.
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 usage guidance by emphasizing that item_key should always be passed when possible to avoid retrieving all annotations, and it explains when to use use_pdf_extraction. However, it does not explicitly mention alternative tools or situations where they should be preferred, though the usage context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_attachment_pathA
Return the local filesystem path(s) of a Zotero item's attachments. Local mode only. Useful when you want to read a large PDF directly (e.g., a book) instead of going through zotero_get_item_fulltext, which is page-limited.
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It adds context about local mode and file paths but does not mention what happens if the item has no attachments, multiple attachments, or errors. The description is adequate but not thorough.
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 consists of two efficient sentences, front-loading the main action and providing a usage hint. Every sentence adds value without unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter), the presence of an output schema, and clear differentiation from siblings, the description covers the essential context. It could be more complete by mentioning prerequisites or edge cases, but it is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate. While it implies that item_key identifies the Zotero item, it does not explicitly define the parameter format or required constraints beyond the schema. The parameter is simple and obvious from context, warranting a baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns local filesystem paths of Zotero item attachments. It specifies 'Local mode only' and contrasts with the sibling tool zotero_get_item_fulltext, which is page-limited, making the purpose precise and differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use this tool (for large PDFs to avoid page limits) and mentions the 'Local mode only' prerequisite. However, it does not explicitly state when not to use it or list other alternatives beyond the one mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_collection_itemsA
Get all items in a specific Zotero collection. Supports detail='keys_only' (minimal), 'summary' (default, no abstracts), or 'full' (with abstracts). Includes PDF/notes indicators. include_subcollections=True also returns items filed in collections nested beneath this one (default False, matching Zotero's own 'Search subcollections' checkbox). For a collection larger than limit, page through it with offset (the response names the next offset to pass). TIP: To find papers on a specific topic, use zotero_semantic_search instead β it's faster and returns only relevant results.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of items to return | |
| detail | No | summary | |
| offset | No | Index of the first item to return, for paging through a collection larger than `limit`. | |
| collection_key | Yes | The collection key/ID | |
| include_subcollections | No | Also return items in collections nested beneath this one. Defaults to False, matching Zotero's own "Search subcollections" checkbox and this tool's previous behaviour. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers: it explains what each detail level returns and omits ('summary' has no abstracts, 'full' has abstracts), states that PDF/notes indicators are included, and discloses key behaviors β subcollection traversal is off by default and pagination is driven by an offset that the response explicitly names. This gives an agent a reliable model of cost and output shape before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly 110 words, front-loaded with the core purpose before layering in detail modes, behavioral flags, pagination, and a routing tip. Every sentence carries distinct information, though the phrase 'and this tool's previous behaviour' adds minor 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?
An output schema exists, so return-value documentation is covered elsewhere. The description covers the meaningful behavioral surface for a 5-parameter tool: mode semantics, subcollection behavior, pagination protocol, and an alternative-tool pointer. The only thin spot is the slightly ambiguous 'Includes PDF/notes indicators' (unclear whether keys_only omits them), which is a minor gap given the rich output schema.
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 high (80%) so the baseline is 3, but the description adds genuine value beyond the schema: it decodes the detail enum values ('keys_only' minimal, summary without abstracts, full with abstracts), explains include_subcollections' default and its equivalence to Zotero's checkbox, and reveals that the response names the next offset β a protocol detail the schema only hints at via 'Index of the first item.'
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?
Opens with a specific verb+resource ('Get all items in a specific Zotero collection') that is immediately distinguishable from siblings like zotero_get_collections (lists collections) and zotero_get_item_metadata (single item). The detail-mode breakdown further clarifies the tool's scope, and explicitly naming zotero_semantic_search as a faster alternative reinforces what this tool is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit routing rule: for topic-focused paper finding, use zotero_semantic_search instead because it is faster and returns only relevant results. Also gives contextual guidance on paging through large collections and on include_subcollections matching Zotero's own 'Search subcollections' checkbox. The when-to-use for this tool itself β needing all items in a collection β is clearly implied by the opening sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_collectionsA
List all collections in the currently active Zotero library as a hierarchical tree (parents and nested subcollections, each with its 8-character key). Use this when the user wants to see the full library structure. If you already know a name and just need the key, prefer zotero_search_collections β it returns only matches. Scope is limited to the active library β switch libraries with zotero_switch_library before listing. Deep hierarchies render inline without truncation, so very deep trees can be long. limit: cap on collections returned; pass None (default) to use 100, or raise to 5000 for libraries with thousands of collections. include_trashed: when True, also show collections in the Zotero Trash (annotated as such). Default False, matching Zotero desktop's default view. Example output:
Orals (Key: MT53KB66)
Early America (Key: 3249BZKE)
I. Historiography & Methodology (Key: XFN79DUT)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of collections to return | |
| include_trashed | No | if True, merge collections currently in Zotero's Trash into the listing, annotated with ``[trashed]``. Default False matches the Zotero desktop default and the prior behavior of this tool. Trashed collections are normally invisible to automated clients (#233) β turn this on when you need to know they exist. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully covers behavior: returns hierarchical tree with keys, inline rendering without truncation, limit default and maximum, include_trashed effect with annotation, and scope to active library.
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 and front-loaded with purpose, usage guidance, parameter details, and example. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 params, existing output schema, and many sibling tools, the description fully covers purpose, usage, parameter behavior, and output format with an example.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but description adds significant meaning: explains limit default and max, describes trashed annotation behavior, and gives context for both parameters beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists collections as a hierarchical tree with keys, and distinguishes it from zotero_search_collections by specifying when to use each.
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 this tool (full library structure) and when to prefer the sibling zotero_search_collections (known name, need key). Also notes scope limitation and need to switch libraries first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_item_childrenA
List the child items (attachments, notes, annotations under an attachment) of one OR MANY parent Zotero items. Use it to find an item's PDF/EPUB attachment key before zotero_create_annotation or zotero_get_pdf_outline β those take an attachment key, NOT the parent item key. item_key: one 8-character parent key, or an ARRAY of keys (a JSON-encoded list string also works). Pass every key you have in ONE call: a batch is one API round trip instead of N, and a bad key is reported in its own section instead of aborting. Returns markdown β one key: attachments (content type, filename) and notes in full under the parent title; several keys: one compact line per child, grouped under each parent. Scope: active library only. Examples: zotero_get_item_children(item_key='RTKZQI8E'); zotero_get_item_children(item_key=['RTKZQI8E', '9UZR8GXT']).
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes | One item key, a list of keys, or a JSON/comma-separated string of keys |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral disclosure burden. It discloses return format (markdown), output shape for one vs. several keys, scope (active library only), and error-handling behavior (bad key reported separately vs aborting). It doesn't disclose rate limits or auth, but for a read-only list tool this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but information-packed; every sentence adds value covering purpose, alternatives, batching rationale, output format, scope, and examples. It's slightly long but not padded β each clause serves a distinct purpose. The examples are useful and illustrative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value documentation isn't required from the description. The tool has moderate complexity (single parameter, multiple accepted formats, batch mode), and the description covers purpose, use cases, alternatives, output shapes, error behavior, scope, and examples exhaustively. Nothing material is left undocumented.
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% for the item_key parameter, establishing a baseline of 3. The description adds substantial value beyond the schema: it details the accepted formats (single key, array, JSON-encoded string), explains why batching matters (one round trip), defines what an 8-character key is, and provides two concrete usage examples. This exceeds the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description has a specific verb+resource ('List the child items of parent Zotero items') and goes well beyond a generic statement by enumerating what child items include (attachments, notes, annotations under an attachment). It clearly distinguishes itself from sibling tools by explaining the output form (markdown, attachments/notes) and the scope (active library).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it ('to find an item's PDF/EPUB attachment key before zotero_create_annotation or zotero_get_pdf_outline'), names specific alternative tools that consume its output, and emphasizes batch usage ('Pass every key you have in ONE call'), explaining efficiency benefits over N round trips. It also notes error handling behavior for bad keys.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_item_fulltextA
Return the full extracted text of a Zotero item's primary attachment (PDF or EPUB). WARNING: returns the entire paper (often 10K+ tokens). Use ONLY when the user explicitly wants to READ the paper β not for searching or browsing. For topic search use zotero_semantic_search; for metadata only use zotero_get_item_metadata. Avoid calling this on multiple papers in one conversation unless the user specifically asked to read several. item_key: 8-character Zotero item key. Normally the parent item β the tool locates the attached PDF/EPUB itself, preferring PDF unless attachment_priority says otherwise. Passing an attachment's own key instead reads exactly that file and skips the priority order, which is how you read one specific attachment of an item that has several (find keys via zotero_get_item_children). Scope: active library only. Extraction path (in order): local Zotero storage via SQLite when running in local mode (fastest, respects pdf_max_pages config); Zotero's server-side fulltext index; direct download and parsing as a last resort. Image-only scanned PDFs without OCR may return little or no text. Example: zotero_get_item_fulltext(item_key='RTKZQI8E').
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes | Zotero item key/ID. Normally the parent item, whose best attachment is chosen by ``attachment_priority``. Passing an *attachment's* own key is also supported and reads exactly that file, bypassing the priority order β pair it with ``zotero_get_item_children`` to read one specific attachment of an item that has several (#378). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It thoroughly discloses: the large token output (10K+ tokens), the extraction path fallback chain (SQLite β server fulltext index β direct download), the attachment_priority behavior, scope (active library only), and the limitation that image-only scanned PDFs without OCR may return little text. This is comprehensive behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the most critical info (purpose + token warning). The structure flows logically: purpose, warning, alternatives, parameters, scope, extraction path, caveat, example. Slightly long but every sentence earns its place given the complexity of this tool (attachment resolution, fallback paths).
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 complex tool with no annotations but an output schema, the description covers all critical operational aspects: token size, when to use, alternative tools, attachment resolution logic, extraction fallback chain, OCR limitation, and an example. The output schema handles return-value documentation. This 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?
Schema coverage is 100% and the schema description is already rich (explains parent vs attachment key, attachment priority, pairing with get_item_children). The description adds some value by restating the attachment-priority preference and providing an example, but largely echoes the schema's parameter documentation. Baseline 3 is appropriate since schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Return the full extracted text of a Zotero item's primary attachment (PDF or EPUB).' It clearly distinguishes this from siblings like zotero_semantic_search and zotero_get_item_metadata, and even warns this is for READING, not searching or browsing. Purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Excellent usage guidance: explicitly says use ONLY when user wants to READ the paper, explicitly excludes searching/browsing, names alternative tools (zotero_semantic_search, zotero_get_item_metadata) and explicitly warns against calling on multiple papers unless requested. This is exemplary usage guidance with clear when/when-not and named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_item_metadataA
Fetch detailed metadata (title, creators, date, DOI, publisher, tags, abstract, URL, etc.) for ONE Zotero item by key. If the metadata and abstract don't contain what you need, call zotero_get_item_fulltext to read the paper β but that is resource-intensive (10K+ tokens) and should NEVER be used for searching; use zotero_search_items or zotero_semantic_search instead. item_key: the 8-character Zotero item key (NOT a DOI or title). include_abstract=True (default) includes the abstractNote in markdown output; pass False to trim tokens when you don't need it. (Ignored in bibtex/json formats.) format='markdown' (default) returns a human-readable block; format='json' returns the complete raw Zotero item record; format='bibtex' returns a BibTeX citation string suitable for .bib files. Scope: active library only (switch with zotero_switch_library). Unlike list endpoints, this returns items EVEN IF THEY ARE IN THE TRASH β a Status: In Trash line is surfaced when the item is trashed (recoverable via the Zotero UI). Collection membership is shown as keys rather than a bare count so the caller can verify entries against zotero_search_collections (the Zotero API does not cascade collection-delete to items, so dangling references can linger). Example: zotero_get_item_metadata(item_key='RTKZQI8E', format='bibtex').
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format - 'markdown' for a readable summary, 'json' for the complete raw Zotero item, or 'bibtex' for BibTeX citation | markdown |
| item_key | Yes | Zotero item key/ID | |
| include_abstract | No | Whether to include the abstract in the output (markdown format only) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully carries the burden. It discloses that trashed items are returned (with status line), collection membership shown as keys, behavior of include_abstract ignored in bibtex/json, and format options. Example clarifies usage.
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?
Description is fairly long but every sentence adds value. Well-organized with purpose upfront, usage guidelines, parameter details, and an example. Slightly verbose but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 parameters, output schema present, and many sibling tools, description covers all necessary aspects: purpose, parameter details, behavioral traits, usage guidelines, output format explanation, and an example. Complete.
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. Description adds meaning: item_key format (8-char, not DOI/title), include_abstract default and ignoring in bibtex/json, format output descriptions. Adds value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Fetch' and resource 'detailed metadata for ONE Zotero item by key'. It distinguishes from siblings by explicitly mentioning alternative tools like zotero_get_item_fulltext and 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?
Provides explicit guidance: when to use this tool (metadata needed), when not to (use zotero_get_item_fulltext for full text, but never for searching), and alternatives (zotero_search_items, zotero_semantic_search). Also mentions scope is active library only, with a note on switching libraries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_notesA
Read notes from the active Zotero library. Omit query to LIST notes: with item_key, that item's child notes; without it, notes library-wide (capped by limit). Pass query to SEARCH note and annotation text instead β case-insensitive substring over the stripped-text body, library-wide, so query and item_key cannot be combined. limit: max results (default 20). truncate=True (default) shortens long bodies for display; pass False for complete content (list mode only). raw_html=True returns a note's original HTML instead of stripped text β use it when you intend to edit and round-trip via zotero_manage_note(action='update'). Scope: active library only (zotero_switch_library to change). Example: zotero_get_notes(item_key='ABC12345', raw_html=True); zotero_get_notes(query='mindfulness').
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| item_key | No | ||
| raw_html | No | ||
| truncate | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It discloses the read-only nature implicitly, explains the library-wide scope, documents the truncation default and its effect, cautions that query searches the stripped-text body, and covers raw_html behavior. While it doesn't explicitly state permission needs, the operational behaviors (truncation, html vs stripped, scope) are well covered for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and efficient, front-loading the core purpose in the first sentence, then proceeding mode-by-mode with clear conditional logic. Two concrete examples at the end reinforce usage. Every sentence earns its place β no filler or repetition despite covering 5 parameters and two operation modes.
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 5 parameters, dual operation modes, no annotations, and a complex sibling landscape, the description is remarkably complete. It covers list vs search mode, parameter interactions, default behaviors, scope constraints, and round-trip editing workflow. An output schema exists, so return-value documentation isn't required. Minor gap: it could explicitly note what happens when both query and item_key are passed rather than just stating they can't be combined.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for all 5 parameters, and it does: item_key (child notes scope), query (case-insensitive substring over stripped text), limit (default 20), truncate (default True, list-mode-only caveat), raw_html (original HTML for edit round-trip). Each parameter's behavior is explained beyond type/schema. Slight deduction because not every parameter interaction (e.g., raw_html with query) is fully spelled out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Read notes from the active Zotero library') and clearly distinguishes two modes: listing (with/without item_key) and searching (with query), which differentiates it from siblings like zotero_get_annotations (annotations) and zotero_get_item_metadata (metadata). The 'Omit query to LIST... Pass query to SEARCH...' structure makes the dual behavior explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance for each mode ('Omit query to LIST notes' vs 'Pass query to SEARCH'), states constraints (query and item_key cannot be combined), and references the scope ('active library only') with an alternative (zotero_switch_library to change). It also mentions raw_html for round-tripping via zotero_manage_note, tying it to a sibling workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_page_layoutA
Detect candidate figure/table regions on a PDF page and return their normalized bounding boxes, so area annotations can be placed on detected content instead of guessed positions. ALWAYS call this before zotero_create_annotation's area mode unless exact coordinates are already known. Returns each region's bounding box (x, y, width, height in [0, 1]), source (image/drawing/table/merged), associated caption (e.g. 'Figure 3: ...'), confidence level, and a ready-to-paste zotero_create_annotation call. Note: detection is geometric β boxes cover the graphical core of a figure/table; text labels inside figures or unruled table headers may fall outside the box. Confidence reflects caption matching, not box completeness. attachment_key: PDF attachment key β NOT the parent item key (use zotero_get_item_children to find attachments). page: 1-indexed page number (page 1 is the first page). Scope: PDFs only β EPUB attachments are NOT supported. Read-only: works in both local and web API modes. Example: zotero_get_page_layout(attachment_key='NHZFE5A7', page=7).
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | 1-indexed PDF page number | |
| attachment_key | Yes | PDF attachment key (e.g., "NHZFE5A7") |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations being provided, the description thoroughly discloses behavior: it's read-only, works in local and web API modes, detection is geometric (boxes cover graphical cores), and confidence reflects caption matching rather than box completeness. It also flags the limitation that text labels inside figures or unruled headers may fall outside boxes. This fully compensates for the absence of 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?
Well-structured with clear sections covering output, usage rule, caveats, parameters, scope, mode support, and a concrete example. Somewhat longer than the minimum, but every sentence adds information about limitations, scope, or usage that isn't obvious from the schema. The example call is valuable for grounding.
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 moderate complexity (geometric detection with nuanced caveats about caption matching and box coverage), the description is remarkably complete. It covers the output schema components, usage ordering, scope limitations, read-only guarantee, and a runnable exampleβall without needing to restate the output schema fields since an output schema exists.
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% since both parameters (attachment_key and page) are documented in the schema. The description adds useful context about what attachment_key must NOT be (parent item key) and clarifies page is 1-indexed with page 1 as first page, which adds small value beyond the schema's terse descriptions. Baseline 3 is appropriate since schema carries most of the burden.
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 (detect), resource (figure/table regions on a PDF page), and specific output (normalized bounding boxes). It explicitly distinguishes from sibling tools by framing it as a precursor to zotero_create_annotation's area mode, making its unique role in the toolset obvious.
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 ALWAYS call before zotero_create_annotation's area mode unless exact coordinates are known, names the sibling alternative (zotero_create_annotation), and clarifies scope exclusions (EPUB not supported). It also differentiates attachment_key from parent item key, clearing up a common usage pitfall.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_pdf_outlineA
Extract the table of contents (outline/bookmarks) from a PDF attachment, returned as a hierarchical markdown list with each entry's page number. Use this to orient in a paper before calling zotero_get_item_fulltext β the outline is typically < 200 tokens versus 10K+ for the full text. If the PDF has no embedded outline, returns a short 'no outline' message rather than failing. item_key: the PDF ATTACHMENT key OR the parent item key β both are accepted; attachment-to-parent resolution is automatic. Find the right key with zotero_get_item_children if unsure. Scope: PDFs only (EPUBs have no outline extraction here). Requires PyMuPDF (the [pdf] extra). Read-only; works in local or web mode. Example: zotero_get_pdf_outline(item_key='RTKZQI8E').
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description covers key behaviors: returns markdown list, handles missing outlines gracefully, is read-only, works in both local and web modes, and lists a dependency (PyMuPDF).
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?
Compact and well-structured: purpose first, then usage guidance, parameter details, scope, dependency, and example. Each sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, clear output), the description covers all necessary aspects: purpose, usage, parameter, edge case, scope, and dependencies. Output schema exists but format is already described.
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?
Single parameter item_key is thoroughly explained: accepts both attachment and parent keys, with automatic resolution. Includes an example call. Compensates for 0% schema coverage.
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 'Extract the table of contents from a PDF attachment' with output format specified. Distinguishes from sibling tools like zotero_get_item_fulltext by positioning it as a lighter alternative.
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 advises using before fulltext, notes outline is typically under 200 tokens, provides alternative tool (zotero_get_item_children) for finding the correct key, and specifies scope (PDFs only, not EPUBs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_recentA
List the most recently ADDED items (by dateAdded) in the active library, optionally scoped to a single collection. Use this for 'what did I add recently?' questions β NOT for general topic search (use zotero_semantic_search) or for a collection's full contents (use zotero_get_collection_items). limit: how many recent items to return (default 10). collection_key: optional 8-character collection key to restrict results to that collection; when omitted, returns the N most recent items across the whole library. Ordering is dateAdded DESC. All item types are returned, INCLUDING standalone notes and attachments β so results can mix papers, notes, and loose PDFs. If you only want parent items, filter client-side by itemType in the output. Scope: active library only (switch with zotero_switch_library). Example: zotero_get_recent(limit=20) or zotero_get_recent(collection_key='MT53KB66', limit=5).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of items to return | |
| collection_key | No | Optional collection key to scope results to a specific collection |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. It discloses ordering (dateAdded DESC), item types (all, including notes and attachments), and recommends client-side filtering for parent items. Lacks mention of error handling or rate limits, but otherwise thorough.
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 front-loaded purpose, but some sentences could be condensed (e.g., filtering advice). Still clear and informative without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 simple parameters, an output schema exists (not shown but noted), and the description covers return behavior, alternatives, and filtering guidance. Complete for the tool's purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds value: explains limit default, collection_key format (8-character), behavior when omitted, and provides example usage. This goes beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists recently added items by dateAdded, with optional collection scoping. It explicitly distinguishes itself from sibling tools like zotero_semantic_search and zotero_get_collection_items, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: use for 'what did I add recently?' questions, not for topic search or full collection retrieval. Names specific alternatives and mentions scope (active library, switchable with zotero_switch_library).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_search_database_statusA
Report the semantic search database's readiness and stats: item count, last update time, embedding provider / model, and whether the [semantic] optional dependency is installed. Use this to decide whether zotero_semantic_search will return useful results, or whether the user should run zotero_update_search_database first. Takes no parameters; no side effects. Returns a human-readable status block. If the [semantic] extras are not installed, returns an install hint instead of stats. Example: zotero_get_search_database_status() β count, last sync, provider summary.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully covers behavior: 'Takes no parameters; no side effects.' It also explains the conditional return when dependencies are missing ('If the [semantic] extras are not installed, returns an install hint instead of stats').
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 slightly lengthy but well-structured with front-loaded key information. Every sentence adds value, though minor trimming could improve conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no annotations, the description covers purpose, usage guidance, behavioral details, and edge cases (missing dependencies). It is complete for a status-check tool with an output schema.
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?
No parameters exist, so baseline is 4 per rules. The description adds value by explaining what the returned status includes and how it helps decision-making, beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Report the semantic search database's readiness and stats'. It lists specific outputs (item count, last update time, etc.) and distinguishes it from siblings like zotero_semantic_search and zotero_update_search_database.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool: 'Use this to decide whether zotero_semantic_search will return useful results, or whether the user should run zotero_update_search_database first.' This provides clear context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_get_tagsA
List all tags used in the currently active Zotero library, as a flat markdown list (one tag per line). Use this for tag discovery before filtering with zotero_search_by_tag or batch-editing with zotero_batch_update. Scope is the active library only β switch with zotero_switch_library before listing. The list is flat: tags have no parent/child structure in Zotero, only a colon convention ("area/subtag") that this tool preserves verbatim. limit: cap on tags returned; None (default) returns all. Example output:
to-read
methods/qualitative
AI agents
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tags to return |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses key behaviors: returns a flat markdown list (one tag per line), tags have no parent/child structure, colon convention is preserved verbatim, default limit is None (all tags). It does convey safety (a read/list operation) implicitly through 'list', though it could explicitly note non-destructive behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with purpose, followed by usage context and parameter details. The example output is useful but could be trimmed slightly; the information density is high with minimal waste. It earns a 4 rather than 5 because the example plus multiple explanatory sentences, while valuable, could be more tightly organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (1 optional param, no nested objects), and an output schema exists. The description covers purpose, usage context, scope, format behavior, parameter default, and provides an example. For this low-complexity tool, the description is thorough and complete; it only slightly misses explicit non-destructive confirmation.
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% for the single 'limit' parameter, so the schema fully documents it. The description adds the default behavior (None returns all tags) and also shows example output, which adds mild value beyond schema. This aligns with the baseline 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all tags in the active Zotero library as a flat markdown list, with a specific verb+resource ('list tags') and scope ('active library'). It distinguishes from siblings like zotero_search_by_tag and zotero_batch_update by noting its role in preceding those operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('for tag discovery before filtering with zotero_search_by_tag or batch-editing with zotero_batch_update') and notes scope constraints ('active library only β switch with zotero_switch_library before listing'). It names specific alternative tools, providing strong when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_list_librariesA
List every Zotero library this MCP can address: the user's personal library (libraryID=1 conventionally), all group libraries the user is a member of (with groupID), and (in local mode) RSS feed libraries. Each entry shows the library/group ID, display name, and item count. Use this to discover a library ID before calling zotero_switch_library β the two form a read-then-switch workflow. If the user only wants to see Zotero collections inside the CURRENT library, use zotero_get_collections instead. No parameters. In local mode: reads the local Zotero SQLite DB (fast, includes RSS feeds). In web mode: queries /groups via the Zotero web API (no feeds). Read-only; no side effects. The active library isn't flagged in the output β track it yourself from the last successful zotero_switch_library call (or the ZOTERO_LIBRARY_ID env var if none). Example: zotero_list_libraries().
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It declares read-only and no side effects. Describes differences between local mode (reads local SQLite DB, includes RSS feeds) and web mode (queries API, no feeds). Notes active library isn't flagged, advising manual tracking. Comprehensive.
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: purpose, workflow, alternatives, mode differences. No redundant sentences. Front-loaded with key information. Concise yet complete.
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 no parameters, presence of output schema, and thorough coverage of behavior (modes, side effects, output fields, workflow), the description is fully complete for the tool's simplicity.
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?
No parameters, so schema coverage is 100%. Description adds meaning by summarizing what each library entry contains (library/group ID, display name, item count). Baseline for 0 parameters is 4, and description provides useful context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool lists libraries the MCP can address (personal, group, RSS feeds). It distinguishes from sibling tool zotero_get_collections by noting that tool lists collections within current library. Uses specific verb 'list' and resource 'libraries'.
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 to use this tool to discover a library ID before calling zotero_switch_library, forming a read-then-switch workflow. Also says if user wants only collections in current library, use zotero_get_collections instead. Provides clear when-to-use and when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_manage_noteA
Create, update, or trash a Zotero note. item_key: the PARENT item's key for action='create', the NOTE's own key for 'update' and 'delete' (zotero_get_notes finds it). create: needs note_text β plain text, or simple HTML (p, strong, em, ul/li, a, code), which is preserved; note_title becomes a heading; tags optional. update: needs note_text. append=False (default) REPLACES the whole body, append=True concatenates. To keep formatting, fetch with zotero_get_notes(raw_html=True), edit that HTML, and pass it back whole. delete: moves the note to the Trash β recoverable; emptying the Trash is manual in Zotero. Notes only, not items/collections/attachments. Requires a writable library (web API key or hybrid mode). Example: (action='create', item_key='ABC12345', note_title='Reading notes', note_text='Key claim ...').
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| action | Yes | ||
| append | No | ||
| item_key | Yes | ||
| note_text | No | ||
| note_title | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It clearly discloses that append=False REPLACES the whole body (a destructive default), that delete moves to Trash (recoverable), that emptying Trash is manual, and the writable library requirement. It also notes HTML preservation behavior. This is strong behavioral transparency for a mutation tool, though it doesn't describe return value/response format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and information-rich with every sentence earning its place, but it is somewhat long for a single paragraph, making it harder to scan quickly. It's front-loaded with the core purpose and action-specific details, and the inline example is valuable. Slightly longer than ideal but every part contributes meaningfully.
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?
This is a complex parameterized mutation tool with 6 parameters at 0% schema coverage and no annotations. The description compensates fully by explaining every parameter across all three actions, the destructive-replace default, recovery semantics, HTML formatting preservation, prerequisite access requirements, and scope exclusions. The inline example ties parameters together. This 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?
Schema description coverage is 0%, so the description must fully explain all parameters, and it does. It explains item_key semantics per action (parent key vs. note's own key), note_text formats (plain or simple HTML with a preserved list), note_title as heading, append behavior with default false meaning replace, and optional tags. It even provides a concrete populated example. This exceeds the baseline compensation expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb+resource statement: 'Create, update, or trash a Zotero note.' It covers all three actions with clear scope, and explicitly differentiates itself from related tools by noting 'Notes only, not items/collections/attachments.' This distinguishes it well from sibling tools like zotero_delete_item, zotero_create_collection, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit action-by-action usage: which key to use for create vs. update/delete, what fields each action needs, when append vs. replace applies, and how to use zotero_get_notes(raw_html=True) to preserve formatting. It names the alternate tool (zotero_get_notes) for fetching. It also states the prerequisite requirement of a writable library. This is comprehensive guidance with clear when and when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_read_pdf_pagesA
Read specific page range(s) from a PDF attachment of a Zotero item. Use this when you know which pages to read β for example after getting the PDF outline via zotero_get_pdf_outline. Pages are 1-indexed. Returns Markdown with the page's heading structure preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| end_page | No | Last page to read (1-indexed). If omitted, reads only start_page. | |
| item_key | Yes | Zotero item key/ID of the paper or its PDF attachment. | |
| start_page | Yes | First page to read (1-indexed). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It discloses that pages are 1-indexed, that reading specific pages is the behavior, and that it 'Returns Markdown with the page's heading structure preserved' β which adds meaningful behavioral detail about the output format beyond the output schema. Solid disclosure for a read operation without 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?
Three concise sentences, zero filler. Each sentence earns its place: purpose, usage context, and indexing convention. Front-loaded with the core action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema that documents the Markdown return, so explaining return values isn't the description's job. Given complexity is moderate (3 params) and schema coverage is 100%, the description provides the key workflow context (use after outline, page indexing) that completes the picture. Missing explicit exclusion scenarios, but otherwise comprehensive for this read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds the page-indexing convention (1-indexed) and clarifies the end_page default behavior the schema already states ('If omitted, reads only start_page'). It adds the workflow context linking to the outline tool, but mostly relies on the schema for parameter meaning. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Read specific page range(s) from a PDF attachment of a Zotero item.' Clearly states the action (read pages) and the resource (PDF attachment). Distinguishes from siblings like zotero_get_pdf_outline (which gets the outline) and zotero_get_item_fulltext (which gets entire text), by emphasizing page-range targeting.
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?
Gives clear context for when to use: 'Use this when you know which pages to read β for example after getting the PDF outline via zotero_get_pdf_outline.' This implies the alternative workflow (get outline first) and sets expectations about the prerequisite knowledge. However, it doesn't explicitly say when NOT to use it, though the sibling distinction is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_search_by_citation_keyA
Look up a single Zotero item by its BetterBibTeX citation key (e.g. 'Smith2024' or 'cladderMicus2018'). Returns that one item's metadata, or a not-found message if no item has that key. citekey: the citation key exactly as assigned by BetterBibTeX (case-sensitive). In local mode: queries the running Better BibTeX plugin via its HTTP API (Zotero desktop must be running and have BBT installed). In web mode: scans the 'Extra' field of items for 'Citation Key:' lines β slower, and may miss items whose keys aren't persisted to Extra. Requires the Better BibTeX plugin in the user's Zotero install. For partial-key or free-text lookup, use zotero_search_items. Example: zotero_search_by_citation_key(citekey='hasan2026mcp') β metadata for that single item.
| Name | Required | Description | Default |
|---|---|---|---|
| citekey | Yes | The BetterBibTeX citation key to search for (e.g., 'Smith2024') |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses behavior: returns metadata or not-found message, details local mode (queries BBT API) and web mode (scans Extra field, slower, may miss items), and requires the Better BibTeX plugin. 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 moderately sized but every sentence contributes useful information. It front-loads the core purpose and then adds behavioral details and alternatives. Minor redundancy could be trimmed but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, a single parameter with high schema coverage, and an output schema (not shown but referenced), the description covers all necessary context: purpose, parameters, modes, prerequisites, limitations, and alternatives. It feels complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter. The description adds value by noting case-sensitivity and the exact key format required, as well as providing an example. This goes beyond the schema's basic description.
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 starts with 'Look up a single Zotero item by its BetterBibTeX citation key', which clearly states the verb (look up), resource (Zotero item), and identifier. It also differentiates from sibling tool zotero_search_items by explicitly mentioning alternatives for partial-key lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: use for exact citation key lookup, and for partial-key/free-text lookup use zotero_search_items. It also explains two modes (local vs web) and prerequisites (Better BibTeX plugin). An example call is included.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_search_by_tagA
Find items carrying one or more tags, with boolean syntax support. tag: list of tag strings; each entry is a condition ANDed with the others, and within an entry you can use ' OR ' for disjunction and a leading '-' for exclusion. Example: tag=['methods OR methodology', '-draft'] matches items tagged 'methods' OR 'methodology' AND NOT tagged 'draft'. item_type: '-attachment' (default) excludes attachments; pass 'journalArticle', 'book', etc. to filter. limit: max results (default 10). collection_key: optional 8-char key to scope to a collection. include_subcollections: also search collections nested beneath it (default False). Use zotero_get_tags to discover available tag names first. For free-text content search, use zotero_search_items or zotero_semantic_search instead. Example: zotero_search_by_tag(tag=['to-read'], limit=20).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | List of tag conditions. Items are returned only if they satisfy ALL conditions in the list. Each tag condition can be expressed in two ways: As alternatives: tag1 OR tag2 (matches items with either tag1 OR tag2) As exclusions: -tag (matches items that do NOT have this tag) For example, a tag field with ["research OR important", "-draft"] would return items that: Have either "research" OR "important" tags, AND Do NOT have the "draft" tag | |
| limit | No | Maximum number of results to return | |
| item_type | No | Type of items to search for. Use "-attachment" to exclude attachments. | -attachment |
| collection_key | No | Optional collection key to scope the search to a specific collection | |
| include_subcollections | No | Also search collections nested beneath collection_key. Ignored when collection_key is not given. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and it delivers: it discloses AND/OR/exclusion semantics, the default -attachment item type, limit default, subcollection default, and the 8-character collection key scope. An agent can predict the tool's filtering behavior without calling it.
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?
Purpose is front-loaded, parameter semantics are compactly summarized in order, and the example at the end illustrates a realistic invocation. No filler; the length is justified by the boolean query 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 all five parameters, defaults, scoping behavior, prerequisites, sibling alternatives, and an example. With an output schema present, no return-value explanation is needed, making this definition effectively complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but description adds value with a concrete boolean example, the 8-char key format, and sample item_type values. It slightly simplifies the tag parameter to strings while the schema also allows object entries, so it loses a point for not explaining that alternative form.
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?
Opens with 'Find items carrying one or more tags,' a specific verb+resource statement that also distinguishes it from free-text search tools by name in the description. The boolean syntax mention signals the tool's specialization without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: 'Use zotero_get_tags to discover available tag names first' and 'For free-text content search, use zotero_search_items or zotero_semantic_search instead.' This tells an agent exactly when this tool is appropriate and which sibling to choose otherwise.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_search_collectionsA
Search collections by name in the active library and return their 8-character keys. Matching is case-insensitive substring and applies ONLY to the collection's own name β not to parent names, descriptions, or items inside the collection. Multi-word queries are ANDed across words (NOT OR-ed): query 'reading list' matches only collections whose name contains both 'reading' AND 'list'. To match either word, issue two separate searches. Leading/trailing whitespace is ignored and empty words are dropped. Returns the collection's key plus its parent (if any). include_trashed: when True, also match collections currently in the Zotero Trash (results annotated as such). Default False β trashed collections are otherwise invisible to automated clients. Performance: scans all collections in the active library (O(n)); for very large libraries expect a full-list pagination under the hood. Example: zotero_search_collections(query="orals") β keys for every collection with "orals" in its name.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| include_trashed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: case-insensitive substring, AND logic, whitespace handling, trashed collection behavior, performance O(n) with pagination hint. This is comprehensive for an AI agent.
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 relatively lengthy but well-structured: purpose first, then detailed rules, then param explanation, then performance note. Every sentence adds information; however, it could be slightly more concise by consolidating some matching details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists (not shown but indicated), the description covers all needed aspects: return value (key + parent), trashed annotations, and performance. It is complete for an AI agent using this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries full burden. It thoroughly explains the 'query' parameter's matching logic (case-insensitive, AND, whitespace) and 'include_trashed' parameter's effect and default. Adds significant value beyond the schema's bare types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool searches collections by name, returns their keys, and explains matching behavior. It clearly distinguishes from sibling tools like zotero_get_collections (list all) and zotero_manage_collections (create/rename/delete) by specifying its specific action and return value.
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 when-to-use and when-not-to-use guidance: matching only on collection's own name (not parents or items), AND logic for multi-word queries, and note to issue separate searches for OR logic. It lacks explicit sibling differentiation but covers usage context well.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_search_itemsA
Search Zotero items by substring match against metadata (title, creators, year, and β in 'everything' mode β abstract). Returns metadata + abstracts as markdown. IMPORTANT: keep queries SHORT and SIMPLE β 'Author Year' (e.g. 'Brewer 2011') or just an author name ('Cladder-Micus'). This is substring matching, not web search: each extra word NARROWS the match, so adding topic words usually returns fewer results, not more. For topic discovery, use zotero_semantic_search instead; for tag filtering use zotero_search_by_tag. If a query finds nothing, this tool automatically falls back to simplified queries and then semantic search. query: required substring. qmode: 'titleCreatorYear' (default) matches only title/authors/year; 'everything' also searches abstract. item_type: '-attachment' (default) excludes attachments; pass 'journalArticle', 'book', etc. to filter. tag: optional list of tag conditions (ANDed). limit: max results (default 10). collection_key: 8-char key to restrict to a collection (bypasses the fallback cascade). include_subcollections: also search collections nested beneath it (default False). search_all_libraries: search personal + all group libraries at once, labelling each result with its library β use it when you don't know which library holds the item. Needs ZOTERO_SEARCH_BACKEND=sqlite; excludes collection_key. Example: zotero_search_items(query='Cladder-Micus') or zotero_search_items(query='Brewer 2011', search_all_libraries=True).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Tag filter. Accepts ["tagA", "tagB"] (preferred), a bare string "tagA", a JSON-string list '["tagA", "tagB"]', or the dict-shape [{"tag": "tagA"}] sometimes emitted by clients that confuse the filter form with Zotero's stored-tag form. All are normalized internally to the list[str] form pyzotero expects. | |
| limit | No | Maximum number of results to return | |
| qmode | No | Query mode (titleCreatorYear or everything) | titleCreatorYear |
| query | Yes | Search query string | |
| item_type | No | Type of items to search for. Use "-attachment" to exclude attachments. | -attachment |
| collection_key | No | Optional collection key to scope the search to a specific collection. When provided, bypasses the fallback cascade and searches the collection directly. | |
| search_all_libraries | No | Search every accessible library at once instead of the active one (#163). Requires the SQLite backend; each result is labelled with the library it came from. Cannot be combined with collection_key, which names a collection inside one library. | |
| include_subcollections | No | Also search collections nested beneath collection_key. Ignored when collection_key is not given. Defaults to False, matching Zotero's own "Search subcollections" checkbox. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly. It discloses the substring-matching narrowing behavior, the automatic fallback cascade to simplified queries and semantic search, the backend requirement for search_all_libraries, and the fact that collection_key bypasses the fallback. This goes well beyond the schema and gives the agent a realistic model of tool behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but deliberately structured and information-dense. The key behavioral warning about substring matching is front-loaded, followed by tool routing, then a compact parameter walkthrough and examples. Every major point earns its place, though the parameter-by-parameter recap does create some overlap with the input schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter search tool with a fallback mechanism and cross-library mode, the description explains all relevant invocation concerns, including constraints, defaults, exclusions, and example calls. The presence of an output schema means the return format does not need to be detailed here, and nothing essential for correct use is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning beyond the bare parameter names: query is a substring, extra words narrow results, qmode controls which fields are searched, item_type defaults to excluding attachments, tag conditions are ANDed, and collection_key has special fallback-bypassing behavior. This is far more than the schema alone 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?
The description states a specific verb and resource ('Search Zotero items by substring match against metadata'), defines the scope of the match (title, creators, year, abstract), and describes the return format. It also clearly differentiates itself from zotero_semantic_search and zotero_search_by_tag, so an agent can tell it apart from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use alternatives: 'For topic discovery, use zotero_semantic_search instead; for tag filtering use zotero_search_by_tag.' It also gives practical guidance on query construction, when to use search_all_libraries, and the sqlite backend prerequisite. This is actionable routing guidance, not just implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_semantic_searchA
Prioritized topic-search tool. Find papers by semantic similarity to a query using AI embeddings β the BEST tool for finding papers on a topic (e.g. 'papers about mindfulness-based therapy'), far more efficient than scanning collection items or reading abstracts. Searches the ACTIVE library by default; pass search_all_libraries=True to cover every indexed library. query: the topic or concept; natural-language phrases work well. limit: max results (default 10). filters: optional metadata filters as a dict (e.g. {'itemType': 'journalArticle', 'year': '2023'}); also accepts a JSON string. library_id: optional β scope to one library other than the active one: 0 or 'user' for personal, else a groupID (see zotero_list_libraries). search_all_libraries: search every indexed library at once, labelling each result with its library; needs ZOTERO_SEARCH_BACKEND=sqlite, excludes library_id. Requires the semantic search database to be POPULATED β run zotero_update_search_database first if you just installed the server or added new items; check readiness with zotero_get_search_database_status. Available only when the [semantic] optional dependency is installed. Example: zotero_semantic_search(query='mindfulness-based cognitive therapy for depression', limit=5).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default: 10) | |
| query | Yes | Search query text - can be concepts, topics, or natural language descriptions | |
| filters | No | Optional metadata filters as dict or JSON string. Example: {"item_type": "note"} | |
| library_id | No | Optional library scope β 0/"user" for the personal library or a groupID for a group library. Defaults to the active library. | |
| search_all_libraries | No | Search every indexed library at once (#163). Requires the SQLite backend; results are labelled with their source library. Mutually exclusive with library_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden and does well: it explains active-library default behavior, cross-library search behavior, the SQLite backend requirement, the need to populate the database first, and the optional dependency caveat. It doesn't explicitly state read-only semantics, but 'search' plus the lack of mutation language makes that reasonably clear, and an output schema covers the return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: core purpose is front-loaded, parameter behavior is compactly explained, prerequisites are stated, and a concrete example closes it out. There is no filler or repetition of schema fields.
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βfive parameters, a required prerequisite database, backend constraints, and optional dependencyβthe description covers all essential context: scope defaults, how to broaden scope, when it is unavailable, and where to look for related library IDs. Because an output schema exists, omitting return-value details is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema with useful practical detail: natural-language query phrasing, default limit of 10, a concrete filters example, the '0'/'user' personal-library convention, and the mutual exclusivity of search_all_libraries with library_id. The only minor blemish is a slight key-style inconsistency in the filter example ('itemType' vs schema's 'item_type'), but it is clearly illustrative.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Prioritized topic-search tool' and clearly states the tool finds papers by semantic similarity using AI embeddings. It explicitly distinguishes this from scanning collection items or reading abstracts, making its unique role among the sibling search tools unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly frames when to use the tool: 'the BEST tool for finding papers on a topic' and more efficient than manual scanning. It also gives operational prerequisites and access constraints. However, it does not explicitly name alternative search tools or state when to choose zotero_search_items or zotero_advanced_search instead, so the exclusion guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_set_item_collectionsA
Change which collections existing items belong to β an incremental add/remove of item membership, NOT collection creation (use zotero_create_collection / zotero_delete_collection for that). item_keys must be an ARRAY of item keys, e.g. ["KEY1", "KEY2"] β not a single string. add_to and remove_from accept arrays of collection keys, names, or '/'-separated paths (resolved and validated automatically; unknown, trashed, or ambiguous specs fail before anything is changed). Existing memberships not named in remove_from are left alone; to replace an item's memberships wholesale use zotero_update_item. Use zotero_search_items to find item keys and zotero_search_collections to find collection keys.
| Name | Required | Description | Default |
|---|---|---|---|
| add_to | No | ||
| item_keys | Yes | ||
| remove_from | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it delivers thoroughly. It states that this is an incremental operation ('Existing memberships not named in remove_from are left alone'), discloses validation behavior ('resolved and validated automatically; unknown, trashed, or ambiguous specs fail before anything is changed'), and clarifies atomicity (no partial changes). This is rich, high-value behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense single paragraph that front-loads the core purpose and alternates. Every sentence adds value, but it's longer than strictly necessary and could benefit from being broken into shorter sentences for scanability. Still, there is zero fluff or repeated structured data.
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?
This is a mutation tool with no annotations but rich documentation. It covers the operation's nature (incremental), edge-case behavior (validation failures), what it does NOT do (create/delete collections, replace wholesale), data types, and companion tools. The output schema exists, so return-value explanation is not needed. This is unusually complete for the complexity of this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does substantially. It clarifies that item_keys must be an ARRAY ('not a single string'), explains that add_to/remove_from accept arrays of collection keys, names, or '/'-separated paths, and explains the semantic difference between the two parameters. It doesn't fully enumerate every edge case of the array/string anyOf types but covers the critical usage 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 states precisely what the tool does: 'Change which collections existing items belong to β an incremental add/remove of item membership.' It uses a specific verb (change/add/remove) with a clear resource (collection membership of existing items), and explicitly distinguishes itself from collection creation, which differentiates it from sibling tools like zotero_create_collection and zotero_delete_collection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when/when-not guidance: 'NOT collection creation (use zotero_create_collection / zotero_delete_collection for that)' names the alternatives directly. It also tells the user when to use a different tool for wholesale replacement ('to replace an item's memberships wholesale use zotero_update_item'). It even suggests complementary search tools (zotero_search_items, zotero_search_collections) for finding required keys.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_set_item_parentA
Set or clear the parent of a Zotero item. Pass a parent item key to assign or change the parent, or null to make the item top-level. Zotero validates whether the requested parent-child relationship is allowed.
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes | ||
| parent_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It clearly discloses that the tool mutates parentage, that passing null clears the parent, and that Zotero validates allowed relationships. This goes beyond a minimal 'set parent' statement, though it does not detail response or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core action. Each sentence contributes useful information, with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with an output schema, the description covers the essential semantics and the tool's validation behavior. It is sufficient for an agent to invoke correctly, though it could mention key format or specific relationship constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains parent_key meaningfully: a string key assigns/changes the parent, null makes the item top-level. item_key is less detailed but its purpose is clear from the tool context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Set or clear the parent of a Zotero item.' It clearly distinguishes itself from related siblings like zotero_set_item_collections or zotero_update_item by focusing solely on the parent-child relationship.
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 implies when to use the toolβwhen you need to assign, change, or clear an item's parentβbut it does not explicitly discuss alternatives or when not to use this tool. The guidance is mostly parameter-level rather than decision-level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_switch_libraryA
Switch the active library context. EVERY subsequent read/write tool call (collections, items, annotations, search β all of them) operates on the library set here. Changes persist for the rest of the session or until the next switch. Discover valid library IDs/types via zotero_list_libraries first; don't guess. library_id: library ID string as returned by zotero_list_libraries (numeric for user/group, numeric for feeds). library_type: 'user' β the personal library; 'group' (default) β a group library; 'feeds' β a local RSS feed library; 'default' β RESET to whatever the ZOTERO_LIBRARY_ID / ZOTERO_LIBRARY_TYPE env vars configure (library_id is ignored in this mode). Fails fast if the library_id isn't accessible under the current credentials. Example: zotero_switch_library(library_id='5294983', library_type='group') or zotero_switch_library(library_id='', library_type='default').
| Name | Required | Description | Default |
|---|---|---|---|
| library_id | Yes | The library/group ID to switch to. For user library: "0" (local mode) or your user ID (web mode). For group libraries: the groupID (e.g. "6069773"). | |
| library_type | No | "user", "group", or "default" to reset to env var defaults. | group |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses persistence across session, fast-fail on inaccessible IDs, and the effect of 'default' mode (ignores library_id). With no annotations, this fully informs the agent of behavioral traits.
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?
Each sentence contributes meaning. Structured with overview, parameter details, and example. Slightly verbose but appropriate for a context-setting tool. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Completely covers the tool's purpose, usage, parameters, and behavior. No gaps remain for a tool of this complexity, especially given the presence of an output schema (not shown).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already describes both parameters (100% coverage). Description adds format clarifications (numeric for user/group), special 'default' mode, and examples, exceeding schema detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Switch the active library context' and explains that subsequent read/write calls operate on this library. This distinguishes it from all sibling tools that use the context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to discover valid IDs via zotero_list_libraries first. Details each library_type option including the 'default' reset. Does not explicitly list when not to use, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_synthesize_annotationsA
Collect every highlight, annotation comment, and child note across a scope and organize them into a structured, per-paper digest that YOU (the agent) can then synthesize into a literature summary. This tool does NOT call an LLM β it only gathers and groups the raw material, so the synthesis step is yours. collection_key: optional 8-character collection key; when given, only annotations/notes whose resolved paper is a member of that collection are included. When omitted, the whole active library is scanned (capped by limit). tag: optional tag or list of tags to filter items by (accepts a string, a JSON list, or a list). limit: cap on annotations/notes scanned (default 200) to keep the call tractable. format='markdown' (default) groups the digest by paper; format='json' returns the same highlights and notes as structured records for downstream processing. Markdown output has each paper heading followed by its highlights (with attached comments) and any note excerpts β plus a top summary line counting papers, highlights, and notes. Use this before writing a thematic review so you can spot themes and contradictions across sources. Example: zotero_synthesize_annotations(collection_key='MT53KB66').
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Optional tag filter (string, JSON list, or list). | |
| limit | No | Maximum annotations/notes to scan. | |
| format | No | ``markdown`` for a readable digest or ``json`` for structured per-paper annotation and note records. | markdown |
| collection_key | No | Optional collection to restrict the digest to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the transparency burden. It discloses that the tool does NOT call an LLM, only gathers and groups material, and that synthesis is left to the agent. It also explains scoping behavior (whole library vs. collection, cap by limit) and output details, leaving no major behavioral surprises.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but every sentence adds value. It front-loads the main purpose, then covers the no-LLM aspect, parameter behaviors, output format, and a concrete usage example. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a tool with 4 optional parameters, an output schema (present), and a wide sibling set. It explains output structures for both markdown and json formats, gives an example call, and provides enough context for correct invocation and interpretation of results.
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 enriches each parameter beyond the schema. For example, it clarifies that collection_key filters by resolved paper membership and that omitting it scans the whole active library, and it explains the markdown output structure for format. This goes well beyond the schema's terse descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Collect every highlight, annotation comment, and child note across a scope and organize them into a structured, per-paper digest.' It explicitly distinguishes itself from LLM-based synthesis and from sibling tools like zotero_get_annotations by emphasizing aggregation and grouping rather than raw retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit use case: 'Use this before writing a thematic review so you can spot themes and contradictions across sources.' It explains when collection_key and tag filters are appropriate, but it does not explicitly name alternative tools for when this one is not suitable, so it gets a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_update_annotationA
Update an existing Zotero annotation. Editable fields: text (highlight text), comment, color (hex like '#ffd400'), and tags. Tags can be replaced wholesale via tags, or edited incrementally via add_tags/remove_tags (mutually exclusive with tags). Position/page/sortIndex are anchored to the PDF/EPUB geometry and are not editable.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| text | No | ||
| color | No | ||
| comment | No | ||
| add_tags | No | ||
| remove_tags | No | ||
| annotation_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description reveals that certain fields (position/page/sortIndex) are non-editable, adding important constraints. It also explains tag update modes (wholesale vs incremental). However, it does not cover permissions, rate limits, or return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no redundancy. It front-loads the purpose, then covers editable fields and special tag behavior. 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?
Given 7 parameters and 1 required, the description explains all user-facing editable fields and tag mechanics. It leaves out error handling and output details, but the presence of an output schema mitigates the need for return value explanation.
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 0% description coverage, yet the description adds meaning by explaining text as 'highlight text', color hex format, and tag handling (wholesale via `tags` vs incremental via `add_tags`/`remove_tags`). This goes well beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing Zotero annotation and lists editable fields. It is specific enough to distinguish from create/delete tools, though it does not explicitly compare with sibling tools like zotero_update_note, which target a different resource.
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 implies usage for modifying annotations but does not provide explicit when-to-use, alternatives, or prerequisites. It does offer parameter-level guidance on tag handling (mutual exclusivity), which partly compensates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_update_itemA
Update metadata on an existing Zotero item by key. Only what you pass is changed. fields: {name: value} of metadata to set (a JSON object string is accepted). Names may be snake_case (title, date, doi, url, abstract, publication_title, access_date, short_title, book_title, citation_key, item_type, place, extra, volume, issue, pages, publisher, issn, isbn, edition, language) or any raw Zotero API field name. An unknown name fails the call and lists the valid ones; a name that is not valid for this item's type is reported as skipped. item_type migrates the item (overlapping fields kept, type-specific ones dropped). TAG SEMANTICS (easy to get wrong): tags REPLACES the whole tag list; add_tags/remove_tags are incremental and preferred. They are mutually exclusive with tags. collections (keys) and collection_names likewise REPLACE membership β pass collections=[] to clear it; for incremental moves use zotero_set_item_collections. creators: full replacement list of {creatorType, firstName, lastName} objects. Requires a writable library (fails in local-only mode). To edit notes use zotero_manage_note. Example: zotero_update_item(item_key='RTKZQI8E', fields={'doi': '10.1145/3708319'}, add_tags=['reviewed']).
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| fields | No | mapping (or JSON object string) of field name -> value. Names may be snake_case aliases (``publication_title``, ``short_title``, ``citation_key``) or raw Zotero API keys (``publicationTitle``). ``place`` is the publication city (e.g. ``"New York"``) and is valid on book, bookSection, thesis, manuscript, report and conferencePaper. ``citation_key`` writes Zotero's native ``data.citationKey`` (the BetterBibTeX citation key); BBT auto-pins from metadata on creation and provides no programmatic refresh path in 9.x, so a direct write here is the only programmatic remediation for malformed pinned keys. ``item_type`` migrates the item across types: overlapping fields are preserved and type-specific fields that do not map are dropped. | |
| add_tags | No | ||
| creators | No | full replacement creators list (also accepted as ``fields['creators']``). | |
| item_key | Yes | 8-character Zotero item key of the item to update. | |
| collections | No | ||
| remove_tags | No | ||
| collection_names | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses mutation behavior (update, migration on item_type change with field drop semantics, tag replacement vs incremental), failure modes (unknown names fail the call, invalid names skipped), and mode restrictions (fails in local-only mode). This is rich behavioral detail despite the lack of 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 information-dense with clear section markers (TAG SEMANTICS, example). It is compact relative to the behavioral complexity it covers. Slightly long but every section earns its place given the easy-to-get-wrong tag/collection/creator replacement semantics.
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 complex mutation tool with 8 params and only 38% schema coverage, the description is remarkably complete: covers all parameter semantics, migration behavior, tag semantics, collection replacement, creators replacement, mode restrictions, error behavior, and points to sibling tools where relevant. An output schema exists, so return format need not be explained.
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 only 38%, so the description must compensate. The main description lists valid snake_case field names, explains item_type migration, tag semantics, collections/collection_names replacement behavior, and creators as full replacement. The fields param in the schema does add extra detail about place validity and citation_key. The combination provides strong semantic depth beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states clearly 'Update metadata on an existing Zotero item by key' with a specific verb+resource. It explicitly outlines what is changed ('Only what you pass is changed') and differentiates from siblings by referencing zotero_set_item_collections and zotero_manage_note for adjacent operations.
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 usage guidance including tag semantics warning ('tags REPLACES the whole tag list; add_tags/remove_tags are incremental and preferred'), alternative tool references (zotero_set_item_collections for incremental collection moves, zotero_manage_note for notes), and prerequisites (requires writable library). Also gives a concrete example invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zotero_update_search_databaseA
Build or refresh the semantic search embedding database from Zotero items. Run this: (a) after first install, (b) after adding items via zotero_add_item, or (c) when the user has added items directly in Zotero desktop since the last update. By default the update is INCREMENTAL β only new or changed items are re-embedded, so repeated calls are cheap. force_rebuild=True re-embeds ALL items from scratch (slow; use when changing the embedding model or recovering from corruption). limit: optional cap on items processed (useful for smoke-testing). Progress is reported via the MCP context; on large libraries an incremental update is seconds, a full rebuild can take minutes. Requires the [semantic] optional dependency and a configured embedding provider (see config.json). Check status with zotero_get_search_database_status. Example: zotero_update_search_database() after adding a batch of papers.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Limit number of items to process (useful for testing) | |
| force_rebuild | No | Whether to rebuild the entire database from scratch |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. It covers dependency requirements ([semantic] package, embedding provider/config.json), performance characteristics (seconds vs minutes), default behavior (incremental), and progress reporting via MCP context. Only minor gaps: no error behavior or failure modes, otherwise strong.
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 thorough and front-loaded with the core purpose and usage triggers, then dives into behavior and examples. Slightly long but every sentence earns its place β context triggers, performance notes, dependencies, and example all add distinct value. Not overlong for the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (side effects on a database, model config, performance differences), the description is quite complete despite rich schema and an output schema. Covers prerequisites, when to run, cost profiles, and how to verify. Minor gap: no mention of error recovery if embedding provider is misconfigured, but this is a strong description overall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds real value beyond the schema by explaining force_rebuild's semantics (re-embeds ALL items, use when changing model or recovering from corruption) and limit's purpose (smoke-testing), plus the incremental-vs-full behavioral contrast. This elevates it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Build or refresh the semantic search embedding database from Zotero items' β a specific verb+resource+scope. It distinguishes from siblings by explicitly referencing zotero_add_item, zotero_get_search_database_status, and the update/rebuild distinction, making its role among the 35 sibling tools clear.
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 triggers (first install, after zotero_add_item, after direct desktop additions) and when-not-to (incremental vs force_rebuild slow full rebuild), plus a reference to the status-checking sibling tool. This is model guidance for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Every tool has a clearly distinct purpose, with detailed descriptions that differentiate even similar operations (e.g., multiple search tools target different scopes: semantic, substring, tag, citation key, notes, advanced). The few overlapping areas are well-delineated by input type or intended use case.
Most tools follow a consistent 'zotero_verb_noun' or 'scite_verb_noun' pattern. The only exceptions are the two ChatGPT connector tools ('fetch' and 'search'), which are required by the MCP-over-web spec and documented as such, so the deviation is justified and does not cause confusion.
With 55 tools, the set is very large. Even though the domain is complex and each tool serves a specific function, the count exceeds the 'too many' threshold (25+) and approaches the 'extreme mismatch' cutoff (50+). This can be overwhelming for agents and users.
The tool surface is remarkably comprehensive, covering CRUD for items, collections, notes, annotations, tags, relations, duplicates, multiple search/retrieval methods, Scite integration, RSS feeds, and library management. There are no obvious gaps for common Zotero 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
Academic literature search, retrieval, and private library management on top of OpenAlex.
Persistent context for Claude. Your AI always knows your projects and next actions across sessions.
Connect your team's living knowledge base β docs, data, issues, CRM β to Claude and ChatGPT.
Share context and questions between Claude instances β VS Code, claude.ai web, and mobile.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to search, read, and manage Zotero references locally with customizable research workflows.94MIT
- FlicenseBqualityDmaintenanceEnables AI assistants to search, cite, and manage research references directly from a Zotero library.97
- AlicenseNot gradedqualityBmaintenanceEnables natural language interaction with Zotero libraries, allowing users to search, retrieve, and update papers and metadata via AI assistants like Claude and Gemini.1GPL 2.0
- AlicenseNot gradedqualityDmaintenanceConnects your Zotero research library with AI assistants (Claude, ChatGPT, etc.) via the Model Context Protocol, enabling paper review, summaries, annotations, and semantic search both locally and through the web API.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/54yyyu/zotero-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server