MCP server providing full-text Markdown access to Zotero library attachments
Project description
markzoterodown
An MCP server that gives AI agents full-text Markdown access to files attached to your Zotero library items.
markzoterodown handles the attachment content layer: it resolves Zotero attachment paths on disk and converts PDFs, DOCX files, PPTX files, HTML, and other formats to Markdown with MarkItDown.
Use it with a Zotero search/browse MCP server: search for an item key there, then read its attached files here.
Tools
| Tool | Description |
|---|---|
list_item_attachments |
List file attachments for a Zotero item, including attachment keys, filenames, MIME types, link modes, and resolved local paths. |
get_attachment_as_markdown |
Convert a Zotero attachment to Markdown. Supports local Zotero files and linked_url attachments. |
Quick Start
Install nothing manually. Most MCP clients can run the PyPI package directly:
uvx markzoterodown
The universal MCP values are:
| Field | Value |
|---|---|
| Server name | zotero-fulltext |
| Command | uvx |
| Arguments | markzoterodown |
| Required env | ZOTERO_LIBRARY_ID, plus ZOTERO_API_KEY unless using ZOTERO_USE_LOCAL=true |
For copy-paste setup across Claude, Codex, Cursor, Gemini CLI, Windsurf, VS Code, OpenCode, MetaMCP, and other clients, see:
Zotero Credentials
For the Zotero web API, open zotero.org/settings/keys:
ZOTERO_LIBRARY_ID: the number under "Your userID for use in API calls"ZOTERO_API_KEY: create a private key with library read accessZOTERO_LIBRARY_TYPE: useuserorgroup
For Zotero Desktop's local API, enable local API access in Zotero and set:
ZOTERO_USE_LOCAL=true
ZOTERO_LIBRARY_ID=<your user or group ID>
The local API requires Zotero Desktop to be running.
Configuration
All runtime configuration is via environment variables:
| Variable | Default | Description |
|---|---|---|
ZOTERO_LIBRARY_ID |
required | Numeric Zotero user or group ID. |
ZOTERO_API_KEY |
"" |
Zotero API key. Usually omitted when using the local API. |
ZOTERO_LIBRARY_TYPE |
user |
Use user or group. |
ZOTERO_USE_LOCAL |
false |
Set true to use Zotero Desktop's local API on port 23119. |
ZOTERO_STORAGE_PATH |
~/Zotero/storage |
Directory where Zotero stores synced attachment files. |
Workflow
zotero_search("gypsum sorption") # another Zotero MCP
-> item key: BZPBTWVU
list_item_attachments("BZPBTWVU") # this server
-> attachment key: AE7VF5JI
filename: Wilkes 2004.pdf
get_attachment_as_markdown("AE7VF5JI") # this server
-> full Markdown text of the paper
Architecture
Troubleshooting
- If your MCP client cannot find
uvx, use the absolute path fromwhich uvxorwhere.exe uvx. - If an attachment returns "file not found", download/sync the file in Zotero on the same machine that runs the MCP server.
- If the Zotero API returns
403, regenerate your API key with library read access. - For group libraries, set
ZOTERO_LIBRARY_TYPE=groupand use the group's numeric ID.
More client-specific notes are in the agent setup guide.
Development
Contributor setup, local checkout MCP config, build, publish, and release notes live in the development guide.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file markzoterodown-0.2.1.tar.gz.
File metadata
- Download URL: markzoterodown-0.2.1.tar.gz
- Upload date:
- Size: 1.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f5e7217053f89d3c0b13c73c257a2c9e76d5e260cf9c63b946f71080d86e1ee9
|
|
| MD5 |
dc070f4ef59cdbe2f560a4b1c67f90fd
|
|
| BLAKE2b-256 |
4d16241c9b2c9e3d7d6f0bb37b388d9f4e563bf0932f49c1fad7b78105eddfa6
|
File details
Details for the file markzoterodown-0.2.1-py3-none-any.whl.
File metadata
- Download URL: markzoterodown-0.2.1-py3-none-any.whl
- Upload date:
- Size: 5.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9dcfe6b6e96b1f7ad0c86300e9193b749c381318bd76ea6f5e2593ab12d4880a
|
|
| MD5 |
f746c2c98a710d268b18f3cdbcafa4de
|
|
| BLAKE2b-256 |
af58075fc92fcc442fe18915aa5c8109088aeabb0d145f3558bcc8e81609e723
|