zotero-clilisted
Install: claude install-skill nelsonlove/claude-code-plugins
# Zotero CLI
Zotero is a desktop reference manager (Mac/Win/Linux) with a SQLite-backed library at `~/Zotero/zotero.sqlite` and PDF attachments under `~/Zotero/storage/<8-char-hash>/`. The `zotero-mcp-server` PyPI package (upstream: 54yyyu/zotero-mcp) ships two binaries:
- **`zotero-cli`** — standalone library access, no MCP server, no AI assistant needed. The right tool for Claude Code via Bash.
- **`zotero-mcp`** — MCP server for Claude Desktop / Cursor / ChatGPT. Same library, heavier integration.
For Claude Code, prefer **`zotero-cli` via Bash** — every MCP tool schema costs context tokens whether or not it's used, but a CLI binary only costs tokens when actually invoked.
## Library access modes
Zotero MCP supports three modes, controlled by env vars:
| Mode | Reads | Writes | Setup |
|---|---|---|---|
| **Local** (`ZOTERO_LOCAL=true`) | direct from `zotero.sqlite` | direct to `zotero.sqlite` — **requires Zotero.app closed** | no API key |
| **Web** (`ZOTERO_API_KEY` + `ZOTERO_LIBRARY_ID`) | Zotero web API | Zotero web API | API key from zotero.org/settings/keys |
| **Hybrid** (both set) | local reads (fast) | web writes (no GUI lock) | both |
**The SQLite lock is the single most common failure mode.** Zotero.app holds a write lock on `zotero.sqlite` while running. Local-mode writes will error with `database is locked`. Either:
1. Quit Zotero.app before writing (simplest for one-off).
2. Switch to **hybrid mode**: keep `ZOTERO_LOCAL=true` for reads, add `ZOTERO_AP