Lightweight Zotero MCP server for AI agent interaction
Project description
zoty
Lightweight Zotero MCP server for AI agents.
What it does
MCP server that connects AI agents to your local Zotero library. Provides 6 tools: BM25-ranked search over titles and abstracts, collection browsing, item lookup, and paper ingestion by arXiv ID or DOI with automatic PDF attachment.
Requirements
- Python 3.10+
- Zotero 7 desktop running
- Zotero local API enabled: Zotero Settings > Advanced > Config Editor > set
extensions.zotero.httpServer.localAPI.enabledtotrue - Zoty Bridge plugin installed (for PDF attachment and collection assignment)
Install
# Install as a uv tool (recommended)
uvx --from git+https://github.com/etramel/zoty zoty
# Or from a local checkout
uv tool install .
Claude Code
Add to .mcp.json or ~/.claude/settings.json:
{
"mcpServers": {
"zoty": {
"command": "zoty"
}
}
}
Claude Desktop
Add to your Claude Desktop MCP config:
{
"mcpServers": {
"zoty": {
"command": "uvx",
"args": ["--from", "git+https://github.com/etramel/zoty", "zoty"]
}
}
}
Zoty Bridge Plugin
A tiny Zotero 7 plugin that lets zoty execute JavaScript inside Zotero's privileged context. This is needed for operations that can't go through the REST API: PDF attachment and collection assignment both require writing to Zotero's SQLite database, which locks out external processes. The bridge sidesteps this by running JS inside Zotero itself.
Install the plugin
- Download
zoty-bridge.xpifrom releases, or build it yourself:cd zotero-plugin && bash build.sh
- In Zotero: Tools > Add-ons > gear icon > Install Add-on From File > select the
.xpi - Restart Zotero
The bridge runs an HTTP server on localhost:24119 when Zotero is open. No configuration needed.
Tools
| Tool | Description |
|---|---|
search_library |
BM25-ranked search over item titles and abstracts |
list_collections |
List all collections with keys, names, and item counts |
list_collection_items |
List items in a specific collection |
get_item |
Full metadata for a single item by key |
get_recent_items |
Recently added items, sorted by date |
add_paper |
Add a paper by arXiv ID or DOI with automatic PDF download |
How it works
Read operations go through pyzotero against Zotero's local API (localhost:23119). The BM25 search index builds in a background thread at startup so the MCP handshake completes immediately.
Write operations use the Zotero connector endpoint (/connector/saveItems) to create metadata items. PDF attachment and collection assignment go through the zoty-bridge plugin, which executes JavaScript in Zotero's privileged context. This two-path design exists because Zotero's SQLite database uses exclusive locking -- external processes can read it (immutable mode) but not write to it while Zotero is running.
License
MIT
Project details
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 zoty-0.1.0.tar.gz.
File metadata
- Download URL: zoty-0.1.0.tar.gz
- Upload date:
- Size: 84.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a3800ad8f7e22f0b3aef3f648ac12adefff0b1f7c33b0e0b460b89d603e1228
|
|
| MD5 |
eef44dae5e9a6985bcd6255545ad0ae8
|
|
| BLAKE2b-256 |
91b9c62aa1245bcf630b53011d8d229fe644d9d434d66b7ef05571e5f03658f5
|
Provenance
The following attestation bundles were made for zoty-0.1.0.tar.gz:
Publisher:
publish.yml on eric-tramel/zoty
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zoty-0.1.0.tar.gz -
Subject digest:
2a3800ad8f7e22f0b3aef3f648ac12adefff0b1f7c33b0e0b460b89d603e1228 - Sigstore transparency entry: 1075683449
- Sigstore integration time:
-
Permalink:
eric-tramel/zoty@eb7c71c40556b5227312f81a343be45f90cf1c4f -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/eric-tramel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@eb7c71c40556b5227312f81a343be45f90cf1c4f -
Trigger Event:
push
-
Statement type:
File details
Details for the file zoty-0.1.0-py3-none-any.whl.
File metadata
- Download URL: zoty-0.1.0-py3-none-any.whl
- Upload date:
- Size: 13.7 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 |
4e0513716e88c005e0f4bdba254c62fa3c1f17f16de16f7d01415cd24e3b4d41
|
|
| MD5 |
e0ad626972a0d8eac41161423a7ac924
|
|
| BLAKE2b-256 |
1bcb80eb1685c4f59fb436dfae863dc2e6e33861c8b11b6c842b7e9c83542dc3
|
Provenance
The following attestation bundles were made for zoty-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on eric-tramel/zoty
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zoty-0.1.0-py3-none-any.whl -
Subject digest:
4e0513716e88c005e0f4bdba254c62fa3c1f17f16de16f7d01415cd24e3b4d41 - Sigstore transparency entry: 1075683490
- Sigstore integration time:
-
Permalink:
eric-tramel/zoty@eb7c71c40556b5227312f81a343be45f90cf1c4f -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/eric-tramel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@eb7c71c40556b5227312f81a343be45f90cf1c4f -
Trigger Event:
push
-
Statement type: