zotero-assistant-mcp
Zotero library management MCP server for Cloudflare Workers, designed for deployment via mcp-deploy.
Tools (16)
Groups
list_groups— list Zotero groups the user belongs to (returns group IDs for use withgroup_idparams)
Search & Browse
search_items— search by text, tags, type, collection, or date rangeget_collection_items— list items in a specific collectionlist_collections— list all collections (folders)create_collection— create a new collectionlist_tags— list tags with item countsget_library_stats— library overview with totals and top tags
Read
get_item— full metadata and children for a single itemread_attachment— read attachment content (auto-detects type, accepts parent or attachment key)get_note— read note content
Write
save_item— create an item with metadata and optional attachment (PDF URL, snapshot, or base64 file)attach— attach a file to an existing item (supportspdf_url,snapshot_url, orfilevia base64)create_note— create a note on an existing itemupdate_item— update metadata, tags, or collectionstrash_item— move a note or attachment to trash
All tools that operate on library data accept an optional group_id parameter. Omit it for the personal library; pass a group ID (from list_groups) to operate on a group library.
Features
- Server instructions — workflow guidance injected once at init, not per-tool
- Progress notifications — multi-step operations (attach, save with attachment, read) emit MCP progress events
- Group library support — call
list_groupsto discover groups, passgroup_idto any tool - Smart author parsing — handles "Last, First", suffixes (Jr., III), and institutional authors
- Curated responses —
get_itemreturns only non-empty, agent-relevant fields; search results are compact summaries
Deploy
Install mcp-deploy and deploy to Cloudflare Workers:
npm install -g mcp-deploy
mcp-deploy login
mcp-deploy add upascal/zotero-assistant-mcp
mcp-deploy deploy zotero-assistant-mcp
Or use the web UI: mcp-deploy gui
How it works
This repo contains only MCP logic. Auth, deployment, and UI are handled by mcp-deploy (npm install -g mcp-deploy). The repo ships:
src/— MCP server code (Cloudflare Workers + Durable Objects)mcp-deploy.json— deployment contract (secrets, config, worker settings)
Configuration
| Secret | Required | Description |
|---|---|---|
ZOTERO_API_KEY |
Yes | Zotero API key |
ZOTERO_LIBRARY_ID |
Yes | Your numeric user library ID |
Local development
npm install
# Create .dev.vars with your Zotero credentials:
# ZOTERO_API_KEY=your-api-key
# ZOTERO_LIBRARY_ID=your-library-id
npx wrangler dev
Testing
npm test
Integration tests run against a live Zotero library. Set .dev.vars with your credentials. Tests create temporary items/collections and clean up after themselves.
Release
Tag a version to trigger the GitHub Actions release workflow:
git tag v0.5.0
git push --tags
This builds worker.mjs and publishes it alongside mcp-deploy.json as release assets. mcp-deploy fetches these assets to deploy the worker.
Tools 15
list_groupsList Zotero groups the user belongs tosearch_itemsSearch by text, tags, type, collection, or date rangeget_collection_itemsList items in a specific collectionlist_collectionsList all collections (folders)create_collectionCreate a new collectionlist_tagsList tags with item countsget_library_statsLibrary overview with totals and top tagsget_itemFull metadata and children for a single itemread_attachmentRead attachment contentget_noteRead note contentsave_itemCreate an item with metadata and optional attachmentattachAttach a file to an existing itemcreate_noteCreate a note on an existing itemupdate_itemUpdate metadata, tags, or collectionstrash_itemMove a note or attachment to trashEnvironment Variables
ZOTERO_API_KEYrequiredYour Zotero API keyZOTERO_LIBRARY_IDrequiredYour numeric user library ID