zotero-cli
Read and write a Zotero library from the shell with the `zotero-cli` command - search papers by keyword or meaning, read PDF full text and page ranges, get…
Skill by huang-sh
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/huang-sh-zotero-cli
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: documents, writing, productivity
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/zotero-cli
What's inside
- Skill name
zotero-cli- Description
- Read and write a Zotero library from the shell with the `zotero-cli` command - search papers by keyword or meaning, read PDF full text and page ranges, get and set metadata, manage collections, tags, notes and annotations, add items by DOI/URL/ISBN, and export bibliographies. Use whenever the user asks about their Zotero library, references, citations, papers they have saved, or their reading notes.
- License
- MPL-2.0
- Instructions
- 143 lines in SKILL.md · view on GitHub
Files (3)
- SKILL.md
- install.md
- reference.md
SKILL.md (first lines)
# Zotero from the shell
`zotero-cli` reaches a Zotero library directly. Prefer it over the Zotero MCP
server when you have shell access: the MCP server's tool schemas cost ~14k
tokens of context on every request whether or not you use them, while this
costs only what you actually run.
Check it is set up before the first real call:
```bash
zotero-cli config # prints the resolved Zotero settings
```
If that fails, Zotero is not reachable. Local mode needs the Zotero desktop
app running with its local API enabled; web mode needs `ZOTERO_API_KEY` and
`ZOTERO_LIBRARY_ID`. Say so rather than guessing at library contents. When
the `zotero-cli` command itself is missing, install it as described in
`install.md` in this skill directory and continue with the task.
## Always pass --json when you will read the output
Default output is markdown for humans. `--json` gives you one object per
invocation with a stable shape, so you never parse prose:
```json
{"ok": true, "command": "search", "schema": 1, "data": {...}}
{"ok": false, "command": "search", "schema": 1, "error": {"message": "...", "code": "..."}}
```
Both go to **stdout**; `[INFO]`/`[WARN]` diagnostics go to stderr. Check `ok`
before using `data`. Run `zotero-cli --json-schema` for the full contract.
## The core loop
Almost every task is: **find keys → act on keys**. Item keys are 8
characters and are the currency of every command.
```bash
# 1. find - use --detail keys_only to keep the result small while browsing
zotero-cli --json search "attention mechanisms" --limit 10 --detail keys_only
# 2. act - metadata, full text, or a page range
zotero-cli --json get metadata ABCD1234
zotero-cli --json get fulltext ABCD1234
zotero-cli --json read ABCD1234 --start-page 3 --end-page 8
```
Pipe keys straight into the next call:
```bash
zotero-cli --json search "diffusion models" --limit 5 --detail keys_only \
| jq -r '.data.items[].key' \
| while read -r key; do zotero-cli --json get metadata "$key"; done
```
## Choosing a search mode
| Mode | Use it for | Command |
|---|---|---|
| `items` (default) | a title, author or phrase you know | `search "Vaswani attention"` |
| `semantic` | a topic or idea, no exact wording | `search --mode semantic "why transformers scale"` |
| `tag` | items you filed under a tag | `search --mode tag "to-read,important"` |
| `advanced` | structured field conditions | `search --mode advanced --conditions '[...]'` |
| `citekey` | a BibTeX citation key | `search --mode citekey smith2020` |
`semantic` needs the search index built (`zotero-cli db status` to check,
`zotero-cli db update` to build). If it is empty, fall back to `items` and
say why rather than reporting no results.
Every search covers one library — the active one. When you don't know which
library holds something, or a search comes up empty and the item might live in
a group library, add `--all-libraries`:
```bash
zotero-cli search "Cladder-Micus" --all-libraries
```
Each result is then labelled `**Library:** <name>`. It needs the server running
with `ZOTERO_SEARCH_BACKEND=sqlite` and errors clearly if it is not, so try it
once and fall back to per-library searches if it is refused. Tag filters work
with it; `--collection` does not, because a collection lives inside one library.
## Reading efficiently
`get fulltext` on a book-length PDF returns a great deal of text. When you
need one section, use the outline to find it and read only those pages:
```bash
zotero-cli --json outline ABCD1234
zotero-cli --json read ABCD1234 --start-page 42 --end-page 55
```
For "what does my library say about X", prefer `search --mode semantic`
followed by targeted `get metadata` over reading whole papers.
## Paging
Listings cap at `--limit`. When more exists, the response says so and names
the next offset:
```bash
zotero-cli --json get collection-items QS7TQPPA --limit 100 --offset 100
```
Keep going until `data.count` is less than `--limit`.
## Writing
Write commands report what they did as text under `data.text`.
```bash
zotero-cli add doi 10.1038/s41586-021-03819-2 -c "Reading List"
zotero-cli edit ABCD1234 --title "Corrected Title" --add-tags reviewed
zotero-cli notes create --item-key ABCD1234 --text "Key finding: ..."
zotero-cli batch --item-keys A1B2C3D4,E5F6G7H8 --add-tags screened
```
`add` is idempotent by default: re-running files the existing item into the
named collection rather than creating a duplicate. Use `--if-exists skip` toFrom huang-sh/PiX, MPL-2.0.
More from huang-sh/PiX
- 0.787score
i-have-adhd
huang-sh
Shape output for a reader with ADHD - lead with the next action, number steps, restate state each turn, suppress tangents, give concrete time estimates, make…
SkillAFreshness: A★ 209Claude Code +9 - 0.781score
eli5
huang-sh
Explain every reply like the reader is five years old - short sentences, everyday words, friendly analogies; keep code and commands exact.
SkillAFreshness: A★ 209Claude Code +9
Compare and alternatives
Featured in
Signals
- Stars
- 209
- Forks
- 18
- Open issues
- 8
- Last commit (this folder)
- Sep 11, 2026 (1 month ago)
- Last release
- Oct 24, 2026 (3 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MPL-2.0
- Repository
- github.com/huang-sh/PiX
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from huang-sh
- 0.787score
i-have-adhd
huang-sh
Shape output for a reader with ADHD - lead with the next action, number steps, restate state each turn, suppress tangents, give concrete time estimates, make…
SkillAFreshness: A★ 209Claude Code +9 - 0.781score
eli5
huang-sh
Explain every reply like the reader is five years old - short sentences, everyday words, friendly analogies; keep code and commands exact.
SkillAFreshness: A★ 209Claude Code +9
Cite this page
zotero-cli skill. Agent Mart. https://agentmart.dev/skills/huang-sh-zotero-cli (last updated 2026-10-24)