Zoteus

io.github.oscardvs由 GitHub 账号 oscardvs 发布v1.23.1更新于 Nov 3, 2026

Zotero MCP server for Claude and ChatGPT: search, citations, safe writes, PDF passages and pages.

已验证Streamable HTTP可网页运行效率与工作流文件与存储知识与记忆

概览

AI 生成的概览

Zotero MCP 服务器,让助手检索 Zotero 文库、提取带页码的 PDF 段落、生成引用格式,并安全地编辑条目。

可以做什么
  • 检索与读取文库:关键词、字段、标签与语义搜索,完整条目记录,数据模型查询,以及群组、标签和分类
  • 提取 PDF 与 EPUB 正文并给出页码定位,把 PDF 页面和插图渲染成图片,读取或设置已提取的全文
  • 按 CSL 样式生成参考文献与引用,解析样式名称,并写出带 Zotero 活动引用字段的 docx 文档
  • 新增与编辑条目:按 DOI、ISBN、PMID、arXiv 编号或网址导入,批量创建与局部修改,合并重复条目,打标签并整理分类
  • 管理附件与 PDF 批注,撰写笔记与批注摘要,并把条目移入可恢复的回收站
  • 查询外部学术图谱(参考文献、被引文献、开放获取版本、撤稿通知),并生成证据表格
适用场景
适合让助手在已有 Zotero 文库中工作:查找文献、引用带页码的原文段落、起草引用与参考文献,或在研究与写作过程中归档和整理文献。
运行要求
以本地 npm 包(npx)或带 OAuth 的远程端点运行。无需密钥的读取和个人文库写入需要运行 Zotero 桌面应用并开启本机通信;同步、应用未持有的群组文库以及应用关闭时写入需要 ZOTERO_API_KEY。语义搜索可选本地、Ollama、OpenAI、Gemini 等嵌入提供方,扫描版 PDF 可选 OCR。
安装前请注意
写入会改动文库数据:条目、标签、分类、笔记、批注和附件。永久删除默认关闭,需将 ZOTEUS_ALLOW_DELETE 设为 true 且每次调用确认。合并会把重复条目移入回收站。工具结果会发送给所选 AI 客户端,启用的功能会访问 Zotero、学术、PDF 与嵌入服务,使用 API 嵌入提供方时文库文本会被发送出去。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Zoteus,将其添加到工作区。
  2. 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
  3. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.oscardvs%2Fzoteus/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。

{
  "mcpServers": {
    "zoteus": {
      "type": "http",
      "url": "https://mcp.zoteus.com/mcp"
    }
  }
}

README

Zoteus

A Zotero MCP server. Your whole library, inside Claude and ChatGPT.

Zoteus gives Claude Desktop, claude.ai, ChatGPT, Claude Code, Cursor and any other MCP client access to a Zotero library: search by keyword or by meaning, passages from your PDFs with page numbers, citations in any CSL style, adding items, and safe writes.

[npm] [npm downloads] [CI] [Node] [License: MIT]

[Claude in the browser answering a question from a Zotero library through Zoteus: the question is typed, the Zoteus tools run, and the answer arrives with a verbatim passage, its page number, and APA references.]

A real session, 6 September 2026, against the maintainer's own library. Tool calls are shown as a time-lapse. The full recording is on zoteus.com.

Install

For most clients there is nothing to download: the client fetches Zoteus with npx the first time it runs. New to MCP servers? Start with docs/getting-started.md.

