Markdown for LLM pipelines rather than human readers
MarkItDown is a Python library from Microsoft, shipped with a command-line tool, that turns files into Markdown for an LLM or a text analysis pipeline. Its README compares it to textract: it tries to keep headings, lists, tables and links, and warns that it may not be the best option for high-fidelity conversions meant for human readers.
Markdownify MCP installs MarkItDown and calls its executable to convert the files an agent hands it.
The open source OCR comparison weighs MarkItDown against OCR engines and vision models.
Format detection with Magika, parsers as pip extras
- One call, many formats: .docx, .pptx, .xlsx and .xls, PDF, Outlook messages (.msg), EPUB, Jupyter notebooks, HTML, CSV, JSON, RSS and Atom. ZIP archives are walked file by file, and a YouTube URL returns the video's transcript.
- File type read from the bytes: when there is no extension, MarkItDown identifies the format with Magika.
- Parsers on demand: the base package ships without the Office and PDF parsers. Each format comes with its own extra (
pip install 'markitdown[pdf, docx]'), and[all]pulls in everything. - Tables and equations: PDF pages that hold a table or a form come out as Markdown tables through pdfplumber, and Word equations become LaTeX.
- Official MCP server:
markitdown-mcpexposes a single tool,convert_to_markdown(uri), forhttp:,https:,file:anddata:URIs.
No local OCR and no legacy Office formats
Prose PDFs come out as plain text. The PDF converter reads the text layer with pdfminer, with no OCR, and rebuilds no headings or lists outside pages with tables.
Images only become text through an LLM. The README lists OCR for images, but the image converter (JPEG and PNG) runs none locally. It reads EXIF metadata when exiftool is installed, GPS position included. Given an OpenAI-compatible client, it sends the whole image to the model with the prompt "Write a detailed caption for this image", so what comes back is a caption, not a transcription. Images inside PowerPoint files take the same route.
Scanned PDFs go to an LLM too. The official markitdown-ocr plugin sends the model every image embedded in a PDF, .docx, .pptx or .xlsx file, plus every scanned page rendered at 300 DPI. Without an LLM client it quietly steps aside. It depends on PyMuPDF, licensed under AGPL-3.0 or a commercial Artifex license, so that part of the stack falls outside MarkItDown's MIT license.
LLMs plug in through the Python API only. The CLI has no option for an LLM client: it only wires up plugins and two Azure services billed per call, Document Intelligence and Content Understanding. The OCR plugin's README still shows --llm-client and --llm-model flags that the CLI code never defines. Content Understanding is the only route for video and for pulling fields such as an invoice total. Unstract does that kind of extraction self-hosted and returns JSON.
Audio transcription goes to Google. The [audio-transcription] extra calls SpeechRecognition's recognize_google without a key, so the library falls back to a generic key its documentation reserves for personal or testing use, and which Google may revoke. The default language is en-US.
No legacy Office, OpenDocument or RTF. No converter accepts .doc or .ppt, .odt, .ods or .odp, or RTF files. anydoc reads them.
Inputs need filtering. convert() opens local files and remote URLs with the privileges of the running process. For server-side use, the README asks you to validate inputs and call convert_local() or convert_stream(). markitdown-mcp has no authentication.
Still at 0.1.x. v0.1.0 shipped on March 22, 2025 and v0.1.8 on September 21, 2026, the fourth stable release of 2026. PyPI lists the package as "4 - Beta", and it needs Python 3.10 to 3.14.
