Skip to main content
Glama
awsl5714
by awsl5714

Zotero MCP Server

A Model Context Protocol (MCP) server for Zotero, enabling LLM-powered tools like Claude Desktop, Claude Code, and Cursor to interact with your academic library.

Features

Tools

  • search_papers - Search papers by keyword, title, or author

  • add_arxiv_paper - Add papers to Zotero by arXiv ID or URL

  • update_metadata - Update metadata fields of existing items

  • get_item - Get detailed information about a specific item

  • get_collection_items - List items in a collection

  • get_recent_items - Get recently added items

Resources

  • zotero://recent - Recently added items

  • zotero://collection/{key} - Items in a specific collection (dynamic)

Prompts

  • literature_review - Generate structured literature review template from collection papers

  • paper_summary - Summarize a specific paper with structured analysis

Related MCP server: mcp-zotero

Quick Start

Prerequisites

Installation

git clone https://github.com/awsl5714/zotero-mcp-server.git
cd zotero-mcp-server
pip install -e .

Configuration

cp .env.example .env
# Edit .env with your Zotero credentials
export ZOTERO_LIBRARY_ID=your-library-id
export ZOTERO_API_KEY=your-api-key
export ZOTERO_LIBRARY_TYPE=user  # or "group"

Claude Desktop Integration

Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "zotero": {
      "command": "zotero-mcp",
      "env": {
        "ZOTERO_LIBRARY_ID": "your-library-id",
        "ZOTERO_API_KEY": "your-api-key"
      }
    }
  }
}

Claude Code Integration

Add to your Claude Code MCP settings:

{
  "mcpServers": {
    "zotero": {
      "command": "zotero-mcp",
      "env": {
        "ZOTERO_LIBRARY_ID": "your-library-id",
        "ZOTERO_API_KEY": "your-api-key"
      }
    }
  }
}

Usage Examples

Once connected, you can use natural language in Claude:

  • "Search my Zotero library for papers about transformer architectures"

  • "Add this arXiv paper to my library: 2301.00234"

  • "Write a literature review based on my 'Deep Learning' collection"

  • "Update the tags for paper KEY123 to include 'NLP' and 'attention'"

Tech Stack

Component

Technology

Protocol

MCP SDK

Zotero API

pyzotero

Validation

Pydantic v2

HTTP

httpx

Project Structure

src/zotero_mcp/
├── server.py        # MCP server with Tools, Resources, Prompts
├── zotero_client.py # Zotero API wrapper
└── config.py        # Environment-based configuration

License

MIT

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
Behavior2/5

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

No annotations provided, so the description carries full burden. It states returns a JSON array of child items but does not disclose read-only nature, required authentication, error handling (e.g., invalid key), or rate limits. The description is minimal beyond basic function.

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?

Description is concise with two sentences plus Args/Returns sections. It front-loads the purpose and avoids fluff. The structure is clear and easy to scan. Minor improvement could be merging the first line with Args for even tighter format.

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?

Tool has one parameter and an output schema, and the description adequately covers input and output. For a simple get-child-items tool, this is sufficient. It does not mention error scenarios or prerequisites, but given the low complexity, it is reasonably complete.

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?

The single parameter 'key' is described as 'The Zotero item key,' which adds basic meaning beyond the schema's type-only definition. However, it lacks specifics such as format, source, or any constraints. With 0% schema coverage, the description partially compensates but could be more helpful.

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?

Description clearly states the verb (get) and resource (child items) with parenthetical examples (attachments, notes) and specifies the scope (of a Zotero item). This distinguishes it from sibling tools like get_item or find_related which serve different purposes.

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 when to use (to retrieve child items of a Zotero item) but does not provide explicit guidance on alternatives or when not to use. For example, it does not contrast with get_item or list_collections. This is acceptable for a simple retrieval tool but lacks explicit differentiation.

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
min_citationsNo
check_libraryNo

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 provided, so description carries full burden. Discloses use of Semantic Scholar and return format (JSON with count and papers). But lacks details on rate limits, data freshness, pagination, 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?

Description is clear and well-structured with a brief summary followed by parameter list. No unnecessary text. Could be slightly more concise by integrating parameter descriptions, but still efficient.

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?

Given no annotations and 0% schema coverage, description covers parameters and return type adequately. But missing behavioral context (rate limits, error handling) and fails to discuss usage alongside sibling tools. Not fully complete for a complex tool.

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

Parameters5/5

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

Schema coverage is 0%, so description compensates fully. Lists all parameters (doi, limit, min_citations, check_library) with clear explanation of each, including defaults and max for limit. Adds value beyond raw schema.

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?

Description states 'Find papers that cite a given paper using Semantic Scholar.' The verb 'find' and resource 'citing papers' are specific. Differentiates from siblings like get_references (citations vs references) and search_semantic_scholar (general search).

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?

Usage is implied: use when you need citations of a paper. No explicit when-not or alternatives mentioned. Lacks guidance on when to use this versus find_related, get_references, or search_semantic_scholar.

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.6/5.0
Behavior4/5

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

The description implies read-only behavior ('Get') and details the return fields (content, indexedPages, totalPages). With no annotations, this provides adequate behavioral context for a simple retrieval tool.

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 with three short lines: purpose, args, returns. Every sentence is necessary and front-loaded with the main action.

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?

Given the tool's simplicity (one parameter, no nested objects, output schema exists), the description fully covers what the tool does, what input is needed, and what output to expect.

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

Parameters5/5

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

The only parameter 'key' has no schema description (0% coverage), but the description compensates fully by stating it must be an attachment key, not a top-level item, adding crucial semantic meaning.

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 specific action: 'Get full-text content of a Zotero attachment.' It uses a strong verb and resource, distinguishing it from siblings like 'get_item' (metadata) and 'search' (query-based).

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 explicitly says the key must be an attachment item, not a top-level item, providing clear when-to-use guidance. It does not name specific alternatives but implies correct usage.

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

get_itemB

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

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries full burden. It states the return format (JSON with full item data) but does not discuss error handling, authentication requirements, or behavior when the key is not found. For a simple retrieval, this is adequate but has gaps.

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 short, front-loaded, and well-structured with Args and Returns sections. Every sentence serves a clear purpose.

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?

Given no annotations, a single required parameter, and an output schema, the description covers core functionality. However, it lacks usage context relative to siblings and does not address edge cases, making it incomplete for a fully informed selection.

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?

Schema coverage is 0%, so the description must compensate. It adds only 'The Zotero item key' for the 'key' parameter, which adds minimal meaning beyond the schema's property name. No format, examples, or constraints are provided.

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 'Get a single Zotero item by its key', specifying the verb and resource. It distinguishes from sibling tools like 'find_related', 'get_children', and 'search', which have different purposes.

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 is provided on when to use this tool versus its siblings. There is no mention of prerequisites, limitations, or alternative tools for similar tasks.

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
min_citationsNo
check_libraryNo

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 are provided, so the description carries the full burden. It mentions default values, max limit, and return format (JSON with count and papers), but does not disclose error handling, rate limits, or side effects. This is adequate but not thorough.

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 highly concise with a clear structure: one-line purpose, then a bulleted args list, then return statement. Every sentence is informative with no redundancy.

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 4 parameters (1 required), the presence of an output schema (mentioned), and no nested objects, the description covers purpose, parameter details, and return format sufficiently for an agent to use the tool correctly. Minor omissions like error handling or external dependencies do not significantly hinder understanding.

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 adds meaningful context for each parameter: DOI format implied, limit with max, min_citations as filter, check_library with behavior explanation. This compensates well for the missing schema 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 the action ('Find papers referenced') and the resource ('by a given paper using Semantic Scholar'). It distinctly differentiates from siblings like get_citations (citations) and find_related (related papers).

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?

The description provides no explicit guidance on when to use this tool versus alternatives such as get_citations or find_related. It does not mention exclusions or preferred use cases.

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 carries burden. It discloses return format (JSON array with fields) and limit behavior, but does not mention performance, auth, or side effects. 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.

Conciseness5/5

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

