Zotero-MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ZOTERO_API_KEY | No | Your Zotero API key with library access and write permission. | |
| ZOTERO_LIBRARY_ID | No | Your Zotero user ID for API calls (numeric). | |
| ZOTERO_MCP_ENV_FILE | No | Path to the .env file containing ZOTERO_API_KEY and ZOTERO_LIBRARY_ID. If provided, the server reads credentials from this file. Alternatively, provide ZOTERO_API_KEY and ZOTERO_LIBRARY_ID directly. |
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
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| zotero_check_setupA | Diagnose the connection to Zotero. Run this first if anything fails. |
| zotero_searchA | Search the Zotero library and return matching references. Use this before citing anything, to find the item keys that the Word tools need. Args: query: Free-text search. Leave empty to browse. item_type: Restrict to a type, e.g. "journalArticle", "book". Prefix with "-" to exclude, e.g. "-attachment". tag: Restrict to a tag. Supports "tagA || tagB" for OR. collection_key: Restrict to one collection. search_mode: "titleCreatorYear" (default) or "everything" to also search full text of attachments and notes. limit: Max results, 1-100. sort: dateModified, dateAdded, title, creator, date, or itemType. direction: "asc" or "desc". top_level_only: Skip notes and attachments that hang off an item. |
| zotero_get_itemA | Fetch one reference in full, including its notes and attachments. Args: item_key: The 8-character Zotero item key. include_children: Also return child notes and attachments. |
| zotero_list_collectionsA | List collections (folders) in the library. Args: parent_collection_key: List sub-collections of this collection. Omit for top-level collections. |
| zotero_list_tagsA | List tags used in the library, optionally filtered by a substring. |
| zotero_list_saved_searchesA | List the saved searches defined in Zotero. |
| zotero_get_fulltextA | Read the indexed full text of an attachment (usually a PDF). Zotero must have indexed the attachment. Pass an attachment key, not the parent reference key -- use zotero_get_item to find it. |
| zotero_list_librariesA | List the personal library and any group libraries you can access. |
| zotero_item_type_templateA | Get the empty field template for an item type. Call this before zotero_create_item when you are unsure which fields a type accepts (they differ a lot between, say, "thesis" and "bill"). |
| zotero_list_item_typesA | List every item type Zotero supports. |
| zotero_create_itemA | Create a new reference in the Zotero library. Args: item_type: e.g. "journalArticle", "book", "bookSection", "report", "thesis", "webpage". Call zotero_list_item_types to see all. title: The item title. creators: List of {"creatorType": "author", "firstName": "...", "lastName": "..."} or {"creatorType": "author", "name": "..."} for institutional authors. date: Publication date, e.g. "2024" or "2024-03-15". fields: Any other Zotero fields for this type, e.g. {"publicationTitle": "Nature", "volume": "620", "DOI": "10.1038/..."}. Use zotero_item_type_template to see which fields are valid. tags: Tag names to attach. collection_keys: Collections to file the item into. |
| zotero_import_identifierA | Look up a DOI, arXiv id or ISBN and save it as a Zotero reference. This is the fastest way to add a source you have a citation for. The metadata comes from CrossRef (DOI/arXiv) or Open Library (ISBN). Args: identifier: e.g. "10.1038/nature12373", "arXiv:2103.00020", "isbn:9780262033848". Bare identifiers are auto-detected. collection_keys: Collections to file the new item into. tags: Tags to attach. |
| zotero_update_itemA | Change fields on an existing reference. Only the fields you pass are modified. The item's current version is read first, so a concurrent edit in Zotero surfaces as a clear conflict rather than silently overwriting. Args: item_key: The 8-character item key. changes: Fields to set, e.g. {"title": "...", "date": "2024"}. For tags pass {"tags": [{"tag": "x"}]} (this replaces all tags). |
| zotero_delete_itemA | Move a reference to the Zotero trash. This is Zotero's normal delete: the item goes to the trash, where you can restore it. It is not an immediate permanent deletion. |
| zotero_add_noteA | Attach a note to a reference, or create a standalone note. Args: text: Note content. Plain text is converted to simple HTML; if you pass HTML it is stored as-is. parent_item_key: Attach the note to this reference. Omit for a standalone note. tags: Tags for the note. |
| zotero_add_tagsA | Add tags to a reference, keeping the tags it already has. |
| zotero_attach_linkA | Attach a web link to a reference. This creates a link attachment (a URL), not an uploaded file. Uploading actual files is not supported yet -- drag them into Zotero directly. |
| zotero_create_collectionB | Create a collection (folder), optionally nested under another. |
| zotero_set_item_collectionsC | File a reference into collections, or take it out of them. |
| zotero_format_citationA | Render references as formatted citation and bibliography text. Use this for previewing, or for output that is not a Word document (email, markdown, a slide). For Word documents use word_insert_citation instead, which inserts live Zotero fields rather than dead text. Args: item_keys: Zotero item keys, from zotero_search. style: CSL style id, e.g. "apa", "ieee", "vancouver". Defaults to ZOTERO_DEFAULT_STYLE. locale: e.g. "en-US", "ca-AD", "es-ES". |
| zotero_list_stylesA | List available CSL citation styles. Args: query: Filter by substring, e.g. "chicago", "medical", "nature". |
| word_document_outlineA | Map a .docx paragraph by paragraph, so you can choose where to cite. Returns each non-empty paragraph with its index and a text preview. Read this before inserting, so anchor text matches the document exactly. |
| word_list_citationsA | List the Zotero citations already present in a .docx. |
| word_insert_citationA | Insert a live Zotero citation field into a Word document. The inserted citation is a real Zotero field, not text: in Word, Zotero's Refresh will update it and changing the document style will reformat it. The document must be CLOSED in Word. A .docx.bak backup is written next to it on every change. Args: document_path: Path to the .docx file. item_keys: One or more Zotero item keys (from zotero_search). Pass several to build a single multi-source citation. anchor_text: Insert immediately after this exact text. Get it from word_document_outline so it matches the document character for character. Use this OR paragraph_index. paragraph_index: Insert at the start or end of this paragraph. position: "end" (default) or "start", used with paragraph_index. locator: Page or range to cite, e.g. "45" or "45-47". prefix: Text before the citation, e.g. "see also". suffix: Text after the citation. suppress_author: Omit the author, for "as Smith (2020) argued". style: CSL style for the document. Only applied if the document has no Zotero style set yet. |
| word_insert_bibliographyA | Insert or refresh the bibliography field, built from the document's citations. Reads every Zotero citation already in the document, renders the corresponding bibliography entries, and writes them into a live ZOTERO_BIBL field. An existing bibliography is replaced. Args: document_path: Path to the .docx file. paragraph_index: Place the bibliography after this paragraph. Omit to append it at the end of the document. heading: Optional heading to insert above it, e.g. "References". style: Only used if the document has no Zotero style set yet. |
| word_set_citation_styleA | Set which CSL style a Word document uses. This writes Zotero's document-preferences fields. After running it, open the document in Word and click Zotero > Refresh: every citation and the bibliography reformat into the new style automatically. Args: document_path: Path to the .docx file. style: CSL style id, e.g. "apa", "ieee", "vancouver". Use zotero_list_styles to browse. locale: e.g. "en-US", "ca-AD", "es-ES". |
| word_remove_citationA | Remove a Zotero citation field from a document. Args: document_path: Path to the .docx file. citation_id: From word_list_citations. keep_text: Leave the rendered citation behind as plain text. |
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 27 tools
Every tool targets a distinct resource or action. zotero_add_tags and zotero_update_item are differentiated by their replacement semantics, and the word_* tools are clearly separated from the zotero_* tools. No two tools appear to serve the same purpose.
The vast majority follow a consistent zotero_/word_ + verb_noun pattern (list_styles, create_item, insert_citation). Two exceptions, zotero_item_type_template and word_document_outline, are noun phrases rather than verb-first, but they remain readable and the overall convention is strong.
At 27 tools, the set is slightly above the typical 'heavy' range, but it covers two substantial domains: Zotero library management (items, collections, tags, notes, attachments) and Word citation integration. Each tool earns its place, so the count is justified.
The core CRUD lifecycle for items is complete (create, read, update, delete), and the Word integration workflow is fully covered. Minor gaps exist—no delete collection, no explicit tag removal, no file attachment upload—but these can be worked around (update_item replaces tags, attach_link covers links) and do not block primary usage.