Fast fulltext Zotero MCP for Codex and Claude.
Project description
Access your Zotero library with your favorite AI tool.
This MCP server for Zotero 8+ gives Claude and Codex access to your library via search and citekyes. It talks directly to Zotero's local API and aims to keep token usage low. Fulltext is fetched only on demand.
Quick Start
- Make sure Zotero 8+ is running with the local API enabled (Settings → Advanced → "Allow other applications on this computer to communicate with Zotero").
- Install the Claude Code plugin:
claude plugin marketplace add statzhero/zotero-fulltext
claude plugin install zotero
- Run
/mcpto confirm the server is connected, and try a slash command:
/zotero:find sustainability reporting
Also works with Claude Desktop, Codex, and as a standalone MCP server without slash commands.
Commands
The Claude Code plugin provides four slash commands:
| Command | What it does |
|---|---|
/zotero:find <query> |
Search the whole library |
/zotero:lookup <citekey> |
Exact citekey metadata lookup |
/zotero:read <citekey> |
Numbered fulltext paragraphs |
/zotero:within <citekey> <query> |
Search inside one paper's fulltext |
find searches the whole library. lookup is lightweight metadata confirmation. read returns the actual paper text. within searches only one item's indexed fulltext.
Without the plugin, all the same functionality is available through the MCP tools directly (see Tools).
Installation
Claude Code (plugin with slash commands)
claude plugin marketplace add statzhero/zotero-fulltext
claude plugin install zotero
This permanently installs the MCP server and slash commands. Run /mcp to confirm the server is connected.
Claude Desktop
Requires uv (install with brew install uv or curl -LsSf https://astral.sh/uv/install.sh | sh).
Open Claude Desktop → Settings → Developer → Edit Config, and add:
{
"mcpServers": {
"zotero": {
"type": "stdio",
"command": "uvx",
"args": ["zotero-fulltext"]
}
}
}
Save the file, then fully quit and reopen Claude Desktop (closing the window is not enough). Open a new chat and confirm the server is available.
Codex
Requires uv (install with brew install uv or curl -LsSf https://astral.sh/uv/install.sh | sh).
Add to ~/.codex/config.toml:
[mcp_servers.zotero]
command = "uvx"
args = ["zotero-fulltext"]
Restart Codex, then run codex mcp list to verify the server appears.
Design
The server is intentionally simple and read-only. It relies on Zotero's own search index rather than building a second one.
- Startup builds a metadata index mapping citekeys to items and attachments.
- Library changes are tracked with Zotero version headers and incremental sync.
- Fulltext is fetched only on demand and cached in memory (TTL/LRU).
- All outputs are bounded by default: 10 search hits, 80 paragraphs, 20 fulltext matches.
- Item results include
item_uriandfulltext_uriso clients can attach standardzotero://...resources directly. - If a lookup finds no citekey, it returns
found=false. If a search finds nothing, it returnsresults=[]. There is no web fallback.
Tools
The server exposes five MCP tools. The slash commands above are convenience wrappers.
lookup(citekey)
Exact citekey lookup. Citekeys are resolved in order:
- Native Zotero 8
citationKey - Legacy Better BibTeX
Citation Key:line inExtra - Deterministic generated fallback
If an item later gains a real citekey, the generated key is kept as an alias.
search(query, collection?, tag?, limit?)
Searches Zotero with qmode=everything, collapses attachment hits to parent items, and ranks exact citekey matches first.
collections()
Lists collections in the current library.
fulltext(citekey, offset?, limit?)
Fetches indexed attachment fulltext, splits it into numbered paragraphs, and returns a bounded slice (default: 80 paragraphs).
fulltext_search(citekey, query, before?, after?, limit?)
Searches within a single item's paragraphized fulltext and returns matching paragraphs with surrounding context.
Roadmap
- Remote API support (beyond local)
- Write-back (notes, annotations)
- Embeddings or semantic search
- Web fallback for items not in the local library
Environment Variables
By default the server connects to a local personal library with no authentication. Set these variables to change that:
| Variable | Default | Description |
|---|---|---|
ZOTERO_LIBRARY_TYPE |
user |
user for personal libraries, group for group libraries |
ZOTERO_LIBRARY_ID |
0 |
Zotero user or group ID (required for group libraries) |
ZOTERO_API_KEY |
— | API key for authenticated or remote access |
ZOTERO_API_BASE_URL |
http://127.0.0.1:23119/api |
Base URL for the Zotero API |
Example for a group library in Claude Code:
{
"mcpServers": {
"zotero": {
"type": "stdio",
"command": "zotero-fulltext",
"env": {
"ZOTERO_LIBRARY_TYPE": "group",
"ZOTERO_LIBRARY_ID": "12345"
}
}
}
}
Related Projects
Other MCP servers for Zotero, with different design goals:
- 54yyyu/zotero-mcp — Feature-rich: read-write operations, optional semantic search via ChromaDB, Web API support. Heavier dependencies.
- kujenga/zotero-mcp — Minimal read-only server with Web API support via pyzotero. No citekey resolution or in-document search.
- kaliaboi/mcp-zotero — Cloud-only (Zotero Web API). Metadata browsing, no fulltext.
To remove an existing Zotero MCP server before switching:
claude mcp remove zotero
Or delete the zotero entry from .mcp.json / claude_desktop_config.json / ~/.codex/config.toml manually.
Requirements
- Zotero 8+ with the local API enabled
- Python 3.11+
- Better BibTeX (optional but recommended)
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 zotero_fulltext-0.2.3.tar.gz.
File metadata
- Download URL: zotero_fulltext-0.2.3.tar.gz
- Upload date:
- Size: 1.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.25 {"installer":{"name":"uv","version":"0.9.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a79f0e5d0e0683ae4958a6c8815a56a770e71cf663eac61acd4a9384cc7bd32
|
|
| MD5 |
2fa10f3867735df71cf20a5e53c19a8a
|
|
| BLAKE2b-256 |
02e3b6b059148fe038f9c9b649e6ef45a9f41d421c2fcb17b61826c99a9e54fe
|
File details
Details for the file zotero_fulltext-0.2.3-py3-none-any.whl.
File metadata
- Download URL: zotero_fulltext-0.2.3-py3-none-any.whl
- Upload date:
- Size: 22.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.25 {"installer":{"name":"uv","version":"0.9.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a906401df1dafcb647bbf380cc1af954eb35cd8bef7ae5736e34c13bffd7957
|
|
| MD5 |
9e7da7d2db6157d744bab6ae48c3d523
|
|
| BLAKE2b-256 |
198e7bb39bcaeb69bc53e91841f26333fd42daac71523e48afdbabeb7b4fc35d
|