Convert any uploaded office document to clean Markdown.
All conversion logic lives in scripts/ — load only the script you need.
Security notes
- Dependencies are installed into an isolated temp directory (
/tmp/office_md_deps/) and pinned to reviewed versions. The system Python environment is not modified.- For scanned or image-only content, pages are sent to Anthropic's vision API. Always ask the user for confirmation before enabling vision (see Workflow step 3).
FormatExtensionsScriptPDF (text + scanned/image).pdf``scripts/pdf-to-md.pyPowerPoint.pptx, .ppt``scripts/pptx-to-md.pyWord.docx, .doc``scripts/docx-to-md.pyExcel.xlsx, .xls``scripts/xlsx-to-md.pyCSV.csv``scripts/csv-to-md.py
Only proceed if the user has explicitly asked to convert, extract, or export the document to Markdown. A bare file upload without a conversion request is not sufficient to trigger this skill.
bash
python scripts/<script-name>.py \
/mnt/user-data/uploads/<input-file> \
/mnt/user-data/outputs/<stem>.md
Each script installs its own pinned dependencies into /tmp/office_md_deps/
on first run (isolated from the system Python environment).
If the script output indicates image-only pages were detected (or the document is known to be scanned), stop and ask the user:
"This document has N image-only page(s) that cannot be extracted without sending them to Anthropic's vision API. Page images will be transmitted externally for OCR. Would you like to proceed with vision extraction?"
Only if the user confirms, re-run with the --allow-vision flag:
bash
python scripts/<script-name>.py \
/mnt/user-data/uploads/<input-file> \
/mnt/user-data/outputs/<stem>.md \
--allow-vision
If the user declines, save the text-only result and note which pages were skipped.
Use present_files with the output .md path, then give a brief summary:
Each script uses a two-pass strategy:
--allow-vision is passed AND pages had no
extractable text; those pages are rendered and sent to the Claude vision APISituationBehaviourFully scanned PDFAll pages flagged for vision; user confirmation requiredMixed PDF (some text, some images)Only image pages flagged; user confirmation requiredUser declines visionText-only .md is saved; skipped pages are noted inlinePassword-protected fileScript exits with a clear error messageVery large PDF (50+ image pages)Script adds 0.3s sleep between vision callsImage too large (>4MB base64)Reduce DPI: edit dpi=150 → dpi=100 in pdf-to-md.pyEncoding errors in CSVScript auto-retries with latin-1