Three clear sentences, front-loaded with purpose. Zero filler. Efficient and to the point.

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?

Simple tool with one param and output schema exists. Description covers core behavior. Sibling tools are distinct. Complete for this complexity level.

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?

Single parameter 'limit' has default 0 in schema but no description. Description adds 'Maximum number of collections to return (0 for all)', providing necessary meaning beyond schema 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?

Clearly states 'List all collections in the local Zotero library' with a specific verb and resource. No ambiguity about what the tool does.

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 siblings like get_children or search. No context for when to choose this over alternatives.

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

A3.6/5.0
Behavior2/5

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

No annotations exist, so the description must fully disclose behavior. It only states the return format (JSON array of tag strings) and does not address read-only nature, limits, 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.

Conciseness5/5

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

The description is extremely concise with three short sentences, front-loading the main purpose, and contains no wasteful words.

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 list tool with one optional parameter, the description covers the basics. It lacks details on behavior when no results or errors, but is largely sufficient given the simplicity.

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?

The description explains the 'collection' parameter as an optional filter, adding meaning beyond the schema's empty title and default. However, with 0% schema coverage, more detail would be beneficial.

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 'List all tags in the Zotero library' with a specific verb and resource, and distinguishes from siblings like search or list_collections by focusing exclusively on tags.

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 mentions optional filtering by collection, providing basic context, but does not give explicit guidance on when to use this tool versus alternatives or any exclusions.

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
queryYes
limitNo
yearNo
open_accessNo
sortNo
min_citationsNo
check_libraryNo

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?

With no annotations, the description carries full burden. It discloses that the tool is a read-only search, returns JSON with specified fields, and explains each parameter's effect. However, it does not mention authentication, rate limits, error handling, or whether the API call modifies any state. The behavior is adequately inferred but not explicitly stated.

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 compact and well-structured. It starts with a clear one-line purpose, then lists parameters in Args with their descriptions, and ends with Returns. Every sentence adds value, with no repetition or unnecessary detail.

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 7-parameter tool with no annotations and an output schema (described in text), the description covers all inputs and the output structure (count, total, papers list). It lacks details on error conditions, pagination (beyond 'max 100'), or API behavior under heavy load, but is sufficient for typical use.

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

Parameters5/5

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

Despite 0% schema description coverage, the description thoroughly explains all 7 parameters: query, limit, year, open_access, sort, min_citations, and check_library. It provides meaning beyond the schema by clarifying formats (e.g., year filter '2020-2022'), options (sort by citations or year), and the purpose of check_library. This significantly aids correct usage.

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 'Search for papers on Semantic Scholar.' This is a specific verb (Search) and resource (papers on Semantic Scholar). It distinguishes from sibling tools like 'search' (likely local Zotero) and other paper-related tools (find_related, get_citations, etc.), as it explicitly names the external source.

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 is given on when to use this tool versus alternatives. The description does not mention scenarios where this tool is preferred or when to avoid it. Sibling tools like 'search', 'get_citations', etc., are not referenced for comparison.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv0.1.0
    • First observedfind_related
    • First observedget_children
    • First observedget_citations
    • First observedget_fulltext
    • First observedget_item
    • First observedget_references
    • First observedlist_collections
    • First observedlist_tags
    • First observedsearch
    • First observedsearch_semantic_scholar

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a distinct functionality: local Zotero operations (get item, children, fulltext, list collections/tags, search) are separate from Semantic Scholar operations (search, related, citations, references). No overlapping purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case (e.g., get_item, list_collections, search_semantic_scholar). Although verbs vary (get, list, search, find), they accurately describe the action and maintain predictability.

Tool Count5/5

With 10 tools, the server is well-scoped for a Zotero integration that includes both local library retrieval and external paper discovery via Semantic Scholar. Each tool serves a distinct need without bloat or deficiency.

Completeness3/5

The tool surface covers extensive read operations for Zotero items, collections, tags, and full-text, plus comprehensive Semantic Scholar searches. However, it lacks CRUD operations (create, update, delete items) that are typical for library management, leaving notable gaps.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers