zotero-skill
An agent-usable Zotero skill for AI agent — search, read, and write your local Zotero library through a single Python CLI. | 面向 AI Agent 的 Zotero 技能:通过单一 Python CLI 搜索、读取、写入本地 Zotero 文献库。
- Stars
- 0
- Language
- Python
- Created
- Aug 25, 2026
- Updated
- Aug 25, 2026
Introduction
zotero skill
English | 中文
Agent skill for read/write access to the local Zotero library.
Install
Copy this directory into the skills dir (global):
# mkdir ~/.dsh/skills/zotero/ # create directory first
cp -r . ~/.dsh/skills/zotero/ # for DeepSeek Harness
cp -r . ~/.config/opencode/skills/zotero/ # for opencode
cp -r . ~/.claude/skills/zotero/ # for Claude Code
cp -r . ~/.agents/skills/zotero/ # for Codex
Then:
- Install/update Zotero 10+.
- Enable the local API: Settings > Advanced > "Allow other applications on this computer to communicate with Zotero".
- Run the one-time setup:
python3 scripts/zotero.py init.
Optional env vars (overrides): ZOTERO_DATA_DIR, ZOTERO_LOCAL_API_URL (default
http://localhost:23119/api), ZOTERO_APP_NAME (name shown in the authorization dialog,
default zotero-skill).
First time use
A step-by-step walkthrough for the first run on a new machine.
-
Check Python —
python3 --version(3.9+; only the standard library is used). -
Install Zotero 10+ and turn on its Local API — Settings > Advanced, then tick "Allow other applications on this computer to communicate with Zotero".
-
Configure (one command) — with Zotero running, run
python3 scripts/zotero.py initIt auto-detects the data directory (reads
extensions.zotero.dataDirfrom the profile'sprefs.js, else falls back to~/Zotero), writes~/.config/zotero-skill/settings.json, and triggers the authorization dialog — click Always Allow to cache the write key. Check the result withpython3 scripts/zotero.py config. -
Verify reads — with Zotero running:
python3 scripts/zotero.py health # ok:true, version 10.x, writesSupported:true python3 scripts/zotero.py search "protein folding"The data directory only matters for the SQLite fallback (
recent,fulltext-words,attachments, anddoionly when Zotero is closed) and for locating saved PDFs; metadata reads (includingdoiwhile Zotero is running) go through the Local API. -
Authorize writes (one time) —
initcaches the key, so a write usually needs no dialog. If you skipped it (init --no-auth), the first write pops the dialog; click Always Allow so the key is saved and reused. The key is cached at~/.config/zotero-skill/state.json(mode 0600, keyed by Zotero server ID).python3 scripts/zotero.py create-item --type journalArticle --title "My first item"If you click Deny, writes fail with a clear error. Re-trigger authorization anytime with
python3 scripts/zotero.py auth. -
Add your first note (overview/summary of a paper):
python3 scripts/zotero.py add-note --parent <itemKey> --note "# Overview\n\nSummary."
Usage
python3 scripts/zotero.py health
python3 scripts/zotero.py search "protein folding"
python3 scripts/zotero.py read <attachmentKey> --text
python3 scripts/zotero.py create-item --type journalArticle --title "T" --doi "10.1/x"
python3 scripts/zotero.py count --collection "Project/bioq"
python3 scripts/zotero.py count --tag Harness
python3 scripts/zotero.py count --query "protein folding"
python3 scripts/zotero.py export --collection "Project/bioq" --format bibtex --output refs.bib
init pre-caches the write key, so a write usually needs no dialog. If you skipped
init --no-auth, the first write asks you to click Always Allow in Zotero's dialog; the
key is cached at ~/.config/zotero-skill/state.json (mode 0600, keyed by Zotero server ID).
Test
python3 -m unittest discover -s tests -v