Skip to main content
Glama
edouardArmit

Zotero MCP Server

by edouardArmit

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
OCR_ENABLEDNoWhether OCR is enabled for scanned/image-only PDF pages. Set to 'false' to turn OCR off.true
OCR_LANGUAGENoLanguage(s) used by the OCR engine (Tesseract).eng
ZOTERO_DATA_DIRNoPath to the Zotero data directory containing zotero.sqlite and storage/ with PDFs. Defaults to ~/Zotero.~/Zotero
ZOTERO_LIBRARY_IDNoZotero library ID. Only needed if using Zotero group libraries.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_librariesA

List every Zotero library this server can see: your personal library ("My Library", library_id 1) plus every group/shared library you belong to, with its library_id, name, and type. Pass a group's library_id as the library_id argument to list_collections, list_items, search_metadata, get_tags, search_library, or get_library_stats to scope to that shared library specifically — otherwise those tools already search across every library by default. Item-level tools (get_item, get_item_fulltext, get_item_notes, get_item_annotations, compare_items) work the same regardless of which library an item lives in — just pass its key.

list_collectionsA

List every collection (and sub-collection) in the Zotero library as a flat list with parent links, so Claude can build or walk the collection tree. Each entry has key, name, library_id, and parent_key (null for top-level collections). Defaults to every library (your personal library plus all group/shared libraries); pass library_id (see list_libraries) to scope to just one.

list_itemsA

List items (papers, books, etc. — not notes/attachments) in the library, most recently modified first. Filter by collection_key (from list_collections), tag (exact tag name), and/or item_type (e.g. 'journalArticle', 'book', 'conferencePaper'). Use limit/offset to page through a large library. Defaults to every library (personal plus all group/shared libraries); pass library_id (see list_libraries) to scope to just one. Returns key, title, library_id, item_type, creators_summary, year, dateAdded, dateModified for each item.

get_itemA

Get full metadata for one item: all bibliographic fields, creators, tags, the collections it belongs to, its abstract, and a summary of its child notes and attachments (so you know what's available to fetch next with get_item_fulltext / get_item_notes / get_item_annotations). Works for items in any library — personal or group/shared — the response's library_id says which one this item lives in.

search_metadataA

Fast search over item titles, abstracts, and creator names (does NOT search inside PDFs or notes — use search_library or search_fulltext for that). Good for quickly locating an item you already know roughly. Searches your personal library and every group/shared library by default; pass library_id (see list_libraries) to scope to one.

get_item_fulltextA

Extract the full text of an item's PDF attachment(s), with [p. N] page markers so you can cite specific pages back to the user. Optionally restrict to a page range with page_start/page_end (1-indexed, inclusive) — useful for a long document where you only need a section. max_chars caps the response size (defaults to a safe per-item limit); the result says so and suggests narrowing the page range if truncated. This extracts on demand — it does not require the search index to have been built first.

get_item_notesA

Get all notes attached to an item (child notes), or the content of a standalone note if item_key is itself a note. Note content is converted from Zotero's internal HTML to plain text.

get_item_annotationsA

Get every PDF annotation (highlights, notes, underlines) the user has made on an item's PDF: the highlighted/underlined text, any comment the user added, the highlight color, and the page label — in reading order. This surfaces what the user found important, which is often more useful for synthesis than the raw PDF text.

get_tagsA

List tags. If item_key is given, list that item's own tags. If omitted, list every tag used anywhere in the library with how many items carry it, most-used first — handy for discovering the user's own taxonomy before filtering list_items/search_library by tag. When item_key is omitted, defaults to aggregating across every library (personal plus all group/shared libraries); pass library_id (see list_libraries) to scope to just one.

search_libraryA

Search across the whole library. scope is one of: 'metadata' (titles/authors/abstracts, always available), 'fulltext' (inside PDF text, requires the index to have been built — see rebuild_search_index / scripts/build_index.py), 'notes' (inside your notes, same index requirement), or 'all' (default: every scope, merged). Searches across every library — your personal library and all group/shared libraries — by default; pass library_id (see list_libraries) to scope to just one. Each fulltext/notes result includes a library_id, a snippet, and the exact page (for PDFs) so you can cite it, plus the parent item_key to fetch more with get_item / get_item_fulltext. IMPORTANT: whenever you report fulltext or notes results to the user, mention the index_last_updated timestamp included in the response (e.g. "based on your library as of ") — those two scopes come from a separately built search index, not a live query, so the user should know how current it is. metadata-only results don't need this since they're always live.

rebuild_search_indexA

(Re)build the full-text search index used by search_library's 'fulltext' and 'notes' scopes. Indexes every library — personal plus every group/shared library — by default, so shared libraries become full-text searchable automatically; pass library_id (see list_libraries) to index just one. Incremental by default (full=False): only new or changed PDFs/notes since the last run are processed, which is fast. Pass full=True to wipe and rebuild everything from scratch. For a large library, prefer running python scripts/build_index.py in a terminal the first time, since that gives you progress output; this tool is best for small incremental top-ups from within a conversation.

compare_itemsA

Fetch metadata (and optionally truncated full text) for several items in one call, so you can compare/synthesize across them — arguments, methods, findings, etc. Items can come from different libraries (personal and/or group/shared) in the same call — each entry's library_id says which one it's from. Set include_fulltext=True to also pull each item's PDF text (capped at max_chars_per_item per item to keep the combined response manageable); leave it False to compare on metadata, abstracts, tags and annotations only.

get_library_statsA

Overall library stats: item/collection/tag counts and full-text index coverage (how many PDFs/notes are searchable via search_library's fulltext/notes scopes right now), including fulltext_index.index_last_updated. Omit library_id to get combined totals across your personal library and every group/shared library, with a by_library breakdown (see list_libraries for names); pass a specific library_id to scope to just one. Mention the index_last_updated timestamp to the user whenever you report these stats or otherwise rely on the full-text index.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.3/5.0

Scored across 13 tools

Disambiguation4/5

Most tools have clearly distinct purposes (list libraries/collections/items, get item content, search, rebuild index, stats). However, search_metadata and search_library with scope='metadata' overlap, and compare_items partially duplicates get_item + get_item_fulltext as a batch operation. Detailed descriptions mitigate but do not eliminate the ambiguity.

Naming Consistency5/5

All 13 tools follow a consistent verb_noun snake_case pattern: list_* for enumerating multiple entities, get_* for retrieving specific content, search_* for the two search tools, plus rebuild_search_index, compare_items, and get_library_stats. The naming is highly predictable and readable.

Tool Count5/5

13 tools is well within the ideal range for this server's scope. Each tool addresses a distinct part of the Zotero read-only workflow (library discovery, collection/item listing, metadata retrieval, fulltext/notes/annotations extraction, search, indexing, comparison, and stats), with no obvious bloat.

Completeness5/5

The tool set provides complete read-only coverage of the Zotero research workflow: discover libraries and collections, list and filter items, fetch full metadata and child content, search across all scopes, maintain the search index, compare multiple items, and retrieve library statistics. There are no dead ends for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues