Zotero — Codex skill: what it does, how to install
This skill connects Codex to a local Zotero library for searching records, exporting BibTeX, and adding citations to LaTeX or Markdown drafts.
npx skills add openai/plugins --skill zotero -a codexWhat Zotero does
The skill works with Zotero Desktop through its local API. It checks whether the connection is ready, can enable the API and restart Zotero, then searches items, lists collections and tags, exports BibTeX, or keeps references.bib in sync.
It includes the standard-library Python script zotero.py. The script inserts citation keys into .tex and Markdown files, reads indexed full text when requested, and imports BibTeX or RIS records through the connector server. The local API uses port 23119.
Install it when Codex needs to work with a local Zotero library and draft files. Zotero write actions require confirmation of the source and destination unless the import was explicitly requested.
What it helps with
- search a local Zotero library
- export records to
references.bib - insert a citation key into a LaTeX file
- add a citation to a Markdown draft
- import BibTeX or RIS records into Zotero
Example prompts for the agent
- Check the local Zotero API and enable it if needed.
- Search Zotero for papers about “transformer” and export them to `references.bib`.
- Insert a Zotero citation into `paper.tex` and update `references.bib`.
How to install Zotero
1Skills CLI (Vercel)
npx skills add openai/plugins --skill zotero -a codex2Manually: put the files in place
.agents/skills/zotero/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add openai/plugins --skill zotero -a claude-code2Manually: put the files in place
~/.claude/skills/zotero/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/zotero/
Manually: put the files in place
.cursor/skills/zotero/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install openai/plugins zotero2Manually: put the files in place
.github/skills/zotero/SKILL.mdPlatform CLI
gemini skills install https://github.com/openai/plugins --path plugins/zotero/skills/zoteroManually: put the files in place
.devin/skills/zotero/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set201
The whole set →Similar
Questions about Zotero
How do I install Zotero in Codex?
Run npx skills add openai/plugins --skill zotero or npx skills add openai/plugins --skill zotero -a codex. The skill file is placed at .agents/skills/zotero/SKILL.md.
What does the Zotero skill do?
It connects Codex to a local Zotero Desktop library, searches records, lists collections and tags, exports BibTeX, and inserts citations into LaTeX or Markdown drafts.
What does Zotero need to work?
Zotero Desktop must expose its local API. The skill checks the API and uses port 23119; its commands run through python3 and the zotero.py script.
Source text
SKILL.md · MIT
--- name: Zotero description: Use Zotero Desktop from Codex to enable/probe the local API, search a local Zotero library, list items/collections/tags, export BibTeX, insert citation keys into LaTeX or Markdown drafts, read indexed full text when requested, and import BibTeX/RIS records into Zotero through the connector server. Use when the user mentions Zotero, citations, references.bib, BibTeX export, local Zotero API, localhost:23119, or adding citations from a Zotero library. --- # Zotero Use this skill to operate a user's local Zotero Desktop library from Codex. Core helper: ```bash python3 <plugin-root>/skills/zotero/scripts/zotero.py <command> ``` Resolve `<plugin-root>` by going two directories up from this `SKILL.md` file. The helper is stdlib-only and follows the repo convention of running plugin Python helpers with `python3` / `#!/usr/bin/env python3`; it does not require Codex-specific runtime discovery. ## Fast starts Check readiness in one command: ```bash python3 <plugin-root>/skills/zotero/scripts/zotero.py status --json ``` Enable the local API and restart Zotero if needed: ```bash python3 <plugin-root>/skills/zotero/scripts/zotero.py enable --restart ``` Search and export citation data: ```bash python3 <plugin-root>/skills/zotero/scripts/zotero.py search "transformer" --json python3 <plugin-root>/skills/zotero/scripts/zotero.py export-bibtex --out references.bib ``` Insert a citation from Zotero into a draft and keep `references.bib` in sync: ```bash python3 <plugin-root>/skills/zotero/scripts/zotero.py cite --query "Attention Is All You Need" --tex paper.tex --bib references.bib --marker '<cite>' ``` ## Workflow 1. Start with `status --json`. Do not rediscover prefs, ports, or profile paths manually unless the helper fails. 2. If `local_api_enabled_pref` is false, run `enable --restart` when the user asked you to operate Zotero. This updates Zotero's local preference and restarts Zotero so port `23119` comes up. 3. Use read-only local API commands for normal work: - `inventory` for item/collection/tag summaries. - `search <query>` for papers/items. - `export-bibtex` or `sync-bib` for `.bib` files. - `cite` for inserting a citation into a draft. 4. Only retrieve attachment file URLs or full text when the user asks for PDFs, attachment paths, or full-text content. 5. Treat Zotero library writes as explicit write actions. Before `import-bibtex`, `import-ris`, or connector save commands, confirm the exact record/source and destination unless the user's prompt already explicitly asked to add/import it. ## Common commands ```bash # Readiness and route map python3 <plugin-root>/skills/zotero/scripts/zotero.py status --json python3 <plugin-root>/skills/zotero/scripts/zotero.py probe --json # Library inventory python3 <plugin-root>/skills/zotero/scripts/zotero.py inventory python3 <plugin-root>/skills/zotero/scripts/zotero.py collections python3 <plugin-root>/skills/zotero/scripts/zotero.py tags # Search and export python3 <plugin-root>/skills/zotero/scripts/zotero.py search "BERT" python3 <plugin-root>/skills/zotero/scripts/zotero.py export-bibtex --out references.bib python3 <plugin-root>/skills/zotero/scripts/zotero.py export-bibtex --item-key PXW99EKT python3 <plugin-root>/skills/zotero/scripts/zotero.py citations --style apa --json # Draft editing python3 <plugin-root>/skills/zotero/scripts/zotero.py cite --item-key PXW99EKT --tex paper.tex --bib references.bib --marker '<cite>' python3 <plugin-root>/skills/zotero/scripts/zotero.py cite --query "BERT" --markdown notes.md --bib references.bib --marker '<cite>' # Attachments and full text; use only on request python3 <plugin-root>/skills/zotero/scripts/zotero.py children PXW99EKT --json python3 <plugin-root>/skills/zotero/scripts/zotero.py fulltext 2JAZS9U8 --out attention-fulltext.txt python3 <plugin-root>/skills/zotero/scripts/zotero.py file-url 2JAZS9U8 # Writes to Zotero; confirm first unless explicitly requested python3 <plugin-root>/skills/zotero/scripts/zotero.py selected-target --json python3 <plugin-root>/skills/zotero/scripts/zotero.py import-bibtex --file new-reference.bib --yes python3 <plugin-root>/skills/zotero/scripts/zotero.py import-ris --file new-reference.ris --yes ``` ## Output standards - For inventory/search, return title, creators, year, Zotero item key, and BibTeX key when available. - Explain the two-key distinction when relevant: Zotero item keys like `PXW99EKT` are not the same as exported BibTeX keys like `vaswani_attention_2023`. - For `.bib` export, return the absolute output path and entry count. - For draft citation insertion, report the edited file, inserted citation key, and updated `.bib` path. - For blockers, name the exact gate: Zotero app missing, local API disabled, port closed, connector unavailable, no matching item, or write not confirmed. ## Route details Read `references/local-api-routes.md` only when you need endpoint details beyond the helper commands.
© OpenAI · MIT · openai/plugins