ClientHow
Claude DesktopDownload the bundle for your system from the latest release, zoteus-macos.mcpb, zoteus-windows.mcpb or zoteus-linux.mcpb, and double-click it. This is the install with a settings screen (Settings → Extensions → Zoteus) and per-tool permissions.
Claude Codeclaude mcp add --transport stdio zoteus -- npx -y @oscardvs/zoteus
Claude Code, as a plugin/plugin marketplace add oscardvs/zoteus, then /plugin install zoteus@zoteus. The same server, plus four research skills that teach Claude to quote passages with pages, build evidence tables, cite, and tidy the library. Set the optional API key with /plugin → Zoteus → Configure options. Claude Desktop shows no settings for a plugin, so use the .mcpb there. See plugins/zoteus.
Cursor, VS Code, Zed, Codex, Gemini CLI, any MCP clientnpx add-mcp @oscardvs/zoteus, or add npx -y @oscardvs/zoteus as a stdio server by hand.
claude.ai in the browserAdd a custom connector pointing at a hosted Zoteus or at your own remote instance.
ChatGPT (web)Needs Developer mode on a paid ChatGPT plan (Settings → Security and login). Then Plugins → Create app, with the server URL of a hosted Zoteus (https://mcp.zoteus.com/mcp) or of your own remote instance, and OAuth as the authentication. ChatGPT only connects to remote servers, so the npx install does not apply.

Then run the Zotero desktop app. Reads, and on Zotero 10+ writes to every library the app holds (your own and the group libraries synced into it), need no cloud key. Add a Zotero API key for sync, for group libraries the app does not hold, and for when the app is closed:

bash
claude mcp add --transport stdio zoteus -e ZOTERO_API_KEY=xxxxx -- npx -y @oscardvs/zoteus

Get a key at zotero.org/settings/keys. In the desktop app, enable Settings → Advanced → "Allow other applications on this computer to communicate with Zotero". Step-by-step for each client, with screenshots: zoteus.com/docs/connect-claude-to-zotero.

Updating a desktop-extension install. A manually installed .mcpb (or older .dxt) does not auto-update. Turn on Check for updates in the extension settings (or set ZOTEUS_UPDATE_CHECK=true) and Zoteus asks GitHub once a day, then says so in-chat via zotero_whoami when a newer version exists; download the new bundle for your system and reinstall. The check is off by default. npx installs always run the latest published version.

What it does

Zoteus exposes research tools, namespaced zotero_*, that search the library by keyword or by meaning, return passages from your PDFs with page locators, show PDF pages and figures as images, format bibliographies with citeproc-js in any CSL style, add items by DOI or arXiv id, and create, edit, tag and organize items with versioned writes and a reversible trash. When the Zotero desktop app is running, reads and writes go to it directly for every library it holds and need no cloud API key; the Zotero Web API v3 is the fallback for sync, group libraries the app does not hold, and for when the app is closed. Zoteus is written in TypeScript, runs on your machine, and is MIT licensed.

Features

  • Search your own library. Hybrid keyword and semantic search over titles, abstracts, creators, and tags, plus full-text keyword search inside your PDFs and notes, with the matching passage returned together with its page number. Your own notes and PDF annotations are indexed under the item they belong to, so "where did I object to this?" is a question search can answer. Set ZOTEUS_INDEX_FULLTEXT (or pass fulltext:true to zotero_index) and indexed search also covers available PDF body text within configured caps, so a claim that never made it into an abstract is still findable.
  • Format citations. Zoteus reads the citation data in your Zotero library and formats it with citeproc-js in any CSL style from the CSL styles repository.
  • Add a paper by identifier. Pass a DOI or arXiv id and Zoteus fetches the metadata and files the item. This works out of the box through built-in resolvers; a Zotero translation-server extends it to ISBN, PMID, and URLs (see docs/resolver.md).
  • Write back. Create items, edit, tag, and organize. Writes are versioned with optimistic-locking retries, trash is reversible by default, and permanent deletion is opt-in and confirmation-gated.
  • Write straight to the desktop app. Adding and editing items, tags, collections, saved searches, merges, attachments, annotations, and trash and restore go to your running Zotero with no cloud API key, in your own library and in any group library the app holds. On Zotero 10+ this uses the local API behind a key you grant once ("Always Allow"); on Zotero 9 and earlier, whose local API is read-only, adding items and annotations uses the connector protocol the browser extensions use. The cloud Web API is the fallback for group libraries the app does not hold, and for when the app is not running.
  • Annotate PDFs and attach files. zotero_annotate adds highlights, underlines, and notes, the same objects the Zotero PDF reader creates. Quote the passage and Zoteus locates it in the PDF and anchors the annotation to the lines it occupies, wrapping and hyphenation included, so no page coordinates are needed. zotero_attach_file stores a local file or a URL as an attachment under any item.
  • Write notes and digest your annotations. zotero_create_note, zotero_append_to_note and zotero_replace_note write Zotero notes from Markdown (headings, lists, tables, code, math), and turn [@ITEMKEY, p. 12] into real Zotero citations that open the paper and become live fields in Word. zotero_annotation_digest lists the highlights, comments, colours and tags on a paper or a whole collection, read-only, and zotero_save_annotation_digest saves them as a note laid out like Zotero's own "Add Note from Annotations", each highlight still linked to its spot in the PDF (docs/notes.md).
  • Ground claims in the PDF. zotero_get_fulltext returns the relevant passage with character offsets, the nearest heading, and a page locator. When Zotero has not indexed the PDF or EPUB, it extracts the text on the fly, from the running desktop app or from Zotero's own storage folder, so a file added a minute ago is readable immediately. It also returns a PDF's table of contents (outline:true) and any page range on demand, so working through a 400-page book costs a few small calls rather than one that returns the whole book.
  • Look at the page. zotero_pdf_images renders any page of a PDF to an image the model can see, so a figure, a table, an equation, or a scanned page with no text layer is no longer out of reach, and extracts the figures embedded in a page, like pdfimages, each with its position on the page. It draws through the same pdfjs that reads the text, so it needs nothing that is not already installed.
  • Follow the literature. zotero_scholar looks up a paper's references, citing works, and related works through OpenAlex, with Crossref as a fallback, and can flag which of them are already in your library.
  • Import a bibliography, find duplicates, merge them. zotero_import reads BibTeX, RIS and CSL-JSON as text or a file without a translation-server, recovers a DOI or arXiv id from a PDF's first pages, and can check the library for an existing copy before saving. zotero_merge_items folds duplicates into one record: it previews by default, fills only what the master lacks, unions tags, collections and relations, reparents notes and attachments, and trashes the emptied copies (see docs/importing-bibliographies.md, docs/duplicates-and-merging.md).
  • Open-access copies and retraction notices. zotero_scholar reports an open-access PDF when OpenAlex knows one and zotero_attach_file can fetch and attach it from the DOI, recording which version it is; zotero_scholar also reports retraction and correction records from Crossref and OpenAlex, as records rather than a verdict (docs/open-access-pdfs.md, docs/retraction-notices.md).
  • Evidence tables and Word documents. A zotero-evidence-table prompt plus zotero_evidence_table render gathered passages as a Markdown or CSV table whose quotations cannot drift from the passage they cite, and zotero_word_document writes a .docx whose citations are live Zotero field codes (docs/evidence-tables.md, docs/word-documents.md; refreshing the fields in Word is not yet verified).
  • Scans, several libraries, local embeddings. zotero_get_fulltext reads a PDF with no text layer through an optional OCR engine (docs/ocr.md); one data directory holds one search index per library and zotero_semantic_search can search several at once (docs/multiple-library-indexes.md); and ZOTEUS_EMBEDDINGS=ollama embeds through a local Ollama daemon with no API key (docs/ollama.md). zoteus index build runs a headless index build from the command line.
  • Agent support. 39 tools with structured outputs, MCP Resources and Prompts, and a generated tool tree for the code-execution-with-MCP pattern.

How it works

  1. Install with one npx command, or the one-click .mcpb.
  2. Connect by running the desktop app for key-free local access, or by pasting your Zotero API key.
  3. Ask. Your MCP client can now search, cite, add to, and organize your library.

Zoteus detects a running Zotero desktop app and talks to it directly: the key-free local API for reads (full PDFs, saved-search results, the semantic-search index build), and the app itself for writes to every library it holds (imports, edits, tags, collections, merges, attachments, annotations, trash). The cloud Web API v3 is the fallback, and it is still required for sync, group libraries the app does not hold, and writes when the app is not running. Details: docs/writing.md.

Writing to a group library. A group the desktop app holds (Zotero 10+) is written through the app with no cloud key; any other group is written through the cloud, which needs ZOTERO_API_KEY with read/write access to that group. Either way, the group's settings must let you edit its library. Address the group by the numeric library_id from zotero_groups (library_type:"group" alone is not enough), and take collection keys from that same group. See Group libraries.

Start with one verified passage. Choose a client and connection, check search readiness, then retrieve and verify a passage. A full library index is not required. For local-only, WebDAV or scanned PDFs, see PDF availability.

Semantic search setup. The first zotero_semantic_search builds the library index in the background. On very large libraries you can also run zotero_index (action:"build") yourself, then poll action:"status" until it is done. The build pages your library through the same local-first path as every other read, so it needs no cloud API key while the desktop app is running. That covers your personal library and, on Zotero 10+, any group library the app holds; a key is needed when the app is closed, and for a group the app does not hold.

Embedding through an API on a large library. A full-text build of a 10k-item library is tens of thousands of requests, and at the default pacing the rate rides at OpenAI's tokens-per-minute ceiling whatever your tier. A rate-limited request backs off and retries rather than failing the build, and a build that still ends short keeps everything it indexed: run zotero_index action:"build" again and it resumes, embedding only the passages that have no vector yet (action:"refresh" is the one that starts over). To pace it up front, set ZOTEUS_EMBED_BATCH_SIZE=256 and ZOTEUS_EMBED_BATCH_DELAY_MS=8000. See docs/semantic-search.md.

Vector ranking is opt-in. Keyword (BM25) search works out of the box everywhere. On-device vectors need @huggingface/transformers, which the desktop-extension bundle cannot ship (the resolved dependency tree, onnxruntime's native binaries included, is about 700 MB): install it into a directory of its own (mkdir -p ~/.zoteus-deps && cd ~/.zoteus-deps && npm init -y && npm i @huggingface/transformers) and set ZOTEUS_TRANSFORMERS_PATH to ~/.zoteus-deps/node_modules. Not npm i -g: Claude Desktop runs the server on its own built-in Node, so a global install under a version manager sits next to a Node the extension never executes. When vectors are unavailable Zoteus says so in zotero_index status, zotero_whoami, and zotero_semantic_search rather than quietly returning nothing. See docs/semantic-search.md.

Configuration

VariableDefaultPurpose
ZOTERO_API_KEYnoneCloud auth (sync, groups, writes without the desktop app; optional otherwise)
ZOTEUS_LOCALautoauto|on|off: use the Zotero desktop app (reads + personal-library writes)
ZOTEUS_LOCAL_API_KEYnonePre-provision the Zotero 10+ desktop write key (else granted once, in-app)
ZOTEUS_EMBEDDINGSlocallocal|ollama|openai|gemini|off for semantic search
ZOTEUS_EMBEDDING_MODELprovider defaultThe model that provider embeds with, local included: Xenova/multilingual-e5-small for a German or otherwise multilingual library, Xenova/all-MiniLM-L6-v2 by default
ZOTEUS_EMBEDDING_DTYPEfp32Weight precision of the on-device model: q8 downloads Xenova/multilingual-e5-small at 129 MB instead of 465 MB. Above fp32 it joins the embedder identity, so changing it needs one rebuild
ZOTEUS_EMBED_BATCH_SIZE32Passages per embedding call. Lower it if an API provider rejects a whole request (OpenAI answers 400 above 300K tokens per request)
ZOTEUS_EMBED_BATCH_DELAY_MS0Pause between embedding calls. Raise it if an API provider rate-limits a large build: 256 and 8000 together hold a full-text build near 400K tokens/min
ZOTEUS_INDEX_OWN_WORDStrueIndex your own child notes and PDF annotations as searchable passages
ZOTEUS_INDEX_FULLTEXTfalseIndex PDF body text for semantic search (opt-in; costly)
ZOTEUS_INDEX_BACKENDautoauto|sqlite|memory: where the search index lives. auto uses SQLite (FTS5) on Node 22.13+, which is what a large library needs
ZOTEUS_TRANSFORMERS_PATHnoneWhere to find @huggingface/transformers for local embeddings when the install can't see it (desktop extension)
ZOTEUS_LOG_FILEnoneAppend every log line to this file, for a server that runs without a terminal
ZOTEUS_ALLOW_DELETEfalseMust be true or zotero_delete_items refuses every call; the tool stays listed unless ZOTEUS_READ_ONLY=true

Full table in docs/configuration.md. To run a shared or remote instance, see docs/remote-oauth.md (self-host the OAuth remote on loopback or behind your own proxy).

Documentation

zoteus.com/docs · Connect Claude to Zotero · Connect ChatGPT to Zotero · Group libraries for review teams · Zoteus and zotero-mcp, side by side

In this repository: Getting started · Configuration · Import & resolver · Importing bibliographies · Duplicates and merging · Architecture · Safe writes · Notes and annotation digests · Threat model · Citations · Word documents · Evidence tables · Semantic search · Several library indexes · Ollama embeddings · OCR · Scholarly context · Open-access PDFs · Retraction notices · Command line · Lab setup · Code execution · Deployment · Uninstall

Zoteus is listed in the MCP Registry as io.github.oscardvs/zoteus, on mcpservers.org, and in the Citation Styler overview of Zotero MCP projects.

Uninstall

Zoteus writes everything it derives (the search index, the on-device model weights, the update-check cache, the granted local-API key) into one directory: ZOTEUS_DATA_DIR if you set it, otherwise your OS's default application-data path. Stop the server, remove it from your MCP client's configuration, then delete that directory; your Zotero library lives elsewhere and nothing here touches it. Full steps and platform paths: docs/uninstall.md.

Privacy

Zoteus runs on your machine or the server you configure. Usage logging is off by default. Tool results go to your chosen AI client, and enabled features contact Zotero and the scholarly, PDF, or embedding services they require. Full policy: PRIVACY.md.

Contributing

Contributions are welcome; see CONTRIBUTING.md. Zoteus is MIT licensed.

Acknowledgements

Built on the Model Context Protocol, the Zotero Web API, citeproc-js, and the Citation Style Language. Not affiliated with or endorsed by the Corporation for Digital Scholarship / Zotero.

citeproc-js implements the Citation Style Language. (c) Frank Bennett, used under the Common Public Attribution License 1.0. https://citationstyles.org/ Dependency notices are collected in THIRD_PARTY_NOTICES.md.

来源:README.md,提交 8a3ee64

工具

34

zotero_whoami

Zotero identity & access

Resolve the current Zotero identity (userID, username, display name) and per-library access scopes from the configured API key, report the running Zoteus `version`, and report which library backends are available (cloud Web API and/or the desktop local API). Call this first to discover the userID — never ask the user to type a numeric ID. It also reports which library every call defaults to and WHY (`defaultLibrary.source`: pinned by whoever runs the server, derived from the key, or the desktop app's own library), whether this caller has a context of their own or shares the one the server operator configured (`context`), and which single library this context's search index holds (`searchIndex`). For per-group write permission, call zotero_groups. If no API key is configured, the server runs in local-only read mode against the desktop library (users/0).

无需输入参数。

zotero_search_items

Search Zotero items

Search or list items in a Zotero library or collection. Quick search via `q` (`qmode`: titleCreatorYear=default, matches title/creator/year only; everything=also searches notes & attachment full text). For presence checks ("is X in my library?"): a default-mode `q` that matches nothing auto-retries once in `everything` mode, so terms appearing only inside PDF text don't false-negative — pin `qmode` explicitly to disable. An empty `everything` result is reported as strong-but-not-conclusive, since un-indexed/scanned/un-synced PDFs aren't full-text searchable. Also supports boolean `itemType` filters (use `||` for OR, repeat or `&&` for AND, leading `-` to negate, e.g. "journalArticle || book", "-attachment"), boolean `tag` filters (same syntax; escape a literal leading hyphen as "\-"), `since` (version) for incremental queries, `sort`/`direction`, and `limit`/`start` paging. Set `response_format` to "detailed" to also return technical fields (version, tags, collections, DOI, url) needed before chaining a write; the default "concise" returns high-signal projections (key, itemType, title, creators, date). Reads are served from the fast desktop local API when available, otherwise the cloud Web API. Returns `totalResults` so you can tell when to page rather than assuming you saw everything. For conceptual/"papers about X" queries by meaning rather than exact fields, use zotero_semantic_search instead.

输入参数qtagtopsortlimitqmodesincestartitemTypedirectionlibrary_idlibrary_type另有 3 个

zotero_get_item

Get a Zotero item

Fetch one item by its key, returning the full item record (itemType, all bibliographic fields, creators, tags, collections, relations, version). Optionally set `include_children` to also return the item's child notes and attachments. Use `include` to additionally request rendered output: "bib" (formatted bibliography entry), "citation" (inline citation), or "csljson" (CSL-JSON for downstream formatting); combine with `style` (a style name such as "apa" or "chicago author-date", a CSL style id such as chicago-notes-bibliography, or the URL of a CSL file; unset renders Zotero's default, Chicago shortened notes and bibliography) and `locale`. When the desktop app serves the request, a style it has installed is used as-is and an unknown one is fetched from the Zotero style repository. The returned `version` is required if you later update or delete this item.

输入参数stylelocaleincludeitem_key必填library_idlibrary_typeinclude_children

zotero_schema

Zotero data model (types & fields)

Return the Zotero data model so you never hardcode item shapes. With no arguments, returns the schema version and the list of all item type names. With `item_type`, returns the valid fields and creator types for that type (the "primary" creator type is listed first). Use this to validate an item before creating or updating it: notes, attachments, and annotations are item types too but bypass the normal field/creator model.

输入参数item_type

zotero_create_items

Create or update Zotero items

Create new items or update existing ones in a single batch (the server auto-chunks into groups of 50). `items` is an ARRAY of item-data objects; each object has `itemType` as a **plain string** (e.g. "journalArticle", "book", "preprint", "report") plus its valid fields, `creators` (each `{creatorType, firstName, lastName}` or `{creatorType, name}`), `tags` (`[{tag}]`), and `collections` (array of 8-char collection keys). To UPDATE an existing item, also include its `key` and current `version`; to CREATE, omit both. Every item is validated against the Zotero schema before anything is sent — if any item is invalid, nothing is written and the problems are returned. Use zotero_schema to discover valid fields/creator types for an itemType. Writes to your personal library go to the running Zotero desktop app (Zotero 10+) when it is up, otherwise to the cloud Web API (requires ZOTERO_API_KEY). When updating, take `version` from a read made the same way (zotero_get_item), since the desktop and the cloud number versions independently. To write to a GROUP library, pass its numeric `library_id` (from zotero_groups) together with `library_type:"group"`. `library_type` alone is not enough, and the key needs write access to that group. Collection keys are per-library, so take them from zotero_list_collections with the same `library_id`. Example: ```json {"items": [{"itemType": "journalArticle", "title": "The Role of Metadata in Machine Learning", "creators": [{"creatorType": "author", "firstName": "Ada", "lastName": "Lovelace"}], "date": "2024-01-15", "DOI": "10.1234/example.5678", "tags": [{"tag": "ml"}], "collections": ["ABCD1234"]}]} ```

输入参数items必填library_idlibrary_type

zotero_update_item

Update a Zotero item

Partially update one item (HTTP PATCH — only the fields you supply change; omitted fields are preserved). Provide `item_key` and a `patch` object of the fields to change (e.g. {"title":"New","extra":"note"} or {"tags":[{"tag":"reviewed"}]}). All field values are plain JSON strings/numbers/booleans/arrays — never wrapped in nested objects (e.g. `"title": "New"`, NOT `"title": {"title": "New"}`). Optimistic concurrency is handled for you: if you pass the item's `version` it is used; otherwise the current version is fetched first. If the item changed on the server in the meantime (412), the update is automatically re-fetched and retried once. Writes to your personal library go to the running Zotero desktop app (Zotero 10+) when it is up, otherwise to the cloud Web API; the version is read from the same place the write goes. Set `dry_run:true` to preview the field-level before→after diff without writing (arrays like tags/collections are replaced wholesale by PATCH, not merged; a dry_run call performs no write).

输入参数patch必填dry_runversionitem_key必填library_idlibrary_type

zotero_trash_items

Trash or restore Zotero items

Move items to the trash (the safe, REVERSIBLE default) or restore them. This sets the `deleted` flag (1=trash, 0=restore); it is NOT a permanent delete, so trashed items can be recovered here or in the Zotero app. Use this instead of zotero_delete_items unless you truly need irreversible removal. Provide `item_keys` and optional `action` (default "trash"). Writes go to the running Zotero desktop app (its local-API writes, Zotero 10+) for your personal library and for any group library the app holds, otherwise to the cloud Web API. When the server sets a bulk-write threshold (ZOTEUS_CONFIRM_BULK_WRITES, off by default), trashing more items than that in one call also needs `confirm: true`.

输入参数actionconfirmitem_keys必填library_idlibrary_type

zotero_delete_items

Permanently delete Zotero items

PERMANENTLY and IRREVERSIBLY delete items by key (this purges them; it is NOT the trash). Prefer zotero_trash_items, which is reversible. This tool is disabled unless the server is started with ZOTEUS_ALLOW_DELETE=true, and additionally requires `confirm: true` on every call. For the personal library, and for a group library the running Zotero desktop app holds, it goes through that app when it supports local-API writes (Zotero 10+), otherwise the cloud Web API. The current library version is used as a precondition; the operation auto-chunks to 50 keys per request.

输入参数confirmitem_keys必填library_idlibrary_type

zotero_manage_collections

Manage Zotero collections

List, create, rename, reparent, or delete collections, and move items into or out of a collection. Set `action` to one of: "list" (collections with key/name/parent, sorted by name; `q` filters by name over the whole library, `start`/`limit` page, `totalResults` counts them all), "create" (needs `name`, optional `parent_collection` key; omit it for top-level), "rename" (needs `collection_key` + `name`), "reparent" (needs `collection_key`; `parent_collection` key, or omit to move to top level), "delete" (needs `collection_key`), "add_items" / "remove_items" (need `collection_key` + `item_keys`; collection membership lives on each item). Writes to your personal library go to the running Zotero desktop app (Zotero 10+) and otherwise to the cloud Web API; group libraries always write to the cloud. When the server sets a bulk-write threshold (ZOTEUS_CONFIRM_BULK_WRITES, off by default), removing more items than that from a collection in one call also needs `confirm: true`.

输入参数qnamelimitstartaction必填confirmitem_keyslibrary_idlibrary_typecollection_keyparent_collection

zotero_manage_tags

Manage Zotero tags

List tags, or add/remove tags on items. Set `action` to "list" (returns library tags; supports `q` substring filter), "add" (add `tags` to each of `item_keys`), or "remove" (remove `tags` from each of `item_keys`). Tags are stored on the parent item's tag array, so add/remove edits the items: in your personal library through the running Zotero desktop app (Zotero 10+) when it is up, otherwise through the cloud Web API; group libraries always write to the cloud. Tag names are case-sensitive. When the server sets a bulk-write threshold (ZOTEUS_CONFIRM_BULK_WRITES, off by default), editing more items than that in one call also needs `confirm: true`.

输入参数qtagslimitaction必填confirmitem_keyslibrary_idlibrary_type

zotero_saved_searches

Manage Zotero saved searches

List, create, or delete saved-search DEFINITIONS. NOTE: the Zotero cloud Web API stores saved searches but does NOT execute them — to get the items a saved search matches, run an equivalent zotero_search_items query (or use the desktop local API when available). Set `action` to "list" (all saved searches with their conditions), "create" (needs `name` and `conditions`, each `{condition, operator, value}`), or "delete" (needs `search_key`). Writes to your personal library go to the running Zotero desktop app (Zotero 10+) and otherwise to the cloud Web API; group libraries always write to the cloud.

输入参数nameaction必填conditionslibrary_idsearch_keylibrary_type

zotero_groups

List Zotero groups

List the group libraries this server can reach, with each group's id and name. Use a returned group id with the `library_id`/`library_type:"group"` parameters of other tools to operate on that group library; `library_type` alone does not address a group. With a cloud API key each group the key can access is listed with its type, item count, description and edit permissions, plus `canWrite`: whether this key may write to that group, decided from the key's own access map without sending a write, and `writeBlockedReason` naming the remedy when it may not. Without a key the list falls back to the group libraries a running Zotero 10+ desktop app holds, which are exactly the groups still readable, key-free, from that app: those rows carry id, name, description and the desktop's own item count, and no type, edit permissions or `canWrite`, because the desktop does not store them. On every row `numItems` counts ALL the items the library holds, child attachments, notes and annotations and the trash included, so it is larger than a zotero_search_items count and is not a number of papers; `numItemsNote` says how to count top-level items instead. Where both are available every row says which it came from, in `source`: "cloud", "local", or "both" for a group the key can see and the desktop also holds. Rows also carry `indexed`: whether this data directory holds a search index for that group, which is what makes it searchable by meaning. Each library gets its own index file, so several rows can be true, and a false row becomes true after zotero_index action:"build" library_type:"group" library_id:<id>. Writing to a group always goes through the cloud, even when the Zotero desktop app holds that group, and needs a key with write access to it; `libraryEditing` says whether the group itself lets ordinary members edit its library.

无需输入参数。

zotero_export

Export Zotero items

Export items in a bibliographic format and return the raw text. Choose `format` (bibtex, biblatex, better-biblatex, ris, csljson, csv, mods, tei, coins, rdf_*, refer, wikipedia, bookmarks). Stock formats are rendered by Zotero itself: by the desktop app when it serves the selected library (no cloud key needed), by the Web API otherwise. `biblatex` is Zotero's STOCK translator; BBT-specific options (citation-key generation, sentence-case, biblatexExtendedNameFormat, unicode→LaTeX) are NOT available there. `better-biblatex` uses the local desktop Better BibTeX plugin (your configured BBT export options apply) and is only available when desktop Zotero + BBT are running; it degrades to built-in `biblatex` otherwise. Narrow with `item_keys`, `collection_key`, `q`, or `item_type`. A `limit` (default 50) is always applied. An export that renders no entries says so instead of returning a blank body: named `item_keys` that render none are an error, and any other selection that renders none comes back with `empty: true`. For styled human bibliographies use the bibliography tools.

输入参数qlimitformat必填item_keysitem_typelibrary_idlibrary_typecollection_key

zotero_fulltext

Attachment full-text

Not a search: to find which items contain a term, use `zotero_search_items` with qmode=everything. This reads, sets, or tracks one attachment's already-extracted full text by key. `action`: "get" returns the indexed text content plus indexing stats for an attachment item (only attachment items have full text; returns found:false if none); "set" stores extracted text for an attachment (provide `content` and the indexing counts); "since" returns the map of attachment keys whose full text changed after a given library `version` (useful for incremental indexing). Only attachment items support full text. All three go through the running Zotero desktop app when there is one (no cloud key needed; "set" needs Zotero 10+ and writes your personal library or a group library the app holds), otherwise the cloud Web API.

输入参数sinceaction必填contentitem_keylibrary_idtotal_charstotal_pageslibrary_typeindexed_charsindexed_pages

zotero_get_fulltext

Get attachment full text / passages / outline (read-only)

Retrieve an item's PDF or EPUB text for grounding. Pass a parent `item_key` (its best PDF/EPUB attachment is resolved automatically) or an attachment key. With `query`, returns the top relevant passages with locators (char offsets, nearest section, and a page); with `page_range` (e.g. "3-7"), returns just those pages, re-extracted from the PDF so the span is exact; with `outline:true`, returns the PDF's table of contents with page numbers (the cheapest way to decide which pages to read next); with none of them, returns a truncated head. Text comes from Zotero's full-text index when available; when the attachment is NOT indexed yet, the file itself is read and parsed on the fly (`fallback`, on by default; set `fallback:false` to disable), so a PDF added minutes ago still returns text (marked fulltextSource:"pdf" or "epub", with fileSource saying where the bytes came from). The file is read from the running Zotero desktop app, else straight out of the local Zotero storage folder, else downloaded from Zotero cloud storage. Page numbers are exact whenever the PDF was parsed, and otherwise an estimate (pageApprox) unless `precise_pages:true`. Read-only; the indexed text is served by the running Zotero desktop app when there is one, otherwise by the cloud Web API. Use this to cite a claim with a page after finding an item via zotero_search_items / zotero_semantic_search. A PDF with no text layer is reported as what it is, with its page count and what would read it, instead of failing vaguely, and one whose text layer covers only some pages says which pages lack one; `ocr:true` reads the pages that have no text layer by rendering them and recognising the text (a few a call), but only where the operator enabled OCR and installed the engine, and that text is a machine reading of a picture, never saved and never indexed. Text is all this returns: for a figure, a table, an equation or a scanned page with no text layer, zotero_pdf_images renders the page (or extracts the embedd

输入参数ocrqueryoutlinefallbackitem_key必填max_charslibrary_idpage_rangelibrary_typemax_passagesprecise_pages

zotero_pdf_images

Look at PDF pages and figures as images (read-only)

See a PDF the way a reader does. Text extraction (zotero_get_fulltext) loses figures, turns tables into run-together numbers, drops most equations, and returns nothing for a scanned page with no text layer; this tool returns pictures instead. Pass a parent `item_key` (its PDF attachment is resolved automatically, exactly as zotero_get_fulltext does) or an attachment key, a `mode`, and `pages` ("3" or "3-7", 1-based; default "1"). `mode:"pages"` renders whole pages and returns them as image content blocks you can look at, followed by a JSON block with each page's pixel size and byte count: the default resolution keeps body text legible (about 1568 px on the long edge, which is also as much as the model is shown), `dpi` (36 to 300) overrides it for small print, and `format` is "jpeg" (default, quality 80) or "png" (sharper line art, larger). `mode:"figures"` extracts the raster images embedded in those pages, the way pdfimages does: photographs, plots and diagrams stored as images, and on a scanned PDF the page image itself (reported with coversPage:true); each comes back with its page, pixel size, position on the page in points from the top left, and the image inline (`inline`, default true; very large ones as a 2000 px preview). A figure drawn as vectors (most matplotlib, TikZ and PDF-exported plots) is lines in the content stream, not an image, so it does not appear in figures mode; render the page with mode:"pages" to see it. Caps: `max_pages` per call (default 4, at most 8; a longer span is cut and the notice says how to continue), `max_images` (default 16, at most 40), images under `min_size` px on a side skipped (default 32: icons, rules, bullets), an image repeated across pages returned once, files above 20 MB not parsed, and about 5 MB of inline image data per response, beyond which pages or figures are left out with a notice naming them and the remedy (fewer pages, lower `dpi`, format:"jpeg", or the next span). A PDF whose encryption only restricts printing

输入参数dpimode必填savepagesformatinlineitem_key必填min_sizemax_pageslibrary_idmax_imageslibrary_type

zotero_sync

Incremental sync delta

Return what changed in a library since a given version, for efficient incremental sync. Provide `since` (a library version; 0 = everything). Returns, per object type (items/collections/searches/tags), the map of keys→version that changed after `since`, plus the deletion log (keys removed since `since`). This is the version-based delta the Zotero sync algorithm uses: fetch the changed keys, then pull only those with zotero_get_item/zotero_search_items. Follows the library route: a running Zotero desktop app serves the delta for any library it holds, with no cloud API key, and otherwise the cloud Web API does; `backend` says which one answered. The whole delta comes from that one API, because the two number library versions independently. The desktop app serves item and collection versions but no tag versions and no deletion log; those are reported in `unavailable`, naming what is missing and why, and never as an empty result.

输入参数sincetypeslibrary_idlibrary_typeinclude_deleted

zotero_attachment

Zotero attachments (files)

Upload, download, or inspect attachment files. `action`: "upload" stores a file as a Zotero attachment using the full File Storage protocol (provide `url` to have Zoteus fetch it, or `file_path` for a file on the machine running Zoteus; optional `parent_item` to attach it under an item, `title`, `content_type`) and returns the new attachment key; "download" fetches an attachment's file to a local path (provide `item_key`; optional `save_path`, default under the Zoteus data dir) and returns the path and byte count; "info" returns an attachment item's metadata. File bytes are written to / read from disk, never streamed through the conversation. Upload and download go through the running Zotero desktop app (Zotero 10+, no cloud key and no storage quota) for your personal library and any group library the app holds, and through the cloud Web API and your file-storage quota otherwise; `target` (upload) and `readFrom` (download) say which. When Zoteus runs on a different machine than Zotero, `file_path` refers to the server's disk, so use `url` instead.

输入参数urltitleaction必填item_keyfile_pathoverwritesave_pathlibrary_idparent_itemcontent_typelibrary_type

zotero_annotate

Annotate a PDF (highlights, notes)

Add or delete Zotero PDF annotations (highlights, underlines, notes), the same objects you create in the Zotero PDF reader. `action:"add"` needs `parent` (a regular item key OR a PDF attachment key) and `annotations`: each with `type` (highlight|note|underline, default highlight), `text` (the exact passage to highlight), optional `comment`, `color`, `page` (0-based page index). **You do not need page coordinates**: give the passage in `text` and it is located in the PDF and anchored to the exact lines it occupies, so quoting a passage is enough to highlight it. Pass `page` to disambiguate a passage that repeats, or `occurrence` to pick among repeats; pass `position` ({"pageIndex":N,"rects":[[x1,y1,x2,y2],...]} in PDF points, bottom-left origin) only to place a highlight yourself. `action:"delete"` trashes the annotations in `annotation_keys`. Writes go to the running Zotero desktop app for your personal library (via its local-API writes where available, or its connector protocol) and for any group library the app holds (local-API writes, Zotero 10+), otherwise to the cloud Web API.

输入参数actionparentlibrary_idannotationslibrary_typeannotation_keys

zotero_attach_file

Attach a file (PDF, snapshot) to an item

Add a stored file attachment (e.g. a PDF full text) under an existing item. Give `parent` (the item key) and one of `url` (Zoteus downloads it, then stores it), `path` (a file on the machine running Zoteus), or `find_oa: true` (Zoteus looks the parent item's DOI up in OpenAlex and attaches the open-access PDF, if there is one). `find_oa` finds only copies OpenAlex already knows about, which is arXiv, PubMed Central, DOAJ journals and institutional repositories: it is not a way past a paywall, and it says so plainly when there is no free copy. The copy it finds is often the author's accepted or submitted manuscript rather than the published version, so the source, the version and the licence come back in the result and go into the attachment's title. `filename` and `content_type` are inferred when omitted. Saves through the Zotero desktop app when one is reachable (Zotero 10+ local API; you may be asked once to allow Zoteus write access, choose "Always Allow"), and otherwise through the cloud Web API, which needs ZOTERO_API_KEY with file access and uses your Zotero file-storage quota. `url` works on every setup including a remote/hosted Zoteus that cannot see your desktop, so prefer it over `path` unless the file really is on the server. Returns the new attachment key.

输入参数urlpathtitleparent必填find_oafilenamelibrary_idcontent_typelibrary_type

zotero_import

Import items by identifier, URL, bibliography file or PDF

Resolve bibliographic metadata to Zotero item-data and optionally save it to your library. `action: "by_identifier"` resolves a DOI, ISBN, PMID, arXiv id, or ADS bibcode (set `identifier`). `action: "by_url"` scrapes a web page (set `url`) and may return multiple choices to pick from. `action: "by_file"` imports a BibTeX, RIS or CSL-JSON bibliography: set `text` with the contents or `path` with a local file. Those three formats are parsed by Zoteus itself, so they need no translation-server, no Docker and no network; a reachable translation-server is used first when there is one, because it covers more formats (EndNote XML, MODS, RDF). `action: "by_pdf"` recovers metadata for a PDF: set `path` for a file on the machine running Zoteus, or `attachment_key` for a PDF already in the library (the only variant a hosted server can reach). It extracts the text of the first pages, looks for a DOI or an arXiv id, and resolves that; the result says which page the identifier was on, what introduced it, and whether the match was a labelled one or a bare string, because a first page often carries DOIs belonging to other works. It does not read scanned pages (no text layer means no identifier) and it never invents metadata: when nothing is found it says so. Set `save_to_library:true` (and optionally `collection_key`) to persist the resolved items, saved into the running Zotero desktop app when available and otherwise via the cloud Web API (requires ZOTERO_API_KEY); without it the metadata is returned and nothing is written, which makes a file import a free preview of what would be created. When a Zotero translation-server is reachable (ZOTEUS_TRANSLATION_SERVER_URL, default http://127.0.0.1:1969) it is the primary path for identifiers and URLs; with none running, DOI and arXiv ids fall back to built-in resolution (OpenAlex/Crossref and the arXiv API), and the result then carries a `source` field ("scholar" or "arxiv"). ISBN/PMID/bibcode and web URLs require a translation-server (a

输入参数urlpathtextaction必填formatconfirmattach_urlidentifierlibrary_idscan_pagesattach_titlelibrary_type另有 5 个

zotero_styles

Resolve CSL citation styles

Resolve a human citation-style name to a valid CSL style id and confirm it is available, or list common style aliases. `action: "resolve"` maps names like "APA 7th", "IEEE", "Vancouver", "Chicago", "MLA", "Nature" to the correct CSL id (e.g. apa, ieee, modern-language-association) and verifies the style can be fetched; pass the returned `styleId` as the `style` argument to zotero_format_bibliography or zotero_bibliography. `action: "list"` returns the built-in common aliases (any id from the CSL styles repository also works). Dependent styles are resolved to their independent parent automatically when formatting. Long names resolve too, including the titles Zotero lists styles under ("Chicago Manual of Style 17th edition (author-date)", "American Psychological Association 7th edition"), and a past edition the CSL repository still carries (Chicago 16th and 17th, APA 6th, AMA 10th) resolves to that edition's own style rather than to the current one. A name it cannot read is tried as a CSL id as given.

输入参数nameaction必填

zotero_format_bibliography

Format a bibliography (citeproc / any CSL style)

Render a formatted bibliography in any CSL style using citeproc-js — no Zotero library write required. Provide either `items` (an array of CSL-JSON objects, e.g. from zotero_import or external metadata) or `item_keys` (library items, which are exported to CSL-JSON first). Choose `style` (a name like "APA 7th" or a CSL id; default "apa"), `locale` (default "en-US"), and `format` (html/text/rtf; default html). The formatted bibliography text is returned. Use this for arbitrary items or styles; for items already in the library you can also use zotero_bibliography (server-rendered).

输入参数itemsstyleformatlocaleitem_keyslibrary_idlibrary_type

zotero_bibliography

Server-rendered bibliography (library items)

Produce a formatted bibliography for items already in a Zotero library, rendered server-side by Zotero in a CSL style (by the desktop app for a library it serves, so no cloud key is needed there; otherwise by the Web API). Provide `item_keys` and optionally `style` (a name such as "apa" or "chicago author-date", or a CSL id; unset renders Zotero's default, chicago-shortened-notes-bibliography), `locale`, and `linkwrap`. Returns XHTML. Note: this endpoint is item-only and capped at 150 items. For arbitrary CSL-JSON or items not in the library, use zotero_format_bibliography instead.

输入参数stylelocalelinkwrapitem_keys必填library_idlibrary_type

zotero_index

Build the semantic search index

Manage the local hybrid-search index used by zotero_semantic_search. Every job runs in the background on the server, so this tool returns immediately and never blocks on large libraries. THREE write actions, and picking the right one matters: `action: "update"` is the cheap one and should be the default for a library that is already indexed; `action: "build"` and `action: "refresh"` both rebuild the WHOLE index, which on a large library means many minutes and, with an API embedding provider, real spend (they differ in one thing: build resumes an interrupted build, refresh always starts over). `action: "build"`/"refresh" pages the library's top-level items (100-at-a-time, stopping at the server's item cap, ZOTEUS_INDEX_MAX_ITEMS, default 5000, or at a smaller `limit` if one is given), indexes their text (title, abstract, creators, tags) for BM25 keyword search and, if an embedding provider is configured, for vector search, persisting partial progress atomically as it goes; use it for the first build, after changing the embedding model, or to widen a previously capped build. It is ALSO the repair: if the index cannot be read at all, only `action:"build"` clears it, by deleting the unreadable file and opening a fresh one before rebuilding (nothing repairs it at startup or inside a query). `action: "update"` instead fetches only the items changed since the version the index recorded (Zotero's `?since=`), re-chunks and re-embeds just those, and removes items the library no longer holds (diffed from a cheap keys-only `?format=versions` census, since the deletion log is cloud-only); untouched items are never re-embedded, so adding a handful of items costs seconds instead of a full rebuild. Update falls back to a full rebuild by itself, and says so in `updateNotice`, when a delta would be wrong: no version stamp recorded yet, the library is now served by a different Zotero API (the desktop app and the cloud number their versions independently), or the embedding model change

输入参数limitaction必填fulltextown_wordslibrary_idlibrary_typefulltext_max_chars

zotero_scholar

Scholarly context (references, citations, related)

Explore the EXTERNAL scholarly graph around a paper (OpenAlex, Crossref fallback). This does NOT search, list, or read your Zotero library: it queries the open web, and results are works from the scholarly web, not your items. To search or inspect YOUR library use zotero_search_items, zotero_semantic_search, zotero_get_item, or zotero_list_tags instead. Provide a `doi` and an `action`: "lookup" (metadata + citation count, plus an `oa` block naming the open-access PDF OpenAlex knows of, when there is one), "references" (works this paper cites), "citations" (works that cite this paper, most-cited first), "related" (similar works), or "notices" (update notices deposited against the paper: retractions, corrections, expressions of concern, errata, withdrawals). "notices" asks Crossref, which redistributes the Retraction Watch database, and OpenAlex side by side and reports what each one says with its source and date; it never emits a verdict, there is no `retracted` field, a source that did not answer is reported as not reached rather than as "nothing found", and when the two sources disagree it says so. Set `include_in_library: true` to additionally flag which results your library already holds and hand back the item key for each (off by default because it scans the library); with action "citations" that key is the way into zotero_get_fulltext, whose `query` returns the passages where a citing paper you already hold discusses this one. Set `library_scan: true` with action "notices" to check the DOIs your library already holds against the same two sources and list only those with a record; it reports how much of the library it saw. `limit` caps results (default 20); every list answer also carries `total`, the size of the list the results were cut from, and `truncated: true` when the limit dropped some, so a review with 150 references never looks like one with 20. Read-only; calls external scholarly APIs. This is a thin citation-graph helper around a single DOI: for full

输入参数doilimitaction必填library_scaninclude_in_library

search_tools

Discover Zotero tools

Discover the available Zotero tools by keyword — useful for progressive disclosure when you do not want to load every tool definition up front (the code-execution-with-MCP pattern). Pass an optional `query` (matched against tool names, titles, and descriptions) and `detail` ("names" or "descriptions", default "descriptions"). Returns the matching `zotero_*` tools so you can pick the right one for a task. With no query, returns the full catalog.

输入参数querydetail

zotero_list_tags

List Zotero tags (read-only)

List tags in a Zotero library with their usage count and whether each was auto-applied by Zotero. Optional `q` substring filter and `limit`. Read-only: available even when the connector runs in read-only mode (unlike zotero_manage_tags, which also writes). For taxonomy hygiene use zotero_tag_audit. Served by the running Zotero desktop app for any library it holds, so it needs no cloud API key.

输入参数qlimitlibrary_idlibrary_type

zotero_list_collections

List Zotero collections (read-only)

List collections in a Zotero library (key, name, parent collection key, item count), sorted by name. Read-only: available even in read-only mode (unlike zotero_manage_collections, which also writes). Every collection in the library is read, then `q` filters by name and `start`/`limit` page the result; `totalResults` says how many there are, so a large library is never mistaken for its first page. Use the keys to scope zotero_search_items (collectionKey) or zotero_tag_audit (scope.collection_keys).

输入参数qtoplimitstartlibrary_idlibrary_type

zotero_tag_audit

Audit tags against a controlled vocabulary

Audit a library against a controlled tag vocabulary with priority tiers. Provide the vocabulary inline as `vocabulary` (or a JSON file via `vocabulary_path`): { tags:[{name,tier?}], tiers?:[{name,required?}] }. Reports (1) off-taxonomy tags (library tags not in the vocabulary; Zotero auto-applied tags are bucketed separately unless include_auto), (2) items missing a tag from each required tier, and (3) optional per-collection coverage when `scope.collection_keys` is given. A key that none of these objects knows is refused and named, never dropped: a dropped `scope`, `tier` or `required` would change the question without changing the answer. Read-only. Tag and item enumeration both follow the library route, so a running Zotero desktop app serves the whole audit with no cloud API key.

输入参数limitscopelibrary_idvocabularyinclude_autolibrary_typevocabulary_path

zotero_merge_items

Merge duplicate items

Merge one or more duplicate items into a master item: fields the master is MISSING are filled from the duplicates, their tags, collections and relations are unioned onto it, their child notes and attachments are reparented to it, and the emptied duplicates are moved to the trash (recoverable). A field the master already has is never overwritten, and nothing is ever deleted outright. PREVIEWS BY DEFAULT: with `dry_run` unset or true nothing is written and the answer is the exact plan, field by field, so the caller can see what would change before it changes. Pass `dry_run:false` to execute. The merge runs on the running Zotero desktop app (Zotero 10+, no cloud key needed) for your personal library and any group library the app holds, and on the cloud Web API (ZOTERO_API_KEY with write access) otherwise; the preview reads the same copy the write will act on, so the two cannot describe different merges, and says which (`readFrom`). The preview also reports `versions` (the master's, each duplicate's and each child's): pass that block back as `expect_versions` with dry_run:false and the write runs only if every record is still at that version, otherwise NOTHING is written and the answer is the plan as it now stands, as a dry run, with `changed` naming what moved. Without `expect_versions` the write plans from the records as they are at call time. If the master changes between the read and the PATCH inside one call, the plan is rebuilt against the record as it then is rather than replayed, and the answer says so (`replanned`), because replaying it would overwrite exactly what changed. Find candidates with zotero_import `check_duplicates:true`, or by comparing records yourself with zotero_search_items and zotero_get_item. The master keeps its own key, so citations already pointing at it stay valid; the duplicates keep theirs in the trash until it is emptied, and the master records a dc:replaces relation naming each item it absorbed, which is the same relation Zotero's own

输入参数confirmdry_runlibrary_idmaster_key必填library_typeduplicate_keys必填expect_versions

zotero_evidence_table

Render an evidence table

Render rows of retrieved evidence as a Markdown or CSV table, deterministically, from passages you already retrieved with zotero_get_fulltext and zotero_semantic_search. This tool does NOT search and does NOT read the library: it formats what you pass it and echoes each row's quotation, locator and coverage back unchanged. It counts the coverage summary from the rows rather than taking your word for it, and it warns, naming the row, when a row contradicts its own evidence (a page locator with no quotation, coverage claiming a retrieved passage with no quotation, a quotation on a source marked unavailable, or any support verdict other than "unverified" on a row whose coverage is not a retrieved passage); it warns and still renders, and never rewords a cell. One byte is added and only in CSV: a cell whose text begins with =, +, -, @ or a tab is a formula to Excel, LibreOffice and Sheets, so the CSV writes it with a leading apostrophe, the spreadsheet's own marker for literal text, which the spreadsheet consumes so the passage still displays exactly as it was retrieved; every such cell is named in `warnings`, and a plain number like a page locator of -5 is left alone. Markdown output carries no such marker. Use the `zotero-evidence-table` prompt to gather the rows first. Each row records one study against one question: the finding, the verbatim quotation that supports it, the page locator, whether that locator is exact or approximate, how well the source was covered (a passage was retrieved, only the abstract was available, or nothing was), and the support status. Returns the rendered table as text; pass `save_path` to also write it to a file.

输入参数rows必填formatquestion必填overwritesave_path

zotero_word_document

Write a Word document with live Zotero citations

Write a .docx whose citations are LIVE Zotero fields, not plain text: Zotero's Word plugin is meant to refresh, restyle and add to them (never run here, so check your first document). Give `body` as paragraphs containing `[[cite:ITEMKEY]]` or `[[cite:ITEMKEY,p. 12]]` placeholders; `[[cite:KEY1;KEY2]]` puts several works in one field, which is how "(Wu, 2026; Devos, 2026)" is written. Each placeholder becomes a Word field carrying the item's CSL data, with the formatted citation as its visible text. A bibliography field is appended by default. For plain formatted references with no live fields use zotero_bibliography or zotero_format_bibliography instead. The file is written to disk and the path is returned; on a shared deployment it is confined to the server data directory. Refreshing needs Microsoft Word with the Zotero word-processor plugin, and Zotero running: nothing else re-renders the fields. What is verified is the package and the field codes, by unpacking the .docx and checking its XML; a refresh in Word has never been run, and LibreOffice's Zotero extension uses ReferenceMarks rather than Word fields, so whether it adopts this document is untested as well. This writes paragraphs and citation fields and nothing else: no headings beyond `title`, no tables, no images, and no footnotes, so a note style renders its notes inline in the body.

输入参数body必填styletitlelocaleoverwritesave_pathlibrary_idbibliographylibrary_type

版本历史

8
  1. v1.23.1最新Nov 1, 2026
  2. v1.23.0Oct 19, 2026
  3. v1.22.4Oct 1, 2026
  4. v1.22.3Sep 30, 2026
  5. v1.22.2Sep 27, 2026
  6. v1.21.0Sep 21, 2026
  7. v1.20.2Sep 16, 2026
  8. v1.19.0Sep 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分