
Pyzotero
FreeManage Zotero libraries programmatically with ease.
Free · Opens the source repo
What Pyzotero does
Pyzotero is a Python wrapper designed for seamless interaction with the Zotero API v3, enabling developers and researchers to manage their Zotero libraries programmatically. With Pyzotero, you can retrieve, create, update, and delete bibliographic references, collections, tags, and attachments directly from your code. This skill is particularly useful for automating workflows related to research, citation management, and data organization, making it an essential tool for academics and developers working with reference management systems.
The skill supports a variety of operations through a straightforward API. You can easily authenticate with your Zotero account using environment variables to store your credentials securely. Once set up, you can retrieve items, search your library, and even manage collections and tags. The ability to export citations in formats like BibTeX adds to its utility, allowing for integration into various academic writing processes. Additionally, the skill supports local mode, enabling read-only access to a locally running Zotero instance without needing an API key, which is beneficial for offline work.
Pyzotero is ideal for those who frequently interact with Zotero for managing bibliographic data, whether for academic papers, research projects, or personal libraries. It simplifies the process of integrating Zotero into larger applications or scripts, allowing users to focus on their research without getting bogged down by manual data entry or management tasks. By leveraging this skill, users can create efficient workflows that enhance their productivity and streamline their research processes.
Overall, Pyzotero provides a robust and flexible solution for anyone looking to programmatically manage their Zotero libraries, making it a valuable addition to the toolkit of developers and researchers alike.
When to use it
Use this skill when you need to automate the management of Zotero libraries, such as retrieving items, updating references, or exporting citations.
When not to use it
This skill may not be suitable for users who prefer a purely GUI-based interaction with Zotero or those who do not require programmatic access to their library.
What you can build with it
Automating Citation Management
Use Pyzotero to automatically update your bibliography as you add new references to your Zotero library.
Integrating Zotero with Research Tools
Integrate Pyzotero into your research applications to fetch and display bibliographic data dynamically.
Exporting References in Different Formats
Leverage Pyzotero to export your Zotero library items in formats like BibTeX for easy integration into LaTeX documents.
How to install Pyzotero
View source1. Install with the skills CLI
npx skills add k-dense-ai/scientific-agent-skills/pyzotero --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by k-dense-aiPyzotero
Pyzotero is a Python wrapper for the Zotero API v3. Use it to programmatically manage Zotero libraries: read items and collections, create and update references, upload attachments, manage tags, and export citations.
Current upstream: pyzotero 1.13.0 (PyPI, May 2026). Docs: pyzotero.readthedocs.io.
Authentication Setup
Required credentials — get from https://www.zotero.org/settings/keys:
- User ID: shown as "Your userID for use in API calls"
- API Key: create at https://www.zotero.org/settings/keys/new
- Library ID: for group libraries, the integer after
/groups/in the group URL
Store credentials in environment variables or a .env file:
ZOTERO_LIBRARY_ID=your_user_id
ZOTERO_API_KEY=your_api_key
ZOTERO_LIBRARY_TYPE=user # or "group"
See references/authentication.md for full setup details.
Installation
uv add pyzotero # Web API client
uv add "pyzotero[cli]" # + local CLI (Zotero 7)
uv add "pyzotero[mcp]" # + MCP server for LLM clients (Zotero 7)
Quick Start
import os
from pyzotero import Zotero
zot = Zotero(
library_id=os.environ['ZOTERO_LIBRARY_ID'],
library_type=os.environ.get('ZOTERO_LIBRARY_TYPE', 'user'),
api_key=os.environ['ZOTERO_API_KEY'],
)
# Retrieve top-level items (returns 100 by default)
items = zot.top(limit=10)
for item in items:
print(item['data']['title'], item['data']['itemType'])
# Search by keyword
results = zot.items(q='machine learning', limit=20)
# Retrieve all items (use everything() for complete results)
all_items = zot.everything(zot.items())
Core Concepts
- A
Zoteroinstance is bound to a single library (user or group). All methods operate on that library. - Item data lives in
item['data']. Access fields likeitem['data']['title'],item['data']['creators']. - Pyzotero returns 100 items by default (API default is 25). Use
zot.everything(zot.items())to get all items. - Write methods return
Trueon success or raise aZoteroError.
Reference Files
| File | Contents |
|---|---|
| references/authentication.md | Credentials, library types, local mode |
| references/read-api.md | Retrieving items, collections, tags, groups |
| references/search-params.md | Filtering, sorting, search parameters |
| references/write-api.md | Creating, updating, deleting items |
| references/collections.md | Collection CRUD operations |
| references/tags.md | Tag access and management |
| references/files-attachments.md | File download and attachment uploads |
| references/exports.md | BibTeX, CSL-JSON, bibliography export |
| references/pagination.md | follow(), everything(), generators |
| references/full-text.md | Full-text content indexing and access |
| references/saved-searches.md | Saved search management |
| references/cli.md | Command-line interface (local Zotero 7) |
| references/mcp.md | MCP server for LLM clients (local Zotero 7) |
| references/error-handling.md | Errors and exception handling |
Common Patterns
Fetch and modify an item
item = zot.item('ITEMKEY')
item['data']['title'] = 'New Title'
zot.update_item(item)
Create an item from a template
template = zot.item_template('journalArticle')
template['title'] = 'My Paper'
template['creators'][0] = {'creatorType': 'author', 'firstName': 'Jane', 'lastName': 'Doe'}
zot.create_items([template])
Export as BibTeX
zot.add_parameters(format='bibtex')
bibtex = zot.top(limit=50)
# bibtex is a bibtexparser BibDatabase object
print(bibtex.entries)
Local mode (read-only, no API key needed)
zot = Zotero(library_id='123456', library_type='user', local=True)
items = zot.items()
Local Zotero 7 (CLI or MCP, no API key)
For searching a locally running Zotero desktop app (including full-text PDF search), use the CLI or MCP server instead of the Web API. Both require Zotero 7 with local API access enabled. See references/cli.md and references/mcp.md.
Frequently asked questions about Pyzotero
Similar skills
Scientific Problem Selection
Streamline your research problem selection process.
Nextflow Development
Run nf-core bioinformatics pipelines with ease.
Nature Reviewer Assessment
Simulate peer review for scientific manuscripts.
Research Writing Pipeline
Streamline your scientific writing with structured proposal-first methodologies.
Nature Literature Downloader
Efficiently download academic literature from various sources.
Auto Research
Streamline your NeMo-RL experiments with automated workflows.
