Zotero MCP

Search, read, annotate and add to a Zotero research library from an MCP client, locally or via the web API

By Steven Yu (individual) Python Local · stdio Knowledge and memoryProductivity

85 popularity score ★ 5.8k ↓ 20k/mo

Connect your client

Local (PyPI)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add zotero -- zotero-mcp
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "zotero": {
      "command": "zotero-mcp",
      "args": []
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "zotero": {
      "command": "zotero-mcp",
      "args": []
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "zotero": {
      "type": "stdio",
      "command": "zotero-mcp",
      "args": []
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.zotero]
command = "zotero-mcp"
args = []
Gemini CLITerminal
gemini mcp add --scope user zotero zotero-mcp

Settings 19

ZOTERO_LOCAL Optional: Set to true to use the local Zotero app and database instead of the web API.
ZOTERO_API_KEY Optional: zotero.org API key for web or hybrid mode.
ZOTERO_LIBRARY_ID Optional: Numeric user or group ID for web or hybrid mode.
ZOTERO_LIBRARY_TYPE Optional: user (default) or group.
ZOTERO_LOCAL_API_KEY Optional: Local write key for Zotero 10+, normally stored by authorize-local.
ZOTERO_LOCAL_WRITE Optional: auto (default) or false to send writes through the web API.
ZOTERO_MCP_TOOLSETS Optional: Which optional tool groups to expose.
ZOTERO_DB_PATH Optional: Custom path to zotero.sqlite.
ZOTERO_BACKEND Optional: api or sqlite read backend in local mode.
ZOTERO_WEBDAV_URL Optional: WebDAV folder for attachment downloads in remote mode.
ZOTERO_WEBDAV_USERNAME Optional: WebDAV user name.
ZOTERO_WEBDAV_PASSWORD Optional: WebDAV password.
ZOTERO_EMBEDDING_MODEL Optional: Embedding provider for semantic search: default, openai, gemini or ollama.
OPENAI_API_KEY Optional: OpenAI key for OpenAI embeddings.
GEMINI_API_KEY Optional: Gemini key for Gemini embeddings.
OLLAMA_BASE_URL Optional: Ollama server address (default http://localhost:11434).
ZOTERO_MCP_SCHEMA_REFRESH Optional: Set to 0 to stop the weekly item-schema refresh from api.zotero.org.
ZOTERO_APP Optional: Container only: server (default) or cli.
ZOTERO_TRANSPORT Optional: Container only: MCP transport when no arguments are given (stdio default).

What it does

Zotero MCP is a Python server that puts a Zotero reference library within reach of an MCP client such as Claude Desktop or ChatGPT. It can find items by keyword, tag, collection, full text or, with an optional index, by meaning; return metadata, BibTeX, full text and chosen PDF page ranges (as text or as page images when equations and tables come out garbled); and read, create, edit and delete PDF highlights, area annotations and notes.

It also writes to the library: new items from a DOI, URL, ISBN, BibTeX, CSL JSON or a local PDF/EPUB (fetching open-access PDFs where it can), collections and tags, item metadata, parent links, related-item links and duplicate merging. Optional tool groups add Scite citation counts and retraction checks, RSS feeds, group-library switching and a search/fetch pair for ChatGPT deep research. The ZOTERO_MCP_TOOLSETS setting decides which groups are exposed; the default profile has 38 tools.

It runs in four modes: local read-only against a running Zotero (reads come straight from zotero.sqlite), local read-write on Zotero 10+, the zotero.org web API, or a hybrid that reads locally and writes through the web API.

The same PyPI package, zotero-mcp-server, also ships zotero-cli with an agent skill for shell-capable agents, and the repository holds a Zotero Agent chat-panel plugin for Zotero itself; that plugin is licensed AGPL-3.0-or-later, while the server and CLI are MIT.

What it needs

RuntimePython 3.10+

Python 3.10 or later (installed with uv or pip), and the Zotero desktop app (7+) with 'Allow other applications on this computer to communicate with Zotero' turned on for local mode. Local writes need Zotero 10+ and a one-time authorization; on older Zotero, writes need a zotero.org API key and library ID. Semantic search, PDF layout and Scite need the optional extras; OpenAI or Gemini embeddings need those providers' keys.

Limits

Local mode is read-only unless Zotero is version 10+ and has granted a local key; otherwise writes need web API credentials. Searching across all libraries at once works only with the local SQLite backend and cannot be combined with collection filters. Many groups (Scite, duplicates, discovery, feeds, relations) are off by default and their tools are absent until enabled. Note management is marked beta. Annotation features were mainly tested with the Better BibTeX plugin and download extra tools on first use. The docs warn that the MCP route costs about 13,400 tokens of context per request with the default tools.

Who it suits

Suits researchers who keep papers in Zotero and want a chat client to search, read, cite and annotate them, especially in clients without a shell such as Claude Desktop or ChatGPT; it works offline against a local library with no account. For agents that have a shell (Claude Code, Cursor, Codex), its own docs recommend the bundled zotero-cli skill over the MCP server because it uses far less context. It is a community project, not from the Zotero team, and its write tools can delete annotations and merge items, so leave write access unauthorized if only reading is wanted.

Tools 57

zotero_search_items
Keyword search over item titles, creators, years and optionally abstracts
zotero_advanced_search
Search with several combined conditions
zotero_semantic_search
Find items by meaning using an embedding index
zotero_update_search_database
Build or refresh the semantic search index
zotero_get_search_database_status
Show the state and settings of the semantic index
zotero_get_collections
List the library's collections
zotero_get_collection_items
List the items in one collection
zotero_get_tags
List every tag in the library
zotero_get_recent
List items added most recently
zotero_search_by_tag
Filter items by tag conditions
zotero_get_item_metadata
Return an item's details as Markdown, raw JSON or BibTeX
zotero_get_item_fulltext
Return the full text of an item's attachment
zotero_get_item_children
List attachments and notes under one or more items
zotero_read_pdf_pages
Read chosen PDF pages as Markdown or images, optionally zoomed to a region
zotero_get_pdf_outline
Return a PDF's table of contents
zotero_get_page_layout
Locate figures, tables and equations on a PDF page with coordinates for annotation
zotero_get_annotations
Fetch annotations, including ones read directly from PDF files
zotero_synthesize_annotations
Compile a per-paper digest of annotations and notes
zotero_get_notes
List notes or search note and annotation text
zotero_create_annotation
Add a text highlight or an area box to a PDF
zotero_update_annotation
Edit an annotation's text, comment, colour or tags
zotero_delete_annotation
Remove an annotation permanently
zotero_manage_note
Create, edit or delete a note (beta)
zotero_authorize_local_writes
Ask the Zotero app for local write permission through a dialog
zotero_write_capabilities
Report which write route is available and how to enable one
zotero_add_by_doi
Create an item from a DOI, attaching an open-access PDF when found
zotero_add_by_url
Create an item from an arXiv, DOI or web page address
zotero_add_by_isbn
Create a book item from an ISBN
zotero_add_by_bibtex
Import items from BibTeX text or a .bib file
zotero_add_by_csl_json
Import items from CSL JSON text or a file
zotero_add_from_file
Import a local PDF or EPUB, detecting its DOI
zotero_attach_file
Attach a local file or PDF link to an existing item
zotero_set_item_parent
Set, change or clear an item's parent
zotero_create_collection
Make a new collection
zotero_update_collection
Rename or move a collection
zotero_search_collections
Find collections by name to get their keys
zotero_manage_collections
Add items to or remove them from collections
zotero_update_item
Change an item's fields such as title, tags, abstract or date
zotero_search_by_citation_key
Look up items by Better BibTeX citation key
zotero_export_bibliography
Export a bibliography for selected items
zotero_get_attachment_path
Return where an item's attachment file is stored
zotero_find_duplicates
Find items that look duplicated by title or DOI (opt-in group)
zotero_merge_duplicates
Merge duplicate items after a preview, keeping their children (opt-in group)
zotero_get_item_related
List an item's related-item links (opt-in group)
zotero_add_item_relation
Link two items as related in both directions (opt-in group)
zotero_remove_item_relation
Remove a related-item link (opt-in group)
zotero_find_related_papers
Suggest papers related to an item (opt-in group)
zotero_library_coverage
Assess how well the library covers a topic (opt-in group)
zotero_list_feeds
List RSS feed subscriptions (opt-in group)
zotero_get_feed_items
Read entries from a subscribed feed (opt-in group)
zotero_list_libraries
List personal and group libraries
zotero_switch_library
Change which library later calls work on
scite_enrich_item
Get Scite citation counts and retraction notices for one paper (opt-in group)
scite_enrich_search
Search the library with Scite data added to results (opt-in group)
scite_check_retractions
Check items for retractions and editorial notices (opt-in group)
search
Search endpoint for ChatGPT deep research, on by default over HTTP transports
fetch
Retrieve one record for ChatGPT deep research, paired with search

Similar servers