需先在 Zotero 7+ 设置→高级中勾选允许其他应用与 Zotero 通信;语义检索、PDF、Scite 等功能需另装 extras,基础安装不含;Zotero 10+ 写入需先运行 zotero-mcp authorize-local,旧版则要配置 ZOTERO_API_KEY 和 ZOTERO_LIBRARY_ID。
zotero-mcp
54yyyuMIT活跃维护把 Zotero 文献库接入 Claude 等 AI 助手的 MCP 服务,支持论文讨论、摘要生成、引用分析和语义检索。
Zotero MCP: Connects your Zotero research library with Claude and other AI assistants via the Model Context Protocol to discuss papers, get summaries, analyze citations, and more.
uv tool install zotero-mcp-server
zotero-mcp setupREADME 未说明硬件要求;仅要求 Python 3.10+,语义检索等可选功能依赖本地嵌入模型或 OpenAI、Gemini、Ollama 等外部服务。
把 Zotero 文献库接入 Claude、ChatGPT 等 AI 助手,让 AI 直接检索、阅读、标注和引用你的论文
把 Zotero 文献库接入 Claude 等 AI 助手的 MCP 服务,支持论文讨论、摘要生成、引用分析和语义检索。
核心能力
- 按标题、作者、标签、全文或语义检索文献库
- 读取 PDF 元数据、BibTeX、全文和指定页码范围
- 在原文精确位置添加高亮、区域框和笔记
- 按 DOI、URL、ISBN、BibTeX 或文件添加条目并管理合集标签
- 本地模式直接读 zotero.sqlite,写入走 Zotero 10+ 或 Web API
容易踩的坑
- v0.17.0最新正式版2026-11-10 · 2026-11-10 16:30 UTC
What's Changed
- chore(plugin): updates.json for 0.16.0 by @54yyyu in https://github.com/54yyyu/zotero-mcp/pull/807
- 0.17 (in progress): article and passage collections, plugin translations, older PRs by @54yyyu in https://github.com/54yyyu/zotero-mcp/pull/808
- perf(duplicates): count before paging, and page only the items that get compared by @danmackinlay in https://github.com/54yyyu/zotero-mcp/pull/507
- fix(extract): recover hidden OCR text on scanned pages by @FFXFF1 in https://github.com/54yyyu/zotero-mcp/pull/729
- feat(add): report the citation key when reusing an existing item by @danmackinlay in https://github.com/54yyyu/zotero-mcp/pull/509
- feat: copy items between libraries (#560) by @mronkko in https://github.com/54yyyu/zotero-mcp/pull/561
New Contributors
- @FFXFF1 made their first contribution in https://github.com/54yyyu/zotero-mcp/pull/729
Full Changelog: https://github.com/54yyyu/zotero-mcp/compare/v0.16.0...v0.17.0
- v0.16.02026-11-10 · 2026-11-10 00:02 UTC
查看更新说明
What's Changed
- chore(plugin): updates.json for 0.15.2 by @54yyyu in https://github.com/54yyyu/zotero-mcp/pull/759
- 0.16: token diet, faster CLI and batch edits, HTTP auth by @54yyyu in https://github.com/54yyyu/zotero-mcp/pull/760
- Add bearer authentication and bind safeguards for HTTP transports by @iamnotmili in https://github.com/54yyyu/zotero-mcp/pull/643
- feat(setup): ask about passage chunking in the semantic search wizard by @mronkko in https://github.com/54yyyu/zotero-mcp/pull/770
- feat(setup): offer current values as defaults when changing the config by @mronkko in https://github.com/54yyyu/zotero-mcp/pull/771
- feat(search): optionally return the full matched passage by @mronkko in https://github.com/54yyyu/zotero-mcp/pull/772
- refactor(cli): share one settings summary across setup, db-status and setup-info by @mronkko in https://github.com/54yyyu/zotero-mcp/pull/773
- fix(embeddings): keep OpenAI requests under the per-request token limit by @mronkko in https://github.com/54yyyu/zotero-mcp/pull/775
- fix(worker): keep the embedding function's settings and provider errors across the worker boundary by @mronkko in https://github.com/54yyyu/zotero-mcp/pull/781
Full Changelog: https://github.com/54yyyu/zotero-mcp/compare/v0.15.2...v0.16.0
- v0.15.22026-11-01 · 2026-11-01 00:32 UTC
查看更新说明
What's Changed
- chore(plugin): updates.json for 0.15.1 by @54yyyu in https://github.com/54yyyu/zotero-mcp/pull/718
- feat(plugin): callout cards for definitions, theorems and notes (0.15.2) by @54yyyu in https://github.com/54yyyu/zotero-mcp/pull/719
- Release 0.15.2 by @54yyyu in https://github.com/54yyyu/zotero-mcp/pull/758
- zotero-cli tags: address tag names containing commas, reach tagged attachments, add --item-keys, and stop limit truncating silently by @danmackinlay in https://github.com/54yyyu/zotero-mcp/pull/752
- feat(cli): edit arbitrary Zotero metadata fields with --field by @kskszq in https://github.com/54yyyu/zotero-mcp/pull/753
- feat(attach): add link_mode='linked' support to zotero_attach_file by @chendengji in https://github.com/54yyyu/zotero-mcp/pull/754
- fix(annotations): keep the page box origin on rotated pages, highlight a repeated quote once by @peterkibbel in https://github.com/54yyyu/zotero-mcp/pull/720
- feat(semantic): label each indexed passage with its paper section by @ArneBouten in https://github.com/54yyyu/zotero-mcp/pull/721
- feat(semantic): allow re-ranking through a hosted endpoint by @ArneBouten in https://github.com/54yyyu/zotero-mcp/pull/722
- fix(embeddings): load each HuggingFace model once per process (#726) by @Liu-Hy in https://github.com/54yyyu/zotero-mcp/pull/727
- fix(annotations): scope dry-run metadata to selected group by @dajiaohuang in https://github.com/54yyyu/zotero-mcp/pull/732
- feat(nix): add a flake for nix run and nix profile install by @Stefanomarton in https://github.com/54yyyu/zotero-mcp/pull/733
- feat(client): ZOTERO_API_URL for self-hosted Zotero Web API servers by @Stefanomarton in https://github.com/54yyyu/zotero-mcp/pull/734
- feat(embeddings): configurable max_input_tokens for OpenAI-compatible and Ollama providers by @Stefanomarton in https://github.com/54yyyu/zotero-mcp/pull/735
- fix(local_db): stop leaking database copies on Windows by @Hpartanen in https://github.com/54yyyu/zotero-mcp/pull/736
- fix(plugin): run Node's npm.cmd through node, not cmd.exe by @serdarucel in https://github.com/54yyyu/zotero-mcp/pull/737
- fix(search): find citation keys the web API's quick search misses by @jmajerus in https://github.com/54yyyu/zotero-mcp/pull/740
- fix: Local mode: when Zotero is closed, writes fail with a bare
[Errno 61] Connection refused, printed twice by @nandanadileep in https://github.com/54yyyu/zotero-mcp/pull/745 - feat(semantic): repair-db rebuilds an unreadable index without re-embedding (#747) by @mronkko in https://github.com/54yyyu/zotero-mcp/pull/748
- fix(semantic): report a damaged index as unreadable, with dates and what to run (#747) by @mronkko in https://github.com/54yyyu/zotero-mcp/pull/749
- feat(semantic): free the index's memory when semantic search is idle by @mronkko in https://github.com/54yyyu/zotero-mcp/pull/750
New Contributors
- @chendengji made their first contribution in https://github.com/54yyyu/zotero-mcp/pull/754
- @peterkibbel made their first contribution in https://github.com/54yyyu/zotero-mcp/pull/720
- @Liu-Hy made their first contribution in https://github.com/54yyyu/zotero-mcp/pull/727
- @dajiaohuang made their first contribution in https://github.com/54yyyu/zotero-mcp/pull/732
- @Stefanomarton made their first contribution in https://github.com/54yyyu/zotero-mcp/pull/733
- @Hpartanen made their first contribution in https://github.com/54yyyu/zotero-mcp/pull/736
- @serdarucel made their first contribution in https://github.com/54yyyu/zotero-mcp/pull/737
- @jmajerus made their first contribution in https://github.com/54yyyu/zotero-mcp/pull/740
- @nandanadileep made their first contribution in https://github.com/54yyyu/zotero-mcp/pull/745
Full Changelog: https://github.com/54yyyu/zotero-mcp/compare/v0.15.1...v0.15.2
- v0.15.12026-10-16 · 2026-10-16 20:57 UTC
查看更新说明
What's Changed
- chore(plugin): updates.json for Zotero Agent 0.15.0 by @54yyyu in https://github.com/54yyyu/zotero-mcp/pull/710
- Update the website automatically on release tags by @54yyyu in https://github.com/54yyyu/zotero-mcp/pull/711
- release: 0.15.1 (PMID import, plugin refit, text-selection and upload fixes) by @54yyyu in https://github.com/54yyyu/zotero-mcp/pull/717
- fix(semantic): fit passages to the embedding model and warn when fulltext is cut by @54yyyu in https://github.com/54yyyu/zotero-mcp/pull/712
- fix(import): write native PMID/PMCID fields from BibTeX and CSL JSON by @rizakardas in https://github.com/54yyyu/zotero-mcp/pull/713
- feat(add): add items by PubMed ID (add_by_pmid, zotero-cli add pmid) by @rizakardas in https://github.com/54yyyu/zotero-mcp/pull/714
- fix(attach): send text/yaml on the default upload path (#703 follow-up) by @lots-o in https://github.com/54yyyu/zotero-mcp/pull/715
- fix(plugin): allow selecting chat text by @IceGiraffe in https://github.com/54yyyu/zotero-mcp/pull/716
New Contributors
- @rizakardas made their first contribution in https://github.com/54yyyu/zotero-mcp/pull/713
- @IceGiraffe made their first contribution in https://github.com/54yyyu/zotero-mcp/pull/716
Full Changelog: https://github.com/54yyyu/zotero-mcp/compare/v0.15.0...v0.15.1
- v0.15.02026-10-15 · 2026-10-15 20:45 UTC
查看更新说明
Added
- The open-access PDF cascade asks OpenAlex for repository copies. When
zotero_add_itemor a batch import attaches a PDF for a DOI, it now tries everypdf_urlOpenAlex lists after Unpaywall and before the publisher'scitation_pdf_url, open-access locations first. OpenAlex knows institutional repository copies that Unpaywall does not count as open access. For Maraun 2013 in J. Climate, DOI 10.1175/jcli-d-12-00821.1, Unpaywall has nothing and the AMS page offers a 2-page preview, while OpenAlex lists the full 7-page PDF in the GEOMAR repository. A URL already tried under one source is not downloaded again under the next. Thanks @phil-c137. - Markdown and YAML files can be attached (#703).
zotero-cli attachandadd fileaccept.md,.yamland.yml, stored astext/markdownandtext/yamlso Zotero's own full-text indexer picks them up..jsonstays a CSL-JSON import. Requested by @rizakardas. zotero-cli --json get fulltextsays when a read was cut short (#701).data.truncatedis always present, and a capped read addspages_readandpage_count, so a script no longer has to parse the TRUNCATED heading out ofdata.text.
Changed
- Semantic search is its own toolset, and hidden on installs without the
[semantic]extra (#572, #689).zotero_semantic_searchmoves from core into a newsemantictoolset that is on by default, so default installs see no change.ZOTERO_MCP_TOOLSETS=nonenow leaves it out too; usenone,semanticto keep it. A spec that usesnonewithout namingsemanticlogs one warning at startup saying so;none,-semanticleaves it out without the warning.semanticandsearch-adminare left out automatically when ChromaDB isn't installed, so a base install no longer advertises tools that can only reply with install instructions; naming them inZOTERO_MCP_TOOLSETSkeeps them. The connectorsearchkeeps its keyword fallback. Reported by @zhuziqi97; thanks @falcon1-1-code. - The literature-review and contradicting-evidence prompts fall back to
zotero_search_itemswhen semantic search is not usable (#693).zotero_literature_reviewandzotero_find_contradicting_evidencealways told the model to callzotero_semantic_search, which fails without the[semantic]extra and is absent when a toolset spec leaves it out. They now check at render time (ChromaDB found withfind_spec, not imported, and the tool's toolset enabled) and otherwise namezotero_search_itemswithqmode='everything', one key term per query. With semantic search usable the text is unchanged. Thanks @falcon1-1-code. zotero_advanced_searchrejects a field name it does not know (#694). A typo such astitelwas a valid-looking condition that matched nothing, so the tool answered "No items found matching the search criteria" and the mistake went unnoticed. It now returns an error naming the field, up to three close matches (Did you mean: title?) and the supported operations. Thanks @falcon1-1-code.zotero_advanced_searchaccepts a single condition sent as a bare object (#695).{"field": "title", "operation": "contains", "value": "x"}instead of a list of one was rejected with a raw pydantic "Input should be a valid list" error, and the same object as a JSON string answered "No search conditions provided". It is now read as a one-condition list. An empty object is still an error. Thanks @falcon1-1-code.
Fixed
- A startup semantic update no longer holds up the MCP handshake (#706). With
auto_update: trueandupdate_frequency: "startup"(or a duedailyrun), the server ran the update in a worker thread of its own process, where native calls that hold the GIL (ChromaDB, loading or downloading the embedding model) and, on Windows, DLL loads stall the event loop as well: Claude Desktop'sinitializewent unanswered until the update finished, timed out, and shut the server down. The update now runs as a childzotero-mcp update-dbproces
- The open-access PDF cascade asks OpenAlex for repository copies. When
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Zotero MCP connects your Zotero research library with ChatGPT, Claude, and other AI assistants (e.g., Cherry Studio, Chorus, Cursor) via the Model Context Protocol. Search your library, read and annotate papers, add and organize items, and find research by meaning.
AI agents: read docs/for-agents.md first. It covers which route to use, setup, and the commands in one place.
Three ways in
One package, zotero-mcp-server, ships all three. Pick the one that fits where you work.
| MCP server | zotero-cli + agent skill | Zotero Agent | |
|---|---|---|---|
| For | Chat apps that speak MCP but have no shell: Claude Desktop, ChatGPT, Cherry Studio, Chorus | Agents with a shell: Claude Code, Codex, Cursor, Windsurf, Gemini CLI, Amp, OpenCode | Chatting inside Zotero, next to the PDF you are reading |
| How | zotero-mcp setup | zotero-mcp install-skill | zotero-cli plugin, then install the .xpi in Zotero |
| Why | Works in any MCP client | 98 tokens in context until it is needed, instead of ~17k | Knows the item, page and selection you have open; answers link to pages |
| Guide | Getting started | CLI and agent skill | Zotero Agent plugin |
What it does
- Search by title, author, tag, collection, full text, or meaning (semantic search with local, OpenAI, Gemini, or Ollama embeddings)
- Read metadata, BibTeX, full text, and page ranges of PDFs, with page images where text extraction garbles math, figures, and tables
- Annotate: highlights and area boxes placed on the exact words, figure, table, or equation; notes; PDF annotation extraction
- Write: add papers by DOI, URL, ISBN, BibTeX, or file (with open-access PDFs), manage collections and tags, merge duplicates
- Local or web: in local mode reads come straight from
zotero.sqlite; writes go to the running Zotero 10+ or through the web API - Scite citation tallies and retraction alerts (optional)
Quick start
1. Install (Python 3.10+):
uv tool install zotero-mcp-server # or: pip install zotero-mcp-server
New to the command line? Try the community-built Zotero MCP Setup: a macOS GUI installer, one-click scripts for Mac and Windows, and a step-by-step guide.
2. Enable Zotero's local API: in Zotero 7+, open Settings → Advanced and tick Allow other applications on this computer to communicate with Zotero.
3. Connect your assistant:
zotero-mcp setup # auto-configures Claude Desktop
or add the server by hand to claude_desktop_config.json:
{
"mcpServers": {
"zotero": {
"command": "zotero-mcp",
"env": { "ZOTERO_LOCAL": "true" }
}
}
}
Teach the agent to drive zotero-cli (the cheaper route, see below):
zotero-mcp install-skill
Or use the MCP server: for Claude Code, add the same mcpServers entry as above to ~/.claude.json.
See Getting started.
zotero-cli plugin # where the .xpi is, and how to install it
Then in Zotero: Tools > Plugins, the gear, Install Plugin From File. Details: Zotero Agent plugin.
4. Writes (optional): on Zotero 10+, run zotero-mcp authorize-local once and choose Always Allow. On older Zotero, add ZOTERO_API_KEY and ZOTERO_LIBRARY_ID to write through the web API.
Then ask things like "Find papers in my library on attention mechanisms", "Summarize the key findings of this paper", or "Highlight the main claims of this PDF".
Optional extras
The base install covers search, reading, annotations, and writes. Heavier features are extras:
| Extra | What it adds | Install command |
|---|---|---|
semantic | Semantic search via ChromaDB, sentence-transformers, OpenAI/Gemini embeddings | pip install "zotero-mcp-server[semantic]" |
pdf | PDF outlines, page layout and page images (PyMuPDF), EPUB annotations | pip install "zotero-mcp-server[pdf]" |
scite | Scite citation tallies and retraction alerts (no account needed) | pip install "zotero-mcp-server[scite]" |
all | Everything above | pip install "zotero-mcp-server[all]" |
Update any time with zotero-mcp update.
MCP server or agent skill?
If your agent has a shell (Claude Code, Cursor, Codex, Windsurf, Gemini CLI, Amp, OpenCode …), one command teaches it to drive zotero-cli:
zotero-mcp install-skill
An MCP server sends every tool's schema on every request, before you type anything. The skill costs 98 tokens until the agent decides it is relevant:
| Route | In context | Paid |
|---|---|---|
| MCP server, default profile (41 tools) | 16,815 | every request |
| MCP server, all tools (53) | 20,942 | every request |
| Agent skill, frontmatter only | 98 | always |
| Agent skill, body loaded | 2,400 | when it fires |
| Agent skill + full command reference | 6,158 | worst case |
Use the MCP server when your client speaks MCP but has no shell (Claude Desktop, ChatGPT); use the skill when it has a shell. Both share one config. Details: CLI and agent skill.
Zotero Agent: chat inside Zotero
A plugin that adds a chat panel to Zotero itself, driven by your own Claude Code, Codex or pi. It knows which item and page you have open and works your library through zotero-cli. Answers cite papers with real zotero:// links, so a click opens the PDF at that page. It ships in the wheel: run zotero-cli plugin for the file and the install steps, or paste the one-paragraph prompt in the docs to your agent and let it do the setup. Details: Zotero Agent plugin.
Documentation
| Guide | What's in it |
|---|---|
| Getting started | Connecting Claude Desktop and Claude Code, ChatGPT, Cherry Studio, Chorus, Autohand, and other MCP clients |
| Configuration | Environment variables, local writes, web and hybrid modes, the SQLite read backend, global search, text extraction, command-line options |
| Semantic search | Embedding models, building and updating the index |
| Tools | Every MCP tool, tool groups (ZOTERO_MCP_TOOLSETS), related items, PDF annotation extraction |
| CLI and agent skill | zotero-cli command reference, --json output, install-skill |
| Zotero Agent plugin | The chat panel inside Zotero: install, first run, agents and sign-in, privacy |
| Docker | Container images and runtime modes |
| Troubleshooting | Common problems and fixes |
| For AI agents | One guide for an agent setting up or using Zotero MCP |
Website: stevenyuyy.com/zotero-mcp · Changelog
Contributing
Issues and pull requests are welcome. Run the tests with uv run pytest tests/. A live integration test plan, meant to be run by Claude against a real library, is in docs/integration-test-plan.md. Changes to the plugin in plugin/ (AGPL-3.0) are accepted on the condition that the maintainer may also release them under other terms, including commercial ones.
Thanks to everyone who has contributed code, fixes, and ideas to Zotero MCP.
Support
Zotero MCP is free and open source.
If it saves you or your lab time, sponsoring helps cover the unglamorous parts: Windows and WSL2 edge cases, Zotero schema changes, group-library support, and the embedding/search infrastructure.
Labs and institutions: the $50 and $200 tiers are meant to be expensable, and include priority triage on the issues affecting your workflow.
License
The MCP server and zotero-cli are MIT (LICENSE). The Zotero Agent plugin in plugin/ is AGPL-3.0-or-later (plugin/LICENSE), the license Zotero itself uses.