New to Claude Skills? Learn how to install them →

k-dense-ai on GitHub

Pyzotero

Free

Manage Zotero libraries programmatically with ease.

Get this skill

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 source

1. Install with the skills CLI

npx skills add k-dense-ai/scientific-agent-skills/pyzotero --agent claude-code

2. 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-ai

Pyzotero

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:

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 Zotero instance is bound to a single library (user or group). All methods operate on that library.
  • Item data lives in item['data']. Access fields like item['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 True on success or raise a ZoteroError.

Reference Files

FileContents
references/authentication.mdCredentials, library types, local mode
references/read-api.mdRetrieving items, collections, tags, groups
references/search-params.mdFiltering, sorting, search parameters
references/write-api.mdCreating, updating, deleting items
references/collections.mdCollection CRUD operations
references/tags.mdTag access and management
references/files-attachments.mdFile download and attachment uploads
references/exports.mdBibTeX, CSL-JSON, bibliography export
references/pagination.mdfollow(), everything(), generators
references/full-text.mdFull-text content indexing and access
references/saved-searches.mdSaved search management
references/cli.mdCommand-line interface (local Zotero 7)
references/mcp.mdMCP server for LLM clients (local Zotero 7)
references/error-handling.mdErrors 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