zotero-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ZOTERO_API_KEY | Yes | Your private Zotero API key, created at zotero.org/settings/keys with access to your personal library (and write access if agents should modify records). Required to access the Zotero API. | |
| ZOTERO_USER_ID | Yes | Your numeric Zotero user ID, found on your zotero.org API key settings page. It is a number, not your username. Required for Word citations. |
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 |
|---|---|
| search_zoteroA | Search the user's Zotero library by title, creator, or year. Attachments, notes, and annotations are omitted. Results are one page; follow next_start until it is null. |
| list_zotero_itemsB | Page through bibliographic items in the library or in one collection. |
| list_zotero_collectionsA | List collections in the user's library, following Zotero's 100-item pages. |
| get_zotero_itemB | Fetch one reference, including its abstract and a Vancouver bibliography line. |
| zotero_apiA | Send one Zotero Web API v3 request to the configured user library. Reads may still use the local app through the bibliography tools. This tool always uses api.zotero.org, including GET, so the response matches the account the API key can change. Create items with POST items and a JSON array. Put collection keys inside each item's collections array. Update one item with PATCH items/ITEMKEY or PUT of the full item data, and send its current version. Delete with DELETE and confirm_delete true. |
| upload_zotero_fileA | Store a local file on an attachment item through the Web API upload flow. Create the attachment first with zotero_api. A new child attachment uses itemType attachment, linkMode imported_file, parentItem, and contentType. Files already stored with the same MD5 are left unchanged. The upload limit here is 100 MB. |
| embed_zotero_word_fieldsA | Replace citation markers with Word fields the Zotero plugin can refresh. Markers: {{zotero:ITEMKEY}}, {{zotero:KEY1+KEY2}}, {{zotero:ITEMKEY|locator=12|label=page|prefix=see|suffix=.}}, and {{zotero:bibliography}}. Open the result in Word and choose Zotero, Refresh. |
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 7 tools
The read tools are clearly separated by action: search_zotero (query), list_zotero_items (paginate), list_zotero_collections (collections), and get_zotero_item (single fetch). The only fuzzy boundary is zotero_api, which is a raw catch-all that can technically do everything the other tools do, but its description frames it explicitly as the Web API escape hatch, so confusion is limited.
All names use snake_case with a verb-led pattern (search_, list_, get_, upload_, embed_) plus a domain noun. The placement of 'zotero' varies (search_zotero vs list_zotero_items vs zotero_api), which is a minor cosmetic inconsistency but nothing confusing.
Seven tools is well-scoped for a Zotero library server, with dedicated read tools plus file upload, word-field embedding, and a raw API fallback. Each tool earns its place without redundancy.
Reads (search, list items, list collections, get item), file upload, and word-field embedding are covered, and zotero_api provides the create/update/delete path so there are no hard dead ends. However, first-class create/update/delete and collection management are only reachable via the raw API, leaving minor ergonomic gaps.