MCP Server 工具¶
Zotero MCP Server 通过 streamable HTTP 传输在端口 8002 上暴露 12 个工具(不是 SSE)。消费者通过 http://zotero-mcp:8002/mcp 连接。
⚠️ 工具名与 dailyinfo 的 Zotero 插件 MCP 不同,勿混用:本仓库取全文是
zotero_get_fulltext,dailyinfo 插件叫zotero_get_item_fulltext——后者在本 server 不存在,反之亦然。批量脚本/提示词跨仓复用时先核对工具名。
工具概览¶
Web API 工具(10 个)¶
通过 pyzotero 访问 api.zotero.org,需要 ZOTERO_API_KEY + ZOTERO_LIBRARY_ID。
| 工具 | 用途 |
|---|---|
zotero_search |
关键词搜索文献库 |
zotero_fulltext_search |
全字段搜索(含全文内容) |
zotero_search_by_tag |
按标签搜索条目 |
zotero_get_item |
获取单篇文献完整元数据 |
zotero_get_attachments |
获取条目的附件和笔记 |
zotero_get_annotations |
获取 PDF 标注(高亮、笔记) |
zotero_get_recent |
获取最近添加的条目 |
zotero_get_collections |
列出所有合集 |
zotero_get_collection_items |
获取某合集下的条目 |
zotero_get_tags |
列出标签(可选按合集过滤) |
Local API 工具(2 个)¶
通过 httpx 访问本地 Zotero Desktop API(host.docker.internal:23119),需要 Zotero Desktop 运行。
| 工具 | 用途 |
|---|---|
zotero_get_fulltext |
获取条目的全文索引内容 |
zotero_get_file_info |
获取附件文件元数据 |
Web API 工具¶
zotero_search¶
关键词搜索 Zotero 文献库。
参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
query |
str |
(必需) | 搜索关键词 |
limit |
int |
10 |
返回条目上限 |
返回格式:
{
"total": 1,
"query": "flood forecasting",
"items": [
{
"key": "ABC12345",
"title": "Deep Learning for Hydrology",
"itemType": "journalArticle",
"creators": ["Jane Smith", "John Doe"],
"date": "2026-06-15",
"DOI": "10.1234/test.2026",
"abstractSnippet": "A comprehensive study...",
"url": "https://doi.org/10.1234/test.2026"
}
]
}
zotero_fulltext_search¶
全字段搜索,使用 qmode=everything 一次调用搜索标题、作者、摘要和索引的 PDF 全文内容。
参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
query |
str |
(必需) | 搜索关键词 |
limit |
int |
20 |
返回条目上限 |
返回格式:与 zotero_search 相同。
zotero_search_by_tag¶
按标签搜索条目。Zotero API 语义:逗号分隔 = AND,&& = OR。
参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
tag |
str |
(必需) | 标签名(支持逗号/&& 组合) |
limit |
int |
20 |
返回条目上限 |
示例:
zotero_search_by_tag(tag="deep learning") # 单个标签
zotero_search_by_tag(tag="hydrology, LSTM") # 同时有 hydrology AND LSTM
zotero_search_by_tag(tag="hydrology && LSTM") # 有 hydrology OR LSTM
zotero_get_item¶
获取单篇文献的完整元数据。
参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
item_key |
str |
(必需) | Zotero 条目 key(1-32 位字母数字,如 ABC12345) |
返回格式:完整的 Zotero item JSON,包含 data(元数据)、meta(创建/修改者)、version 等。
zotero_get_attachments¶
获取条目的子项(附件和笔记)。
参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
item_key |
str |
(必需) | Zotero 条目 key(1-32 位字母数字) |
返回格式:
{
"total": 2,
"itemKey": "ABC12345",
"attachments": [
{
"key": "ATTACH99",
"data": {
"itemType": "attachment",
"title": "paper.pdf",
"filename": "paper.pdf",
"contentType": "application/pdf",
"linkMode": "imported_file",
"md5": "abc123",
"size": 2048000
}
},
{
"key": "NOTE01",
"data": {
"itemType": "note",
"note": "Important paper"
}
}
]
}
zotero_get_annotations¶
获取 PDF 标注。遍历 paper → attachment → annotations 两级结构。
参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
item_key |
str |
(必需) | Zotero 条目 key(1-32 位字母数字) |
返回格式:
{
"total": 2,
"itemKey": "ABC12345",
"annotations": [
{
"key": "ANN0001",
"type": "highlight",
"text": "LSTM outperforms traditional models",
"comment": "Key finding",
"color": "#ffd400",
"page": "3"
},
{
"key": "ANN0002",
"type": "note",
"text": "",
"comment": "Check the cited reference",
"color": "#5fb236",
"page": "5"
}
]
}
zotero_get_recent¶
获取最近添加的条目,按 dateAdded 降序排列。
参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
limit |
int |
10 |
返回条目上限 |
since |
str \| None |
None |
仅返回此日期之后的条目(ISO 格式,如 2026-07-01) |
返回格式:与 zotero_search 相同(total + items)。
zotero_get_collections¶
列出 Zotero 文献库中的所有合集。
参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
limit |
int |
50 |
返回合集数上限 |
返回格式:
{
"total": 2,
"collections": [
{"key": "COLA1B2C", "version": 42, "name": "Hydrology", "parentCollection": false},
{"key": "COLD3E4F", "version": 17, "name": "Deep Learning", "parentCollection": "COLA1B2C"}
]
}
zotero_get_collection_items¶
获取某合集下的所有条目。
参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
collection_key |
str |
(必需) | 合集 key(1-32 位字母数字) |
limit |
int |
20 |
返回条目上限 |
返回格式:total + collectionKey + items。
zotero_get_tags¶
列出 Zotero 文献库的标签。
参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
collection_key |
str \| None |
None |
可选,限定到某个合集(1-32 位字母数字;省略或传空串不校验) |
返回格式:
Local API 工具¶
以下工具需要 Zotero Desktop 正在运行,且本地 API 可访问。
zotero_get_fulltext¶
获取条目的索引全文内容。
参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
item_key |
str |
(必需) | Zotero 附件 key 或条目 key(1-32 位字母数字) |
item_key 可以是 PDF 附件 key,也可以是条目 key。传条目 key 时会经
/children 解析到附件;一个条目常挂多个 PDF(论文本体 + 关于它的新闻报道),
此时取全文最长的那个,并把所有候选列在 attachmentCandidates 里。
只有 1 个 PDF 子附件时不做比较、直接采用 —— 不会为了确认「它是唯一的」而
白读一整篇论文。
attachmentCandidates 的每一项键集恒定为 {key, chars, indexed};
未做过比较的候选,chars 与 indexed 为 null(表示「未测量」,
不是 0)。所以按 chars 排序前请先滤掉 null。
返回格式:
{
"content": "Abstract\n\nThis paper presents...\n\nIntroduction\n\nHydrological modeling...",
"indexedPages": 12,
"totalPages": 15,
"itemKey": "ABC12345",
"attachmentKey": "ABC12345",
"attachmentCandidates": [
{"key": "ABC12345", "chars": 276543, "indexed": true}
]
}
错误:404 时返回错误 JSON,消息里带上实际请求的路径(不含主机名), 并区分「列表失败」「该条目没有 PDF 子附件」「附件未建索引」三种情况。
zotero_get_file_info¶
获取附件文件元数据。
参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
item_key |
str |
(必需) | Zotero 附件 key 或条目 key(1-32 位字母数字) |
传条目 key 时用与 zotero_get_fulltext 相同的选取规则(全文最长者),
保证两个工具描述的是同一个文件。
返回格式:
{
"filename": "Lu 等 - 2024 - The AI Scientist.pdf",
"contentType": "application/pdf",
"linkMode": "linked_file",
"path": "G:\\我的云端硬盘\\Documents\\Papers\\Zotero_Papers\\Lu 等 - 2024 - The AI Scientist.pdf",
"size": 0,
"itemKey": "ABC12345",
"attachmentKey": "ABC12345",
"attachmentCandidates": [
{"key": "ABC12345", "chars": 276543, "indexed": true}
]
}
两点与直觉不同,但都是实测结果:
size恒为 0。Zotero Local API 对存储型与链接型附件一律返回 302 跳向file://URL,没有任何路由会给出文件大小;自己去 stat 会读用户磁盘、并可能触发 Google Drive 水合,因此不猜。filename是推导出来的。链接型附件的filename字段为null,名字藏在path的attachments:前缀之后。path则是从/file/view/url解析出的本地路径。
错误处理¶
所有工具在出错时返回统一的错误格式:
未配置 API Key 时,Web API 工具返回 "Web API client not initialized" 错误。
key 格式校验¶
有 7 个工具在做任何事之前先校验 key 的形状,格式不合法就直接返回错误 JSON,不会去请求 Zotero:
| 参数 | 工具 |
|---|---|
item_key |
zotero_get_item、zotero_get_attachments、zotero_get_annotations、zotero_get_fulltext、zotero_get_file_info |
collection_key |
zotero_get_collection_items、zotero_get_tags(该参数可选:省略或传空串时不校验) |
规则:必须是 1–32 位 ASCII 字母数字(^[A-Za-z0-9]{1,32}$)。
真实的 Zotero key 通常是 8 位大写字母数字。这里放宽到 1–32 位是留余量,真正的目的是挡住能改变请求路径的字符(/、.、% 等)—— 这些 key 会被拼进请求路径,而 HTTP 客户端会规范化点段,所以必须在边界上拦。
非字符串也会被拦:传入 int 之类的值同样返回错误 JSON,不会抛 TypeError。这对手写调用尤其重要。
被拒绝时的返回(context 是工具名,message 指明是哪个参数、哪个值):