Zotero MCP

io.github.54yyyu由 GitHub 帳號 54yyyu 發布v0.15.2更新於 Nov 1, 2026

Search, read, annotate, and add to your Zotero research library, local or web.

概覽

AI 產生的概覽

把 AI 助理連接到 Zotero 研究文獻庫,可搜尋、閱讀、引用、註記與新增文獻,支援本機或 Web API 模式。

可以做什麼
  • 依標題、作者、標籤、分類、引用鍵或結構化欄位搜尋與瀏覽文獻庫,並列出最近項目、文獻庫與分類
  • 讀取項目中繼資料、全文、PDF 目錄與指定頁碼範圍,並取得本機附件路徑
  • 建立、修改與刪除螢光標記、區域註記、便箋與子筆記,並把註記彙整成依論文分組的素材
  • 透過 DOI、URL、ISBN、BibTeX、CSL JSON 或檔案新增項目、附加檔案,並批次修改中繼資料、標籤與分類歸屬
  • 管理分類(新增、重新命名、移動、刪除),並用 Zotero 的 CSL 引擎產生格式化參考文獻或文中引用
適用情境
適合把研究資料放在 Zotero、並希望助理在對話中尋找論文、閱讀或摘要、加上螢光標記與筆記、整理文獻回顧,或新增與歸類參考文獻的情境。
執行需求
以本機 Python 套件執行(需 Python 3.10+),透過 uvx 或 pip 安裝。本機讀取模式需 Zotero 7+ 並在設定中啟用本機 API;Web 模式需 ZOTERO_API_KEY 與 ZOTERO_LIBRARY_ID,個人或群組文獻庫另需 ZOTERO_LIBRARY_TYPE。選用擴充提供語意搜尋、PDF 頁面功能與 Scite 資料。Zotero 10+ 的寫入需一次性本機授權。
安裝前請注意
寫入工具會改動真實文獻庫:註記刪除無法復原,分類刪除會連同子分類一併硬刪除,項目會被移到資源回收筒。ZOTERO_API_KEY 可存取你的 Zotero 帳號,應盡量縮小權限範圍。全文讀取會消耗大量 token;使用 OpenAI 或 Gemini 嵌入的語意搜尋會把文獻內容傳送給這些服務,選用的 Scite 查詢也會存取外部服務。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Zotero MCP,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[Zotero MCP logo]

Zotero MCP: Chat with your Research Library in Claude, ChatGPT, and more

Your Zotero library, in every AI agent.
Search, read, cite and annotate your papers from Claude, ChatGPT, Codex, Cursor, or a chat panel inside Zotero.

Install · Docs · Zotero Agent · Discord

[PyPI version] [Downloads] [Discord] [MIT license]

[Zotero with "Attention Is All You Need" open on page 4. The Zotero Agent panel on the right explains why the dot products are scaled by the square root of d_k, with page citations; clicking one has highlighted the cited sentence in the PDF.]
Zotero Agent explaining a paper with page citations. A click on a citation opens the page and flashes the cited sentence.

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 serverzotero-cli + agent skillZotero Agent
ForChat apps that speak MCP but have no shell: Claude Desktop, ChatGPT, Cherry Studio, ChorusAgents with a shell: Claude Code, Codex, Cursor, Windsurf, Gemini CLI, Amp, OpenCodeChatting inside Zotero, next to the PDF you are reading
Howzotero-mcp setupzotero-mcp install-skillzotero-cli plugin, then install the .xpi in Zotero
WhyWorks in any MCP client98 tokens in context until it is needed, instead of ~17kKnows the item, page and selection you have open; answers link to pages
GuideGetting startedCLI and agent skillZotero 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+):

bash
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:

Claude Desktop
bash
zotero-mcp setup      # auto-configures Claude Desktop

or add the server by hand to claude_desktop_config.json:

json
{  "mcpServers": {    "zotero": {      "command": "zotero-mcp",      "env": { "ZOTERO_LOCAL": "true" }    }  }}
Claude Code, Codex, Cursor and other agents with a shell

Teach the agent to drive zotero-cli (the cheaper route, see below):

bash
zotero-mcp install-skill

Or use the MCP server: for Claude Code, add the same mcpServers entry as above to ~/.claude.json.

ChatGPT, Cherry Studio, Chorus, Autohand and other clients

See Getting started.

Zotero itself (the Zotero Agent chat panel)
bash
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:

ExtraWhat it addsInstall command
semanticSemantic search via ChromaDB, sentence-transformers, OpenAI/Gemini embeddingspip install "zotero-mcp-server[semantic]"
pdfPDF outlines, page layout and page images (PyMuPDF), EPUB annotationspip install "zotero-mcp-server[pdf]"
sciteScite citation tallies and retraction alerts (no account needed)pip install "zotero-mcp-server[scite]"
allEverything abovepip 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:

