zoterolisted
Install: claude install-skill moiri-gamboni/roost
# Zotero
Read and batch-manipulate the local Zotero library. Three access paths — pick per operation, and for bulk work write Python scripts (via `uv run`) rather than driving item-by-item.
## Access paths
1. **Direct storage reads — fastest, for PDF/attachment content.** Attachments live at `~/Zotero/storage/<8-char-key>/<file>`. Get the mapping from the API (attachment items carry the key; `zot.dump()`/`zot.file()` fetch content). For bulk text extraction prefer `pdftotext file.pdf -` (poppler, installed by guest-bootstrap) over vision-reading; use the Read tool on the PDF only when layout/figures matter.
2. **Local API — preferred whenever the app is running.** Mirror of web API v3 at `http://127.0.0.1:23119/api/`; requires Settings → Advanced → "Allow other applications on this computer to communicate with Zotero". Reads need no key (pyzotero: `zotero.Zotero(library_id, 'user', local=True)`). Writes (Zotero 10+): authorize once via `POST http://127.0.0.1:23119/api/local/authorize` with an application name — Zotero shows Allow / Always Allow / Deny; **Always Allow** returns a reusable 32-char key (plain Allow is single-use). Store it at `~/.config/zotero/local-api-key` (0600), send as a `Zotero-API-Key` header. Request/response shapes are identical to the web API (items, collections, tags, saved searches, file uploads). pyzotero's local mode is documented for reads; if it refuses writes, hit the endpoints directly (requests/curl) — same JSON.
3. **Web API via pyzotero