feat: 补数据来源文档与 npm test docs/catalog-sources.md:两套目录的版本、发布机构、条目构成、字段结构、 适用范围、更新流程、匹配策略与限制、版权说明 目录 JSON 增加 meta 字段(版本/机构/条目数/解析时间/适用范围) mcp-server 加 npm test;无 Zotero 库时打印 SKIP 返回 0,便于 CI test-client 支持 ZOTERO_DB=none 强制跳过
feat: 补数据来源文档与 npm test
让 AI agent 直接维护你的 Zotero 库:搜索、改元数据、批量打 CCF 级别标签、导入 PDF,不需要 Zotero 开着。
MCP server 直连 zotero.sqlite,把 Zotero 当成一个带 PDF 阅读器的数据库。agent 负责整理和标注,你负责阅读和思考。
zotero.sqlite
"把库里所有 OSDI 的论文标成 CCF-A" "这篇的 DOI 写错了,改成 10.xxx/yyy" "帮我看看 IEEE TPDS 是几类" "这个 PDF 导进库里,顺带补上元数据"
两者共用同一份 CCF 目录,结果一致。
cd mcp-server npm install
配置到 Claude Desktop(claude_desktop_config.json)或 Cursor(.cursor/mcp.json):
claude_desktop_config.json
.cursor/mcp.json
{ "mcpServers": { "zotero": { "command": "node", "args": [ "/path/to/zotero-mcp/mcp-server/server.mjs", "--db", "/path/to/Zotero/zotero.sqlite" ] } } }
--db 可省略,会自动找 ZOTERO_DB、ZOTERO_DATA_DIR、~/Zotero、%APPDATA%/Zotero。
--db
ZOTERO_DB
ZOTERO_DATA_DIR
~/Zotero
%APPDATA%/Zotero
zotero_search
zotero_get
zotero_stats
zotero_tags
zotero_collections
zotero_update_fields
zotero_set_creators
ccf_lookup
ccf_detect
zotero_add_tags
zotero_remove_tags
zotero_pdf_import
CCF-A
CCF-B
CCF-C
T-T1
T-T2
T-T3
两套是独立的:CCF 目录只收国际英文刊会,所以中文期刊不会有 CCF 等级;T 目录只评期刊,所以会议不会有 T 等级。一本英文期刊可以同时有两个。
数据都解析自 CCF 公开发布的 PDF,不是手工抄录。版本、字段结构、匹配策略和更新方法见 docs/catalog-sources.md。
查级:
{ "venue": "IEEE Transactions on Parallel and Distributed Systems" } → { "ccf": "A", "t": null } { "venue": "计算机研究与发展" } → { "ccf": null, "t": "T1" }
批量打标签后,等级会以彩色标签出现在文献列表里,侧栏点一下就能筛出所有 A 类。
标签必须配色才会显示在列表中 —— Zotero 只渲染有颜色或含 emoji 的标签。工具已自动处理。
plugin/dist/pmlink-4.0.0.xpi
安装:Zotero → 工具 → 插件 → 右上齿轮 → Install Add-on From File。
提供:
如果你之前用 Paper Manager,scripts/ 提供了完整的迁移链路:
scripts/
# 1. 从 pm 库导出迁移清单(只读) PAPER_MANAGER_DB="/path/to/paper-manager-data" \ node scripts/build-manifest.mjs # 2. 生成 Zotero 导入数据 PM_PDF_DIR="/path/to/paper-manager-data/pdfs" \ node scripts/prepare-import.mjs # 3. 在 Zotero 里运行 scripts/zotero-import.js # (工具 → 开发者 → Run JavaScript,先改 CONFIG.dataFile / resultFile)
迁移脚本是幂等的,中断后重跑会跳过已导入的条目,只补挂缺失的 PDF。
写这个仓库时踩过、值得记下来的:
自定义字段只能用 Extra。 Zotero 的字段 schema 是编译期固定的,没有面向插件的注册 API。DB 里的 customFields 表受外键约束,只能挂到自定义 itemType 上,挂不到内置的 journalArticle/book。所以分级只能走标签或 Extra。
customFields
getExtraField 读不到自定义 key。 Zotero 的 extra 解析器只认内置字段名和 CSL 变量,行正则 /^([a-z][a-z -_]+):/ 连 CJK 键都拒绝。要读 CCF: 这类自定义键,必须自己解析 Extra 原文。
getExtraField
/^([a-z][a-z -_]+):/
CCF:
标注的坐标只能由 reader 产生。 是 PDF 用户空间坐标、y 轴从页面底部起算。从”页码 + 文本”反推不可靠,所以插件只提供”从当前选区建高亮”。
直接写库的约束。 WAL 模式 + 外键开启,代码里强制:BEGIN IMMEDIATE + busy_timeout;写完更新 items.synced / dateModified / libraries.version;itemDataValues 复用已有行;标签走 tags + itemTags 两表。
BEGIN IMMEDIATE
busy_timeout
items.synced
dateModified
libraries.version
itemDataValues
tags
itemTags
更多插件开发踩坑见 docs/plugin-development-notes.md。
cd mcp-server npm install npm test # ZOTERO_DB=<路径> 后才真正跑;没设置会跳过
npm test 走真实 MCP 协议(stdio),覆盖搜索、统计、标签分布、两级查询、批量识别幂等。没有 Zotero 库时打印 SKIP 并返回 0,方便 CI。
npm test
MIT。CCF 目录数据来自中国计算机学会公开目录,仅供个人学术检索使用。
Zotero migration toolkit and MCP server
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
Zotero MCP
让 AI agent 直接维护你的 Zotero 库:搜索、改元数据、批量打 CCF 级别标签、导入 PDF,不需要 Zotero 开着。
MCP server 直连
zotero.sqlite,把 Zotero 当成一个带 PDF 阅读器的数据库。agent 负责整理和标注,你负责阅读和思考。能做什么
两种用法,按需选
两者共用同一份 CCF 目录,结果一致。
快速开始: MCP server
配置到 Claude Desktop(
claude_desktop_config.json)或 Cursor(.cursor/mcp.json):--db可省略,会自动找ZOTERO_DB、ZOTERO_DATA_DIR、~/Zotero、%APPDATA%/Zotero。工具
zotero_searchzotero_getzotero_statszotero_tags/zotero_collectionszotero_update_fieldszotero_set_creatorsccf_lookupccf_detectzotero_add_tags/zotero_remove_tagszotero_pdf_import分级:两套体系
CCF-A/CCF-B/CCF-CT-T1/T-T2/T-T3两套是独立的:CCF 目录只收国际英文刊会,所以中文期刊不会有 CCF 等级;T 目录只评期刊,所以会议不会有 T 等级。一本英文期刊可以同时有两个。
数据都解析自 CCF 公开发布的 PDF,不是手工抄录。版本、字段结构、匹配策略和更新方法见 docs/catalog-sources.md。
查级:
批量打标签后,等级会以彩色标签出现在文献列表里,侧栏点一下就能筛出所有 A 类。
插件
安装:Zotero → 工具 → 插件 → 右上齿轮 → Install Add-on From File。
提供:
从 Paper Manager 迁移
如果你之前用 Paper Manager,
scripts/提供了完整的迁移链路:迁移脚本是幂等的,中断后重跑会跳过已导入的条目,只补挂缺失的 PDF。
技术要点
写这个仓库时踩过、值得记下来的:
自定义字段只能用 Extra。 Zotero 的字段 schema 是编译期固定的,没有面向插件的注册 API。DB 里的
customFields表受外键约束,只能挂到自定义 itemType 上,挂不到内置的 journalArticle/book。所以分级只能走标签或 Extra。getExtraField读不到自定义 key。 Zotero 的 extra 解析器只认内置字段名和 CSL 变量,行正则/^([a-z][a-z -_]+):/连 CJK 键都拒绝。要读CCF:这类自定义键,必须自己解析 Extra 原文。标注的坐标只能由 reader 产生。 是 PDF 用户空间坐标、y 轴从页面底部起算。从”页码 + 文本”反推不可靠,所以插件只提供”从当前选区建高亮”。
直接写库的约束。 WAL 模式 + 外键开启,代码里强制:
BEGIN IMMEDIATE+busy_timeout;写完更新items.synced/dateModified/libraries.version;itemDataValues复用已有行;标签走tags+itemTags两表。更多插件开发踩坑见 docs/plugin-development-notes.md。
开发
npm test走真实 MCP 协议(stdio),覆盖搜索、统计、标签分布、两级查询、批量识别幂等。没有 Zotero 库时打印 SKIP 并返回 0,方便 CI。许可
MIT。CCF 目录数据来自中国计算机学会公开目录,仅供个人学术检索使用。