Zotero MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ZOTERO_LOCAL | No | Use the local Zotero API instead of the web API | false |
| ZOTERO_API_KEY | No | Your Zotero API key (for web API) | |
| ZOTERO_LIBRARY_ID | No | Your Zotero library ID (for web API) | |
| ZOTERO_LIBRARY_TYPE | No | The type of library (user or group) | user |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| zotero_get_annotations | Get all annotations for a specific item or across your entire Zotero library. When called without item_key, returns ALL annotations library-wide — this can be very large. Always pass item_key when you know which item you want. |
| zotero_get_notes | Retrieve notes from your Zotero library, with options to filter by parent item. Set raw_html=True to return the note's original HTML (e.g., for round-tripping through zotero_update_note). |
| zotero_search_notes | Search for notes and annotations across your Zotero library. Set raw_html=True to return note matches as raw HTML (useful for round-tripping through zotero_update_note). |
| zotero_create_note | Create a new note attached to a Zotero item. Parameters: item_key (the key of the parent item to attach the note to), note_title (title string), note_text (body text, HTML formatting supported). |
| zotero_update_note | Update the HTML content of an existing Zotero note. Set append=True to concatenate to the existing note; otherwise the note is replaced. |
| zotero_delete_note | Move a Zotero note to the Trash. Trashed notes are recoverable from Zotero's Trash — empty the Trash in the Zotero UI for permanent deletion. |
| zotero_create_annotation | Create a highlight annotation on a PDF or EPUB attachment with optional comment. Parameters: attachment_key (the key of the PDF/EPUB attachment, not the parent item), page (integer, 1-indexed — page 1 is the first page), text (exact text to highlight), color (hex, default yellow #ffd400), comment (optional note on the highlight). Requires PyMuPDF: pip install zotero-mcp-server[pdf] |
| zotero_create_area_annotation | Create a PDF area/image annotation using normalized page coordinates. |
| zotero_get_item_metadata | Get detailed metadata for a specific Zotero item by its key. If the metadata and abstract don't contain the specific information you need, use zotero_get_item_fulltext to read the full paper — but note that fulltext retrieval is resource-intensive and should not be used for searching; use zotero_search_items or zotero_semantic_search instead. |
| zotero_get_item_fulltext | Get the full text content of a Zotero item by its key. WARNING: Returns the entire paper text (often 10K+ tokens). Only use when you need to read the actual paper content, not just metadata. Do NOT use this for searching — use zotero_search_items or zotero_semantic_search instead. Avoid calling this on multiple papers in one conversation unless the user specifically asks to read them. |
| zotero_get_collections | List all collections in your Zotero library. |
| zotero_get_collection_items | Get all items in a specific Zotero collection. Supports detail='keys_only' (minimal), 'summary' (default, no abstracts), or 'full' (with abstracts). Includes PDF/notes indicators. TIP: To find papers on a specific topic, use zotero_semantic_search instead — it's faster and returns only relevant results. |
| zotero_get_item_children | Get all child items (attachments, notes) for a specific Zotero item. |
| zotero_get_items_children | Get child items (attachments, notes) for MULTIPLE Zotero items in one call. Much more efficient than calling get_item_children repeatedly. |
| zotero_get_tags | Get all tags used in your Zotero library. |
| zotero_list_libraries | List all accessible Zotero libraries (user library, group libraries, and RSS feeds). Use this to discover available libraries before switching with zotero_switch_library. |
| zotero_switch_library | Switch the active Zotero library context. All subsequent tool calls will operate on the selected library. Use zotero_list_libraries first to see available options. Pass library_type='default' to reset to the original environment variable configuration. |
| zotero_list_feeds | List all RSS feed subscriptions in your local Zotero installation. Shows feed names, URLs, item counts, and last check times. Local mode only. |
| zotero_get_feed_items | Get items from a specific RSS feed by its library ID. Use zotero_list_feeds first to find feed library IDs. Local mode only. |
| zotero_get_recent | Get recently added items to your Zotero library, or to a specific collection. |
| search | ChatGPT-compatible search wrapper. Performs semantic search and returns JSON results. |
| fetch | ChatGPT-compatible fetch wrapper. Retrieves fulltext/metadata for a Zotero item by ID. |
| zotero_search_items | Search for items in your Zotero library, given a query string. Returns metadata and abstracts. IMPORTANT: Use short, simple queries — 'Author Year' (e.g., 'Brewer 2011') or just the author name (e.g., 'Cladder-Micus'). Do NOT add extra keywords like topic words — this is substring matching, not web search. More words make the search STRICTER, not broader. If no results are found, the tool will automatically retry with simplified queries and semantic search. Optionally scope to a specific collection with collection_key. |
| zotero_search_by_tag | Search for items in your Zotero library by tag, optionally scoped to a collection. Conditions are ANDed, each term supports disjunction ( |
| zotero_search_by_citation_key | Look up a Zotero item by its BetterBibTeX citation key (e.g., 'Smith2024'). Works in local mode via the BetterBibTeX API, or in web mode by searching the Extra field. |
| zotero_advanced_search | Perform an advanced search with multiple criteria. |
| zotero_semantic_search | Prioritized search tool. Perform semantic search over your Zotero library using AI-powered embeddings. BEST TOOL for finding papers on a specific topic — much more efficient than scanning collection items or reading abstracts. Works across your entire library. |
| zotero_update_search_database | Update the semantic search database with latest Zotero items. Run this after adding items (via add_by_doi, add_by_url, or add_from_file) to make them immediately available for semantic search. Also useful if the user has added items directly in Zotero since the last update. |
| zotero_get_search_database_status | Get status information about the semantic search database. |
| zotero_batch_update_tags | Batch update tags across multiple items matching a search query or tag filter. |
| zotero_create_collection | Create a new collection (project/folder) in your Zotero library. To create a subcollection, pass parent_collection (not parent_key) as either a collection key (8-character string like 'KMMQDFQ4') or a collection name. Use zotero_search_collections to find collection keys. |
| zotero_search_collections | Search for collections by name to find their keys. |
| zotero_manage_collections | Add or remove one or more items from collections. item_keys must be an ARRAY of item keys, e.g. ["KEY1", "KEY2"] — not a single string. add_to and remove_from also accept arrays of collection keys. Use zotero_search_items to find item keys and zotero_search_collections to find collection keys. |
| zotero_add_by_doi | Add a paper to your Zotero library by DOI. Fetches metadata from CrossRef. |
| zotero_add_by_url | Add a paper by URL. Supports DOI URLs, arXiv URLs, and general web pages. |
| zotero_update_item | Update metadata for an existing item in your Zotero library. To add tags without removing existing ones, use add_tags (not tags). To remove specific tags, use remove_tags. Using tags replaces ALL existing tags — use add_tags/remove_tags for incremental changes. |
| zotero_find_duplicates | Find duplicate items in your library by title and/or DOI. |
| zotero_merge_duplicates | Merge duplicate items. Consolidates tags, collections, notes, annotations, and all child items into the keeper. Duplicates are moved to Trash (recoverable). Dry-run by default — call with confirm=True to execute. Parameters: keeper_key (the item key to KEEP), duplicate_keys (ARRAY of item keys to merge into the keeper and then trash). |
| zotero_get_pdf_outline | Extract the table of contents / outline from a PDF attachment. |
| zotero_add_from_file | Add an item to Zotero from a local PDF file. Attempts DOI extraction for rich metadata. File path must be absolute and point to a .pdf or .epub file. |
| scite_enrich_item | Get a Scite citation report for a paper — supporting, contrasting, and mentioning citation counts plus retraction/correction alerts. Provide either a DOI or a Zotero item key. No Scite account needed. |
| scite_enrich_search | Search your Zotero library and enrich results with Scite citation data. Each result shows supporting/contrasting/mentioning tallies and retraction alerts alongside standard Zotero metadata. No Scite account needed. |
| scite_check_retractions | Scan items in your Zotero library for retractions, corrections, and other editorial notices using Scite data. Filter by collection, tag, or check recent items. No Scite account needed. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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/54yyyu/zotero-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server