MCP Server Setup Guide
Claude Scholar relies on MCP (Model Context Protocol) servers for extended capabilities. MCP servers are not included in this repository — users must install and configure them separately.
Required MCP Servers
1. Zotero MCP (Research Workflow)
Used by: literature-reviewer agent, /research-init, /zotero-review, /zotero-notes commands
Package: Galaxy-Dawn/zotero-mcp — auto-detects local Zotero desktop vs Web API mode; Web credentials are only required for remote access or write tools.
Features
| Category | Tools |
|---|---|
| Import | zotero_add_items_by_identifier, zotero_add_items_by_doi, zotero_add_items_by_arxiv, zotero_add_item_by_url |
| Read | zotero_get_collections, zotero_get_collection_items, zotero_search_items, zotero_semantic_search |
| Update | zotero_update_item, zotero_update_note, zotero_create_collection, zotero_move_items_to_collection, zotero_reconcile_collection_duplicates |
| Delete | zotero_delete_items (to trash), zotero_delete_collection |
zotero_find_and_attach_pdfs (source-aware PDF cascade), zotero_add_linked_url_attachment |
Prerequisites
- Install Zotero if you want local read-only access without Web API credentials
- For write tools or remote Web API access, open Zotero Settings -> Security -> Applications
- Click
Create new private keyto generate your API key - On the same page, copy the
User IDshown below the button. Use this numeric value asZOTERO_LIBRARY_IDfor personal libraries
Installation
# Install via uv (recommended)
uv tool install git+https://github.com/Galaxy-Dawn/zotero-mcp.git
Configuration
Choose your platform below:
Claude Code
For Claude Code v2.1.5+, add to your ~/.claude.json under mcpServers.
For earlier versions, add to your ~/.claude/settings.json under mcpServers:
{
"mcpServers": {
"zotero": {
"command": "zotero-mcp",
"args": ["serve"],
"env": {
"ZOTERO_API_KEY": "your-api-key",
"ZOTERO_LIBRARY_ID": "your-user-id",
"ZOTERO_LIBRARY_TYPE": "user",
"UNPAYWALL_EMAIL": "your-email@example.com",
"UNSAFE_OPERATIONS": "all"
}
}
}
}
Codex CLI
Add to your ~/.codex/config.toml:
[mcp_servers.zotero]
command = "zotero-mcp"
args = ["serve"]
enabled = true
[mcp_servers.zotero.env]
ZOTERO_API_KEY = "your-api-key"
ZOTERO_LIBRARY_ID = "your-user-id"
ZOTERO_LIBRARY_TYPE = "user"
UNPAYWALL_EMAIL = "your-email@example.com"
UNSAFE_OPERATIONS = "all"
NO_PROXY = "localhost,127.0.0.1"
OpenCode
Add to your ~/.opencode/opencode.jsonc:
{
"mcp": {
"zotero": {
"type": "local",
"command": ["zotero-mcp", "serve"],
"enabled": true
}
}
}
Then set environment variables in ~/.zshrc:
# Zotero MCP
export ZOTERO_API_KEY="your-api-key"
export ZOTERO_LIBRARY_ID="your-user-id"
export ZOTERO_LIBRARY_TYPE="user"
export UNPAYWALL_EMAIL="your-email@example.com"
export UNSAFE_OPERATIONS="all"
Environment Variables
| Variable | Required | Description |
|---|---|---|
ZOTERO_API_KEY |
No for local read-only; Yes for Web/write tools | Your Zotero API key |
ZOTERO_LIBRARY_ID |
No for local read-only; Yes for Web/write tools | Your Zotero User ID (numeric) for personal libraries |
ZOTERO_LIBRARY_TYPE |
Yes | user or group |
UNPAYWALL_EMAIL |
No | Email for Unpaywall PDF search |
UNSAFE_OPERATIONS |
No | items (delete_items), all (delete_collection) |
NO_PROXY |
No | Bypass proxy for localhost |
Notes:
- The minimal local setup is just
command = "zotero-mcp"plusargs = ["serve"]. - Do not leave placeholder values such as
your-api-key,your-user-id, oryour-email@example.comin your live config.
Available Tools
| Tool | Purpose |
|---|---|
zotero_get_collections |
List all collections |
zotero_get_collection_items |
Get items in a collection |
zotero_search_items |
Search library by keyword |
zotero_search_by_tag |
Search by tag |
zotero_get_item_metadata |
Get item metadata and abstract |
zotero_get_item_fulltext |
Read PDF full text |
zotero_get_annotations |
Get PDF annotations |
zotero_get_notes |
Get notes |
zotero_semantic_search |
Semantic search (uses embeddings) |
zotero_advanced_search |
Advanced search |
zotero_add_items_by_identifier |
Smart paper import from DOI, arXiv, landing pages, or direct PDF URLs; when web upload hits storage quota and Zotero Desktop is running, it can fall back to a local connector copy (pdf_source=local_zotero_copy) or reuse an existing local copy (pdf_source=local_zotero_existing_copy), exposing local_item_key=... when available |
zotero_add_items_by_doi |
Import papers by DOI |
zotero_add_items_by_arxiv |
Import preprints by arXiv ID |
zotero_add_item_by_url |
Save webpage as item |
zotero_update_item |
Update item fields |
zotero_update_note |
Update note content |
zotero_create_collection |
Create collection |
zotero_move_items_to_collection |
Move items between collections |
zotero_update_collection |
Rename collection |
zotero_delete_collection |
Delete collection |
zotero_delete_items |
Move items to trash |
zotero_find_and_attach_pdfs |
Re-run the source-aware PDF cascade for existing items |
zotero_reconcile_collection_duplicates |
Post-import dedupe and collection-level cleanup |
zotero_add_linked_url_attachment |
Add linked URL attachment |
Workflow note: Claude Scholar's current research startup path prefers zotero_add_items_by_identifier for import, then zotero_reconcile_collection_duplicates as the standard post-import cleanup. Import ledger and local-copy reconcile remain internal diagnostics rather than default public MCP tools.
2. Browser Automation MCP (Optional)
Used for: Chrome browser control, web page interaction.
Configuration
{
"mcpServers": {
"streamable-mcp-server": {
"type": "streamable-http",
"url": "http://127.0.0.1:12306/mcp"
}
}
}
Verification
After configuration, restart your CLI and verify MCP servers are connected:
# Zotero example:
> List my Zotero collections
If the tool responds with your data (for example collections), the setup is complete.
Troubleshooting
| Issue | Solution |
|---|---|
| Tools return error | Check API key and library ID are correct |
| PDF attach fails | Ensure UNPAYWALL_EMAIL is set |
| Delete operations blocked | Set UNSAFE_OPERATIONS=items or all |
| HTTP errors | Check NO_PROXY includes localhost |
| API rate limit (429) | Batch ≤10 papers at a time, add delays between batches |