Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Convert files and office documents to Markdown. Supports PDF, DOCX, PPTX, XLSX, images (with OCR), audio (with transcription), HTML, CSV, JSON, XML, ZIP, YouTube URLs, EPubs and more.
.claude/skills/mkurman-markitdown/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 156% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 130% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 84% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 80% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 123% | 0% |
-----|-------------|-------| | PDF | Portable Document Format | Full text extraction | | DOCX | Microsoft Word | Tables, formatting preserved | | PPTX | PowerPoint | Slides with notes | | XLSX | Excel spreadsheets | Tables and data | | Images | JPEG, PNG, GIF, WebP | EXIF metadata + OCR | | Audio | WAV, MP3 | Metadata + transcription | | HTML | Web pages | Clean conversion | | CSV | Comma-separated values | Table format | | JSON | JSON data | Structured representation | | XML | XML documents | Structured format | | ZIP | Archive files | Iterates contents | | EPUB | E-books | Full text extraction | | YouTube | Video URLs | Fetch transcriptions |
bash# Install with all features pip install 'markitdown[all]' # Or from source git clone https://github.com/microsoft/markitdown.git cd markitdown pip install -e 'packages/markitdown[all]'
bash# Basic conversion markitdown document.pdf > output.md # Specify output file markitdown document.pdf -o output.md # Pipe content cat document.pdf | markitdown > output.md # Enable plugins markitdown --list-plugins # List available plugins markitdown --use-plugins document.pdf -o output.md
pythonfrom markitdown import MarkItDown # Basic usage md = MarkItDown() result = md.convert("document.pdf") print(result.text_content) # Convert from stream with open("document.pdf", "rb") as f: result = md.convert_stream(f, file_extension=".pdf") print(result.text_content)
Use LLMs via OpenRouter to generate detailed image descriptions (for PPTX and image files):
pythonfrom markitdown import MarkItDown from openai import OpenAI # Initialize OpenRouter client (OpenAI-compatible API) client = OpenAI( api_key="your-openrouter-api-key", base_url="https://openrouter.ai/api/v1" ) md = MarkItDown( llm_client=client, llm_model="anthropic/claude-opus-4.5", # recommended for scientific vision llm_prompt="Describe this image in detail for scientific documentation" ) result = md.convert("presentation.pptx") print(result.text_content)
For enhanced PDF conversion with Microsoft Document Intelligence:
bash# Command line markitdown document.pdf -o output.md -d -e "<document_intelligence_endpoint>"
python# Python API from markitdown import MarkItDown md = MarkItDown(docintel_endpoint="<document_intelligence_endpoint>") result = md.convert("complex_document.pdf") print(result.text_content)
MarkItDown supports 3rd-party plugins for extending functionality:
bash# List installed plugins markitdown --list-plugins # Enable plugins markitdown --use-plugins file.pdf -o output.md
Find plugins on GitHub with hashtag: #markitdown-plugin
Control which file formats you support:
bash# Install specific formats pip install 'markitdown[pdf, docx, pptx]' # All available options: # [all] - All optional dependencies # [pptx] - PowerPoint files # [docx] - Word documents # [xlsx] - Excel spreadsheets # [xls] - Older Excel files # [pdf] - PDF documents # [outlook] - Outlook messages # [az-doc-intel] - Azure Document Intelligence # [audio-transcription] - WAV and MP3 transcription # [youtube-transcription] - YouTube video transcription
pythonfrom markitdown import MarkItDown md = MarkItDown() # Convert PDF paper result = md.convert("research_paper.pdf") with open("paper.md", "w") as f: f.write(result.text_content)
pythonfrom markitdown import MarkItDown md = MarkItDown() result = md.convert("data.xlsx") # Result will be in Markdown table format print(result.text_content)
pythonfrom markitdown import MarkItDown import os from pathlib import Path md = MarkItDown() # Process all PDFs in a directory pdf_dir = Path("papers/") output_dir = Path("markdown_output/") output_dir.mkdir(exist_ok=True) for pdf_file in pdf_dir.glob("*.pdf"): result = md.convert(str(pdf_file)) output_file = output_dir / f"{pdf_file.stem}.md" output_file.write_text(result.text_content) print(f"Converted: {pdf_file.name}")
pythonfrom markitdown import MarkItDown from openai import OpenAI # Use OpenRouter for access to multiple AI models client = OpenAI( api_key="your-openrouter-api-key", base_url="https://openrouter.ai/api/v1" ) md = MarkItDown( llm_client=client, llm_model="anthropic/claude-opus-4.5", # recommended for presentations llm_prompt="Describe this slide image in detail, focusing on key visual elements and data" ) result = md.convert("presentation.pptx") with open("presentation.md", "w") as f: f.write(result.text_content)
pythonfrom markitdown import MarkItDown from pathlib import Path md = MarkItDown() # Files to convert files = [ "document.pdf", "spreadsheet.xlsx", "presentation.pptx", "notes.docx" ] for file in files: try: result = md.convert(file) output = Path(file).stem + ".md" with open(output, "w") as f: f.write(result.text_content) print(f"✓ Converted {file}") except Exception as e: print(f"✗ Error converting {file}: {e}")
pythonfrom markitdown import MarkItDown md = MarkItDown() # Convert YouTube video to transcript result = md.convert("https://www.youtube.com/watch?v=VIDEO_ID") print(result.text_content)
bash# Build image docker build -t markitdown:latest . # Run conversion docker run --rm -i markitdown:latest < ~/document.pdf > output.md
MarkItDown()pythonfrom markitdown import MarkItDown md = MarkItDown() try: result = md.convert("document.pdf") print(result.text_content) except FileNotFoundError: print("File not found") except Exception as e: print(f"Conversion error: {e}")
pythonfrom markitdown import MarkItDown md = MarkItDown() # For large files, use streaming with open("large_file.pdf", "rb") as f: result = md.convert_stream(f, file_extension=".pdf") # Process in chunks or save directly with open("output.md", "w") as out: out.write(result.text_content)
Markdown output is already token-efficient, but you can:
pythonfrom markitdown import MarkItDown import re md = MarkItDown() result = md.convert("document.pdf") # Clean up extra whitespace clean_text = re.sub(r'\n{3,}', '\n\n', result.text_content) clean_text = clean_text.strip() print(clean_text)
pythonfrom markitdown import MarkItDown from pathlib import Path md = MarkItDown() # Convert all papers in literature folder papers_dir = Path("literature/pdfs") output_dir = Path("literature/markdown") output_dir.mkdir(exist_ok=True) for paper in papers_dir.glob("*.pdf"): result = md.convert(str(paper)) # Save with metadata output_file = output_dir / f"{paper.stem}.md" content = f"# {paper.stem}\n\n" content += f"**Source**: {paper.name}\n\n" content += "---\n\n" content += result.text_content output_file.write_text(content) # For AI-enhanced conversion with figures from openai import OpenAI client = OpenAI( api_key="your-openrouter-api-key", base_url="https://openrouter.ai/api/v1" ) md_ai = MarkItDown( llm_client=client, llm_model="anthropic/claude-opus-4.5", llm_prompt="Describe scientific figures with technical precision" )
pythonfrom markitdown import MarkItDown import re md = MarkItDown() result = md.convert("data_tables.xlsx") # Markdown tables can be parsed or used directly print(result.text_content)
bash pip install 'markitdown[pdf]' # For PDF support
python with open("file.pdf", "rb") as f: # Note the "rb" result = md.convert_stream(f, file_extension=".pdf")
bash # macOS brew install tesseract
# Ubuntu sudo apt-get install tesseract-ocr
references/api_reference.md for complete API documentationreferences/file_formats.md for format-specific detailsscripts/batch_convert.py for automation examplesscripts/convert_with_ai.py for AI-enhanced conversionspackages/markitdown-sample-plugin| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 5,265 | 2,842 | -46% | 1 | 1 | 0% | 941 | 3,364 | +257% | 0 | 0 | — |
case-02 | pass→pass | 3,552 | 2,059 | -42% | 1 | 1 | 0% | 555 | 3,217 | +480% | 0 | 0 | — |
case-03 | fail→pass | 7,311 | 4,085 | -44% | 1 | 1 | 0% | 1,403 | 3,588 | +156% | 0 | 0 | — |
case-04 | fail→pass | 8,245 | 1,418 | -83% | 1 | 1 | 0% | 1,340 | 3,088 | +130% | 0 | 0 | — |
case-05 | fail→pass | 11,228 | 2,188 | -81% | 1 | 1 | 0% | 1,782 | 3,279 | +84% | 0 | 0 | — |
case-06 | pass→pass | 2,827 | 1,820 | -36% | 1 | 1 | 0% | 421 | 3,162 | +651% | 0 | 0 | — |
case-07 | pass→pass | 4,386 | 2,654 | -39% | 1 | 1 | 0% | 762 | 3,346 | +339% | 0 | 0 | — |
case-08 | pass→pass | 5,322 | 3,313 | -38% | 1 | 1 | 0% | 1,005 | 3,504 | +249% | 0 | 0 | — |
case-09 | fail→pass | 9,766 | 2,689 | -72% | 1 | 1 | 0% | 1,872 | 3,367 | +80% | 0 | 0 | — |
case-10 | fail→pass | 8,209 | 3,987 | -51% | 1 | 1 | 0% | 1,611 | 3,599 | +123% | 0 | 0 | — |
case-11 | pass→pass | 9,581 | 3,274 | -66% | 1 | 1 | 0% | 1,711 | 3,567 | +108% | 0 | 0 | — |
case-12 | pass→pass | 3,781 | 2,866 | -24% | 1 | 1 | 0% | 554 | 3,425 | +518% | 0 | 0 | — |
case-13 | pass→pass | 6,701 | 4,505 | -33% | 1 | 1 | 0% | 1,155 | 3,704 | +221% | 0 | 0 | — |
case-14 | pass→pass | 5,936 | 3,879 | -35% | 1 | 1 | 0% | 1,001 | 3,557 | +255% | 0 | 0 | — |
case-15 | fail→pass | 6,561 | 2,766 | -58% | 1 | 1 | 0% | 1,111 | 3,327 | +199% | 0 | 0 | — |
case-16 | pass→pass | 6,694 | 1,865 | -72% | 1 | 1 | 0% | 1,089 | 3,144 | +189% | 0 | 0 | — |
case-17 | pass→pass | 6,100 | 2,268 | -63% | 1 | 1 | 0% | 1,072 | 3,266 | +205% | 0 | 0 | — |
case-18 | fail→pass | 4,463 | 2,004 | -55% | 1 | 1 | 0% | 693 | 3,156 | +355% | 0 | 0 | — |
case-19 | pass→pass | 4,393 | 2,582 | -41% | 1 | 1 | 0% | 727 | 3,401 | +368% | 0 | 0 | — |
case-20 | pass→pass | 9,735 | 7,552 | -22% | 1 | 1 | 0% | 1,709 | 4,252 | +149% | 0 | 0 | — |
case-21 | pass→pass | 6,426 | 4,875 | -24% | 1 | 1 | 0% | 1,091 | 3,754 | +244% | 0 | 0 | — |
case-22 | pass→pass | 6,974 | 5,469 | -22% | 1 | 1 | 0% | 1,217 | 3,836 | +215% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +32 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.