Skip to content
Data
Skill

/pyzotero

Zotero library type: ''user'' or ''group'' (default ''user'').

From plugin
scientific-agent-skills
56k177 skills

Claude Code

$ npx -y skills add K-Dense-AI/scientific-agent-skills --skill pyzotero --agent claude-code

SKILL.md

pyzotero.SKILL.md
name: pyzotero
description: >-
  Manages Zotero reference libraries using the pyzotero Python client: retrieves, creates, updates, and deletes items, collections, tags, and attachments via the Zotero Web API v3 or local API. Applies when working with Zotero libraries programmatically, managing bibliographic references, exporting citations, searching library contents, uploading PDF attachments, or building research automation workflows that integrate with Zotero.
allowed-tools: Read Write Edit Bash
license: MIT License
compatibility: Requires Python 3.10+ and pyzotero 1.15.2. Remote access needs network access; private reads and writes need a Zotero API key. Local reads require Zotero 7+ with local API enabled; local writes require Zotero 10+ and separate local authorization.
metadata:
  version: "1.4"
  last-reviewed: "2026-09-30"
  upstream-version: "1.15.2"
  skill-author: K-Dense Inc.
  openclaw:
    primaryEnv: ZOTERO_API_KEY
    envVars:
    - name: ZOTERO_API_KEY
      required: false
      description: Zotero Web API key for private reads and remote writes; not needed for public or local reads.
    - name: ZOTERO_LIBRARY_ID
      required: false
      description: Remote Zotero user or group ID; local personal-library reads can use user ID 0.
    - name: ZOTERO_LIBRARY_TYPE
      required: false
      description: 'Zotero library type: ''user'' or ''group'' (default ''user'').'

Pyzotero

Pyzotero is a Python wrapper for the [Zotero API v3](https://www.zotero.org/support/dev/web_api/v3/start). Use it to programmatically manage Zotero libraries: read items and collections, create and update references, upload attachments, manage tags, and export citations.

**Reviewed target:** [pyzotero 1.15.2](https://pypi.org/project/pyzotero/1.15.2/) on 2026-09-30. Checked official [SDK documentation](https://pyzotero.readthedocs.io/en/latest/), release source, and [Web API contracts](https://www.zotero.org/support/dev/web_api/v3/basics). Examples requiring a private library or running Zotero are illustrative; read-only public probes and isolated SDK contract checks do not establish authenticated write success.

Authentication Setup

**For remote private reads and writes**, get credentials 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](references/authentication.md) for full setup details.

Installation

uv add "pyzotero==1.15.2"    # Reviewed Web API client
uv add "pyzotero[cli]==1.15.2"  # + local CLI
uv add "pyzotero[mcp]==1.15.2"  # + MCP server

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'].get('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.
  • Return types are method-specific: `update_item()` reports Boolean success, while `create_items()` returns per-item creation status. Inspect its `failed`, `successful` (full saved objects), `success` (legacy keys), and `unchanged` mappings and retain the input-index-to-key mapping. A truthy response dictionary does not establish that every item was created; report partial failures and retry only the failed inputs after reconciliation. See the [write-method contracts](https://pyzotero.readthedocs.io/en/latest/#creating-and-updating-items).

Reference Files

| File | Contents | |------|----------| | [references/authentication.md](references/authentication.md) | Credentials, library types, local mode | | [references/read-api.md](references/read-api.md) | Retrieving items, collections, tags, groups | | [references/search-params.md](references/search-params.md) | Filtering, sorting, search parameters | | [references/write-api.md](references/write-api.md) | Creating, updating, deleting items | | [references/collections.md](references/collections.md) | Collection CRUD operations | | [references/tags.md](references/tags.md) | Tag access and management | | [references/files-attachments.md](references/files-attachments.md) | File download and attachment uploads | | [references/exports.md](references/exports.md) | BibTeX, CSL-JSON, bibliography export | | [references/pagination.md](references/pagination.md) | follow(), everything(), generators | | [references/full-text.md](references/full-text.md) | Full-text content indexing and access | | [references/saved-searches.md](references/saved-searches.md) | Saved search management | | [references/cli.md](references/cli.md) | Command-line interface (local Zotero) | | [references/mcp.md](references/mcp.md) | MCP server for LLM clients (local Zotero) | | [references/error-handling.md](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('journalAr
Read more
@k-dense-ai
Ships withscientific-agent-skills

๐Ÿ”” Claude Scientific Skills is now Scientific Agent Skills. Same skills, broader compatibility โ€” now works with any AI agent that supports the open Agent Skills standard, not just Claude.

Stars on GitHub

Momentum

stars in total
55.6k
Star history of K-Dense-AI/scientific-agent-skills on GitHub, a chart by star-history.com

Other skills on scientific-agent-skills.

aeon

aeon

This skill should be used for time series machine learning tasks including classification, regression, clustering, forecasting,โ€ฆ

More skills from other plugins.

paddleocr-doc-parsing

paddleocr-doc-parsing

Use this skill to extract structured Markdown/JSON from PDFs and document imagesโ€”tables with cell-level precision, formulas asโ€ฆ

@paddlepaddle@paddlepaddleInstall Skill
context-loader
Auto-invoked

context-loader

Search memories from earlier Pi sessions in this repository. Use it when earlier work may already explain the code, error,โ€ฆ

mem04d69k
@mem0ai@mem0aiInstall Skill
analyzing-ai-citations

analyzing-ai-citations

Answer AI citation and answer engine optimization (AEO) questions in PostHog: whether AI answer engines (ChatGPT, Claude, and anโ€ฆ

posthog10d41k
@posthog@posthogInstall Skill
qmd

qmd

Search local markdown knowledge bases, notes, docs, and wikis with QMD. Use when users ask to find notes, retrieve documents,โ€ฆ

qmd3w31k
@tobi@tobiInstall Skill

Questions about pyzotero.

Which coding agents can use pyzotero?
pyzotero installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.