zotero-mcp
Provides read-only access to a local Zotero library via the Zotero desktop local API, with tools for searching items, retrieving metadata and full-text of attachments, and managing collections, tags, and library statistics.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@zotero-mcpsearch my Zotero library for 'machine learning' in full text"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
zotero-mcp
A local-only, read-only MCP server for Zotero.
AI disclosure
This tool was built by Claude and hardly verified by me. I advise against using it on your Zotero database (and if you ignore that advise, make sure you have up to date offline backups).
Related MCP server: zotero-mcp
Features
Local-only. Talks to the Zotero desktop client's local API on
127.0.0.1:23119. No API key, no zotero.org account, no network traffic.Read-only. Every tool is a retrieval call, enforced by an allowlist; the server has no code path that can add, edit, or delete anything. Note that the local API itself is not read-only — Zotero 10+ supports
POST/PUT/PATCH/DELETEon/api/once a client obtains a local API key viaPOST /api/local/authorize. This server never requests such a key and holdsapi_key=None, so the write path stays unreachable; the read-only guarantee is enforced here, not by the API.stdio transport only.
Requirements
Zotero 7 or newer, running
Python 3.13+
Zotero's local API enabled: Settings → Advanced → "Allow other applications on this computer to communicate with Zotero"
Without that setting the API returns 403 and every tool reports how to fix it.
Install
From a local checkout:
uv tool install .Usage
Register it with Claude Code:
claude mcp add zotero -- uvx zotero-mcpOr add it to your MCP client config directly:
{
"mcpServers": {
"zotero": {
"command": "uvx",
"args": [ "zotero-mcp" ]
}
}
}Tools
Tool | Purpose |
| Search by keyword; optional item-type and tag filters. |
| Full metadata for one item key. |
| Attachments and notes belonging to an item. |
| Indexed text of an attachment (PDF, snapshot), with truncation info. |
| Collections, optionally top-level only. |
| Items inside a collection. |
| Tags used in the library. |
| Most recently added items. |
| Item and collection counts. |
Item keys are 8-character strings such as ABCD2345. To read a PDF's text,
call get_item_children on a reference first to get its attachment key, then
pass that to get_item_fulltext.
Why not read zotero.sqlite directly?
Zotero's developer documentation states that the SQLite schema is an internal implementation detail that may change between releases, and that direct access must be read-only to avoid corruption (Zotero's caching layer interferes with SQLite file locking). The local API is the supported interface, works while Zotero is running, and returns stable documented JSON.
The tradeoff: Zotero must be open. Reading the SQLite file would work with Zotero closed, at the cost of coupling to an unstable schema.
Notes
itemTypenegation: the API docs document exactly three forms —itemType=book,itemType=book || journalArticle(OR), anditemType=-attachment(NOT). Negating a group is not documented, and unsupported expressions fail open: they return200 OKwith the filter silently dropped rather than a400. Measured on this library:-attachment→ 578 results,-attachment || note→ 1184 (the unfiltered total),-(attachment)→ 1184. An unknown type such asgarbagetypereturns 0 results rather than erroring. Because a broken filter yields more rows than a working one, this server sends only the documented-attachmentand drops remaining notes and annotations in code, over-fetching so the requestedlimitis still filled.Results are condensed (envelope and empty fields stripped) to keep responses small; abstracts are truncated in list views but returned in full by
get_item.ZOTERO_LIBRARY_IDandZOTERO_LOCALEcan override the defaults (0,en-US).
Tests
uv run pytestThe suite mocks pyzotero, so it runs without Zotero open.
License
Released into the public domain under the Unlicense. See LICENSE.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceA server that enables MCP clients like Anthropic Claude App to interact with local Zotero libraries, allowing users to search papers, manage notes, and access research materials through natural language.1029Apache 2.0
- Flicense-qualityDmaintenanceRead-only MCP server for browsing, searching, and exporting a Zotero library from AI assistants.
- AlicenseAqualityCmaintenanceRead-only MCP server that lets Claude or any MCP client search and retrieve metadata, notes, full text, citations, and BibTeX from your local Zotero library via its built-in API.11MIT
- AlicenseAqualityBmaintenanceMCP server that grants AI tools read-only access to a Zotero library via search, citekey lookup, and on-demand fulltext retrieval, with low token usage and support for Claude Code, Claude Desktop, and Codex.5MIT
Related MCP Connectors
The everything Zotero MCP server — Web API v3 + local API, safe writes, citations, search.
Remote MCP server for full read/write access to a Zotero library
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sebastianv89/zotero-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server