doc2md: конвертировать Word, Excel, PowerPoint, PDF, EPUB в чистый Markdown для Claude Code, Cursor, Codex и других AI-агентов
Скилл для AI-агентов. Прогоняет пачку разноформатных документов через один конвертер и отдаёт агенту чистый GitHub-Flavored Markdown — вместо десятка формат-специфичных ридеров на лету. Один файл, список путей или целая папка (рекурсивно). Обёртка над firecrawl/anydoc.
Было: агент открывает 15 договоров
.docx— 15 вызовов docx-ридера, 15 разных дампов, тонна токенов на построчное чтение. Стало:node convert.js ~/договоры/— 15 чистых.md, единый формат, сводкаOK / ПРОПУСК / ОШИБКА, дальше агент ищет по ним grep-ом.
AI-агент обычно читает .docx, .xlsx, .pptx, .pdf каждый своим отдельным ридером. На пачке из 10-20 файлов это десятки лишних вызовов инструментов и разный формат вывода под каждый тип. doc2md прогоняет всё через один конвертер, и на выходе всегда чистый GitHub-Flavored Markdown, независимо от того, что было на входе.
Это не замена штатным скиллам docx/pdf/xlsx/pptx для точечной работы с одним файлом (правки, форматирование, извлечение изображений — там нужны они). doc2md — для случая «прочитать содержимое пачки документов и дальше с ней работать», особенно когда документов много и формат смешанный: договоры, акты, презентации, выгрузки.
Кому это регулярно нужно: бухгалтерия, HR, юристы на due diligence — у всех периодически скапливаются пачки документов, которые надо превратить в текст для дальнейшей работы, в том числе чтобы скормить той же нейросети.
doc2md/
├── skills/doc2md/
│ ├── SKILL.md — сам скилл (описание + инструкция для агента)
│ └── scripts/
│ ├── convert.js — пакетный конвертер, кросс-платформенный (Windows/macOS/Linux) — основной
│ └── convert.sh — тот же конвертер, bash-версия для Unix
├── commands/convert.md — слэш-команда /convert
├── .claude-plugin/ — манифесты для Claude Code + marketplace
├── .codex-plugin/ — манифест для Codex CLI
├── .cursor-plugin/ — манифест для Cursor
├── gemini-extension.json — манифест для Gemini CLI
└── assets/ — иконки и соц-превью
Через marketplace плагина:
/plugin marketplace add ilyautov/doc2md
/plugin install doc2md@ilyautov-plugins
Или скопировать папку skills/doc2md/ целиком в свою директорию скиллов (например ~/.claude/skills/doc2md/). В Cowork — загрузить как кастомный скилл.
npx skills add ilyautov/doc2mdМанифест в .codex-plugin/plugin.json, пакет скилла — skills/. Подключается как расширение Codex; .codexignore отсекает дев-обвязку.
Манифест в .cursor-plugin/plugin.json — автоактивация на запросах конвертации документов.
Манифест gemini-extension.json в корне.
Любой агент, понимающий формат SKILL.md, подхватит skills/doc2md/SKILL.md напрямую.
Единственная зависимость рантайма — Node.js 18+ (он и так нужен для
npx). Конвертер@firecrawl/anydocскачивается автоматически при первом запуске; для offline можно поставить заранее:npm install -g @firecrawl/anydoc.
Основной, кросс-платформенный вариант (Windows/macOS/Linux):
node skills/doc2md/scripts/convert.js договор.docx
node skills/doc2md/scripts/convert.js ~/Downloads/акты/ -o ~/Downloads/акты-md/
node skills/doc2md/scripts/convert.js a.pdf b.xlsx "отчёт за март.pptx"На Unix (macOS/Linux/WSL/Git Bash) — bash-версия, поведение идентично:
bash skills/doc2md/scripts/convert.sh договор.docxБез -o каждый файл <имя>.<расширение>.md пишется рядом с исходником — расширение сохраняется в имени намеренно, иначе отчёт.docx и отчёт.csv в одной папке лягут в один отчёт.md и один перезапишет другой. С -o папка/ все результаты собираются в одном месте.
Триггеры для агента: «сконвертируй эти файлы», «разбери пачку документов», «не могу прочитать этот файл», «переведи в markdown», «подготовь документы для агента».
| Группа | Расширения |
|---|---|
| Word | .doc .docx .docm |
| PowerPoint | .ppt .pps .pot .pptx .pptm .ppsx .ppsm |
| Excel | .xls .xlsx .xlsm .xlsb |
| OpenDocument | .odt .ods .odp |
| Прочее | .rtf .epub .csv .pdf |
Сканы и PDF-картинки без текстового слоя не читаются (в движке нет OCR) — попадают в «ПРОПУСК», batch на этом не падает. Для них нужен отдельный OCR-проход перед конвертацией (например, скилл pdf, шаг «сделать PDF searchable»).
- Конвертирует файл(ы), печатает построчный статус и итоговую сводку: сколько
OK, сколькоПРОПУСК, сколькоОШИБКА. OK— anydoc вернул код0.ОШИБКА— не удалось даже запуститьnpx/anydoc (нет в PATH, код 126/127): отказ окружения, а не «файл нечитаем», OCR тут не поможет.ПРОПУСК— anydoc запустился, но файл не сконвертировался: почти всегда скан/шифр/битый файл.- Не удаляет и не трогает исходники.
Контракт кодов возврата anydoc формально не задокументирован — скрипт трактует их консервативно (см.
SKILL.md). При первом боевом прогоне на битом/зашифрованном файле стоит перепроверить.
.csvи.docxс кириллицей — конвертация корректна, кириллица не теряется.- Папка с двумя файлами одного имени, разных расширений — найдена и починена коллизия имён до релиза (см. CHANGELOG).
- Путь с пробелами и кириллицей в имени файла.
- Несуществующий путь в аргументах — пропускается с понятным сообщением, batch не падает.
convert.js— та же батарея тестов повторена и прошла (рекурсивная папка, коллизия имён, кириллица, вложенная подпапка, missing path).
Не тестировано вживую: .pptx, .xlsx, .pdf, .epub, боевая пачка документов клиента. Живой запуск на Windows не делал — в песочнице нет Windows-окружения; convert.js написан без shell-специфичного синтаксиса и с shell:true для npx на win32, но это обоснованное рассуждение, а не проверка. Проверил формат или ОС — заведи issue, обновлю раздел.
firecrawl/anydoc публикует свой минимальный skill (npx skills add firecrawl/anydoc) — конвертирует один файл за раз, без пакетной обработки, без сводки по batch и без русской документации. doc2md достраивает именно это: пачка/папка на вход, честная сводка OK/ПРОПУСК/ОШИБКА, маршрутизация сканов на OCR, кросс-платформенная Node-версия, документация на русском.
Обёртка над github.com/firecrawl/anydoc (MIT, Rust). По собственному бенчмарку авторов (
Илья Утов — t.me/gorilla_under_hood
MIT — см. LICENSE. Движок anydoc — тоже MIT.
