zotero-mcp-local-write
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ZOTERO_LOCAL | No | Set to 'true' to use Zotero's local HTTP server (no API key required). | false |
| ZOTERO_API_KEY | No | API key from zotero.org settings (required for web API mode). | |
| ZOTERO_LIBRARY_ID | No | Your user or group library ID (required for web API mode). | |
| ZOTERO_LIBRARY_TYPE | No | Your library type: 'user' or 'group'. Defaults to 'user'. | user |
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_item_metadataA | Get the complete metadata for a specific Zotero item, given the item key. Includes the citation key, publication details, identifiers, and timestamps. |
| zotero_item_fulltextA | Get the full text content of a Zotero item, given the item key of a parent item or specific attachment. |
| zotero_search_itemsA | Search for items in your Zotero library. Returns a summary of each match; look up individual results with zotero_item_metadata or zotero_item_fulltext. Choosing a query mode:
Words match by prefix, and space-separated words must all be present though not necessarily adjacent, so 'cybor insect' matches 'Cyborg Insect'. A hyphen separates words and switches the match to OR: 'oxygen-deprived' matches anything containing 'oxygen' or 'deprived', which is far broader than intended. Write hyphenated terms with a space to require both halves. |
| zotero_list_collectionsA | List all collections (folders) in the Zotero library as a tree, with each collection's key, name, parent, and item count. Use these keys with the other write tools to organize your library. |
| zotero_list_collection_itemsA | List the top-level items (works) in a collection, with key, type, title, and date. Use to review a collection's contents before moving items in or out. Child attachments/notes are not listed. |
| zotero_create_collectionA | Create a new collection (folder) in the Zotero library, optionally nested under a parent collection. Returns the new collection's key. |
| zotero_delete_collectionA | Delete a collection. The collection's items are NOT deleted from the library unless delete_items=true — by default they just lose this folder. |
| zotero_add_items_to_collectionA | Add one or more items to a collection. An item can live in multiple collections; this never removes it from others. Use zotero_list_collections to get keys. |
| zotero_remove_items_from_collectionA | Remove one or more items from a collection. This only takes them out of that folder; the items stay in the library and in any other collections they belong to. |
| zotero_update_item_fieldsA | Update fields of an item, e.g. to fix a missing title, date, publication, or abstract, or to set tags (tags: [{'tag': 'x'}]). Pass only the fields to change; everything else is untouched. Use zotero_item_metadata first to see the current values. Collections are NOT edited here — use the dedicated collection tools. |
| zotero_delete_itemsA | Move items to Zotero's trash (recoverable via zotero_restore_items). Note: the local API's true DELETE is permanent, so this tool marks the items deleted instead; to purge permanently, list the trash and empty it with zotero_empty_trash. Use for duplicates. Requires confirm=true. |
| zotero_create_itemA | Create a new empty item in the library, e.g. a journalArticle, book, report, or webpage. Pass only the fields you want set (title, date, creators, ...). Use zotero_item_metadata on an existing item to see valid field names for its type. Returns the new item's key. |
| zotero_change_item_typeA | Change an item's type (e.g. journalArticle -> bookSection). Zotero silently drops fields that do not exist on the new type, so pass field_map to move values across, e.g. {'publicationTitle': 'bookTitle'}. The old values stay in the new fields when the names map. |
| zotero_create_noteA | Create a note. With parent_item_key it becomes a child note of that item; without it, a standalone note. Content is HTML, e.g. 'text'. Returns the new note's key. |
| zotero_update_noteA | Replace a note's content with new HTML. The old content is overwritten; fetch it first with zotero_item_metadata if you need to edit rather than replace. |
| zotero_create_annotationA | Create an annotation on a PDF attachment: a highlight, a note annotation, an image, or ink. annotation_position is the page placement as a JSON object, e.g. {'pageIndex': 0, 'rects': [[x1, y1, x2, y2]]} in PDF coordinates. Attach to the ATTACHMENT key (the PDF), not the parent item. Returns the new annotation's key. |
| zotero_create_saved_searchA | Create a saved (dynamic) search that Zotero keeps in the left sidebar and that re-evaluates automatically. Conditions format: [{'condition': 'title', 'operator': 'contains', 'value': 'x'}]. Common conditions: title, creator, date, tag, publicationTitle, abstractNote, itemType; common operators: contains, doesNotContain, is, isNot, beginsWith, isBefore, isAfter. Returns the new search's key. |
| zotero_update_saved_searchA | Update a saved search's name and/or its conditions. Only the parts you pass are changed; conditions are replaced wholesale when provided. |
| zotero_delete_saved_searchA | Delete a saved search. Its items are untouched (a saved search is just a query). |
| zotero_run_saved_searchA | Execute a saved search and return the matching top-level items. This is a LOCAL-API-ONLY capability: the Zotero Web API exposes saved searches as metadata but cannot run them. |
| zotero_upload_fileA | Attach a local file to an item: creates a stored-file (imported file) child attachment and uploads the file into it. If you pass an attachment key instead, the file is uploaded to that existing attachment (fails if one is already stored). Supported for imported-file attachments, not linked URLs. |
| zotero_download_fileA | Download an item's stored attachment file from Zotero to a path on disk. Works for imported_file attachments (pass the attachment key, or a parent item to auto-pick its best attachment). Link-mode attachments have no stored file. |
| zotero_write_fulltextA | Write (or replace) an attachment's indexed full-text content so zotero_item_fulltext and full-text search can read it. Use for attachments whose text Zotero could not extract (scans, exotic formats) — pass the text you extracted yourself. |
| zotero_list_tagsA | List tags used across the library, with how many items carry each. Use 'prefix' to list only tags starting with a string. |
| zotero_delete_tagA | Delete a tag from every item that carries it. Implemented by rewriting each affected item's tags (the local API has no direct tag-delete endpoint); a few hundred items is fine, tens of thousands is not. |
| zotero_list_trashA | List items currently in Zotero's trash (deleted but recoverable). |
| zotero_restore_itemsA | Restore items from the trash back into the library. |
| zotero_empty_trashA | Permanently delete EVERY item in the trash. This cannot be undone. Requires confirm=true. |
| zotero_list_settingsA | List all library settings stored in Zotero, as JSON. |
| zotero_set_settingA | Set one library setting (a key under /settings), e.g. syncing metadata used by plugins. Overwrites the previous value. |
| zotero_list_groupsA | List the Zotero group libraries the logged-in user belongs to (read-only metadata; group CONTENTS are maintained by the server, not locally). |
| zotero_list_changesA | Track what changed since a version: returns key -> version for every item, collection, or search modified since the given library version. Use since=0 (or omit) for everything, and feed the returned highest version back next time. |
| zotero_bulk_update_fieldsA | Apply a field patch to MANY items in one call (e.g. fixing a hundred titles). Each entry: {'key': 'ABCD1234', 'fields': {...}}. Same semantics as zotero_update_item_fields per item; each request carries its own Zotero-Write-Token for idempotency. |
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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/ozbayenes123-ops/zotero-mcp-local-write'
If you have feedback or need assistance with the MCP directory API, please join our Discord server