bash
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:

RouteIn contextPaid
MCP server, default profile (41 tools)16,815every request
MCP server, all tools (53)20,942every request
Agent skill, frontmatter only98always
Agent skill, body loaded2,400when it fires
Agent skill + full command reference6,158worst 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.

[Zotero's library view with a Deep Learning collection. The Zotero Agent panel answers which papers in the library trace how attention replaced recurrence, linking Bahdanau et al. 2015, Vaswani et al. 2017 and Devlin et al. 2019.]

Documentation

GuideWhat's in it
Getting startedConnecting Claude Desktop and Claude Code, ChatGPT, Cherry Studio, Chorus, Autohand, and other MCP clients
ConfigurationEnvironment variables, local writes, web and hybrid modes, the SQLite read backend, global search, text extraction, command-line options
Semantic searchEmbedding models, building and updating the index
ToolsEvery MCP tool, tool groups (ZOTERO_MCP_TOOLSETS), related items, PDF annotation extraction
CLI and agent skillzotero-cli command reference, --json output, install-skill
Zotero Agent pluginThe chat panel inside Zotero: install, first run, agents and sign-in, privacy
DockerContainer images and runtime modes
TroubleshootingCommon problems and fixes
For AI agentsOne 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.

[Contributors to Zotero MCP]

[Star history of 54yyyu/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.

[Sponsor on GitHub] [Buy Me a Coffee]

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.

來源:README.md,提交 f3f01a4

工具

38

zotero_get_annotations

Zotero Get Annotations

Get annotations (highlights and attached notes on PDF/EPUB attachments) for a specific item or across the active Zotero library. item_key: pass the parent item key OR an attachment key — both work; attachment-to-parent resolution is automatic. ALWAYS pass item_key when you know which item you want; calling without it returns every annotation in the library (potentially thousands). use_pdf_extraction=True falls back to direct PDF parsing when the Zotero API has no stored annotation record — useful for annotations made outside Zotero desktop. limit: cap on annotations returned; None (default) returns all. format='markdown' (default) returns a readable list; format='json' returns normalized records with stable keys for downstream scripts and other MCP tools. Uses Better BibTeX when Zotero desktop is running locally, otherwise the Zotero web API. Example: zotero_get_annotations(item_key='ABC12345') → every highlight/note on that paper.

輸入參數limitformatitem_keyuse_pdf_extraction

zotero_get_notes

Zotero Get Notes

Read notes from the active Zotero library. Omit query to LIST notes: with item_key, that item's child notes; without it, notes library-wide (capped by limit). Pass query to SEARCH note and annotation text instead — case-insensitive substring over the stripped-text body, library-wide, so query and item_key cannot be combined. limit: max results (default 20). truncate=True (default) shortens long bodies for display; pass False for complete content (list mode only). raw_html=True returns a note's original HTML instead of stripped text — use it when you intend to edit and round-trip via zotero_manage_note(action='update'). Scope: active library only (zotero_switch_library to change). Example: zotero_get_notes(item_key='ABC12345', raw_html=True); zotero_get_notes(query='mindfulness').

輸入參數limitqueryitem_keyraw_htmltruncate

zotero_manage_note

Zotero Manage Note

Create, update, or trash a Zotero note. item_key: the PARENT item's key for action='create', the NOTE's own key for 'update' and 'delete' (zotero_get_notes finds it). create: needs note_text — Markdown with $math$, plus <u> <s> <sub> <sup> <mark> <span style="color:red"> (or background-color), converted to note HTML; HTML input is sanitized. note_title becomes a heading; tags optional. update: needs note_text (Markdown or HTML, as for create). append=False (default) REPLACES the whole body, append=True adds to the end. To keep existing formatting, fetch with zotero_get_notes(raw_html=True), edit that HTML, and pass it back whole. delete: moves the note to the Trash — recoverable; emptying the Trash is manual in Zotero. Notes only, not items/collections/attachments. Requires a writable library: local writes (Zotero 10+, via zotero_authorize_local_writes) or a web API key. Example: (action='create', item_key='ABC12345', note_title='Reading notes', note_text='<p>Key claim ...</p>').

輸入參數tagsaction必填appenditem_key必填note_textnote_title

zotero_create_annotation

Zotero Create Annotation

Create an annotation on a PDF attachment (EPUB: highlights only). Exactly one mode per call: text= HIGHLIGHTS selectable text; rect= draws an AREA box over a figure, table, or other non-text region (PDF only); note=[x, y] places a STICKY NOTE centered on that normalized point, its text in comment (PDF only). Passing several or none is an error. attachment_key: the PDF/EPUB attachment key, NOT the parent item key (zotero_get_item_children finds it). page: 1-indexed page (EPUB: 1-indexed chapter). text: exact text to highlight, matched against the text layer — scanned/image-only PDFs will not match. rect: [x, y, width, height] normalized to [0, 1], with (0, 0) at the page's top-left; width/height are page-relative and the box must fit the page. Call zotero_get_page_layout first and reuse a detected region's bbox instead of guessing coordinates. comment, color (hex, default '#ffd400'), tags: optional. Requires PyMuPDF (the [pdf] extra) and a writable library: local writes (Zotero 10+) or a web API key. Examples: (attachment_key='NHZFE5A7', page=4, text='working memory'); (attachment_key='NHZFE5A7', page=7, rect=[0.15, 0.22, 0.6, 0.35], comment='Figure 3').

輸入參數notepage必填recttagstextcolorcommentattachment_key必填

zotero_get_page_layout

Zotero Get Page Layout

Detect candidate figure/table regions on a PDF page and return their normalized bounding boxes, so area annotations can be placed on detected content instead of guessed positions. ALWAYS call this before zotero_create_annotation's area mode unless exact coordinates are already known. Returns each region's bounding box (x, y, width, height in [0, 1]), source (image/drawing/table/merged), associated caption (e.g. 'Figure 3: ...'), confidence level, and a ready-to-paste zotero_create_annotation call. Note: detection is geometric — boxes cover the graphical core of a figure/table; text labels inside figures or unruled table headers may fall outside the box. Confidence reflects caption matching, not box completeness. attachment_key: PDF attachment key — NOT the parent item key (use zotero_get_item_children to find attachments). page: 1-indexed page number (page 1 is the first page). Scope: PDFs only — EPUB attachments are NOT supported. Read-only: works in both local and web API modes. Example: zotero_get_page_layout(attachment_key='NHZFE5A7', page=7).

輸入參數page必填attachment_key必填

zotero_update_annotation

Zotero Update Annotation

Update an existing Zotero annotation. Editable fields: text (highlight text), comment, color (hex like '#ffd400'), and tags. Tags can be replaced wholesale via `tags`, or edited incrementally via `add_tags`/`remove_tags` (mutually exclusive with `tags`). Position/page/sortIndex are anchored to the PDF/EPUB geometry and are not editable.

輸入參數tagstextcolorcommentadd_tagsremove_tagsannotation_key必填

zotero_delete_annotation

Zotero Delete Annotation

Permanently delete a Zotero annotation. This cannot be undone. Annotations are deleted outright, as Zotero's own PDF reader does: a trashed annotation stays visible in the reader with no way to remove it there.

輸入參數annotation_key必填

zotero_get_item_metadata

Zotero Get Item Metadata

Fetch detailed metadata (title, creators, date, DOI, publisher, tags, abstract, URL, etc.) for ONE Zotero item by key. If the metadata and abstract don't contain what you need, call zotero_get_item_fulltext to read the paper — but that is resource-intensive (10K+ tokens) and should NEVER be used for searching; use zotero_search_items or zotero_semantic_search instead. item_key: the 8-character Zotero item key (NOT a DOI or title). include_abstract=True (default) includes the abstractNote in markdown output; pass False to trim tokens when you don't need it. (Ignored in bibtex/json formats.) format='markdown' (default) returns a human-readable block; format='json' returns the complete raw Zotero item record; format='bibtex' returns a BibTeX citation string suitable for .bib files. Scope: active library only (switch with zotero_switch_library). Unlike list endpoints, this returns items EVEN IF THEY ARE IN THE TRASH — a Status: In Trash line is surfaced when the item is trashed (recoverable via the Zotero UI). Collection membership is shown as keys rather than a bare count so the caller can verify entries against zotero_search_collections (the Zotero API does not cascade collection-delete to items, so dangling references can linger). Example: zotero_get_item_metadata(item_key='RTKZQI8E', format='bibtex').

輸入參數formatitem_key必填include_abstract

zotero_get_item_fulltext

Zotero Get Item Fulltext

Return the extracted text of a Zotero item's primary attachment (PDF or EPUB). WARNING: returns most or all of the paper (often 10K+ tokens). Use ONLY when the user explicitly wants to READ the paper — not for searching or browsing. For topic search use zotero_semantic_search; for metadata only use zotero_get_item_metadata. PDFs are read up to fulltext_display_max_pages (10 by default); when that cuts a document short the heading names the page range and TRUNCATED — read on with zotero_read_pdf_pages. Avoid calling this on multiple papers in one conversation unless the user specifically asked to read several. item_key: 8-character Zotero item key. Normally the parent item — the tool locates the attached PDF/EPUB itself, preferring PDF unless attachment_priority says otherwise. Passing an attachment's own key instead reads exactly that file and skips the priority order, which is how you read one specific attachment of an item that has several (find keys via zotero_get_item_children). Scope: active library only. Extraction path (in order): local Zotero storage via SQLite when running in local mode (fastest, respects pdf_max_pages config); Zotero's server-side fulltext index; direct download and parsing as a last resort. Image-only scanned PDFs without OCR may return little or no text. Example: zotero_get_item_fulltext(item_key='RTKZQI8E').

輸入參數item_key必填

zotero_get_attachment_path

Zotero Get Attachment Path

Return the local filesystem path(s) of a Zotero item's attachments. Local mode only. Useful when you want to read a large PDF directly (e.g., a book) instead of going through zotero_get_item_fulltext, which is page-limited.

輸入參數item_key必填

zotero_get_collections

Zotero Get Collections

List all collections in the currently active Zotero library as a hierarchical tree (parents and nested subcollections, each with its 8-character key). Use this when the user wants to see the full library structure. If you already know a name and just need the key, prefer zotero_search_collections — it returns only matches. Scope is limited to the active library — switch libraries with zotero_switch_library before listing. Deep hierarchies render inline without truncation, so very deep trees can be long. limit: cap on collections returned; pass None (default) to use 100, or raise to 5000 for libraries with thousands of collections. include_trashed: when True, also show collections in the Zotero Trash (annotated as such). Default False, matching Zotero desktop's default view. Example output: - **Orals** (Key: MT53KB66) - **Early America** (Key: 3249BZKE) - **I. Historiography & Methodology** (Key: XFN79DUT)

輸入參數limitinclude_trashed

zotero_get_collection_items

Zotero Get Collection Items

Get all items in a specific Zotero collection. Supports detail='keys_only' (minimal), 'summary' (default, no abstracts), or 'full' (with abstracts). Includes PDF/notes indicators. include_subcollections=True also returns items filed in collections nested beneath this one (default False, matching Zotero's own 'Search subcollections' checkbox). For a collection larger than limit, page through it with offset (the response names the next offset to pass). TIP: To find papers on a specific topic, use zotero_semantic_search instead — it's faster and returns only relevant results.

輸入參數limitdetailoffsetcollection_key必填include_subcollections

zotero_get_item_children

Zotero Get Item Children

List the child items (attachments, notes, annotations under an attachment) of one OR MANY parent Zotero items. Use it to find an item's PDF/EPUB attachment key before zotero_create_annotation or zotero_get_pdf_outline — those take an attachment key, NOT the parent item key. item_key: one 8-character parent key, or an ARRAY of keys (a JSON-encoded list string also works). Pass every key you have in ONE call: a batch is one API round trip instead of N, and a bad key is reported in its own section instead of aborting. Returns markdown — one key: attachments (content type, filename) and notes in full under the parent title; several keys: one compact line per child, grouped under each parent. Scope: active library only. Examples: zotero_get_item_children(item_key='RTKZQI8E'); zotero_get_item_children(item_key=['RTKZQI8E', '9UZR8GXT']).

輸入參數item_key必填

zotero_get_tags

Zotero Get Tags

List all tags used in the currently active Zotero library, as a flat markdown list (one tag per line). Use this for tag discovery before filtering with zotero_search_by_tag or batch-editing with zotero_batch_update. Scope is the active library only — switch with zotero_switch_library before listing. The list is flat: tags have no parent/child structure in Zotero, only a colon convention ("area/subtag") that this tool preserves verbatim. limit: cap on tags returned; None (default) returns all. Example output: - to-read - methods/qualitative - AI agents

輸入參數limit

zotero_list_libraries

Zotero List Libraries

List every Zotero library this MCP can address: the user's personal library (switch to it with library_type='user'), all group libraries the user is a member of (with groupID), and (in local mode) RSS feed libraries. Each entry shows the library/group ID, display name, and item count. Use this to discover a library ID before calling zotero_switch_library — the two form a read-then-switch workflow. If the user only wants to see Zotero collections inside the CURRENT library, use zotero_get_collections instead. No parameters. In local mode: reads the local Zotero SQLite DB (fast, includes RSS feeds). In web mode: queries /groups via the Zotero web API (no feeds). Read-only; no side effects. The active library isn't flagged in the output — track it yourself from the last successful zotero_switch_library call (or the ZOTERO_LIBRARY_ID env var if none). Example: zotero_list_libraries().

無需輸入參數。

zotero_switch_library

Zotero Switch Library

Switch the active library context. EVERY subsequent read/write tool call (collections, items, annotations, search — all of them) operates on the library set here. Changes persist for the rest of the session or until the next switch. Discover valid library IDs/types via zotero_list_libraries first; don't guess. library_id: library ID string as returned by zotero_list_libraries (numeric for user/group, numeric for feeds); for the personal library 'user' or '0' also work. library_type: 'user' — the personal library; 'group' (default) — a group library; 'feeds' — a local RSS feed library; 'default' — RESET to whatever the ZOTERO_LIBRARY_ID / ZOTERO_LIBRARY_TYPE env vars configure (library_id is ignored in this mode). Fails fast if the library_id isn't accessible under the current credentials. Example: zotero_switch_library(library_id='5294983', library_type='group') or zotero_switch_library(library_id='', library_type='default').

輸入參數library_id必填library_type

zotero_get_recent

Zotero Get Recent

List the most recently ADDED items (by dateAdded) in the active library, optionally scoped to a single collection. Use this for 'what did I add recently?' questions — NOT for general topic search (use zotero_semantic_search) or for a collection's full contents (use zotero_get_collection_items). limit: how many recent items to return (default 10). collection_key: optional 8-character collection key to restrict results to that collection; when omitted, returns the N most recent items across the whole library. Ordering is dateAdded DESC. All item types are returned, INCLUDING standalone notes and attachments — so results can mix papers, notes, and loose PDFs. If you only want parent items, filter client-side by itemType in the output. Scope: active library only (switch with zotero_switch_library). Example: zotero_get_recent(limit=20) or zotero_get_recent(collection_key='MT53KB66', limit=5).

輸入參數limitcollection_key

zotero_set_item_parent

Zotero Set Item Parent

Set or clear the parent of a Zotero item. Pass a parent item key to assign or change the parent, or null to make the item top-level. Zotero validates whether the requested parent-child relationship is allowed.

輸入參數item_key必填parent_key必填

zotero_authorize_local_writes

Zotero Authorize Local Writes

Request permission to write to the local Zotero library (Zotero 10+). BLOCKS until the user answers a dialog that appears in the Zotero app, so tell them to switch to Zotero before calling this. "Always Allow" grants a reusable key that is saved for future sessions; "Allow" grants a key good for exactly ONE write. Call this when a write tool reports that no writable backend is configured and zotero_write_capabilities says the server supports local writes but no key is held. Not needed in web API mode. app_name: the name shown to the user in the dialog. timeout: seconds to wait for the answer (5-55, default 45). Zotero rate-limits this to about 5 prompts per minute — do not retry in a loop. Example: zotero_authorize_local_writes().

輸入參數timeoutapp_name

zotero_write_capabilities

Zotero Write Capabilities

Report whether and how this server can write to Zotero: local API, web API, hybrid (local reads + cloud writes), or nothing. Read-only and instant — it never opens a dialog. Call it when a write tool reports that no writable backend is configured, to find out which fix applies before asking the user for anything: if the local server supports writes but no key is held, call zotero_authorize_local_writes; otherwise web API credentials are needed. Takes no arguments. Example: zotero_write_capabilities().

無需輸入參數。

zotero_read_pdf_pages

Zotero Read Pdf Pages

Read specific page range(s) from a PDF attachment of a Zotero item. Use this when you know which pages to read — for example after getting the PDF outline via zotero_get_pdf_outline. Pages are 1-indexed. format='text' (default) returns Markdown with the heading structure preserved and flags pages whose equations, figures or tables the text garbles. format='image' returns the pages as PNG images (up to 10) so those can be read exactly; rect=[x, y, width, height] (normalized 0-1, e.g. from zotero_get_page_layout) returns just that region of start_page, zoomed in.

輸入參數rectformatend_pageitem_key必填start_page必填

zotero_search_items

Zotero Search Items

Search Zotero items by substring match against metadata (title, creators, year, and — in 'everything' mode — abstract). Returns metadata + abstracts as markdown. IMPORTANT: keep queries SHORT and SIMPLE — 'Author Year' (e.g. 'Brewer 2011') or just an author name ('Cladder-Micus'). This is substring matching, not web search: each extra word NARROWS the match, so adding topic words usually returns fewer results, not more. For topic discovery, use zotero_semantic_search instead; for tag filtering use zotero_search_by_tag. If a query finds nothing, this tool automatically falls back to simplified queries and then semantic search. query: required substring. qmode: 'titleCreatorYear' (default) matches only title/authors/year; 'everything' also searches abstract. item_type: '-attachment' (default) excludes attachments; pass 'journalArticle', 'book', etc. to filter. tag: optional list of tag conditions (ANDed). limit: max results (default 10). collection_key: 8-char key to restrict to a collection (bypasses the fallback cascade). include_subcollections: also search collections nested beneath it (default False). search_all_libraries: search personal + all group libraries at once, labelling each result with its library — use it when you don't know which library holds the item. Needs the SQLite backend (the default in local mode); excludes collection_key. Example: zotero_search_items(query='Cladder-Micus') or zotero_search_items(query='Brewer 2011', search_all_libraries=True).

輸入參數taglimitqmodequery必填item_typecollection_keysearch_all_librariesinclude_subcollections

zotero_search_by_tag

Zotero Search By Tag

Find items carrying one or more tags, with boolean syntax support. tag: list of tag strings; each entry is a condition ANDed with the others, and within an entry you can use ' OR ' for disjunction and a leading '-' for exclusion. Example: tag=['methods OR methodology', '-draft'] matches items tagged 'methods' OR 'methodology' AND NOT tagged 'draft'. item_type: '-attachment' (default) excludes attachments; pass 'journalArticle', 'book', etc. to filter. limit: max results (default 10). collection_key: optional 8-char key to scope to a collection. include_subcollections: also search collections nested beneath it (default False). Use zotero_get_tags to discover available tag names first. For free-text content search, use zotero_search_items or zotero_semantic_search instead. Example: zotero_search_by_tag(tag=['to-read'], limit=20).

輸入參數tag必填limititem_typecollection_keyinclude_subcollections

zotero_search_by_citation_key

Zotero Search By Citation Key

Look up a single Zotero item by its BetterBibTeX citation key (e.g. 'Smith2024' or 'cladderMicus2018'). Returns that one item's metadata, or a not-found message if no item has that key. citekey: the citation key exactly as assigned by BetterBibTeX (case-sensitive). Matches Zotero's native citationKey field, then any 'Citation Key:' line in Extra. In web mode a key the API's search does not surface is found by scanning the library, which is slower on large libraries. For partial-key or free-text lookup, use zotero_search_items. Example: zotero_search_by_citation_key(citekey='hasan2026mcp') → metadata for that single item.

輸入參數citekey必填

zotero_synthesize_annotations

Zotero Synthesize Annotations

Collect every highlight, annotation comment, and child note across a scope and organize them into a structured, per-paper digest that YOU (the agent) can then synthesize into a literature summary. This tool does NOT call an LLM — it only gathers and groups the raw material, so the synthesis step is yours. collection_key: optional 8-character collection key; when given, only annotations/notes whose resolved paper is a member of that collection are included. When omitted, the whole active library is scanned (capped by limit). tag: optional tag or list of tags to filter items by (accepts a string, a JSON list, or a list). limit: cap on annotations/notes scanned (default 200) to keep the call tractable. format='markdown' (default) groups the digest by paper; format='json' returns the same highlights and notes as structured records for downstream processing. Markdown output has each paper heading followed by its highlights (with attached comments) and any note excerpts — plus a top summary line counting papers, highlights, and notes. Use this before writing a thematic review so you can spot themes and contradictions across sources. Example: zotero_synthesize_annotations(collection_key='MT53KB66').

輸入參數taglimitformatcollection_key

zotero_export_bibliography

Zotero Export Bibliography

Render a formatted bibliography or in-text citations for a set of Zotero items using Zotero's own CSL citation engine, so you can drop references straight into a manuscript. item_keys: optional list of 8-character item keys (also accepts a JSON list string); takes precedence over collection_key. collection_key: optional collection to export instead; if neither is given, the active library is exported. style: CSL style short name (default 'apa'); e.g. 'modern-language-association', 'chicago-note-bibliography', 'ieee'. Ignored for bibtex. export_format: 'bib' (formatted reference-list entries, default), 'citation' (in-text citation strings), or 'bibtex' (raw BibTeX for .bib files). Output: markdown naming the style/format, then the rendered entries (a fenced block for bibtex, a numbered list otherwise). Rendering uses Zotero's own CSL engine and works in local mode with no API credentials, as well as over the web API. item_keys is capped at 100 items per call; a collection or the whole library is exported in full (top-level items only). Example: zotero_export_bibliography(item_keys=['RTKZQI8E'], style='apa', export_format='bib').

輸入參數styleitem_keysexport_formatcollection_key

zotero_batch_update

Zotero Batch Update

Edit metadata across many items in one call: add/remove tags and upsert/remove `Key: value` lines in Extra (Better BibTeX keys, tex.* fields). Select items by item_keys, and/or a free-text query, and/or an existing tag (query and tag are ANDed; tag may be a list to OR); item_keys wins. At least one selector AND one action are required. add_tags/remove_tags keep the item's other tags — not a replace-all. set_keys upserts Extra lines, matching a line case-insensitively by its `key:` prefix and replacing it in place, else appending; remove_keys deletes those lines; lines without a colon are preserved. limit: max items for query/tag selection (default 50, at most 1000); the report says when more matched. A query-only selection leaves attachments out; Extra edits skip attachments, notes and annotations. Items needing no change are skipped and counted. Requires a writable library. Example: zotero_batch_update(tag='to-read', add_tags=['reviewed'], remove_tags=['to-read']).

輸入參數taglimitqueryadd_tagsset_keysitem_keysremove_keysremove_tags

zotero_create_collection

Zotero Create Collection

Create a new collection (project/folder) in your Zotero library. To create a subcollection, pass parent_collection (not parent_key) as either a collection key (8-character string like 'KMMQDFQ4'), a collection name, or a 'Parent/Child' path when the name is shared. Use zotero_search_collections to find collection keys.

輸入參數name必填parent_collection

zotero_delete_collection

Zotero Delete Collection

Delete a collection (folder) from your Zotero library by its 8-character key. Items inside the collection are NOT deleted — they remain in the library (and in any other collections they belong to). Subcollections ARE deleted along with the parent. This is a hard delete — Zotero's API does not trash collections, so the operation cannot be undone via the API. Use zotero_search_collections to find the key first. Example: zotero_delete_collection(collection_key="KMMQDFQ4").

輸入參數collection_key必填

zotero_update_collection

Zotero Update Collection

Rename a collection or move it under a different parent, keeping its key, subcollections and item membership (#517). collection_key: the 8-character key of the collection to change. name: the new name, or omit to keep it. parent_collection: key, name or 'Parent/Child' path of the new parent; a collection cannot be moved under itself or one of its own subcollections. to_top_level=True moves it out of any parent. Pass at least one change. Use zotero_search_collections to find keys. Example: zotero_update_collection(collection_key="KMMQDFQ4", name="AI & ML").

輸入參數nameto_top_levelcollection_key必填parent_collection

zotero_search_collections

Zotero Search Collections

Search collections by name in the active library and return their 8-character keys. Matching is case-insensitive substring and applies ONLY to the collection's own name — not to parent names, descriptions, or items inside the collection. Multi-word queries are ANDed across words (NOT OR-ed): query 'reading list' matches only collections whose name contains both 'reading' AND 'list'. To match either word, issue two separate searches. Leading/trailing whitespace is ignored and empty words are dropped. Returns the collection's key plus its parent (if any). include_trashed: when True, also match collections currently in the Zotero Trash (results annotated as such). Default False — trashed collections are otherwise invisible to automated clients. Performance: scans all collections in the active library (O(n)); for very large libraries expect a full-list pagination under the hood. Example: zotero_search_collections(query="orals") → keys for every collection with "orals" in its name.

輸入參數query必填include_trashed

zotero_set_item_collections

Zotero Set Item Collections

Change which collections existing items belong to — an incremental add/remove of item membership, NOT collection creation (use zotero_create_collection / zotero_delete_collection for that). item_keys must be an ARRAY of item keys, e.g. ["KEY1", "KEY2"] — not a single string. add_to and remove_from accept arrays of collection keys, names, or '/'-separated paths (resolved and validated automatically; unknown, trashed, or ambiguous specs fail before anything is changed). Existing memberships not named in remove_from are left alone; to replace an item's memberships wholesale use zotero_update_item. Use zotero_search_items to find item keys and zotero_search_collections to find collection keys.

輸入參數add_toitem_keys必填remove_from

zotero_update_item

Zotero Update Item

Update metadata on an existing Zotero item by key. Only what you pass is changed. fields: {name: value} of metadata to set (a JSON object string is accepted). Names may be snake_case (title, date, doi, url, abstract, publication_title, access_date, short_title, book_title, citation_key, item_type, place, extra, volume, issue, pages, publisher, issn, isbn, edition, language) or any raw Zotero API field name. An unknown name fails the call and lists the valid ones; a name that is not valid for this item's type is reported as skipped. item_type migrates the item (overlapping fields kept, type-specific ones dropped). TAG SEMANTICS (easy to get wrong): tags REPLACES the whole tag list; add_tags/remove_tags are incremental and preferred. They are mutually exclusive with tags. collections (keys) and collection_names likewise REPLACE membership — pass collections=[] to clear it; for incremental moves use zotero_set_item_collections. creators: full replacement list of {creatorType, firstName, lastName} objects. Requires a writable library (fails in local-only mode). To edit notes use zotero_manage_note. Example: zotero_update_item(item_key='RTKZQI8E', fields={'doi': '10.1145/3708319'}, add_tags=['reviewed']).

輸入參數tagsfieldsadd_tagscreatorsitem_key必填collectionsremove_tagscollection_names

zotero_delete_item

Zotero Delete Item

Move a Zotero item to the Trash. Works for any item type (book, journalArticle, webpage, attachment, etc.). For notes, use zotero_manage_note(action='delete') — identical mechanism, constrained to notes for safety. Trashed items are recoverable from Zotero's Trash — empty the Trash in the Zotero UI for permanent deletion. By default refuses to trash notes; set allow_note=True to override.

輸入參數item_key必填allow_note

zotero_get_pdf_outline

Zotero Get Pdf Outline

Extract the table of contents (outline/bookmarks) from a PDF attachment, returned as a hierarchical markdown list with each entry's page number. Use this to orient in a paper before calling zotero_get_item_fulltext — the outline is typically < 200 tokens versus 10K+ for the full text. If the PDF has no embedded outline, returns a short 'no outline' message rather than failing. item_key: the PDF ATTACHMENT key OR the parent item key — both are accepted; attachment-to-parent resolution is automatic. Find the right key with zotero_get_item_children if unsure. Scope: PDFs only (EPUBs have no outline extraction here). Requires PyMuPDF (the [pdf] extra). Read-only; works in local or web mode. Example: zotero_get_pdf_outline(item_key='RTKZQI8E').

輸入參數item_key必填

zotero_attach_file

Zotero Attach File

Attach a file to an EXISTING Zotero item as an imported child attachment (uploads the file bytes). Use when the item is already in the library and you have its key — e.g. attaching a PDF you found for a reference. To create a NEW item from a file, use zotero_add_item(source=<file path>) instead. item_key: key of the existing REGULAR item. Passing an attachment/note key fails with a hint to use its parent. file_path: ABSOLUTE local path (.pdf, .epub, .djvu, .doc, .docx, .odt, .rtf). url: direct http(s) link, downloaded server-side — PDF-only; for other formats download locally and use file_path. Exactly one of file_path/url must be given. filename: optional stored-filename override; defaults to the file's basename or the URL's last path segment (falling back to <item_key>.pdf); a missing extension is appended automatically. Returns the created attachment's key. Idempotent: if the item already has an attachment with the same filename or identical content (MD5), nothing is re-uploaded. Requires a writable library (fails in local-only mode). Uploads count against the Zotero cloud storage quota unless WebDAV sync is configured. Run zotero_update_search_database afterwards to index the new file for semantic search. link_mode: 'import' (default) uploads the file bytes; 'linked' records the absolute path only (like Zotero's 'Add Link to File') — the file is NOT moved or copied and no cloud quota is used. 'linked' requires file_path (not url) and a writable library; filename then only sets the title. Example: zotero_attach_file(item_key='ABCD2345', file_path='/Users/me/smith-2020.pdf').

輸入參數urlfilenameitem_key必填file_pathlink_mode

zotero_add_item

Zotero Add Item

Add item(s) to Zotero from any source: DOI, URL, ISBN, BibTeX, CSL JSON, or a local file. Use for every 'add this to Zotero' request. source: the identifier, URL, citation text, or ABSOLUTE file path. DOI/URL/ISBN/PMID also take many at once (list or comma/newline-separated). BibTeX/CSL JSON may be inline (many entries per call) or a path to .bib/.bibtex/.json/.csljson; documents are .pdf, .epub, .docx and similar. source_type: 'auto' (default) detects it, incl. comma/newline DOI lists; override for URL/ISBN batches. Routing: doi → CrossRef (best metadata — prefer a DOI when you have one); url → doi.org/arxiv.org get full metadata, anything else becomes a bare 'webpage' item that is often not citable, so resolve to a DOI first; isbn → Open Library then Google Books (noisy — verify after); bibtex/csl_json → one item per entry, citation key kept in Extra; file → extracts the PDF's DOI and enriches via CrossRef, else guesses from filename/text, then attaches the file. collections: keys, names, or '/'-paths ('_project/topic'), validated before anything is created — an unknown or ambiguous spec fails the call rather than leaving an unfiled item; create_missing_collections=True creates them instead. if_exists: 'duplicate' (default) always creates; 'file' is idempotent — reuses the item matching the DOI/ISBN/URL, adding missing collections/tags, never removing; 'skip' leaves a match untouched. attach_mode: 'auto' (default) attaches an OA PDF, 'linked_url' bookmarks it, 'none' skips, 'required' fails without one. title: file sources only, when extraction misses. Requires a writable library (fails in local-only mode). Run zotero_update_search_database afterwards for semantic search. Example: zotero_add_item(source='10.1145/3708319', collections=['9SU943GB'], if_exists='file').

輸入參數tagstitlesource必填if_existsattach_modecollectionssource_typecreate_missing_collections

版本歷史

10
  1. v0.15.2最新Nov 1, 2026
  2. v0.15.1Oct 17, 2026
  3. v0.15.0Oct 16, 2026
  4. v0.14.1Oct 8, 2026
  5. v0.14.0Oct 8, 2026
  6. v0.13.3Oct 7, 2026
  7. v0.13.2Oct 4, 2026
  8. v0.13.1Sep 23, 2026
  9. v0.13.0Sep 22, 2026
  10. v0.12.4Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分