Supports creating new library items by automatically fetching and filling metadata using Digital Object Identifiers (DOIs).
Provides full read and write support for managing Zotero libraries, including tools for searching items, managing collections and tags, creating new entries, and performing maintenance tasks like merging duplicates.
zotero-mcp
Read+write MCP server for Zotero. An MCP server with full write support for managing Zotero library from AI assistants.
Zotero MCP servers I could find were read-only. This one lets you create items, manage collections, find and merge duplicates, and import BibTeX from within Claude Code, Claude Desktop, or any MCP-compatible client.
Features
Search & Read
Tool | Description |
| Full-text search with collection, type, and tag filters |
| Detailed metadata or BibTeX export for a single item |
| List all collections with hierarchy and item counts |
| List items in a specific collection |
| Find duplicates by title/DOI, or scan entire library |
| List all tags with item counts |
Write
Tool | Description |
| Create item from field data |
| Create item by DOI (auto-fills metadata via Zotero translator + CrossRef) |
| Import BibTeX entries into a collection |
| Update item fields with version conflict protection |
Collections
Tool | Description |
| Create a collection (with optional parent) |
| Add an item to multiple collections at once |
| Remove item from collection (doesn't delete it) |
Management
Tool | Description |
| Merge duplicates: transfer metadata, tags, collections to keeper, trash rest |
| Move to trash or permanently delete |
Installation
Requires Python 3.11+ and uv.
# Clone the repo
git clone https://github.com/BirdInTheTree/zotero-mcp.git
cd zotero-mcp
uv syncUsage
Claude Code
claude mcp add zotero -- uv run --directory /path/to/zotero-mcp python -m zotero_mcpClaude Desktop
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"zotero": {
"command": "uv",
"args": ["run", "--directory", "/path/to/zotero-mcp", "python", "-m", "zotero_mcp"],
"env": {
"ZOTERO_LOCAL": "true"
}
}
}
}Configuration
Variable | Default | Description |
|
| Use local Zotero desktop API (requires Zotero running) |
| — | Zotero Web API key (required if not using local) |
| — | Zotero user ID (required if not using local) |
Local mode (default)
Connects to Zotero desktop app at http://localhost:23119/api. Faster, no rate limits. Requires Zotero to be running with the default local API enabled.
Web API mode
Set ZOTERO_LOCAL=false and provide ZOTERO_API_KEY and ZOTERO_USER_ID. Works without the desktop app. Get your API key at https://www.zotero.org/settings/keys.
If local mode fails and Web API credentials are present, the server falls back to Web API automatically.
Examples
Once connected, you can ask your AI assistant things like:
"Search my Zotero for papers ..."
"Create a new collection called ..."
"Import this BibTeX into my collection"
"Find duplicate items in my library and merge them"
"Add this paper to both collections"
"Look up DOI 10.1234/example and add it to my library"
Development
# Install with dev dependencies
uv sync --dev
# Run tests
uv run pytest tests/ -vLicense
MIT