A standalone, remote MCP server that turns Zotero into something your AI client can act on directly: search, create, tag, update — even delete and move, with real safeguards. Covers the full library surface — items, collections, tags, trash, saved searches, and schema lookups — in 36 tools. Self-service and multi-tenant: sign in with your own Zotero Library ID and API key, no admin approval, no shared credentials. Nothing to install locally, gated by a first-party OAuth 2.1 flow built into the server itself.
Unofficial, community-maintained project. Not affiliated with, endorsed by, or sponsored by the Corporation for Digital Scholarship (Zotero) — see Zotero's trademark policy.
This server is multi-tenant and self-service, so
/authorize doesn't delegate to a third-party identity
provider — it's a first-party login form asking for your own Zotero
Library ID, Library Type, and API Key. Validating that key against the
live Zotero API is what gates access and onboards your library,
in one step.
version is stale — no silent overwrite.Add it as a remote MCP connector directly — the OAuth flow prompts for your own Zotero Library ID/Type/API Key in-browser, nothing to configure by hand, no admin sign-up step.
Also listed in the official
MCP Registry
as dk.herbertkokholm.citecaddy/cite-caddy.
/mcp appendedhttps://your-domain.example/mcp
claude mcp add --transport http cite-caddy \ https://your-domain.example/mcp
search_items / get_item / list_collections / list_tags / list_trashRead-only
lookups against the connected librarylist_saved_searches / list_groupsDiscover saved searches, and groups whose
id can target move_item_to_different_librarylist_item_types / list_item_fields / list_item_type_fields / list_item_creator_typesZotero's
own schema — check before a create/update call, instead of guessinglist_attachments / get_fulltext / download_attachment / list_notesRead-only lookups
for attachments and notescreate_item / update_itemAdd new items or edit fields — always key-preserving
add_tags / remove_tags / set_tags / rename_tagManage tags per-item or library-wide,
without touching item keysadd_to_collection / remove_from_collectionReorganize safely, in-library only
create_collection / update_collectionCreate a collection, or rename/move
(reparent) an existing onecreate_saved_searchAdd a new saved searchtrash_item / restore_from_trashReversible soft delete, and its undoupload_attachment / create_note / update_noteAdd a file attachment or note, or
edit a note in placedelete_item_permanently / move_item_to_different_libraryDestructive — requires the
item's current versiondelete_collection / delete_tag / delete_saved_searchPermanently remove a
collection, a tag library-wide, or a saved searchversion; a stale one is refused, never silently overwritten.FakeZotero in tests — the suite never touches a live library.Full CRUD was a deliberate scope choice, and it comes with a real risk this project is built around rather than around ignoring.
version. A mismatch means it changed since — the call is refused, not forced through.