Skip to main content

MCP server providing full-text Markdown access to Zotero library attachments

Project description

markzoterodown

PyPI Python License: MIT

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

markzoterodown-0.2.0.tar.gz (113.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

markzoterodown-0.2.0-py3-none-any.whl (5.8 kB view details)

Uploaded Python 3

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

Hashes for markzoterodown-0.2.0.tar.gz
Algorithm Hash digest
SHA256 2bb1298abb687fb349c488536181d3ff9428c541f865644c1ee9815e90c77308
MD5 dd33cfbbff84af76ac2dd8c2271ccdb3
BLAKE2b-256 56d75ac6b14440f6a26cb5878d21f69abfeef26a543dee3835f15d4213023eba

See more details on using hashes here.

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

Hashes for markzoterodown-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 58cfdf9fc93cbbb41e6753a42d0146e2f6767de88263289b50e139ba4158e43b
MD5 30d7d029011753a49c9eedb49d56cee5
BLAKE2b-256 b9ea123389481352484b43227b0caf2de3d28cbd4659fd5106b87acbe7eeb2e0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page