MCP server providing full-text Markdown access to Zotero library attachments
Project description
markzoterodown
An MCP server that gives Claude (or any MCP client) full-text Markdown access to files attached to your Zotero library items.
It complements the zotero-remote MCP — which lets you search and browse your library — by resolving the local file path of any attachment and converting it to Markdown via MarkItDown.
Tools
| Tool | Description |
|---|---|
list_item_attachments |
List all file attachments for a Zotero item (key, filename, MIME type, local path) |
get_attachment_as_markdown |
Convert an attachment (PDF, DOCX, PPTX, HTML, …) to full-text Markdown |
Typical workflow
zotero_search("gypsum sorption") ← zotero-remote 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
Installation
No cloning or manual installs needed. Uses uvx
to pull the package from PyPI into an isolated environment on first run:
uvx markzoterodown # that's it
Setup
1. Get your Zotero credentials
Go to zotero.org/settings/keys:
- Your library ID is the number shown under "Your userID for use in API calls"
- Click Create new private key to generate an API key
2. Add to Claude Desktop / Claude Code
Edit your claude_desktop_config.json:
{
"mcpServers": {
"zotero-fulltext": {
"command": "uvx",
"args": ["markzoterodown"],
"env": {
"ZOTERO_LIBRARY_ID": "<your numeric user ID>",
"ZOTERO_API_KEY": "<your API key>"
}
}
}
}
On macOS the config file lives at:
~/Library/Application Support/Claude/claude_desktop_config.json
Restart Claude after saving.
Configuration
All configuration is via environment variables:
| Variable | Default | Description |
|---|---|---|
ZOTERO_LIBRARY_ID |
(required) | Numeric Zotero user or group ID |
ZOTERO_API_KEY |
"" |
Zotero API key |
ZOTERO_LIBRARY_TYPE |
user |
user or group |
ZOTERO_USE_LOCAL |
false |
Set true to use the Zotero local API (port 23119) instead of the web API — requires enabling it in Zotero → Settings → Advanced |
ZOTERO_STORAGE_PATH |
~/Zotero/storage |
Path where Zotero stores synced attachment files |
Troubleshooting
"File not found" error
The attachment exists in Zotero but hasn't been downloaded locally. Open Zotero,
right-click the item → Find Available PDF or Download PDF. The file must be
present in ZOTERO_STORAGE_PATH on this machine.
403 from the Zotero API
Your API key doesn't have read access. Regenerate it at
zotero.org/settings/keys and make sure
"Allow library access" is checked.
ZOTERO_LIBRARY_ID not set
The server will return a clear error message. Add the env var to your MCP config.
Using a Zotero group library
Set ZOTERO_LIBRARY_TYPE=group and use the group's numeric ID (visible in its
URL on zotero.org).
Development
git clone https://github.com/flol3622/markzoterodown
cd markzoterodown
uv sync
# verify tools register
uv run python -c "from markzoterodown.server import mcp; print([t.name for t in mcp._tool_manager.list_tools()])"
# build + publish
uv build
uv publish --token pypi-...
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.0.tar.gz.
File metadata
- Download URL: markzoterodown-0.2.0.tar.gz
- Upload date:
- Size: 113.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":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 |
2bb1298abb687fb349c488536181d3ff9428c541f865644c1ee9815e90c77308
|
|
| MD5 |
dd33cfbbff84af76ac2dd8c2271ccdb3
|
|
| BLAKE2b-256 |
56d75ac6b14440f6a26cb5878d21f69abfeef26a543dee3835f15d4213023eba
|
File details
Details for the file markzoterodown-0.2.0-py3-none-any.whl.
File metadata
- Download URL: markzoterodown-0.2.0-py3-none-any.whl
- Upload date:
- Size: 5.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":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 |
58cfdf9fc93cbbb41e6753a42d0146e2f6767de88263289b50e139ba4158e43b
|
|
| MD5 |
30d7d029011753a49c9eedb49d56cee5
|
|
| BLAKE2b-256 |
b9ea123389481352484b43227b0caf2de3d28cbd4659fd5106b87acbe7eeb2e0
|