zotero-mcp-server-write
A Model Context Protocol (MCP) server that exposes the write operations of a
local Zotero installation to LLM agents. It is a thin async wrapper around the
companion zotero_write_api_plugin
Zotero plugin, which adds HTTP endpoints to Zotero's built-in local server on
http://127.0.0.1:23119. Together they let an agent import items by DOI,
ingest PDFs with Zotero's metadata recognizer, attach files to existing items,
and add formatted notes.
Prerequisite
You must install the zotero_write_api_plugin XPI in Zotero before this
MCP server can do anything useful. Download the latest release from
github.com/akchan/zotero_write_api_plugin/releases
and install it via Tools → Add-ons → Install Add-on From File… in Zotero.
Make sure Zotero is running whenever you use the MCP server.
Recommended pairing
This server only covers writes. For reads (searching the library,
browsing collections, fetching item metadata, getting tags, etc.) install
54yyyu/zotero-mcp alongside it. The
two together give an agent a complete view-and-edit surface over your local
Zotero library. The tool descriptions in this server explicitly point at
54yyyu/zotero-mcp as the way to discover item_key and collection_key
values.
Install / run
The server is published to PyPI as zotero-mcp-server-write:
# Run on-demand with uv (recommended; matches the Claude Desktop config below)
uvx zotero-mcp-server-write
# Or install with pip into a virtual environment / globally
pip install zotero-mcp-server-write
zotero-mcp-server-write
The console-script entry point has the same name as the package.
Tools
| Tool | Description |
|---|---|
add_by_doi |
Import a new item from a DOI / ISBN / arXiv ID / PMID (type auto-detected). |
add_pdf |
Import a local PDF, then run Zotero's metadata recognizer to find a parent item. |
attach_pdf_to_item |
Attach a local PDF to an existing Zotero item by item_key. |
add_note |
Add a child note to an existing item. Accepts markdown (rendered to HTML) or raw HTML. |
update_note |
Replace the body of an existing note item (markdown or raw HTML). |
add_tags |
Add one or more tags to an existing item. Already-present tags are skipped, not errored. |
Claude Desktop config example
Register both the read server and this write server side-by-side:
{
"mcpServers": {
"zotero-mcp": {
"command": "uvx",
"args": ["zotero-mcp"]
},
"zotero-mcp-server-write": {
"command": "uvx",
"args": ["zotero-mcp-server-write"],
"env": {
"ZOTERO_LOCAL_API_BASE": "http://127.0.0.1:23119",
"ZOTERO_WRITE_TIMEOUT": "60"
}
}
}
}
Environment variables
| Variable | Default | Purpose |
|---|---|---|
ZOTERO_LOCAL_API_BASE |
http://127.0.0.1:23119 |
Base URL of Zotero's local HTTP server (where the plugin is hooked in). |
ZOTERO_WRITE_TIMEOUT |
60 (seconds) |
Per-request HTTP timeout for the plugin endpoints. |
Out of scope
- Group libraries. Only the user's local library is targeted; group library writes are not supported by the underlying plugin.
- Collection management. This server does not create, rename, delete,
or reassign collections. Tag addition is supported via
add_tags, but renaming/removing tags is not. Use54yyyu/zotero-mcpfor read access to those structures and edit them in the Zotero UI when needed.
License
MIT, see LICENSE.
Metadata
Release files for zotero-mcp-server-write 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| zotero_mcp_server_write-0.1.5.tar.gz | 12.2 kB | Without provenance | Details for zotero_mcp_server_write-0.1.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| zotero_mcp_server_write-0.1.5-py3-none-any.whl | Python 3 | none | any | Details for zotero_mcp_server_write-0.1.5-py3-none-any.whl |
Total release size: 22.7 kB
Release files / zotero_mcp_server_write-0.1.5.tar.gz
| Download URL | zotero_mcp_server_write-0.1.5.tar.gz |
|---|---|
| Size | 12.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
789c78d4fa913fe17091f4ddad063d77468ad905409cea63f41e4da8756822b1
|
|
BLAKE2b-256 checksum How to use checksums |
1c3f3e72c8cbee67433970b851ba423e380a1abe32e37f0ee0f181298f2fb536
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / zotero_mcp_server_write-0.1.5-py3-none-any.whl
| Download URL | zotero_mcp_server_write-0.1.5-py3-none-any.whl |
|---|---|
| Size | 10.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2d63b3f76b3310f6c262110d37abf645b4a385ca434b9d0587e44495a9487bad
|
|
BLAKE2b-256 checksum How to use checksums |
62e5b48b427cda06618c40bbcce1375b5c2074a054454b8be637719838ca651d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for zotero-mcp-server-write 0.1.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.