AFFiNE MCP Server
Read, write and organise AFFiNE workspaces, docs, databases and comments from an MCP client
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
Opens the app, which asks before it adds the server.
claude mcp add zotero -- zotero-mcp{
"mcpServers": {
"zotero": {
"command": "zotero-mcp",
"args": []
}
}
}{
"mcpServers": {
"zotero": {
"command": "zotero-mcp",
"args": []
}
}
}{
"servers": {
"zotero": {
"type": "stdio",
"command": "zotero-mcp",
"args": []
}
}
}[mcp_servers.zotero]
command = "zotero-mcp"
args = []gemini mcp add --scope user zotero zotero-mcpZOTERO_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). |
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.
| Runtime | Python 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.
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.
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.
zotero_search_itemszotero_advanced_searchzotero_semantic_searchzotero_update_search_databasezotero_get_search_database_statuszotero_get_collectionszotero_get_collection_itemszotero_get_tagszotero_get_recentzotero_search_by_tagzotero_get_item_metadatazotero_get_item_fulltextzotero_get_item_childrenzotero_read_pdf_pageszotero_get_pdf_outlinezotero_get_page_layoutzotero_get_annotationszotero_synthesize_annotationszotero_get_noteszotero_create_annotationzotero_update_annotationzotero_delete_annotationzotero_manage_notezotero_authorize_local_writeszotero_write_capabilitieszotero_add_by_doizotero_add_by_urlzotero_add_by_isbnzotero_add_by_bibtexzotero_add_by_csl_jsonzotero_add_from_filezotero_attach_filezotero_set_item_parentzotero_create_collectionzotero_update_collectionzotero_search_collectionszotero_manage_collectionszotero_update_itemzotero_search_by_citation_keyzotero_export_bibliographyzotero_get_attachment_pathzotero_find_duplicateszotero_merge_duplicateszotero_get_item_relatedzotero_add_item_relationzotero_remove_item_relationzotero_find_related_paperszotero_library_coveragezotero_list_feedszotero_get_feed_itemszotero_list_librarieszotero_switch_libraryscite_enrich_itemscite_enrich_searchscite_check_retractionssearchfetch