<div align="center">
<img src="https://raw.githubusercontent.com/SylphxAI/anymd/main/docs/public/og-image.png" alt="anymd — any file → clean Markdown for AI agents" width="820" />
<h1 hidden>anymd</h1>
<!-- generated:lead -->
PDF, Word, PowerPoint, Excel, EPUB, HTML 및 웹 페이지, 이미지(OCR), 오디오 및 비디오(메타데이터, 자막, 스크립트)를 지원합니다. 사용자의 장치에서 실행되는 빠르고 강력한 Rust MCP 서버 및 CLI입니다. API 키가 필요 없습니다.
<!-- /generated:lead -->
<!-- generated:hosted -->
anymd는 호스팅되는 문서 파싱 서비스인 Sylphx AI parse에서 사용되는 동일한 크레이트(crates)의 무료 로컬 모드입니다. 이 크레이트는 로컬 런타임이 필요 없는 호출자를 위해 페이지별로 호스팅 및 측정됩니다.
<!-- /generated:hosted -->
npm
downloads
stars
MCP registry
license
OpenSSF Scorecard <!-- repomap:agent-ready -->agent-ready 93/100<!-- /repomap:agent-ready -->
[설치 (Install)] · [벤치마크 (Benchmarks)] · [도구 (MCP Tools)] · [CLI] · [지원 형식 (Formats)] · 문서 (Docs) · Pro
<!-- generated:formerly -->
<sub style="font-size: 0.9em;">이전 명칭은 pdf-reader-mcp였습니다. pdf-reader-mcp에서 마이그레이션하기</sub>
<!-- /generated:formerly -->
<img src="https://raw.githubusercontent.com/SylphxAI/anymd/main/docs/public/demo.gif" alt="실제 터미널 세션: anymd가 테이블이 포함된 PDF 페이지를 변환하고, 폴더를 검색하며, 스프레드시트를 읽은 다음, Claude Code가 anymd MCP 서버를 통해 PDF에서 답변을 제공하는 과정" width="820" />
<sub>실제 편집되지 않은 터미널 기록 (asciinema + agg, <a href="https://github.com/SylphxAI/anymd/tree/main/bench/demo">스크립트</a>). 마지막 명령어는 anymd MCP 서버를 통해 PDF에서 답변하는 Claude Code입니다.</sub>
npx -y @sylphx/anymd setup
npx -y @sylphx/anymd report.pdf > report.md
anymd를 사용해야 하는 이유
<!-- fast:start -->
- 빠름(Fast). 네이티브 Rust로 페이지별 병렬 변환을 수행합니다. 벤치마크 문서 38개에 대해 anymd는 총 11.5초가 소요되는 반면, docling은 2,432.4초 (212배), markitdown은 75.6초 (7배)가 걸립니다. marker는 동일한 30개 문서 변환에 7,104.5초가 걸렸지만, anymd는 4.64초로 처리했습니다 (1,532배).
<!-- fast:end -->
- 정확함(Accurate). 레이아웃 엔진이 글리프 간격(glyph gaps)으로부터 단어를 재구성하고, 2단 논문은 읽는 순서대로 배치하며, 테두리가 없는 표를 포함하여 테이블을 복구합니다. 텍스트는 붙여진 단어나 뒤섞인 열 없이 인쇄된 그대로 유지됩니다.
- 토큰 효율성(Lean on tokens). 페이지는
<!-- page 3 --> 인용 앵커, 작은 프론트매터 헤더, 그리고 간결한 테이블이 포함된 Markdown 형식으로 반환됩니다. 토큰 예산과 커서가 대규모 문서를 에이전트의 컨텍스트 내에 유지하도록 합니다.
- 모든 형식 지원(Every format, one call). 하나의 도구가 아래 나열된 모든 형식을 읽습니다. 또한 웹 URL과 전체 디렉터리를 허용하며,
search 기능을 통해 이들 모두에서 검색할 수 있습니다.
- 로컬 및 개인 정보 보호(Local and private). 아무것도 업로드되지 않습니다. OCR은 설치된 로컬 doc-VLM 모델 또는 tesseract를 사용하며, 전사(transcripts)는 ffmpeg와 번들된 Qwen3-ASR을 사용합니다. OCR 설정 및 ASR 모델 다운로드는 명시적인 옵트인(opt-in)이 필요합니다.
설치
사용자의 모든 MCP 클라이언트(Claude Code, Codex, Cursor, VS Code, Claude Desktop, Windsurf, Gemini CLI)에 다음 하나의 명령어로 anymd를 추가할 수 있습니다:
npx -y @sylphx/anymd setup
또는 수동으로 추가할 수도 있습니다: 모든 MCP 클라이언트는 동일한 명령어인 npx -y @sylphx/anymd를 실행합니다. 요구 사항은 Node 18+ 하나뿐이며, npm이 사용자의 플랫폼에 맞는 네이티브 바이너리를 설치합니다.
<details open>
<summary><b>Claude Code</b></summary>
claude mcp add anymd -- npx -y @sylphx/anymd
또는 플러그인으로, anymd 스킬을 사용하여: /plugin marketplace add SylphxAI/anymd, 그런 다음 /plugin install anymd@anymd.
</details>
<details>
<summary><b>Codex</b></summary>
codex mcp add anymd -- npx -y @sylphx/anymd
또는 ~/.codex/config.toml에 다음 내용을 추가합니다:
[mcp_servers.anymd]
command = "npx"
args = ["-y", "@sylphx/anymd"]
</details>
<details>
<summary><b>Cursor</b></summary>
Add to Cursor
또는 .cursor/mcp.json에 다음 내용을 추가합니다:
{ "mcpServers": { "anymd": { "command": "npx", "args": ["-y", "@sylphx/anymd"] } } }
</details>
<details>
<summary><b>VS Code</b></summary>
원클릭으로 VS Code에 설치를 사용하거나, 터미널에서 다음 명령어를 실행합니다:
code --add-mcp '{"name":"anymd","command":"npx","args":["-y","@sylphx/anymd"]}'
또는 .vscode/mcp.json에 다음 내용을 추가합니다:
{ "servers": { "anymd": { "type": "stdio", "command": "npx", "args": ["-y", "@sylphx/anymd"] } } }
</details>
<details>
<summary><b>Claude Desktop</b></summary>
원클릭으로 최신 릴리스에서 anymd-<version>.mcpb를 다운로드하여 열 수 있습니다. 또는 수동으로 다음을 수행합니다:
claude_desktop_config.json에 추가 (설정 → 개발자 → 설정 편집):
{ "mcpServers": { "anymd": { "command": "npx", "args": ["-y", "@sylphx/anymd"] } } }
</details>
<details>
<summary><b>Windsurf, Zed, Cline 및 기타 클라이언트</b></summary>
stdio를 통해 MCP 통신을 지원하는 모든 클라이언트: 명령어는 npx, 인수는 ["-y", "@sylphx/anymd"]입니다. 서버가 하나의 폴더 안에 유지되도록 하려면 --allow-dir=/path/to/docs를 추가합니다.
</details>
<details>
<summary><b>CLI 전용</b></summary>
npm install -g @sylphx/anymd
파이썬 휠(wheels)은 발행 후 첫 번째 릴리스부터 PyPI에 있는 anymd와 동일한 사전 구축된 바이너리를 포함합니다.
Windows: winget install Sylphx.anymd. macOS 및 Linux: brew install sylphxai/tap/anymd. Scoop: scoop bucket add sylphx https://github.com/SylphxAI/scoop-bucket && scoop install anymd.
Docker (amd64 및 arm64):
docker run --rm -v "$PWD:/data" ghcr.io/sylphxai/anymd report.pdf > report.md
docker run -i --rm ghcr.io/sylphxai/anymd
또는 crates.io에서 빌드합니다 (Rust 1.95 이상, CMake 및 C++ 컴파일러 필요; doc-VLM OCR 및 로컬 ASR 포함):
npm, pip, 그리고 Docker는 사전 구축된 바이너리를 배포하는 반면, cargo install은 사용자의 장치에서 하나를 컴파일합니다.
</details>
벤치마크 (Benchmarks)
AgentDocBench는 에이전트를 위한 문서 → Markdown 변환에 대한 공개 벤치마크입니다. 이 벤치마크는 12가지 범주(수학 논문, 두 단 구조 논문, 재무 테이블, 양식, 스캔본, CJK, 슬라이드, 스프레드시트, Word, EPUB, HTML)의 라이선스 클린 문서를 대상으로 하며, 일치 구문(verbatim sentences), 텍스트 F1, 읽기 순서, 테이블 셀을 기준으로 시간 및 출력 토큰과 함께 점수가 매겨집니다. 모든 도구는 동일한 GitHub 호스팅 러너(4 CPU)에서 실행됩니다:
<!-- headline:start -->
| anymd | docling | kreuzberg | unstructured | markitdown | marker | pdftotext |
|---|
| 종합 점수 (Overall score) | 96.4 | 93.0 | 81.7 | 81.2 | 76.8 | 71.0 | 42.2 |
| ... | | | | | | | |
<!-- headline:end -->
생성된 리더보드, 카테고리별 점수(anymd가 패배한 경우 포함), 그리고 방법론은 벤치마크 가이드에서 확인할 수 있습니다. 코퍼스(corpus), 정답 데이터(ground truth), 어댑터(adapters), 그리고 원시 결과물(raw results)은 bench/에 있으며, 벤치마크 워크플로우는 모든 것을 재실행합니다. 새로운 도구는 단일 어댑터 파일로 참여할 수 있습니다.
이미지 및 비디오 추출 (Image and video extraction)
이미지 및 비디오 벤치마크는 페이지 이미지 OCR과 내장된 비디오 자막을 개별적으로 다룹니다:
| 데이터셋 | anymd | 참고 대안 (Reference alternative) |
|---|
| OmniDocBench v1.6 (1,651페이지 이미지), 전체 평균 ↑ | 21.4 (8.1.0, English tesseract) | TeleOCR 96.91 (저자 보고치, 당사 동일 실행 측정값 아님) |
| ... | | |
이미지 점수는 역사적인 수치이며 현재 OCR 모델의 점수가 아닙니다. 비디오 점수는 영화나 강의가 아닌 소규모 작성 데이터셋을 사용하여 2026-10-08에 측정되었으며, anymd는 다른 타임스탬프에서 중복된 자막을 건너뜁니다. 이들은 시각적 이해 또는 ASR(자동 음성 인식)이 아니라 내장된 자막 추출을 측정합니다. 가이드에는 대안 선택, 제한 사항, 타이밍, 원시 출력물 및 재현 하네스가 연결되어 있습니다.
anymd는 네 가지 도구를 노출합니다.
| 도구 | 사용 용도 | 주요 인자 (Key arguments) |
|---|
outline | 노드 ID와 단위/마크다운 범위를 가진 헤딩 트리 탐색 | source, format (json · tree) |
| ... | | |
read 답변은 다음과 같습니다:
---
source: papers/attention.pdf
title: Attention Is All You Need
...
search는 검색된 항목당 한 줄로 답변합니다:
정확히 일치하는 내용이 없으면, `search`는 BM25 순위가 매겨진 구절로 폴백(fallback)합니다. 따라서 "양방향 사전 학습은 어떻게 작동하나요(how does bidirectional pretraining work)"와 같은 질문도 여전히 올바른 페이지를 찾을 수 있습니다.
## CLI (명령줄 인터페이스)
동일한 바이너리는 MarkItDown과 유사하지만 훨씬 빠른 명령줄 변환기입니다:
```bash
anymd report.pdf > report.md # 파일 하나
anymd deck.pptx notes.docx budget.xlsx # 여러 파일, 각 파일에 헤더 포함
anymd https://example.com/article # 웹 페이지 (주요 콘텐츠만)
...
인자 없이 MCP 클라이언트(파이프된 표준 입력, piped stdin)에서 실행하거나, anymd mcp로 실행하면, stdio를 통해 MCP 서비스를 제공합니다.
| Input | What you get |
|---|
| PDF | 읽기 순서의 마크다운(Markdown): 제목(headings), 단락(paragraphs), 목록(lists), 표(tables), 위첨자/아래첨자(sub/superscripts), <!-- page N --> 마커, 개요로 사용되는 북마크. 실행 헤더와 페이지 번호는 제거됩니다. 이미지 전용 페이지는 명시적인 모델 설정 후 로컬 doc-VLM OCR을 사용하며, 그렇지 않은 경우 설치된 tesseract를 사용합니다. 포함된 그림(Embedded figures)은 anymd 캐시에 저장되고 캡션과 함께 제자리에 표시됩니다 (images: "refs", 기본값). |
| ... | |
PDF의 경우, anymd는 텍스트 흐름(text runs) 대신 글리프 위치(glyph positions)를 읽습니다. 글리프들은 기준선(baseline)을 따라 그룹화되며, 이는 위첨자 및 아래첨자를 허용합니다. 단어 간 공백은 글리프 사이의 간격에서 오며, 폰트 크기를 기준으로 측정되고 문자 트래킹(letter tracking)에 맞춰 조정됩니다. 열을 인식하는 XY 커팅(column-aware XY cut)은 본문 사이에 있는 여백(gutters)을 찾습니다. 표는 표 자체에 그려진 선에서 옵니다 (두 셀 사이의 선이 누락되면 병합된 셀(merged cell)로 간주). 그렇지 않은 경우에는 정렬된 공백 열에서 가져옵니다. 줄 바꿈된 셀 텍스트는 해당 셀에 유지되며, 쌓인 헤더 라인은 하나의 헤더가 되고, 여러 열에 걸친 헤더는 각 열과 함께 유지됩니다. 독자가 볼 수 없는 텍스트(보이지 않는 텍스트 또는 배경 상자와 같은 색상의 텍스트)는 제외됩니다. 페이지들은 병렬로 처리되며 서로 격리되어 있어, 한 개의 잘못된 페이지가 전체 문서의 실패를 초래하지 않습니다. 다른 형식들은 Rust에서 네이티브하게 파싱됩니다 (zip/XML, calamine, html5ever). Python, LibreOffice 또는 클라우드 서비스는 관여하지 않습니다.
anymd Pro