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 39 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_types / list_creator_fieldsZotero's
own schema — check before a create/update call, instead of guessinglist_attachments / get_fulltext / download_attachment / list_notesRead-only lookups
for attachments and notesexport_bibliographyFormatted HTML bibliography/citation entries in a CSL style, or
portable CSL-JSON/BibTeX export datacreate_item / update_item / update_publication_statusAdd new items, edit fields, or
record a preprint's publication (even its item type) — 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 version; both accept an idempotency_key to make retries safedelete_collection / delete_tag / delete_saved_searchPermanently remove a
collection, a tag library-wide, or a saved search — also accept idempotency_keyversion; a stale one is refused, never silently overwritten.FakeZotero in tests — the suite never touches a live library./status (JSON) and /status.html
(small page) report uptime, onboarded-tenant count, and per-tool call/error totals — aggregate only,
no per-tenant data./.well-known/mcp/server-card.json lists
identity, auth requirements, and the full tool registry with schemas, generated live on every request.
A pragmatic approximation of SEP-2127
("MCP Server Cards"), which is not yet a ratified MCP standard.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.