Skip to main content

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

Project description

markzoterodown

markzoterodown logo

PyPI Python License: MIT

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:

Agent setup guide

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 access
  • ZOTERO_LIBRARY_TYPE: use user or group

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

Architecture diagram

Troubleshooting

  • If your MCP client cannot find uvx, use the absolute path from which uvx or where.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=group and 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


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.1.tar.gz (1.1 MB 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.1-py3-none-any.whl (5.8 kB view details)

Uploaded Python 3

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

Hashes for markzoterodown-0.2.1.tar.gz
Algorithm Hash digest
SHA256 f5e7217053f89d3c0b13c73c257a2c9e76d5e260cf9c63b946f71080d86e1ee9
MD5 dc070f4ef59cdbe2f560a4b1c67f90fd
BLAKE2b-256 4d16241c9b2c9e3d7d6f0bb37b388d9f4e563bf0932f49c1fad7b78105eddfa6

See more details on using hashes here.

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

Hashes for markzoterodown-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9dcfe6b6e96b1f7ad0c86300e9193b749c381318bd76ea6f5e2593ab12d4880a
MD5 f746c2c98a710d268b18f3cdbcafa4de
BLAKE2b-256 af58075fc92fcc442fe18915aa5c8109088aeabb0d145f3558bcc8e81609e723

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