mcpField
P
pyzotero

pyzotero

github.com/kalarislabsProductivity7346 installsUpdated 4d ago
Repository

About pyzotero

Pyzotero is a Python wrapper for the Zotero API, aimed at developers automating reference-library management. It supports API and local read-only access, with separate CLI and MCP options for a local Zotero 7 installation.

Key features

  1. 01Read and search library items
  2. 02Create and update references
  3. 03Manage collections and tags
  4. 04Upload attachments and export citations
  5. 05CLI and MCP options for local Zotero 7

Use cases

  1. 01Automate reference-library updates
  2. 02Export citations for a bibliography
  3. 03Search a local Zotero library
  4. 04Upload files to library items

MCP support

An optional MCP server for LLM clients is available for local Zotero 7 with local API access enabled. It can be used instead of the Web API to search a locally running desktop app, including full-text PDF search.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/kalarislabs/research-agent-skills --skill pyzotero

After installing, type/pyzoteroin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
authentication.md
cli.md
collections.md
error-handling.md
exports.md
files-attachments.md
full-text.md
mcp.md
pagination.md
read-api.md
saved-searches.md
search-params.md
tags.md
write-api.md

Details

From the project README

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.

Agent operating procedure

  1. Check the environment. Confirm the research question, databases, date range and inclusion criteria.
  2. Pin down the inputs. Confirm formats, identifiers and parameters from the data or the user. Ask rather than guess any value that changes the result.
  3. Run a small version first. Run the search on one database with a narrow query and check that the results are relevant.
  4. Execute the full task using the instructions and references above.
  5. Validate the result. Every reference is retrieved from a real record with a resolvable identifier; counts and search strings are recorded.
  6. Report. State what was run (versions, commands, parameters), what was checked, and what is still uncertain.
If this happensDo this
An API rate-limits or returns errorsBack off and retry, reduce the batch size, or switch database, and report the gap.
A function, flag or endpoint in these instructions is missing in the installed versionCheck the installed version's own documentation (help(), --help, official docs), adapt, and tell the user. Never invent an API.
A required input, identifier or parameter is ambiguousAsk the user, or state the assumption explicitly before running.

Integrity rules

  • Never fabricate results, parameters, identifiers, citations or statistics. If something cannot be run or verified, say so plainly.
  • Never summarize a paper you have not retrieved; never cite from memory.
  • Treat version-specific details here as possibly outdated: confirm them against the official documentation for the installed version.
  • Ask before actions that cost money, consume shared GPUs or cloud quota, touch personal or patient data, or cannot be undone.

Related skills

  • reference-manager-interop: Move and sync reference libraries between Zotero, Mendeley, EndNote, JabRef, Paperpile and writing tools (LaTeX/BibTeX, Word, Google Docs,…
  • citation-management: Searches OpenAlex, PubMed, and Google Scholar, extracts metadata from DOIs, PMIDs, PMCIDs, arXiv IDs, and URLs via CrossRef, PubMed, and ar…
  • literature-review: Runs systematic literature reviews by searching PubMed, arXiv, bioRxiv, and Semantic Scholar (plus web search via parallel-cli), screening…

Comments

Markdown supported