Local Zotero MCP
An MCP server that gives an LLM read-only
access to your local Zotero library via the
desktop app's Local API.
It talks to Zotero over http://127.0.0.1:23119, so nothing leaves your
machine and no API keys are required.
Requirements
- Zotero desktop app, running, with Settings > Advanced > "Allow other applications on this computer to communicate with Zotero" enabled.
- uv installed.
Quickstart
No cloning or installing required - uvx fetches the published package
from PyPI and runs it. Add this to your Claude Desktop config
(claude_desktop_config.json):
{
"mcpServers": {
"zotero": {
"command": "uvx",
"args": ["--from", "local-zotero-mcp", "zotero-mcp"]
}
}
}
Restart Claude Desktop and the Zotero tools should be available.
uvx caches the environment after the first run, so subsequent launches are
fast; add --refresh to args if you want to force-pull the latest version.
Tools
Every library-scoped tool takes an optional library argument - "user"
(default) for your personal library, or a group ID to read a group library
synced locally. Use list_groups to find group IDs.
| Tool | Description |
|---|---|
list_groups |
List group libraries available to the local Zotero install |
search_items |
Search the library by title/creator/year or full text |
get_item |
Get full data for an item, optionally with citation/bibliography |
get_item_children |
List an item's notes and attachments |
list_top_level_items |
List top-level items in the library |
list_trashed_items |
List items in the trash |
list_publications |
List items in "My Publications" |
list_collections |
List collections |
get_collection |
Get full data for a single collection |
get_subcollections |
List the direct subcollections of a collection |
get_collection_items |
List items in a collection |
get_collection_tags |
List tags used on items in a collection |
list_tags |
List tags |
get_item_tags |
List tags attached to a single item |
get_bibliography |
Generate a formatted bibliography for one or more items |
get_attachment_file_path |
Get the local file path of an attachment |
get_item_types |
List item types supported by Zotero |
The two tools below have no equivalent in the Zotero Web API - they read the
attachment file resolved by get_attachment_file_path and process it locally
with PyMuPDF. Both accept
remove_headers_footers: when true, lines that repeat near the top/bottom of
most pages (running titles, page numbers, etc.) are detected and stripped
from the returned/saved text. For convert_document this only applies to
output_format="txt" - PDF output preserves the original pages as-is.
| Tool | Description |
|---|---|
read_document |
Read the text content of a PDF or EPUB attachment |
convert_document |
Convert a PDF or EPUB attachment to TXT or PDF and save it to a location you specify |
Claude Plugin
This repo also ships as a Claude Code plugin bundling four Agent Skills for Zotero-based research, on top of the same MCP tools listed above:
| Skill | Covers |
|---|---|
searching-zotero-library |
Searching and browsing items, collections, tags, groups |
reading-zotero-documents |
Full-text PDF/EPUB reading, quoting, and comparison |
generating-zotero-bibliographies |
Formatted citations and reading lists |
analyzing-zotero-research |
Thematic clustering, gap analysis, trajectory tracing, reading-list prioritization |
The plugin's .mcp.json runs the server the same way as the Quickstart above (uvx --from local-zotero-mcp zotero-mcp), so it always tracks the published PyPI package.
To try it locally, clone the repo and run:
claude --plugin-dir /path/to/Local-Zotero-MCP
Then invoke a skill directly, e.g. /local-zotero-mcp:searching-zotero-library, or just ask
Claude a research question about your library and let it pick the right skill.
Local development
Clone the repo and install it locally:
uv sync
Run it directly from the checkout:
uv run zotero-mcp
Point Claude Desktop at your local checkout instead of GitHub with:
{
"mcpServers": {
"zotero": {
"command": "uv",
"args": ["run", "--directory", "/path/to/Local-Zotero-MCP", "zotero-mcp"]
}
}
}
Run the tests:
uv run pytest
Tests mock the Zotero HTTP responses, so a running Zotero instance isn't required. To smoke-test against your own Zotero library:
uv run mcp dev zotero_mcp/server.py
Metadata
Release files for local-zotero-mcp 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| local_zotero_mcp-0.3.0.tar.gz | 13.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| local_zotero_mcp-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 24.8 kB
Release files / local_zotero_mcp-0.3.0.tar.gz
| Download URL | local_zotero_mcp-0.3.0.tar.gz |
|---|---|
| Size | 13.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
80dae9aae50f14fe2940bd8abda6be0e5888ee9ad33560f8f7ae913192568640
|
|
BLAKE2b-256 checksum How to use checksums |
a3a0d5aafc22b9e1f6ce2a88e67be2ed4c581e0b09bf7fecd99522f0bda6d7d9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / local_zotero_mcp-0.3.0-py3-none-any.whl
| Download URL | local_zotero_mcp-0.3.0-py3-none-any.whl |
|---|---|
| Size | 11.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c31a91d9218baa460e0d8b02876dfc47a8773d280501b523031589bedb6661ef
|
|
BLAKE2b-256 checksum How to use checksums |
2d7053dcbd2ce01922aa88da7f238b15b47333fdc95d769387191dbd7cd5f5bc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|