Skip to main content
Glama

Zotero MCP Server

A MCP (Model Context Protocol) server to let your MCP clients (e.g. Anthropic Claude App, Goose, possibly vscode Cline too) interact with your local Zotero repository. This server enables programmatic access to your Zotero library, allowing you to search papers, manage notes, and more.

Note: If you don't want to set up API keys, see the SQLite database server option below.

Setup

  1. Install dependencies:

pip install -e .
  1. Create a .env file in the root directory with your Zotero credentials:

ZOTERO_API_KEY=your_api_key_here
ZOTERO_USER_ID=your_user_id_here

You can get your Zotero API key and user ID from Zotero's settings page.

Related MCP server: zotero-mcp

Integration with Anthropic Desktop App

To integrate with the Anthropic Desktop app, add the following configuration to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "zotero-mcp-server": {
      "command": "uv",
      "args": [
        "--directory",
        "/Users/swairshah/work/research/zotero-mcp",
        "run",
        "python",
        "-m",
        "zotero_mcp.server"
      ]
    }
  }
}

If this gives an error like

{"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"claude-ai","version":"0.1.0"}},"jsonrpc":"2.0","id":0}
  error: unexpected argument '--directory' found

Then use the following config, make sure to do uv venv; source .venv/bin/activate; uv pip install ".[dev]" to make sure the server can be run with all dependencies.

{
   "mcpServers": {
      "zotero-mcp-server": {
        "command": "bash",
        "args": [
          "-c",
          "cd /Users/shahswai/personal/zotero-mcp-server && source .venv/bin/activate && python -m zotero_mcp.server"
        ]
      }
    }
  }

Alternative: Direct SQLite Database Access

If you prefer to bypass the Zotero API entirely and work directly with the SQLite database, use zotero_mcp/db_server.py. This approach gives you full control over your Zotero data without API limitations. Note that you'll need to close Zotero completely before using this method since SQLite locks the database when Zotero is running.

Claude MCP config for the SQLite version:

{
  "mcpServers": {
    "zotero-mcp-server": {
      "command": "uv",
      "args": [
        "--directory",
        "/Users/swair/work/code/zotero-mcp-server",
        "run",
        "python",
        "-m",
        "zotero_mcp.db_server"
      ]
    }
  }
}

Example Usage

Zotero MCP Server Example

The server allows you to:

  • Search papers by tags

  • Get paper details and attached notes

  • Add notes to papers

  • Request paper summaries

Available Tools

10 tools
get_childrenA

Get child items (attachments, notes) of a Zotero item.

Args: key: The Zotero item key.

Returns: JSON array of child items.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It states it returns a JSON array, but lacks details on side effects, permissions, or limits. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Short, structured with Args and Returns, no wasted words. Efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple get operation with one parameter and output schema, description covers core purpose and return type. Could mention more about edge cases, but adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

One required parameter 'key' with description 'The Zotero item key'. Adds a bit of meaning beyond schema title, but minimal. Schema coverage is 0%, so baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'Get' and resource 'child items (attachments, notes) of a Zotero item', distinguishing from siblings like get_item or search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use or when not to use this tool; only implied context from the description. No mention of alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_citationsA

Find papers that cite a given paper using Semantic Scholar.

Args: doi: DOI of the paper. limit: Maximum results (default 100, max 1000). min_citations: Minimum citation count filter. check_library: If true, annotate results with local Zotero presence.

Returns: JSON with count and papers list.

ParametersJSON Schema
NameRequiredDescriptionDefault
doiYes
limitNo
check_libraryNo
min_citationsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears the full burden. It discloses the use of Semantic Scholar, the return format (JSON with count and papers list), and the check_library behavior. However, it does not mention rate limits, authentication needs, or confirm that it is a read-only operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with a clear separation of Args and Returns sections. It avoids unnecessary fluff, though it could be slightly more structured (e.g., using bullet points for Args).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema (though not detailed in description), the tool is adequately described. Input parameters are explained, the data source is identified, and the return structure is summarized. Sibling context is known from the list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description provides brief yet meaningful explanations for all four parameters (doi, limit, min_citations, check_library) beyond their types and defaults. This adds sufficient context for agent understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Find' and the resource 'papers that cite a given paper' using Semantic Scholar. It distinguishes itself from siblings like 'search_semantic_scholar' (general search) and 'get_references' (likely referenced papers).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for citation lookups but does not explicitly state when to use this tool versus alternatives (e.g., 'find_related', 'search_semantic_scholar'). No exclusions or prerequisites are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_fulltextA

Get full-text content of a Zotero attachment.

Args: key: The key of an attachment item (not a top-level item).

Returns: JSON with content, indexedPages, and totalPages.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses the return JSON structure (content, indexedPages, totalPages) and the constraint that key must be an attachment item, which is sufficient for a read-only operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: one line for purpose, then Args and Returns sections. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and an output schema, the description is complete: it clarifies the input requirement and describes the output fields, matching the output schema. No additional context needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate. It explains the sole parameter 'key' as 'The key of an attachment item (not a top-level item)', adding meaning beyond the schema's bare 'string' type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Get full-text content of a Zotero attachment', which specifies a clear verb and resource. It distinguishes from siblings like 'get_item' (which gets metadata) and 'get_children' (which gets child items).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clarifies that the key must be for an attachment item, not a top-level item, guiding correct usage. It doesn't explicitly mention when not to use, but the scope is well-defined.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_itemC

Get a single Zotero item by its key.

Args: key: The Zotero item key.

Returns: JSON with the full item data.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It merely states the return is 'JSON with the full item data,' lacking details on side effects, authentication needs, rate limits, or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise and front-loaded with the main purpose. However, it is slightly under-specified for a production tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While an output schema exists (reducing need to document return values), the description omits error conditions, key constraints (e.g., key format), and usage context relative to sibling tools, making it minimally adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The parameter 'key' is described as 'The Zotero item key,' adding minimal value over the schema property name. Schema description coverage is 0%, so the description should compensate but does not provide type, format, or source hints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get a single Zotero item by its key,' identifying the verb (Get), resource (Zotero item), and method (by key). However, it does not explicitly distinguish this from sibling tools like get_children or get_citations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives. There is no mention of preconditions, criteria, or when not to use it, leaving the agent to infer from context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_referencesA

Find papers referenced by a given paper using Semantic Scholar.

Args: doi: DOI of the paper. limit: Maximum results (default 100, max 1000). min_citations: Minimum citation count filter. check_library: If true, annotate results with local Zotero presence.

Returns: JSON with count and papers list.

ParametersJSON Schema
NameRequiredDescriptionDefault
doiYes
limitNo
check_libraryNo
min_citationsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, increasing the burden on the description. It discloses behavior such as the check_library annotation feature, return JSON format, and default/max limits. However, it omits potential rate limits or authentication needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a clear one-line purpose, structured Args list, and Returns section. It avoids unnecessary detail but is slightly verbose with the Returns line repeating the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, parameters, and return format. With an output schema present, it doesn't need to detail return fields. It lacks information on prerequisites or side effects, but for a lookup tool, it is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description adds meaningful parameter explanations (e.g., 'doi: DOI of the paper,' 'limit: Maximum results (default 100, max 1000)'). This compensates for the lack of schema descriptions, though min_citations could be more detailed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Find papers referenced by a given paper using Semantic Scholar,' providing a specific verb and resource. It distinguishes references from citations (sibling get_citations) and other related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives, nor does it list exclusions. It implicitly suggests use for references, but lacks guidance on when not to use it or mention of sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_collectionsA

List all collections in the local Zotero library.

Args: limit: Maximum number of collections to return (0 for all).

Returns: JSON array of collections with id, name, items count, and parent info.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must convey behavior. It states return type and fields but omits side effects, permissions, or pagination details. Adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: two sentences plus parameter/return details. No superfluous text, every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Provides return format information despite presence of output schema. Covers parameter meaning. Lacks usage context among 9 sibling tools, but given simplicity, it is mostly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds critical meaning: explains that limit=0 returns all collections, clarifying the default behavior beyond the schema's integer type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'List' with specific resource 'collections' and scope 'local Zotero library'. Distinguishes from sibling tools like search and list_tags by focusing on listing all collections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. Does not mention exclusions or prerequisites, leaving the agent to infer use cases from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tagsA

List all tags in the Zotero library, optionally filtered by collection.

Args: collection: Optional collection key to filter tags.

Returns: JSON array of tag strings.

ParametersJSON Schema
NameRequiredDescriptionDefault
collectionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry behavioral info. It states the return format (JSON array of strings) but does not disclose read-only nature, pagination, or side effects. The 'List' verb implies safety, but explicit mention of read-only would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise, with the main purpose in the first sentence. 'Args' and 'Returns' sections are well-structured. No redundant or unnecessary content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one parameter, and an output schema exists (though not shown) to cover return details. The description explains the return format. Edge cases like invalid collection keys are not covered, but for a basic list tool this is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds meaning by specifying that 'collection' is an optional key for filtering tags. This clarifies the parameter's purpose beyond the schema's bare name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and resource 'all tags in the Zotero library', with optional filtering by collection. It distinguishes from siblings like list_collections (collections) and search (items).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for listing tags, but does not explicitly state when to use this tool versus alternatives (e.g., list_collections or search). No when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_semantic_scholarA

Search for papers on Semantic Scholar.

Args: query: Search query string. limit: Maximum results (default 20, max 100). year: Year filter, e.g. "2020", "2018-2022", or "2020-". open_access: Only return open access papers. sort: Sort by "citations" or "year" (descending). min_citations: Minimum citation count filter. check_library: If true, annotate results with local Zotero presence.

Returns: JSON with count, total, and papers list.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNo
yearNo
limitNo
queryYes
open_accessNo
check_libraryNo
min_citationsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description bears full responsibility. It details parameters, defaults, and return format. It discloses the check_library annotation behavior. It does not mention rate limits or auth, but for a read-only search, this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with clear Args and Returns sections. It is concise, with no wasted words. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all 7 parameters and the return format. Given the tool's complexity and presence of an output schema, it is sufficiently complete. It lacks edge cases or error handling, but this is acceptable for a search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds meaning by briefly describing each parameter (e.g., 'Search query string', 'Maximum results (default 20, max 100)'). This compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it searches for papers on Semantic Scholar. It uses a specific verb ('Search') and resource ('papers on Semantic Scholar'), which distinguishes it from sibling tools like search (likely local) and get_citations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives. It implies its purpose but lacks guidance on when not to use it or comparison to sibling tools like find_related or get_references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A3.8/5.0
Disambiguation5/5

Every tool has a clearly distinct purpose: local Zotero operations (list_collections, list_tags, search, get_item, get_children, get_fulltext) and Semantic Scholar operations (find_related, get_citations, get_references, search_semantic_scholar). Within each group, tools are differentiated by specific actions (e.g., find_related vs. get_citations vs. get_references). There is no ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using lowercase and underscores (e.g., list_collections, get_item, search_semantic_scholar). The verbs appropriately reflect the action: 'list' for enumerations, 'get' for retrieving single items, 'search' for queries, and 'find_related' for semantic similarity. No mixing of conventions.

Tool Count5/5

With 10 tools, the surface is well-scoped for a Zotero integration. It covers both local library management (6 tools) and external Semantic Scholar access (4 tools), providing a balanced set without unnecessary overlap or missing core functionality. The count is ideal for an MCP server.

Completeness3/5

The server provides robust read operations for Zotero items and comprehensive Semantic Scholar functionality. However, it lacks any write operations (create, update, delete) for Zotero library items or collections, which is a notable gap for a library management server. The tool set appears read-only, limiting its utility for full library management.

Maintenance

ActivityInactive
ResponsivenessNo issues

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

Related MCP Servers

Latest Blog Posts

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/swairshah/zotero-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server