连接 AI 助手与 Zotero 研究库的 Model Context Protocol 服务器。
开发者规范与仓库协作约定见 AGENTS.md。
- MCP 入口:
src/zotero_mcp/server.py - CLI 入口:
src/zotero_mcp/cli_app/main.py - 解析与分发:
src/zotero_mcp/cli_app/registry.py
src/zotero_mcp/handlers/tools.pysrc/zotero_mcp/handlers/prompts.py
src/zotero_mcp/services/data_access.py(统一数据访问门面)src/zotero_mcp/services/scanner.py(批量扫描与分析)src/zotero_mcp/services/zotero/metadata_update_service.py(元数据补全)src/zotero_mcp/services/zotero/duplicate_service.py(去重)src/zotero_mcp/services/zotero/semantic_search.py(语义搜索)
src/zotero_mcp/clients/zotero/src/zotero_mcp/clients/database/src/zotero_mcp/clients/metadata/src/zotero_mcp/clients/llm/
- 入口:
GlobalScanner.scan_and_process() - 目标: 扫描需要 AI 分析的条目并触发分析
- 逻辑阶段:
- 扫描
source_collection(默认00_INBOXS) - 候选不足时按集合顺序继续扫描
- 过滤规则: 必须有 PDF 且未带
AI/条目分析标签 - 执行分析并可移动到
target_collection
- 入口:
MetadataUpdateService.update_all_items() - 目标: 使用 Crossref/OpenAlex 增强条目元数据
- 逻辑要点:
- 先按 DOI 查,DOI 路径不再降级 title/url
- 清洗 HTML 标题后再做 title 查询
- 将扩展信息安全写入
extra
- 入口:
DuplicateDetectionService.find_and_remove_duplicates() - 目标: 检测并删除重复条目(永久删除,不移动回收站)
- 分组优先级:
DOI > title > URL - 保留策略: 按完整度评分保留主条目
- 入口:
WorkflowService.prepare_analysis()/WorkflowService.batch_analyze() - 目标: 批量 PDF 分析、生成结构化笔记、支持检查点恢复
- 入口:
ZoteroSemanticSearch.search()/update_database() - 目标: ChromaDB 向量检索与索引更新
- 当前行为:
limit <= 0直接返回空结果- 兼容空嵌套列表结果结构
- 连接拒绝抛出
RuntimeError
跨服务的批处理入口统一由显式参数模型约束:
src/zotero_mcp/models/operations.pyScannerRunParamsMetadataUpdateBatchParamsDuplicateScanParams
这三个模型统一了:
- 默认值
- 数值边界(如
scan_limit >= 1) - 禁止隐式额外字段(
extra="forbid")
批处理服务统一返回 envelope(并保留兼容字段):
src/zotero_mcp/services/common/operation_result.pyoperation_success(...)operation_error(...)
统一字段:
successoperationstatusmetricsmessage/error/details
重复的 offset + limit 循环已统一:
src/zotero_mcp/services/common/pagination.pyiter_offset_batches(...)
已接入:
scanner.pymetadata_update_service.pyduplicate_service.py
zotero-mcp <command> <subcommand> [parameters]| command | 说明 |
|---|---|
system |
系统与运行命令 |
workflow |
批处理工作流命令 |
semantic |
语义数据库命令 |
tags |
标签操作 |
items |
条目操作 |
notes |
笔记操作 |
annotations |
注释操作 |
pdfs |
PDF 附件操作 |
collections |
集合操作 |
zotero-mcp system servezotero-mcp system setupzotero-mcp system setup-infozotero-mcp system versionzotero-mcp system update [--check-only --force --method pip|uv|conda|pipx]
zotero-mcp workflow item-analysiszotero-mcp workflow metadata-updatezotero-mcp workflow deduplicate
| 参数 | 默认值 | 说明 |
|---|---|---|
--scan-limit |
100 |
每批抓取条目数 |
--treated-limit |
20 |
最多处理条目数 |
--target-collection |
必填 | 分析后移动目标集合 |
--dry-run |
False |
预览模式 |
--llm-provider |
auto |
auto/claude-cli/deepseek/openai/gemini |
--source-collection |
00_INBOXS |
优先扫描集合 |
--template |
default |
分析模板:research/review/default |
--output |
text |
输出格式:text/json |
zotero-mcp semantic db-updatezotero-mcp semantic db-statuszotero-mcp semantic db-inspect
| 参数 | 默认值 | 说明 |
|---|---|---|
--force-rebuild |
False |
强制重建向量库 |
--scan-limit |
500 |
每批抓取条目数 |
--treated-limit |
100 |
最大处理条目数 |
--no-fulltext |
False |
禁用全文提取 |
--config-path |
None |
指定语义配置路径 |
--db-path |
None |
指定 Zotero DB 路径 |
--local / --no-local |
True |
是否使用本地 Zotero DB/API 模式 |
--output |
text |
输出格式:text/json |
| command | subcommand |
|---|---|
items |
get/list/children/fulltext/bundle/delete/update/create/add-tags/add-to-collection/remove-from-collection/delete-empty |
notes |
list/create/search/delete |
annotations |
list/add/search/delete |
pdfs |
list/add/search/delete |
collections |
list/find/create/rename/move/delete/delete-empty/items |
tags |
list/add/search/delete/rename |
# 扫描并分析
zotero-mcp workflow item-analysis --target-collection 01_SHORTTERMS --output json
# 更新元数据
zotero-mcp workflow metadata-update --scan-limit 200 --treated-limit 100
# 查看语义数据库状态
zotero-mcp semantic db-status --output json
# 获取条目详情
zotero-mcp items get --item-key ABCD1234 --output json
# 创建笔记
zotero-mcp notes create --item-key ABCD1234 --content "My note"
# 上传 PDF 附件
zotero-mcp pdfs add --item-key ABCD1234 --file ./paper.pdf| 变量 | 默认值 | 说明 |
|---|---|---|
ZOTERO_LOCAL |
true |
使用本地 API |
ZOTERO_API_KEY |
- | Web API 密钥 |
ZOTERO_LIBRARY_ID |
- | Web API 库 ID |
ZOTERO_LIBRARY_TYPE |
user |
库类型 |
| 变量 | 默认值 | 说明 |
|---|---|---|
OPENAI_API_KEY |
- | OpenAI 密钥 |
OPENAI_EMBEDDING_MODEL |
text-embedding-3-small |
OpenAI 模型 |
GEMINI_API_KEY |
- | Gemini 密钥 |
GEMINI_EMBEDDING_MODEL |
models/text-embedding-004 |
Gemini 模型 |
| 变量 | 默认值 | 说明 |
|---|---|---|
DEEPSEEK_API_KEY |
- | DeepSeek 密钥 |
DEEPSEEK_MODEL |
deepseek-chat |
DeepSeek 模型 |
DEEPSEEK_BASE_URL |
https://api.deepseek.com |
API endpoint |
| 变量 | 默认值 | 说明 |
|---|---|---|
ZOTERO_MCP_CLI_LLM_PROVIDER |
deepseek |
LLM 提供商 |
ZOTERO_MCP_CLI_LLM_OCR_ENABLED |
true |
启用 OCR |
ZOTERO_MCP_CLI_LLM_MAX_PAGES |
50 |
最大处理页数 |
ZOTERO_MCP_CLI_LLM_MAX_IMAGES |
20 |
最大提取图片数 |
zotero_semantic_search- 语义搜索zotero_search- 关键词搜索zotero_advanced_search- 高级搜索zotero_search_by_tag- 标签搜索zotero_get_recent- 最近条目
zotero_get_metadata- 条目元数据zotero_get_fulltext- 全文内容zotero_get_bundle- 完整条目数据zotero_get_children- 附件和笔记zotero_upload_pdf- 上传本地 PDF 到条目
zotero_get_collections- 列出集合zotero_find_collection- 按名称查找(模糊匹配)zotero_get_tags- 列出所有标签
zotero_get_annotations- PDF 注释zotero_get_notes- 获取笔记zotero_search_notes- 搜索笔记/注释zotero_create_note- 创建笔记
zotero_prepare_analysis- 收集 PDF 内容zotero_batch_analyze_pdfs- 批量 AI 分析zotero_resume_workflow- 恢复中断的工作流zotero_list_workflows- 查看工作流状态