zotero-library-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ZOTERO_API_KEY | Yes | API key with read/write permissions | |
| CROSSREF_MAILTO | No | Your email for CrossRef polite pool (faster API access) | |
| ZOTERO_LIBRARY_ID | Yes | Your Zotero user or group library ID | |
| ZOTERO_WEBDAV_URL | No | WebDAV URL for file storage | |
| ZOTERO_WEBDAV_USER | No | WebDAV username | |
| ZOTERO_LIBRARY_TYPE | No | Type of library: 'user' (default) or 'group' | user |
| ZOTERO_WEBDAV_PASSWORD | No | WebDAV password |
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
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_librariesA | List the key owner's personal library and a page of shared group libraries. Use the returned library_id and library_type on subsequent tool calls. This does not change the default library. Pagination applies to groups; the personal library is included on each page. Key permissions are not a guarantee of group membership rights; Zotero enforces access on each call. |
| add_paper_by_doiA | Add a paper to your Zotero library by its DOI. Resolves metadata automatically via CrossRef and creates the item in Zotero. Optionally add it to a specific collection. Args: doi: The DOI of the paper (e.g. "10.1038/nature12373") collection_id: Optional Zotero collection key to add the paper to |
| add_papers_by_doisB | Add multiple papers to Zotero by their DOIs (batch, up to 50). Args: dois: List of DOIs to add collection_id: Optional Zotero collection key to add all papers to |
| add_paper_by_arxiv_idA | Add a paper to your Zotero library by its arXiv ID. Fetches metadata from the arXiv API. If the paper has a DOI, resolves it via CrossRef for richer metadata; otherwise creates a preprint entry directly. Optionally add it to a specific collection. Args: arxiv_id: The arXiv ID of the paper (e.g. "2301.07041") collection_id: Optional Zotero collection key to add the paper to |
| add_book_by_isbnB | Add a book to your Zotero library by its ISBN. Resolves metadata automatically via Open Library and creates the item in Zotero. Optionally add it to a specific collection. Args: isbn: The ISBN of the book (e.g. "9780262046824") collection_id: Optional Zotero collection key to add the book to |
| add_item_from_metadataB | Add an item from manual, CSL-like, or previously parsed metadata. The Zotero item template determines which fields are accepted for the requested item type, preventing invalid cross-type metadata. |
| get_unfiled_itemsB | Get items that are not in any collection (unfiled items). Args: limit: Maximum number of items to return (default 25) |
| search_libraryA | Search your Zotero library. Falls back to fuzzy matching if the exact search returns no results. Args: query: Search query matched against titles, creators, and year (use search_fulltext for abstracts, notes, and PDF text) limit: Maximum number of results per page (default 10, max 100) start: Offset of the first result; pass the value suggested by the previous call's footer to fetch the next page (default 0) |
| get_item_detailsC | Get full details of a Zotero item by its key. Args: item_key: The Zotero item key |
| get_bibtexA | Export BibTeX entries from your Zotero library. Can export specific items, an entire collection, or your whole library. Use save_bibtex when the export should be written to a local file. Args: item_keys: Optional list of item keys to export. If omitted, exports collection or full library. collection_id: Optional collection key to export all items from. include_abstract: Include abstracts in BibTeX output (default False to save tokens). biblatex: Convert output to BibLaTeX format (default False). Remaps fields like journal→journaltitle, address→location, and merges year+month into date. max_chars: Maximum response size; use save_bibtex for larger full-library exports |
| save_bibtexB | Export BibTeX or BibLaTeX and atomically write it to a local file. Path writes are available by default over local stdio. HTTP deployments must explicitly allow a confined file root. |
| get_item_fulltextA | Get bounded plain text from a paper's PDF or Zotero full-text index. Unlike download_pdf, this returns readable text directly and never exposes a server-local temporary path. Args: item_key: The Zotero item key (the parent item, not the attachment) attachment_key: Optional PDF attachment key when an item has several PDFs max_chars: Maximum number of characters to return (1,000-200,000) |
| delete_itemB | Permanently delete an item from your Zotero library. Args: item_key: The Zotero item key to delete |
| get_recent_itemsC | Get recently added items from your Zotero library. Args: limit: Maximum number of items to return (default 10) |
| verify_itemsA | Verify that recently added items have valid DOIs that match CrossRef metadata. Re-resolves each item's DOI via CrossRef and compares the title. Reports items that have no DOI, DOIs that don't resolve, or title mismatches. Args: limit: Number of recent items to check (default 10) |
| health_checkA | Check Zotero credentials, library access, and optional file storage setup. |
| list_attachmentsC | List attachment keys, filenames, MIME types, links, and sizes for an item. |
| update_item_metadataB | Update selected bibliographic fields and optionally replace creators. Immutable/internal fields such as item type, key, version, parent item, collections, tags, and deletion state cannot be changed through this tool. |
| trash_itemB | Move an item to Zotero's trash so it can be restored later. |
| list_trashA | List items in Zotero's trash, e.g. to find a key for restore_item. Args: limit: Maximum number of items per page (default 25, max 100) start: Offset of the first item; use the footer's suggestion for the next page |
| restore_itemC | Restore an item from Zotero's trash. |
| find_duplicatesB | Find duplicate top-level items by DOI, ISBN, or normalized title. |
| search_fulltextC | Search Zotero metadata and indexed full text using qmode=everything. |
| searchC | Company-knowledge compatible search over Zotero items and full text. |
| fetchC | Company-knowledge compatible fetch for one Zotero item key. |
| list_collectionsC | List all collections in your Zotero library. |
| add_to_collectionB | Add an existing Zotero item to a collection. Args: item_key: The Zotero item key (from search results) collection_id: The collection key to add it to |
| remove_from_collectionA | Remove an item from a collection without deleting it from the library. Args: item_key: The Zotero item key collection_id: The collection key to remove it from |
| create_collectionC | Create a new collection in your Zotero library. Args: name: Name for the new collection parent_collection_id: Optional parent collection key to nest under |
| delete_collectionA | Permanently delete a collection from your Zotero library. Items in the collection are NOT deleted — they remain in your library. Args: collection_id: The collection key to delete |
| get_collection_itemsB | Get items in a specific collection, one page at a time. Args: collection_id: The collection key to browse limit: Maximum number of items to return per page (default 25, max 100) start: Offset of the first item; pass the value suggested by the previous call's footer to fetch the next page (default 0) |
| rename_collectionB | Rename a Zotero collection without changing its parent. |
| move_collectionC | Move a collection under another collection, or to the library root. |
| list_tagsC | List all tags in your Zotero library. Args: limit: Maximum number of tags to return (default 100) |
| delete_tagsB | Delete tags from the entire Zotero library. This removes the tags from all items. Args: tags: List of tag names to delete from the library |
| add_tagsB | Add one or more tags to a Zotero item. Optionally assign a color to all added tags. Args: item_key: The Zotero item key tags: List of tags to add color: Optional hex color code (e.g. '#FF0000') to assign to the added tags |
| remove_tagsC | Remove one or more tags from a Zotero item. Args: item_key: The Zotero item key tags: List of tags to remove |
| set_tag_colorB | Assign a color to a tag in the Zotero library. Colored tags appear in the tag selector and item lists. Args: tag: The tag name to colorize color: Hex color code (e.g. '#FF0000' for red, '#3366CC' for blue) position: Sort position for the colored tag (0-8, lower = higher priority) |
| rename_tagB | Rename a tag across all items in the Zotero library. Args: old_name: The current tag name new_name: The new tag name to replace it with |
| unset_tag_colorA | Remove a tag's assigned library color without deleting the tag. |
| add_noteB | Add a note to a Zotero item. The note is created as a child of the specified item. Supports HTML formatting (e.g. bold, italic, lists). Args: item_key: The parent Zotero item key to attach the note to note: The note content (plain text or HTML) |
| create_annotationA | Highlight a text passage in a PDF attached to a Zotero item. Searches the PDF for the quoted text and creates a visible highlight annotation in Zotero's PDF reader. Tries a normalized word match first, then fuzzy matching (for OCR errors, hyphenation differences, or minor transcription mismatches). Smart overlap handling:
Args: item_key: The Zotero item key (the parent item, not the attachment) quoted_text: The text passage to highlight in the PDF (fuzzy matching handles minor differences from the actual PDF text) comment: Optional comment to attach to the highlight color: Highlight color as hex (default "#ffd400" yellow) max_l_dist: Maximum Levenshtein distance for fuzzy matching. Default is ~20% of the search text length. Increase if the PDF has many OCR errors; decrease for stricter matching. attachment_key: Optional PDF attachment key when the item has multiple PDFs page_number: Optional one-based page number to search occurrence: One-based occurrence to highlight when text repeats |
| get_annotationsB | List all highlights and annotations on a paper's PDF. Args: item_key: The Zotero item key (the parent item, not the attachment) limit: Maximum number of annotations to return (default 100) |
| attach_fileB | Attach a ChatGPT file input or an authorized local file to an item. Args: item_key: The Zotero item key to attach the file to file: File object supplied by ChatGPT through openai/fileParams file_path: Local server path; stdio only unless HTTP roots are explicitly enabled |
| download_pdfA | Return a PDF as a remote-safe MCP resource link. Useful when Zotero's fulltext index is incomplete (e.g. for books) and you need to read the PDF directly with other tools. Args: item_key: The Zotero item key (the parent item, not the attachment) attachment_key: Optional PDF attachment key when the item has multiple PDFs |
| save_pdfC | Save a Zotero PDF to an authorized local server path. |
| list_notesC | List child notes for an item with bounded note content. |
| update_noteC | Replace the content of an existing Zotero note. |
| delete_noteC | Permanently delete a Zotero note. |
| update_annotationC | Update the comment and/or highlight color of an annotation. |
| delete_annotationC | Permanently delete a Zotero annotation. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 51 tools
Most tools target distinct Zotero resources and actions, but search_library, search_fulltext, and search overlap heavily, and fetch duplicates get_item_details. An agent could struggle to choose the right search or retrieval tool without trial and error.
Predominantly snake_case verb_noun (add_paper_by_doi, list_collections, delete_item). Minor deviations like health_check and bare verbs search/fetch are readable but slightly inconsistent.
51 tools is far beyond the 25+ threshold and qualifies as an extreme mismatch for a single MCP server. While the domain is broad, many tools could be consolidated, such as search variants, batch/single adds, and attachment operations.
The surface covers items, collections, tags, notes, annotations, imports/exports, trash, search, and libraries very thoroughly. Minor gaps remain, such as explicit attachment deletion/update and batch item operations.