Mdtero turns papers into reusable Markdown packages for reading, translation, project research, and local agents.
Parse a DOI or URL in one command, download structured Markdown (with a quality_label so you know when not to cite thin results), then optionally translate for bilingual reading.
Python/uv CLI, TUI, browser extension, and agent skill bundle are maintained as the public client surfaces.
Languages: English | 简体中文
Cloud MCP (ChatGPT / Claude / Cursor)
Add this remote MCP URL in ChatGPT Plugins, Claude custom connectors, or Cursor mcp.json:
https://api.mdtero.com/mcp
Sign in with a Mdtero account when asked. Save Elsevier keys at secure account settings. For institutional full text, connect Relay on an authorized campus device. An online Relay does not prove a paper is available: mdtero relay check --json checks key validity and article entitlement. See the Cloud MCP setup guide.
Codex and the ChatGPT desktop app can add this repo as a plugin source:
codex plugin marketplace add JonbinC/doi2md
The installable plugin is plugins/mdtero-reader. It points at the same public MCP service and does not include the parser.
Install
Connect an agent first (works in Cursor, Claude Code, Codex, Trae, WorkBuddy, and more):
npx skills add JonbinC/doi2md
# or: npx skills add https://mdtero.com/agent-skills
Then install the Python runtime:
uv tool install --upgrade mdtero
mdtero setup
mdtero doctor --json
The package is published on PyPI, so the default install does not depend on GitHub. In mainland China the installer automatically tries a Tsinghua/Alibaba PyPI mirror before the official index. If uv is unavailable, use the installer:
curl -Ls https://mdtero.com/install.sh | sh
curl -Ls https://mdtero.com/install.sh | sh -s -- --agent codex
The installer supports uv, pipx, and Python fallbacks. --agent <target> installs a local agent skill. Discovery index: https://mdtero.com/.well-known/agent-skills/index.json
Use Mdtero
Primary path: mdtero parse <doi-or-url> → download Markdown → optional translate. After download, check quality_label; low-confidence files use a .low_quality.md suffix.
mdtero discover "thermal energy storage" --limit 5 --interactive
mdtero parse <doi-or-url> --wait --timeout 300 --json
mdtero parse --file paper.pdf --trace --wait --timeout 600 --json
mdtero status <task-id> --wait --timeout 300 --json
mdtero download <task-id> paper_md --output-dir ./mdtero-output --json
mdtero translate <task-id> --to zh-CN --wait --timeout 600 --json
mdtero doctor --json returns safe auth/dependency/academic/Zotero/project/RAG summaries without echoing credentials.
The CLI is the default path. Desktop installs prepare the local access helper automatically for campus-network and browser-required routes. Use the browser extension only for current-page capture or when an existing browser session is needed; it can hand DOI, URL, PDF, EPUB, HTML, or XML artifacts back to the CLI.
Choose the surface for your environment
| Environment | Best surface | What it can solve | Boundary |
|---|---|---|---|
| Campus Windows/macOS with a full browser | Extension + optional local Relay | OA, campus-IP routes, browser login/challenges, entitled closed articles | The user completes visible login or verification. |
| CLI/Agent on a server only | CLI/API | OA, structured APIs, ordinary HTTP, VPN/IP-authorized files, and uploads | No browser session; WAF/login-only closed content needs a file or another desktop. |
| Server Agent plus a separate campus desktop | Server CLI/API + Relay on the desktop; extension as manual fallback | Full authorized browser acquisition on the desktop, then cloud parsing | The extension alone is user-triggered; use Relay when the server must request the article remotely. |
| Server connected to campus VPN without a browser | CLI/API with the VPN or proxy | IP-authorized machine-readable PDF/XML/HTML | VPN supplies network access, not browser cookies or challenge completion. |
In short: a browser is required for browser-bound entitlement; a campus IP or VPN is sufficient only when the publisher exposes a machine-readable route. Mdtero never bypasses a paywall or exports browser session material.
Project Workflow
Use a local Mdtero project when you are handling a paper set:
mdtero project init --name literature-review
mdtero project import-bib references.bib --json
mdtero project parse --wait --timeout 300 --json
mdtero rag query "What are the strongest findings?" --build-if-needed --json
Zotero support is conservative: mdtero zotero sync adds Mdtero result notes and tags for matching succeeded items without rewriting Zotero bibliographic metadata.
Browser And Agents
Use the browser extension as a lightweight fallback for a paper open in your browser, content accessed through your own session, or a file you want to upload. The extension and CLI share task history, downloads, and translation.
Install a local agent skill with:
mdtero agent install --interactive
mdtero mcp briefing --json
The briefing provides safe task state, available downloads, citations, and suggested next steps. Keep API keys and other secrets out of prompts, logs, and repositories. For a trusted headless machine, enter a fresh key only at the secure mdtero setup --api-key --json prompt.
Access Boundaries
Mdtero helps process material you are permitted to access. Publisher subscriptions, institutional access, and source-specific credentials remain your responsibility. When a source needs your browser session or a local copy, use the extension or upload the saved file.
Parser and source-selection implementation are service internals, not user configuration. The stable workflow is submit, check status, download, translate, and use the resulting Markdown in a project.
Product Boundary
Mdtero Account is the control plane for Mdtero API keys, quota, billing, history, and install prompts. Academic source keys stay in local mdtero config academic configuration; OpenAlex discovery also has a server-managed fallback, so users do not need to configure an OpenAlex key just to search. The CLI-managed local access helper and browser extension remain separate from provider credentials.
Shared /api/v1 server contract
The CLI, extension, dashboard, and MCP briefing expose this contract: /api/v1/route, /api/v1/extension/route, /api/v1/tasks/parse, /api/v1/tasks/upload, /api/v1/tasks/{task_id}, /api/v1/tasks/{task_id}/download/{artifact}, /api/v1/discovery/search, /api/v1/tasks/translate, /api/v1/projects, /api/v1/projects/{project_id}/tasks/{task_id}/import, /api/v1/projects/{project_id}/rag/status, /api/v1/projects/{project_id}/rag/build, and /api/v1/projects/{project_id}/rag/query.
Repo Map
This public repository owns the Python CLI/TUI package, browser extension, campus Relay client, and public install/skill surfaces. The website/dashboard and private backend live in separate repositories.
Documentation
Development
uv run --with pytest --with rich --with textual --with httpx --with requests --with curl_cffi --with pyzotero --with fastmcp pytest tests_py -q
npm --prefix extension test
npm --prefix extension run build
Metadata
Release files for mdtero 0.3.4
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 |
|---|---|---|---|---|
| mdtero-0.3.4.tar.gz | 661.0 kB | With provenance | Details for mdtero-0.3.4.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| mdtero-0.3.4-py3-none-any.whl | Python 3 | none | any | Details for mdtero-0.3.4-py3-none-any.whl |
Total release size: 912.1 kB
Release files / mdtero-0.3.4.tar.gz
| Download URL | mdtero-0.3.4.tar.gz |
|---|---|
| Size | 661.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b93c0fc10c6403b0e3616da3f8924c748a3e3872daee8c51d1937b0371b8559a
|
|
BLAKE2b-256 checksum How to use checksums |
1a05a7e277608416e043b72c33f28469f2e6ee2d8400c4908abbb65ff9c63abe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / mdtero-0.3.4-py3-none-any.whl
| Download URL | mdtero-0.3.4-py3-none-any.whl |
|---|---|
| Size | 251.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9b99501e48913bce9a420b0a713bd586a7bae372c0707907cc9202720c546394
|
|
BLAKE2b-256 checksum How to use checksums |
b07a486c656687dd97e973689a91a2c9df156cd56918d9543c75b9296caf7cd6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logSecurity for mdtero 0.3.4
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for mdtero-0.3.4.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logA 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.