Microsoft의 가벼운 파이썬 도구. PDF·Word·Excel·PPT·이미지·오디오·유튜브 URL까지 한 줄 명령으로 마크다운 텍스트를 뽑아낸다. 123k stars, AutoGen 팀이 만든 LLM 전처리 표준.
아주 기초부터 — 왜 굳이 마크다운으로 변환하나?
요즘 챗GPT나 Claude한테 "이 PDF 좀 요약해줘" 하면 그냥 파일을 던지면 되지만, 개발자가 코드로 그걸 하려면 얘기가 달라진다. 대형 언어 모델은 글자(텍스트)를 먹는 기계라서, PDF나 워드 파일을 그대로 못 먹는다. 그래서 우리가 미리 "PDF 안의 글자만 깔끔하게 뽑아내는 작업"을 해줘야 한다.
그런데 그냥 글자만 뽑으면 문제가 생긴다. 표가 무너지고, 제목인지 본문인지 구분이 사라지고, 글머리표가 흩어진다. MarkItDown은 이 문제를 마크다운으로 구조를 살려서 뽑는 방식으로 해결한다.
요리에 비유하면 — PDF는 통째로 든 식재료(닭 한 마리·당근·양파)다. LLM은 잘게 썬 재료만 먹는 까다로운 요리사. MarkItDown은 밑작업 도마다. 재료를 받아 LLM이 바로 먹을 수 있는 크기로 자르고, 어떤 게 단백질이고 어떤 게 채소인지 라벨까지 붙여서 내준다.
이 글의 핵심 메시지.
MarkItDown은 Microsoft가 자사 AutoGen 팀에서 직접 만든 다중 포맷 → 마크다운 변환기다. textract 같은 옛 라이브러리와 비슷한 위치지만, 차이가 명확하다 — 단순히 "글자만 뽑기"가 아니라 제목·표·리스트·링크 같은 문서 구조를 살려서 마크다운으로 표현한다.
최종 출력은 사람도 읽을 만하지만, 본질적으로는 LLM의 입력으로 가장 효율적인 형태다. 마크다운은 토큰 효율도 좋아서 같은 정보를 적은 비용으로 모델에 넣을 수 있다.
123k stars의 이유 — 트렌딩 배경.
2024년 말 공개 이후 빠르게 별을 모은 이유는 세 가지로 정리된다.
저자가 Adam Fourney(adamfo@microsoft.com). Microsoft Research의 AutoGen 팀이 직접 만들었다. AutoGen은 멀티 에이전트 LLM 프레임워크인데, 거기서 문서 입력 전처리가 골칫거리였고 그 내부 도구를 외부로 푼 결과물이다. "진짜 LLM 파이프라인을 운영하던 팀이 만든 도구"라는 신뢰가 별점으로 이어졌다.
비슷한 도구로 textract, unstructured, docling(IBM) 등이 있다. MarkItDown은 "가벼움 + 마크다운 출력 + 폭넓은 포맷"이라는 세 가지 축에서 균형을 잡았다. unstructured처럼 모든 걸 다 처리하려 욕심내지 않고, textract처럼 글자만 던지지 않는다.
LangChain·LlamaIndex 같은 RAG 프레임워크의 문서 로더 자리에 자연스럽게 들어갔다. Microsoft 자사의 AutoGen, Azure AI Foundry 등에서도 추천한다. 무엇보다 의존성 최소화 설계로 "프로젝트에 슬쩍 끼워 넣기" 좋다 — pip install markitdown 한 줄.
요리 기구로 치면 "좋은 식칼"이다. 푸드 프로세서(unstructured)는 다 갈아주지만 무겁고 복잡하다. 가위(textract)는 가볍지만 못 자르는 게 많다. MarkItDown은 식칼 — 가볍고 잘 들고, 대부분의 식재료를 처리하면서도 모양을 유지한다.
의존성 트리로 본 MarkItDown의 뼈대.
MarkItDown은 99.7% 파이썬(나머지 0.3%는 Dockerfile)이다. 코어는 매우 가볍게 유지하고, 포맷별 무거운 라이브러리는 "optional dependency"로 분리해 사용자가 필요한 것만 깔도록 설계했다.
[pdf] → pdfminer.six + pdfplumber (텍스트 추출) [docx] → mammoth + lxml (Word를 HTML로 → 마크다운) [xlsx] → pandas + openpyxl (시트 → 표) [xls] → pandas + xlrd (오래된 엑셀) [pptx] → python-pptx (슬라이드 파싱) [outlook]→ olefile (.msg 메시지) [audio-transcription] → pydub + SpeechRecognition [youtube-transcription] → youtube-transcript-api [az-doc-intel] → Azure Document Intelligence [az-content-understanding] → Azure AI Content Understanding
이 분리 덕에 pip install 'markitdown[pdf,docx]'처럼 딱 필요한 포맷만 설치할 수 있다. Docker 이미지 크기 줄이거나 의존성 충돌 피하는 데 결정적이다.
빌드 시스템: hatchling (PEP 517 기반 모던 파이썬 패키징, setuptools의 후속). 테스트: hatch test로 격리 환경에서 멀티 파이썬 버전(3.10/3.11/3.12) 매트릭스 테스트. 코드 품질: pre-commit hooks + mypy 타입체크. 배포: PyPI 패키지(pip install markitdown) + Dockerfile(컨테이너 실행) + dev-container(.devcontainer/로 VS Code Codespaces 지원).
이미지/PPTX의 그림을 설명하려면 LLM Vision이 필요하다. MarkItDown은 OpenAI 호환 클라이언트를 받아 쓰는 패턴이다 — Anthropic·Mistral·로컬 Ollama도 OpenAI 포맷만 맞추면 다 꽂힌다.
from markitdown import MarkItDown
from openai import OpenAI
md = MarkItDown(
llm_client=OpenAI(), # Claude·Ollama도 OpenAI 호환 어댑터로 가능
llm_model="gpt-4o",
)
result = md.convert("slides.pptx")
print(result.text_content)
-d -e <endpoint> 옵션으로 이걸 백엔드로 쓸 수 있다 — 로컬 라이브러리로 못 푸는 어려운 PDF를 Azure에 위임한다.시스템 구조도 + 핵심 설계 패턴.
MarkItDown의 아키텍처는 "Converter Registry 패턴"으로 한 마디 정리된다. MarkItDown 객체가 컨버터 목록을 들고 있고, 입력이 들어오면 어떤 컨버터가 처리할 수 있는지 자동으로 결정한다.
┌────────────────────────────────────────────────────────────┐
│ 사용자 호출 │
│ md.convert("file.pdf") / md.convert("https://...") │
└─────────────────┬──────────────────────────────────────────┘
▼
┌────────────────────────────────────────────────────────────┐
│ MarkItDown 코어 (_markitdown.py) │
│ • 입력 라우팅 (file / URL / stream / bytes) │
│ • magika로 파일 종류 감지 (MIME + 확장자 + 매직넘버) │
│ • 컨버터 후보 선택 → 우선순위 정렬 │
└─────────────────┬──────────────────────────────────────────┘
▼
┌────────────────────────────────────────────────────────────┐
│ StreamInfo (메타 + 파일 스트림) │
│ extension · mimetype · charset · url · filename │
└─────────────────┬──────────────────────────────────────────┘
▼
┌────────────────────────────────────────────────────────────┐
│ Converter Registry (converters/__init__.py) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │PdfConverter │ │DocxConverter│ │PptxConverter│ …17개+ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ↓ accepts()? → True인 것만 convert() 호출 │
└─────────────────┬──────────────────────────────────────────┘
▼
┌────────────────────────────────────────────────────────────┐
│ 각 컨버터의 변환 로직 │
│ • PDF: pdfminer.six로 텍스트 추출 → 후처리 │
│ • DOCX: mammoth로 HTML 변환 → markdownify │
│ • XLSX: pandas DataFrame → 마크다운 표 │
│ • IMG: EXIF + LLM Vision으로 캡션 │
└─────────────────┬──────────────────────────────────────────┘
▼
┌────────────────────────────────────────────────────────────┐
│ DocumentConverterResult │
│ .text_content (마크다운 문자열) + .title │
└────────────────────────────────────────────────────────────┘
모든 컨버터는 DocumentConverter를 상속한다. 인터페이스는 단순하다 — accepts(stream_info)로 "내가 처리할 수 있나" 답하고, convert(stream, stream_info)로 실제 변환을 수행한다.
class DocumentConverter:
def accepts(self, file_stream, stream_info, **kwargs) -> bool:
"""이 컨버터가 stream_info를 처리할 수 있는가?"""
return stream_info.extension == ".pdf" or \
stream_info.mimetype == "application/pdf"
def convert(self, file_stream, stream_info, **kwargs) -> DocumentConverterResult:
"""실제 변환 — text_content(마크다운)를 반환"""
...
새 포맷을 추가하려면 이 클래스 하나만 상속해서 만들고 등록하면 끝. 컨버터마다 자기 책임 영역이 명확해서 테스트도 컨버터 단위로 격리된다 — 전형적인 Strategy 패턴.
병원 응급실의 분류(triage) 시스템과 비슷하다. 환자(파일)가 들어오면 접수처(MarkItDown 코어)가 증상(파일 종류)을 보고 어느 진료과(컨버터)로 보낼지 결정한다. 각 진료과는 자기 전문 분야만 처리한다 — 정형외과는 X-ray만, 안과는 눈만. 새 진료과 추가는 간판만 달면 된다.
README의 보안 섹션이 길게 강조하는 부분. convert()는 너무 관대해서 위험할 수 있다 — 로컬 파일·HTTP URL·bytes 스트림을 다 받는다. 신뢰할 수 없는 입력은 가장 좁은 API로:
웹 서버에서 사용자가 입력한 URL을 그대로 md.convert(user_input)에 넘기면, 공격자가 file:///etc/passwd나 http://169.254.169.254/(AWS 메타데이터) 같은 URL을 주입할 수 있다. SSRF 공격의 전형.
로컬 파일만 변환할 거면 convert_local(). URL은 직접 requests.get()으로 검증 후 convert_response(). 가장 안전한 방식은 본인이 스트림을 열어 convert_stream()에 넘기는 것. "최소 권한 원칙"의 API 버전.
3rd-party 플러그인을 명시적으로 지원. 진입점(entry_points) 메커니즘으로 PyPI에 올라간 외부 패키지를 자동 발견한다. 예를 들어 markitdown-ocr 플러그인은 LLM Vision으로 PDF/DOCX 안의 이미지에서 글자를 뽑는 기능을 추가한다 — 코어를 건드리지 않고.
markitdown --list-plugins # 설치된 플러그인 목록 markitdown --use-plugins file.pdf # 플러그인 활성화하고 변환
레포 안에서 어디에 무엇이 있는가.
microsoft/markitdown/ ├── .devcontainer/ ← VS Code dev container 설정 (Codespaces 1클릭 환경) ├── .github/ ← GitHub Actions CI 워크플로 ├── packages/ ← 멀티 패키지 monorepo │ ├── markitdown/ ← 본체 패키지 │ │ ├── src/markitdown/ │ │ │ ├── __init__.py │ │ │ ├── __main__.py ← CLI 진입점 │ │ │ ├── _markitdown.py ← MarkItDown 클래스 (코어) │ │ │ ├── _base_converter.py ← DocumentConverter 추상 클래스 │ │ │ ├── _stream_info.py ← StreamInfo 메타데이터 │ │ │ ├── _uri_utils.py ← URL/file:// 라우팅 │ │ │ ├── converters/ ← 포맷별 컨버터 (이 폴더가 핵심!) │ │ │ │ ├── _pdf_converter.py (20KB, 가장 큼) │ │ │ │ ├── _cu_converter.py (Azure Content Understanding) │ │ │ │ ├── _doc_intel_converter.py (Azure Doc Intelligence) │ │ │ │ ├── _pptx_converter.py │ │ │ │ ├── _xlsx_converter.py │ │ │ │ ├── _docx_converter.py │ │ │ │ ├── _image_converter.py │ │ │ │ ├── _audio_converter.py ← 음성 STT │ │ │ │ ├── _youtube_converter.py ← 자막 fetch │ │ │ │ ├── _zip_converter.py ← ZIP 풀어서 내부 파일 재귀 변환 │ │ │ │ ├── _epub_converter.py │ │ │ │ ├── _html_converter.py │ │ │ │ ├── _rss_converter.py │ │ │ │ ├── _wikipedia_converter.py ← 위키 전용 클린업 │ │ │ │ ├── _bing_serp_converter.py ← Bing 검색 결과 페이지 │ │ │ │ ├── _outlook_msg_converter.py │ │ │ │ ├── _csv_converter.py │ │ │ │ ├── _ipynb_converter.py ← Jupyter 노트북 │ │ │ │ ├── _plain_text_converter.py ← 최후의 fallback │ │ │ │ ├── _markdownify.py ← HTML → MD 헬퍼 │ │ │ │ ├── _llm_caption.py ← LLM Vision 캡션 │ │ │ │ ├── _transcribe_audio.py ← 음성 STT 헬퍼 │ │ │ │ └── _exiftool.py ← EXIF 메타 추출 │ │ │ └── __about__.py ← 버전 문자열 │ │ ├── tests/ ← pytest 테스트 │ │ └── pyproject.toml ← Hatch 빌드 설정 + 의존성 │ ├── markitdown-mcp/ ← MCP 서버 패키지 (Claude/Cursor 연결용) │ ├── markitdown-ocr/ ← OCR 플러그인 (LLM Vision 기반) │ └── markitdown-sample-plugin/ ← 3rd-party 플러그인 작성 예제 ├── Dockerfile ← stdin → stdout 컨테이너 ├── README.md ├── LICENSE ← MIT ├── SECURITY.md ← 보안 이슈 신고 가이드 └── .pre-commit-config.yaml ← pre-commit hooks
여기가 진짜 본체. 파일 19개 + 헬퍼 4개. 새 포맷 지원을 추가하고 싶다면 이 폴더에 _xxx_converter.py를 하나 만들고 등록하면 끝. 각 파일이 독립적이라 코드 읽기도 쉽다. 파이썬으로 컨버터 패턴을 배우기 가장 좋은 실전 예제 폴더.
별도 패키지로 MCP (Model Context Protocol) 서버를 제공. Claude Desktop이나 Cursor에 등록하면 AI 어시스턴트가 직접 MarkItDown을 호출해서 파일을 변환할 수 있다. "AI에게 도구를 쥐여주는 방식"의 모범 사례.
플러그인을 어떻게 만드는지 보여주는 샘플. pyproject.toml의 [project.entry-points."markitdown.plugins"] 섹션이 핵심. 본 레포가 "라이브러리 확장성 설계"의 교과서가 되는 이유.
이 레포에서 무엇을 배울 수 있는가.
MarkItDown은 코드량이 크지 않다(파이썬 200KB 안팎). 그런데 그 안에 현업 파이썬 패키지의 모범 사례가 줄줄이 들어 있다. 학습 관점에서 6가지로 쪼개보자.
converters/__init__.py에서 모든 컨버터를 import + __all__로 노출. MarkItDown 클래스는 생성 시 이 리스트를 받아 등록한다. 사용자가 새 컨버터를 만들면 md.register_converter(MyConverter())로 동적 추가도 가능.
실습 아이디어: 자기 프로젝트에서 비슷한 "여러 종류의 입력을 처리해야 하는" 상황(예: 여러 결제 게이트웨이, 여러 알림 채널)에 같은 패턴 적용해보기.
pyproject.toml의 [project.optional-dependencies] 활용법이 교본. all·pdf·docx 같은 그룹으로 의존성을 묶고, 사용자가 pip install 'markitdown[pdf,docx]'처럼 골라 설치. 컨테이너 이미지 크기 60%~80% 줄이는 핵심 테크닉.
실습 아이디어: 본인의 파이썬 패키지에 optional dep 그룹을 도입. 무거운 시각화 라이브러리(matplotlib)·ML 라이브러리(torch)를 옵션으로 떼어내기.
setuptools·poetry 다음 세대인 Hatch가 빌드/테스트/배포를 모두 관리. hatch shell로 격리 환경 진입, hatch test로 매트릭스 테스트, hatch publish로 PyPI 배포. tool.hatch.envs.* 섹션 읽으면 패턴이 보인다.
실습 아이디어: 새 파이썬 프로젝트를 Hatch로 시작해보기. hatch new myproject.
Google의 magika는 ML 기반 파일 타입 감지기 — 확장자가 거짓말해도(또는 없어도) 매직넘버 + 내용 패턴으로 정확히 맞춘다. MarkItDown은 이걸로 "PDF인 줄 알았는데 실제론 HTML" 같은 케이스를 잡는다.
실습 아이디어: 업로드 폴더 안의 파일을 magika로 스캔해 실제 타입과 확장자가 다른 의심 파일 찾기.
_llm_caption.py + _image_converter.py를 보면 OpenAI 클라이언트만 받고 모델명은 외부에서 주입. 이 단순한 약속(OpenAI 호환 인터페이스)이 Claude·Gemini·Ollama 같은 다른 프로바이더를 동시에 지원하게 만든다.
실습 아이디어: 본인 도구에 "LLM 옵션"을 넣을 때 같은 패턴 따르기. 특정 SaaS에 락인되지 말 것.
defusedxml 사용(XXE 방지), convert_local() 같은 좁은 API 제공, README의 보안 섹션 명시. "공격자가 입력을 조작할 수 있다"는 가정으로 설계한 흔치 않은 오픈소스. SSRF·XXE·Path Traversal 같은 웹 보안 개념 학습에 좋은 살아 있는 예제.
실습 아이디어: 본인 코드에서 사용자 입력을 받는 함수를 골라 "공격 입력이 들어오면?"으로 점검 + 좁은 API 제공.
어디서 어떻게 돌릴 수 있나.
Python 3.10 이상(3.13까지 공식 지원). OS 무관 — 윈도우·맥·리눅스 모두. 메모리는 대부분 파일에서 200MB 이내로 충분. 대형 PDF(수백 페이지)나 큰 엑셀에서 잠시 1GB까지 쓸 수 있다.
README가 직접 권하는 패턴 — venv·uv·conda 셋 다 안내. uv는 Astral의 차세대 패키징 도구로 pip보다 10배 이상 빠르다. 2026년 기준 신규 파이썬 프로젝트는 uv가 기본값이라고 봐도 무방.
uv venv --python=3.12 .venv source .venv/bin/activate uv pip install 'markitdown[all]'
레포 루트에 Dockerfile 제공. 컨테이너로 격리해서 stdin/stdout으로 변환:
docker build -t markitdown:latest . docker run --rm -i markitdown:latest < my.pdf > out.md
이미지 크기는 모든 의존성 포함 시 1GB 이내. "파이프라인의 한 단계로 끼워 넣을 때" 컨테이너가 깔끔하다 — Airflow·n8n·Zapier 같은 워크플로 도구에서 쓰기 좋음.
Azure Document Intelligence — 어려운 스캔 PDF용. 사용량 기반 과금(첫 500페이지/월 무료). OpenAI API — 이미지 캡션·PPTX 슬라이드 이미지 설명용. 반드시 필요하진 않다 — 기본 변환은 전부 로컬에서 무료로 작동한다.
커피머신 같다. 기본 모델은 손으로 직접 내리는 드립(로컬 라이브러리). 무거운 PDF를 자주 다루면 에스프레소 머신(Azure Doc Intel) 끼워 넣기. 이미지 안의 글자를 자주 본다면 우유 거품기(LLM Vision) 추가. 처음엔 기본만 깔고 필요할 때 옵션 추가하면 된다.
난이도별 5개 — 짧게 시작해서 깊게.
pip install 'markitdown[pdf]' 후 손에 있는 PDF로 markitdown report.pdf > out.md. 결과 마크다운을 텍스트 에디터로 열어보고 — 표·제목·리스트가 어떻게 살아 있는지 관찰. 학습 포인트: 글자만 뽑힌 게 아니라 구조가 유지된다는 걸 직접 확인.
markitdown 'https://youtu.be/<id>' > transcript.md로 자막을 마크다운으로 뽑고, ChatGPT나 Claude에 붙여서 5줄 요약 요청. 학습 포인트: "텍스트 추출 → LLM 요약"이라는 RAG 워크플로의 미니어처. 강의 영상 학습 노트 만들기 같은 실용 케이스도 바로.
DocumentConverter를 상속해 .eml(표준 이메일 포맷) 변환기를 만들어보기. 파이썬 표준 라이브러리 email 모듈로 헤더·본문 파싱 → 마크다운 출력. 학습 포인트: Strategy 패턴 직접 구현 + Python 표준 라이브러리 활용. 끝나면 패키지의 _outlook_msg_converter.py(.msg용)와 비교하면서 차이 학습.
업로드 폴더 안 PDF·DOCX·XLSX·PPTX를 모두 마크다운으로 변환 → 청크 분할(LangChain 또는 직접 구현) → 임베딩(OpenAI text-embedding-3-small 또는 로컬 bge-small) → SQLite + sqlite-vec 또는 Chroma DB에 저장 → 질의 시 유사도 검색 → LLM에게 컨텍스트로 제공. 학습 포인트: MarkItDown이 어디서 빛나는지 체감 — "전처리"가 RAG 품질의 절반.
markitdown-sample-plugin을 참고해 본인만의 플러그인을 작성·배포. 아이디어 예: 'markitdown-notion' (Notion API 페이지를 마크다운으로), 'markitdown-korean-ocr' (한국어 특화 OCR로 스캔 PDF 처리), 'markitdown-slack-export' (Slack export ZIP을 시간순 마크다운 일지로). 학습 포인트: PyPI 배포·entry_points·pre-commit·GitHub Actions까지 풀패키지 라이프사이클 체험. 잘 만들면 본 레포의 사용자들이 실제로 깐다.
주차별 학습 계획 — 4주 코스.
주제: pyproject.toml · Hatch · uv · optional-dependencies · entry_points. 학습: MarkItDown의 pyproject.toml 정독 → 동일 구조로 자기 미니 패키지를 만들고 TestPyPI에 올려보기. 읽을거리: PEP 517·518·621, Hatch 공식 문서. 파이썬 패키지를 "사용자"에서 "제작자"로 한 단계 올리는 주차.
주제: pdfminer.six · pdfplumber · mammoth · python-pptx · openpyxl. 학습: 각 라이브러리 README 읽고 각각 PDF/DOCX/PPTX/XLSX 한 개씩 직접 파싱해보기. 발견: "왜 MarkItDown은 pdfminer + pdfplumber를 함께 쓰나?" 답을 코드에서 찾기. 심화: 표가 복잡한 PDF를 잡아 어떻게 망가지는지 관찰.
주제: 청크 분할 · 임베딩 · 벡터 DB · 시맨틱 검색. 학습: MarkItDown으로 자기 문서 컬렉션을 마크다운화 → LangChain 또는 LlamaIndex로 RAG 챗봇 빌드. 벡터 DB 선택: 무료 옵션은 Chroma·Qdrant·SQLite + sqlite-vec. 도전: 한국어 문서로 RAG할 때 임베딩 모델 선택(bge-m3 vs jhgan/ko-sroberta-multitask) 비교.
주제: MCP 서버 작성 · Claude Desktop·Cursor에 연결 · 도구를 LLM에 노출. 학습: markitdown-mcp 패키지 코드 정독 → 자기만의 MCP 서버 작성(예: 회사 위키 검색 도구). 읽을거리: Anthropic의 MCP 공식 문서 + fastmcp 라이브러리(github.com/PrefectHQ/fastmcp). "AI에게 손을 달아주는" 다음 시대 기술의 시작점.
레포에 등장하는 주요 기술 용어 — 한 번에 정리.
setup.py 시대의 다음 세대.xml 모듈의 XXE(XML External Entity) 공격 방어 버전. 사용자가 제공한 XML이 외부 리소스를 불러와 정보를 빼가는 공격을 막는다.http://localhost, AWS 메타데이터)을 요청하게 만드는 공격. MarkItDown의 convert()에 URL을 직접 넘기면 발생 가능.markitdown-mcp 패키지로 MCP 서버 제공.pyproject.toml의 [project.entry-points]에 등록하면 MarkItDown이 --use-plugins로 자동 감지.DocumentConverter가 정석적인 예.더 깊이 파고들 자료들.
• GitHub: github.com/microsoft/markitdown (123k stars, MIT)
• PyPI: pypi.org/project/markitdown/
• Discussions: github.com/microsoft/markitdown/discussions — 사용자 Q&A, 플러그인 공유
• Trendshift 순위 페이지: trendshift.io/repositories/12961
• unstructured.io — 더 무겁지만 다양한 포맷. 엔터프라이즈용 OSS.
• IBM docling — IBM의 경쟁작. 표·수식 보존이 강점.
• textract — 마크다운 안 만드는 옛 도구. 비교용.
• pandoc — 문서 변환의 만능 도구(Haskell). 마크다운 변환도 가능하지만 LLM 친화적이진 않음.
• AutoGen: github.com/microsoft/autogen — MarkItDown의 부모 프로젝트.
• LangChain / LlamaIndex — RAG 프레임워크. 둘 다 MarkItDown 통합 가능.
• Anthropic MCP: modelcontextprotocol.io — MCP 표준 문서.
• Hatch: hatch.pypa.io — 패키징 도구.
• uv: astral.sh/uv — 차세대 파이썬 패키지 매니저.
pip install 'markitdown[pdf]' 후 markitdown 가까이 있는 PDF > out.md. 결과를 보고 표·제목이 얼마나 잘 살아 있는지 확인. 본 도구를 처음 느끼는 가장 빠른 방법.Documents/회의록 같은 폴더를 글로브로 훑어 모든 .docx·.pdf·.pptx를 마크다운으로 변환 → ChatGPT/Claude에 통째로 던져 분기 요약. 실제 업무 시간이 줄어드는 첫 자동화.packages/markitdown-sample-plugin을 복사해 본인이 자주 다루는 파일 포맷용 컨버터 작성. 예: 자기 회사 사내 ERP가 뱉는 특수 포맷, Notion export, Slack export. 잘 만들어지면 PyPI에 올려 다른 사람도 쓰게 한다._pdf_converter.py(20KB) 한 파일을 처음부터 끝까지 읽어보기. pdfminer + pdfplumber를 어떻게 조합하는지, 표를 어떻게 처리하는지 관찰. 가벼운 코드지만 "현업 파이썬"의 모든 요소가 농축돼 있다.