ZotLink
STDIOMCP server connecting Zotero with open scholarly sources for seamless academic paper management
MCP server connecting Zotero with open scholarly sources for seamless academic paper management
A lightweight, production-ready MCP server that brings open scholarly sources into Zotero with one command.
❤️ Like ZotLink? Give it a star 🌟 to support the development!
~/.zotlink/zotlink.logpip install zotlink python -m playwright install chromium
Requires Python 3.10+. Includes full browser support for all preprint servers by default!
Use zotlink init to automatically generate MCP configuration:
# Auto-detect Zotero path zotlink init # Or specify path manually zotlink init /Users/yourname/Zotero
The command outputs ready-to-use configuration JSON, for example:
{ "mcpServers": { "zotlink": { "command": "/opt/homebrew/.../zotlink", "args": [], "env": { "ZOTLINK_ZOTERO_ROOT": "/Users/yourname/Zotero" } } } }
Copy the generated configuration to your Claude Desktop config file:
~/Library/Application Support/Claude/claude_desktop_config.json~/.config/claude/claude_desktop_config.json~/AppData/Roaming/Claude/claude_desktop_config.jsonRestart Claude Desktop and you're ready to go!
git clone https://github.com/your-org/ZotLink.git cd ZotLink pip install -e . python -m playwright install chromium
If you need manual configuration (without using zotlink init), see examples below:
Recommended configuration (simple - just specify Zotero directory):
{ "mcpServers": { "zotlink": { "command": "/path/to/zotlink", "args": [], "env": { "ZOTLINK_ZOTERO_ROOT": "/Users/yourname/Zotero" } } } }
Advanced configuration (specify paths separately):
{ "mcpServers": { "zotlink": { "command": "/path/to/zotlink", "args": [], "env": { "ZOTLINK_ZOTERO_DB": "/Users/yourname/Zotero/zotero.sqlite", "ZOTLINK_ZOTERO_DIR": "/Users/yourname/Zotero/storage" } } } }
Minimal config (auto-detect Zotero paths):
{ "mcpServers": { "zotlink": { "command": "zotlink", "args": [] } } }
Note: Using env variables follows MCP standard and works with all MCP clients (Claude Desktop, Cherry Studio, etc.).
check_zotero_status: Check if Zotero is running and reachableget_zotero_collections: List collections (tree view) from the local DBsave_paper_to_zotero: Save a paper by URL (arXiv/CVF/rxiv), attach PDF/metadataextract_arxiv_metadata: Extract full arXiv metadata (title/authors/subjects/DOI/comment)Logs are written to ~/.zotlink/zotlink.log.
Browser-driven extraction is included by default! All preprint servers (bioRxiv, medRxiv, chemRxiv) work automatically.
The server switches to browser strategy automatically when needed (falls back to HTTP mode on Windows).
Linux may require additional system dependencies:
sudo apt-get install -y libnss3 libatk1.0-0 libatk-bridge2.0-0 libdrm2 libxkbcommon0 libgbm1 libasound2
Recommended - Single directory:
# macOS/Linux export ZOTLINK_ZOTERO_ROOT=/Users/yourname/Zotero # Windows PowerShell $env:ZOTLINK_ZOTERO_ROOT='C:\Users\YourName\Zotero'
Advanced - Separate paths:
# macOS/Linux export ZOTLINK_ZOTERO_DB=/Users/yourname/Zotero/zotero.sqlite export ZOTLINK_ZOTERO_DIR=/Users/yourname/Zotero/storage # Windows PowerShell $env:ZOTLINK_ZOTERO_DB='C:\Users\YourName\Zotero\zotero.sqlite' $env:ZOTLINK_ZOTERO_DIR='C:\Users\YourName\Zotero\storage'
Local config file ~/.zotlink/config.json:
{ "zotero": { "database_path": "/Users/yourname/Zotero/zotero.sqlite", "storage_dir": "/Users/yourname/Zotero/storage" } }
Configuration precedence: ENV vars > MCP env config > local config file > auto-detection
Auth-required sources (e.g., Nature) are planned via bookmark-based cookie sync.
pip install -e . python -m playwright install chromium zotlink # or: python run_server.py
See docs/DEVELOPMENT.md for code structure, adding new extractors, and release tips.
Sources
Stability & Quality
Integration & DX
MIT (see SPDX identifier in packaging metadata)