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. v1.0 covers the full library surface — items, collections, tags, trash, saved searches, and schema lookups — in 36 tools. Nothing to install locally, gated by a first-party OAuth 2.1 flow built into the server itself.
There's exactly one resource owner, so /authorize
doesn't delegate to a third-party identity provider — it's a first-party
login form checked against a username/password configured on the server.
version is stale — no silent overwrite.Add it as a remote MCP connector directly — the OAuth flow prompts for username/password in-browser, nothing to configure by hand.
/mcp appendedhttps://your-domain.example/mcp
claude mcp add --transport http zotero \ 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.ZOTERO_LIBRARY_ID/TYPE/API_KEY
configure which library it talks to — never hardcoded.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.