Python wrapper for the Zotero API
Project description
Pyzotero: An API Client for the Zotero API
Quickstart
uv add pyzoteroorpip install pyzoteroorconda install conda-forge::pyzotero- You'll need the ID of the personal or group library you want to access:
- Your personal library ID is available here, in the section
Your userID for use in API calls - For group libraries, the ID can be found by opening the group's page:
https://www.zotero.org/groups/groupname, and hovering over thegroup settingslink. The ID is the integer after/groups/
- Your personal library ID is available here, in the section
- You'll also need† to get an API key here
- Are you accessing your own Zotero library?
library_typeis'user' - Are you accessing a shared group library?
library_typeis'group'.
Then:
from pyzotero import Zotero
zot = Zotero(library_id, library_type, api_key) # local=True for read access to local Zotero
items = zot.top(limit=5)
# we've retrieved the latest five top-level items in our library
# we can print each item's item type and ID
for item in items:
print(f"Item: {item['data']['itemType']} | Key: {item['data']['key']}")
Documentation
Full documentation of available Pyzotero methods, code examples, and sample output is available on Read The Docs.
Installation
- Using uv:
uv add pyzotero - Using pip:
pip install pyzotero - Using Anaconda:
conda install conda-forge::pyzotero
Pyzotero also provides an optional CLI and MCP server for working with a local Zotero library. Both require Zotero 7 with local API access enabled: Zotero > Settings > Advanced > "Allow other applications on this computer to communicate with Zotero".
Command-Line Interface
Pyzotero includes an optional CLI for searching and querying your local Zotero library.
Installing the CLI
Or run it directly without installing:
- Using uvx:
uvx --from "pyzotero[cli]" pyzotero search -q "your query" - Using pipx:
pipx run --spec "pyzotero[cli]" pyzotero search -q "your query"
Usage
# Search for top-level items
pyzotero search -q "machine learning"
# Search with full-text mode
pyzotero search -q "climate change" --fulltext
# Filter by item type
pyzotero search -q "methodology" --itemtype book --itemtype journalArticle
# Search for top-level items within a collection
pyzotero search --collection ABC123 -q "test"
# Output as JSON for machine processing
pyzotero search -q "climate" --json
# List all collections
pyzotero listcollections
# List available item types
pyzotero itemtypes
Search Behaviour
By default, pyzotero search searches only top-level item titles and metadata fields.
When the --fulltext flag is used, the search expands to include all full-text indexed content, including PDFs and other attachments. Since most full-text content comes from PDF attachments rather than top-level items, the CLI automatically retrieves the parent bibliographic items for any matching attachments. This ensures you receive useful bibliographic records (journal articles, books, etc.) rather than raw attachment items.
Output Format
By default, the CLI outputs human-readable text with a subset of metadata including:
- Title, authors, date, publication
- Volume, issue, DOI, URL
- PDF attachments (with local file paths)
Use the --json flag to output structured JSON.
MCP Server
Pyzotero includes an optional MCP server that exposes your local Zotero library and Semantic Scholar integration as tools for LLMs. This lets sandboxed applications such as Claude Desktop access your Zotero library without needing direct CLI access.
Installing the MCP server
- Using uv:
uv add "pyzotero[mcp]" - Using pip:
pip install "pyzotero[mcp]" - As a standalone tool:
uv tool install "pyzotero[mcp]"
Claude Desktop Configuration
Add the following to your Claude Desktop configuration file:
If pyzotero-mcp is installed:
{
"mcpServers": {
"zotero": {
"command": "pyzotero-mcp"
}
}
}
Or, without installing, using uvx:
{
"mcpServers": {
"zotero": {
"command": "uvx",
"args": ["--from", "pyzotero[mcp]", "pyzotero-mcp"]
}
}
}
Available Tools
Zotero Library Tools
| Tool | Description |
|---|---|
search |
Search the local Zotero library by query, item type, collection, tag, or full-text content |
get_item |
Get a single Zotero item by its key |
get_children |
Get child items (attachments, notes) of a Zotero item |
list_collections |
List all collections in the library |
list_tags |
List all tags, optionally filtered by collection |
get_fulltext |
Get full-text content of a PDF or other attachment |
Semantic Scholar Tools
| Tool | Description |
|---|---|
find_related |
Find semantically similar papers using SPECTER2 embeddings |
get_citations |
Find papers that cite a given paper |
get_references |
Find papers referenced by a given paper |
search_semantic_scholar |
Search across Semantic Scholar's paper index |
The Semantic Scholar tools can optionally check whether results already exist in your local Zotero library (enabled by default via the check_library parameter).
Development
Installing from Source
git clone git://github.com/urschrei/pyzotero.git
cd pyzotero
git checkout main
# specify --dev if you're planning on running tests
uv sync
Testing
Run pytest . from the top-level directory. This requires the dev dependency group to be installed: uv sync --dev / pip install --group dev
Issues
The latest commits can be found on the main branch, although new features are currently rare. If you encounter an error, please open an issue.
Pull Requests
Pull requests are welcomed. Please read the contribution guidelines. In particular, please base your PR on the main branch.
Versioning
As of v1.0.0, Pyzotero is versioned according to Semver; version increments are performed as follows:
- MAJOR version will increment with incompatible API changes,
- MINOR version will increment when functionality is added in a backwards-compatible manner, and
- PATCH version will increment with backwards-compatible bug fixes.
Citation
Pyzotero has a DOI:
You may also cite Pyzotero using CITATION.cff.
A sample citation (APA 6th edition) might look like:
Stephan Hügel, The Pyzotero Authors (2019, May 18). urschrei/pyzotero: Version v1.3.15. http://doi.org/10.5281/zenodo.2917290
License
Pyzotero is licensed under the Blue Oak Model Licence 1.0.0. See LICENSE.md for details.
† This isn't strictly true: you only need an API key for personal libraries and non-public group libraries.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyzotero-1.10.0.tar.gz.
File metadata
- Download URL: pyzotero-1.10.0.tar.gz
- Upload date:
- Size: 552.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
90ec4040e5a26182b9e2b0eaa7945464bcb4f57c710b1418c1ccd19bb5ccf7a7
|
|
| MD5 |
c97144463eb3b84b1591809c0bb9cc15
|
|
| BLAKE2b-256 |
53fcdc2682ccbb6f4ada2c0b08252febd647723330d2f72c70bb070de32586ce
|
Provenance
The following attestation bundles were made for pyzotero-1.10.0.tar.gz:
Publisher:
tests.yml on urschrei/pyzotero
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyzotero-1.10.0.tar.gz -
Subject digest:
90ec4040e5a26182b9e2b0eaa7945464bcb4f57c710b1418c1ccd19bb5ccf7a7 - Sigstore transparency entry: 924133746
- Sigstore integration time:
-
Permalink:
urschrei/pyzotero@d8f3b5520ecd6d357fb9eb69c232e2312ecc5e2f -
Branch / Tag:
refs/tags/v1.10.0 - Owner: https://github.com/urschrei
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
tests.yml@d8f3b5520ecd6d357fb9eb69c232e2312ecc5e2f -
Trigger Event:
push
-
Statement type:
File details
Details for the file pyzotero-1.10.0-py3-none-any.whl.
File metadata
- Download URL: pyzotero-1.10.0-py3-none-any.whl
- Upload date:
- Size: 49.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
454e3f3e7fbb4f98e1eaae7d90c78ee12b7c0ea386e21a8d9a12e73b38ee9fa0
|
|
| MD5 |
596154c998c70976bd0f0952ad17b835
|
|
| BLAKE2b-256 |
26ad648abae578d4b79dc7fd5368ba6f5c9d3a9cf3b78685f4dfab31ea8d37fe
|
Provenance
The following attestation bundles were made for pyzotero-1.10.0-py3-none-any.whl:
Publisher:
tests.yml on urschrei/pyzotero
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyzotero-1.10.0-py3-none-any.whl -
Subject digest:
454e3f3e7fbb4f98e1eaae7d90c78ee12b7c0ea386e21a8d9a12e73b38ee9fa0 - Sigstore transparency entry: 924133750
- Sigstore integration time:
-
Permalink:
urschrei/pyzotero@d8f3b5520ecd6d357fb9eb69c232e2312ecc5e2f -
Branch / Tag:
refs/tags/v1.10.0 - Owner: https://github.com/urschrei
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
tests.yml@d8f3b5520ecd6d357fb9eb69c232e2312ecc5e2f -
Trigger Event:
push
-
Statement type: