Zotero MCP Connector
The Zotero MCP Connector server allows direct integration of your local Zotero library with Claude, enabling you to access and interact with your research data. With this server, you can:
List all collections in your library using
get_collections()Fetch items within a specific collection using
get_collection_items(collection_key)Retrieve detailed information about specific items, including abstracts, via
get_item_details(item_key)Search your entire Zotero library with
search_library(query)Access recently added items using
get_recent(limit=10)Retrieve tags used in your library with
get_tags()
Provides direct read access to your local Zotero library, allowing Claude to search collections, view item details, and access paper abstracts
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 MCP Connectorsearch my library for papers about machine learning ethics"
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 Connector
This project is retired. I am no longer convinced MCP is the interface one wants, better have direct CLI access.
If you like MCPs, there are a few options, but I did not test them.
A Model Control Protocol (MCP) connector for integrating your local Zotero with Claude.
This enables direct read access to your local Zotero library through Claude's Desktop interface.
It depends on the ability to access a local web-api in Zotero 7.
This was inspired by a repository using Node.js and the web api: mcp-zotero.
This builds on the shoulders of the fantastic pyzotero library.
Installation
Run from local code (Recommended)
Information about Claude Desktop interacting with MCPs can be found here.
Use
uv. Installation instructions can be found here.Checkout the git project to local space and activate the virtual environment inside:
git clone https://github.com/gyger/mcp-pyzotero.git
cd mcp-pyzotero
uv syncEnable the local API in Zotero 7:

Add the server to your local Claude installation:
uv run mcp install zotero.pyRun encapsulated with uvx (Should work)
Edit the configuration for your Claude Desktop softare in the file.
- macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
- Windows: %APPDATA%\Claude\claude_desktop_config.jsonand add the Zotero entry
{
"mcpServers": {
"Zotero": {
"command": "uvx",
"args": ["--from", "git+https://github.com/gyger/mcp-pyzotero.git",
"--with", "mcp[cli]",
"--with", "pyzotero",
"mcp", "run", "zotero.py"
],
}
}
}Related MCP server: principia-mcp
Configuration
The connector is configured to work with local Zotero installations and currently only user libraries are supported.
By default it uses the userid 0, but you can also set the environment variable ZOTERO_USER_ID if needed:
uv run mcp install zotero.py -v ZOTERO_USER_ID=0Available Functions
Available tools
get_zotero_summary(): Lists properties about your library including collections, recent items or tags.get_collection_items(collection_key): Get all items in a specific collectionget_items_metadata(item_key): Get detailed information about specific paper(s), including abstract.search_library(query, mode): Search your Zotero library, with two possible modes: everything or titleCreatorYear.
This functionality should be extended in the future.
Requirements
Python 3.10+
pyzotero
mcp[cli]
Local Zotero installation
Contributing
Contributions are welcome! Please visit the GitHub repository to:
Report issues
Submit pull requests
Suggest improvements
License
MIT
Available Tools
4 toolsget_collection_itemsC
Gets all items in a specific Zotero collection.
| Name | Required | Description | Default |
|---|---|---|---|
| collection_key | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action ('Gets') but doesn't cover critical aspects like whether this is a read-only operation, potential rate limits, authentication needs, or how it handles errors. The description is too minimal for a tool with parameters and an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words. It's front-loaded with the core purpose, making it easy to scan, though this brevity comes at the cost of completeness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 2 parameters (with 0% schema coverage) and an output schema, the description is incomplete. It doesn't explain parameter meanings or behavioral traits, but the presence of an output schema reduces the need to describe return values. This makes it minimally adequate but with significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it only mentions 'a specific Zotero collection' without explaining what 'collection_key' is or how to obtain it. It doesn't address the 'limit' parameter at all, leaving both parameters poorly documented beyond their schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Gets') and resource ('all items in a specific Zotero collection'), making the purpose explicit. However, it doesn't differentiate from sibling tools like 'get_items_metadata' or 'search_library', which likely retrieve similar data but with different scopes or filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, such as needing a valid collection key, or compare it to siblings like 'get_items_metadata' for broader item retrieval or 'search_library' for filtered searches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_items_metadataC
Get detailed information on specific item(s) in the library
| Name | Required | Description | Default |
|---|---|---|---|
| item_key | Yes | Item key(s) to retrieve. Multiple keys are separated by comma. | |
| include_fulltext | No | Include fulltext content (default: False) | |
| include_abstract | No | Include abstract (default: True) | |
| include_bibtex | No | Include BibTeX key (default: True) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states this is a 'Get' operation, implying read-only behavior, but doesn't cover critical aspects like authentication needs, rate limits, error handling, or what 'detailed information' includes. For a tool with no annotations, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose ('Get detailed information on specific item(s) in the library'). It avoids redundancy and waste, though it could be slightly more structured (e.g., by hinting at parameters).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (4 parameters, 1 required) and the presence of an output schema (which handles return values), the description is minimally adequate. However, with no annotations and no sibling differentiation, it lacks completeness for safe and effective use. The description should compensate more for the missing annotation context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with clear documentation for all parameters (e.g., 'item_key' for retrieval, booleans for content inclusion). The description adds no additional meaning beyond the schema, such as explaining parameter interactions or usage examples. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('detailed information on specific item(s) in the library'), making the purpose understandable. However, it doesn't explicitly distinguish this tool from its siblings like 'get_collection_items' or 'search_library', which likely retrieve items in different ways (e.g., by collection vs. by search).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention siblings like 'get_collection_items' or 'search_library', nor does it specify prerequisites or exclusions (e.g., that 'item_key' is required). This leaves the agent without context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_zotero_informationC
Returns by default information on the Zotero library containing Research Papers collected by the User.Good to call if you dont have a clear understanding yet what to ask from this tool. The returned information can be finetuned by asking for summary, collections, recent items, tags.
| Name | Required | Description | Default |
|---|---|---|---|
| properties | No | Properties you are interested in getting. By default returns informational summary on the connected library.otherwise provide comma-separated list containing: collections, recent, tags | summary |
| limit | No | ||
| itemType | No | itemType supports Boolean searches. E.g. the following examples are possible to limit or choose the item Type. - itemType: book - itemType: book || journalArticle (OR) - itemType: -attachment (NOT) Default choice is to exclude attachements | -attachment |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions that returned information can be 'finetuned' by parameters, implying configurability, but lacks details on permissions, rate limits, or what happens if parameters are omitted. For a tool with three parameters and no annotation coverage, this leaves significant behavioral gaps, such as default behaviors or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately concise but not optimally structured. The first sentence clearly states the default behavior, but the second sentence ('Good to call if...') is vague and doesn't add value. The third sentence about finetuning is useful but could be more integrated. Overall, it's front-loaded with purpose but includes a redundant phrase that reduces efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has three parameters, no annotations, and an output schema (which reduces the need to describe return values), the description is partially complete. It covers the tool's purpose and parameter finetuning but lacks usage guidelines, behavioral details like authentication or errors, and doesn't fully compensate for the 33% gap in schema description coverage. It's adequate as a baseline but has clear gaps for effective agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful context beyond the input schema, which has 67% coverage. It explains that the tool returns 'information on the Zotero library' by default and can be 'finetuned' for 'summary, collections, recent items, tags,' clarifying the purpose of the 'properties' parameter. However, it doesn't detail the semantics of 'limit' or 'itemType' beyond what the schema provides, leaving some parameter meaning implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool returns information about a Zotero library, which clarifies its purpose. However, it's somewhat vague about what 'information' entails and doesn't clearly differentiate from sibling tools like 'get_collection_items' or 'get_items_metadata' that also retrieve library data. The phrase 'Good to call if you dont have a clear understanding yet what to ask from this tool' adds confusion rather than specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides minimal guidance on when to use this tool, only suggesting it's 'Good to call if you dont have a clear understanding yet what to ask from this tool,' which is ambiguous and not actionable. It doesn't explain when to choose this tool over alternatives like 'search_library' or how it complements sibling tools, leaving the agent without clear usage criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_libraryB
Search the Zotero library for an item.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| qmode | No | Use all field and full text search (`everything`), or only Title, Creator and Year search (`titleCreatorYear`) | titleCreatorYear |
| itemType | No | itemType supports Boolean searches. E.g. the following examples are possible to limit or choose the item Type. - itemType: book - itemType: book || journalArticle (OR) - itemType: -attachment (NOT) Default choice is to exclude attachements | -attachment |
| tag | No | tag supports Boolean searches. E.g. the following examples are possible to limit or choose the item Type. - tag: foo - tag: foo bar (tag with space) - tag: foo&tag=bar (AND) - tag: foo bar || bar (OR) - tag: -foo (NOT) - tag: \-foo (literal first-character hyphen) Default choice is empty. | |
| include_abstract | No | Should search results include the abstract? | |
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure but provides minimal information. It doesn't mention whether this is a read-only operation, what authentication might be required, potential rate limits, or what happens when no results are found. The description only states what the tool does at the highest level without behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is maximally concise - a single sentence that states the core purpose without any fluff. Every word earns its place, and the information is front-loaded. There's no wasted verbiage or unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there's an output schema (which handles return values), no annotations, and moderate schema description coverage (67%), the description is minimally adequate. However, for a search tool with 6 parameters and sibling alternatives, the description should provide more context about when to use this specific search functionality versus other retrieval methods available in the server.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides no parameter information whatsoever, while the schema has 67% description coverage. Since the schema already documents most parameters well (especially 'qmode', 'itemType', and 'tag' with detailed examples), the baseline is 3. The description doesn't add value beyond what's in the schema, but the schema coverage is adequate for most parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Search') and target resource ('Zotero library for an item'), making the purpose immediately understandable. However, it doesn't distinguish this tool from sibling tools like 'get_collection_items' or 'get_items_metadata' - both of which also retrieve items from the library, leaving some ambiguity about when to choose this search tool over those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance about when to use this tool versus the sibling tools. There's no mention of alternatives, prerequisites, or specific contexts where this search functionality is preferable to 'get_collection_items' or 'get_items_metadata'. The agent must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
The tools have mostly distinct purposes: get_collection_items retrieves items from a collection, get_items_metadata fetches details for specific items, get_zotero_information provides library overview, and search_library searches across the library. However, get_collection_items and search_library could be slightly confused as both retrieve items, but their scopes (collection-specific vs. library-wide) help differentiate them.
The naming follows a consistent verb_noun pattern (get_collection_items, get_items_metadata, get_zotero_information, search_library) with all tools using snake_case. The only minor deviation is that get_zotero_information uses 'information' instead of a more specific noun like 'overview', but it still fits the pattern well.
With 4 tools, the count is on the low side for a library management system like Zotero, which typically involves CRUD operations. While it covers basic retrieval and search, it feels thin for the domain, lacking tools for creating, updating, or deleting items or collections, which are common in such systems.
The tool set is severely incomplete for a Zotero connector, focusing only on read operations (get and search). There are significant gaps: no tools for creating, updating, or deleting items, collections, or tags, and no support for managing attachments or notes. This will cause agent failures when full library management is needed.
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 Connectors
Academic literature search, retrieval, and private library management on top of OpenAlex.
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Connect Claude to Fathom meeting recordings, transcripts, and summaries
Personal CRM for Claude. Contacts live as plain-text files in your own Google Drive.
Related MCP Servers
- AlicenseAqualityAmaintenanceConnects your Zotero research library with Claude and other AI assistants via the Model Context Protocol, allowing you to search your library, access content, discuss papers, get summaries, and analyze citations.384,829MIT
- FlicenseNot gradedqualityNot gradedmaintenanceEnables Claude to access and search a local Zotero library by querying metadata and providing direct paths to PDF files. This allows the model to browse research collections and natively read academic papers without requiring text extraction or manual exports.
- 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
- FlicenseNot gradedqualityCmaintenanceGives Claude full read/write access to your Zotero reference library, enabling search, collection management, and article addition through natural language.
Appeared in Searches
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/gyger/mcp-pyzotero'
If you have feedback or need assistance with the MCP directory API, please join our Discord server