
slamsmart/super-mcp-ocr-deepseek
Developer toolsMemberi ke model AI yang tidak punya vision (mis. , DeepSeek R1, atau LLM teks-only lain) — semua gambar & dokumen dibaca jadi yang bisa langsung dianalisa.
Overview
Memberi ke model AI yang tidak punya vision (mis. , DeepSeek R1, atau LLM teks-only lain) — semua gambar & dokumen dibaca jadi yang bisa langsung dianalisa. .doc / .xls versi lama → simpan ulang sebagai .docx / .xlsx. - read_document(file_path, mode, enhance) — nama penuh (teks) - ocr_image(image_path, mode, enhance) — alias kompatibel (teks) - read_colors(file_path, top_n=8, merge=true) — 🎨 - ocr.sh — 🐧 CLI OCR tanpa Python (tesseract + poppler), buat mesin/sandbox tanpa env Python Model teks-only juga . read_colors terjemahkan warna gambar jadi teks berstruktur — hex, rgb, nama, shade, persentase area, dan posisi region. Cocok buat: copy-paste screenshot halaman web, mau ganti warna desain, cari nilai hex yang dipakai. Region label: background, header/navbar, footer, sidebar, panel/card, accent/button/text, band. Nilai hex sudah siap tempel ke CSS/Tailwind. Warna tanpa nama umum (Tailwind dll) dilabel ~custom — pakai hex/rgb-nya.
README
🦉 Super MCP OCR for DeepSeek (teks-only LLM) 
Memberi “mata” ke model AI yang tidak punya vision (mis. DeepSeek v4 Flash, DeepSeek R1, atau LLM teks-only lain) — semua gambar & dokumen dibaca jadi teks murni yang bisa langsung dianalisa.
Gambar / PDF / Word / Excel / PPT
│
▼
[ MCP OCR Server ] ──► teks murni ──► LLM bisa baca & jawab
✨ Fitur
| Format | Cara baca |
|---|---|
| 🖼️ Gambar — png, jpg/jpeg, webp, bmp, gif, tif/tiff | OCR (RapidOCR + pre-process) |
| teks asli diekstrak; halaman scan otomatis di-OCR per halaman (max 25 hal) | |
| 📝 Office — docx, xlsx/xlsm, pptx, rtf | ekstrak paragraf, tabel, slide |
| 📃 Teks — txt, md, csv, json, xml, log, yaml, toml, html | baca langsung |
Tidak didukung: .doc / .xls versi lama → simpan ulang sebagai .docx / .xlsx.
Tool yang tersedia:
read_document(file_path, mode, enhance)— nama penuh (teks)ocr_image(image_path, mode, enhance)— alias kompatibel (teks)read_colors(file_path, top_n=8, merge=true)— 🎨 ekstrak warna dominan dari gambarocr.sh— 🐧 CLI OCR tanpa Python (tesseract + poppler), buat mesin/sandbox tanpa env Python
🎨 Baca Warna dari Gambar (read_colors)
Model teks-only juga tidak bisa melihat warna. read_colors terjemahkan warna gambar jadi teks berstruktur — hex, rgb, nama, shade, persentase area, dan posisi region. Cocok buat: copy-paste screenshot halaman web, mau ganti warna desain, cari nilai hex yang dipakai.
read_colors(file_path="web-design.png")
read_colors(file_path="ui.png", top_n=12) # lebih banyak warna
read_colors(file_path="ui.png", merge=false) # tanpa gabung shade dekat
| Param | Nilai | Fungsi |
|---|---|---|
file_path |
path gambar lokal / URL | wajib |
top_n |
8 (default) |
jumlah warna teratas |
merge |
true (default) |
gabung warna nyaris-sama (<30 delta) |
Contoh output:
[COLORS] web-design.png — 1280x800px — top 6 warna dominan
1. #FFFFFF rgb(255, 255, 255) ~white (light) 53.1% posisi: background
2. #1F2937 rgb(31, 41, 55) ~custom (dark) 19.8% posisi: header/navbar
3. #3B82F6 rgb(59, 130, 246) ~custom (dark) 6.5% posisi: accent/panel
Region label: background, header/navbar, footer, sidebar, panel/card, accent/button/text, band. Nilai hex sudah siap tempel ke CSS/Tailwind. Warna tanpa nama umum (Tailwind dll) dilabel ~custom — pakai hex/rgb-nya.
Flow copas web: gambar di-paste di chat →
extract-pasted-image.py→read_colors(...)→ dapat hex → edit warna.
🎯 Kenapa ini penting?
Banyak LLM yang murah/cepat hanya teks-only — mereka menolak gambar (Cannot read image / model does not support image input). Padahal pengguna sering paste screenshot error, stack trace, scan dokumen, proposal PDF.
Skill ini menjembatani: file → OCR → teks → LLM, tanpa perlu model vision yang mahal.
🧭 Dua Jalur: Vision vs OCR
| Situasi | Jalur | Kenapa |
|---|---|---|
Tool/model-nya punya vision (mis. Hermes vision_analyze, GPT-4o, Gemini) |
Vision | bisa “ngerti” gambar: layout, grafik, diagram, UI — bukan cuma teks |
| Model teks-only (DeepSeek v4 Flash / R1) | OCR (repo ini) | file → teks murni → bisa dianalisa |
| Butuh teks presisi (invoice, angka, stack trace, scan) | OCR | teks verbatim; model vision bisa halusinasi angka |
| Mesin tanpa Python (sandbox, CI, server polos) | CLI ocr.sh |
tesseract + poppler, nol dependensi Python |
Aturan praktis: vision dulu kalau ada → kalau angka/teks harus persis atau vision tidak ada, jatuh ke OCR. Untuk dokumen penting, jalankan keduanya lalu bandingkan.
👁️ Jalur Vision (kalau tool-nya ada)
Contoh di Hermes — terbukti jalan walaupun model utamanya teks-only, karena Hermes merutekan gambarnya ke model vision:
vision_analyze(image_url="/path/foto.png", question="Baca semua teks & jelaskan isinya")
vision_analyze(image_url="https://contoh.com/grafik.png", question="Apa tren grafik ini?")
Menerima path lokal, URL http(s), atau data URL. Pakai question yang spesifik; untuk teks panjang minta transkrip verbatim.
🐧 Jalur CLI ocr.sh (tanpa Python)
Untuk mesin tanpa env Python (uv/pip):
sudo apt-get install -y tesseract-ocr tesseract-ocr-ind tesseract-ocr-eng \
poppler-utils imagemagick
install -m 0755 ocr.sh /usr/local/bin/ocr # atau ~/.local/bin/ocr
ocr foto.png # teks ke stdout (default bahasa ind+eng)
ocr scan.pdf # PDF digital → pdftotext; PDF scan → 300dpi → OCR/halaman
ocr a.png b.pdf c.jpg # banyak file sekaligus
OCR_LANG=eng ocr chart.jpg # ganti bahasa
Bedanya dengan server MCP: ocr.sh cuma output teks mentah, tanpa read_colors, tanpa mode code, dan tidak membaca docx/xlsx/pptx (untuk itu pakai read_document).
✅ Uji nyata di sandbox Linux: PNG teks Indonesia + angka, PDF image-only, dan gambar yang diblur + dikecilkan 60% (simulasi foto HP) — ketiganya kebaca persis.
🪶 Mode ringan: server auto-fallback ke tesseract
server.py tidak wajib RapidOCR/onnxruntime. Urutannya: RapidOCR → tesseract → pesan error jelas.
- RapidOCR tidak terpasang / error / hasil kosong → otomatis pakai CLI
tesseract. pypdfium2tidak ada → PDF lewat poppler:pdftotext(PDF digital) ataupdftoppm+ tesseract (halaman scan).- Env:
MCP_OCR_ENGINE=auto|rapidocr|tesseractdanMCP_OCR_LANGS=ind+eng(bahasa yang tidak terpasang otomatis dilewati). - Header hasil menyebut mesinnya:
engine rapidocr/engine tesseract.
sudo apt-get install -y tesseract-ocr tesseract-ocr-ind poppler-utils
pip install mcp pillow numpy # cukup ini, tanpa onnxruntime (~ratusan MB)
python server.py --selftest scan.pdf # -> engine tesseract
✅ Uji nyata (venv tanpa
rapidocr&pypdfium2): gambar →engine tesseract(conf 0.95), PDF scan →poppler + tesseractper halaman, PDF digital →pdftotext. Semua exit code 0.
🚀 Cara Setup
1. Install dependensi
cd mcp-ocr
# pakai uv (disarankan)
uv sync
# atau pakai pip langsung
pip install -r pyproject.toml
Butuh Python 3.10 – 3.13. Dependensi utama:
mcp, rapidocr-onnxruntime, Pillow, numpy, pypdfium2, python-docx, openpyxl, python-pptx, striprtf.
Model OCR RapidOCR (ONNX) di-download otomatis saat pertama kali dipakai.
2. Daftarkan sebagai MCP server
Tambahkan ke config MCP klien kamu (opencode, Claude Code, dst):
{
"mcpServers": {
"ocr": {
"command": "python",
"args": ["/path/ke/server.py"],
"env": { "PYTHONIOENCODING": "utf-8" }
}
}
}
3. Selftest (tanpa MCP)
python server.py --selftest # buat sample gambar lalu OCR
python server.py --selftest "folder/file" # test file atau folder
📖 Cara Pakai
Panggil tool dari LLM:
read_document(file_path="C:/Users/.../test-failed-1.png")
read_document(file_path="proposal.pdf")
read_document(file_path="laporan-bug.docx", mode="text", enhance=true)
| Param | Nilai | Fungsi |
|---|---|---|
file_path |
path lokal / URL http(s) / file:// | wajib |
mode |
auto | text | code |
urutan baris OCR (code terbaik utk stack trace) |
enhance |
true (default) |
autocontrast + upscale teks kecil |
Hasilnya teks murni + metadata singkat, contoh:
[OCR] pasted-XXXX.png — 1658x605px — 21 baris — avg confidence 0.98 — 18.5s
----------------------------------------------------
Models
# Model Provider Source Input Output ...
1 cx/gpt-5.5 9router Codex 16.5M 685K ...
...
🔗 Bonus: Baca gambar yang DI-PASTE langsung di chat
Ada satu masalah unik di opencode: gambar yang di-paste di kolom chat tidak disimpan sebagai file — opencode menyimpannya di database SQLite (opencode.db, tabel part) sebagai base64 data-URL. Model teks-only tidak bisa melihat bytes-nya.
Helper extract-pasted-image.py menjembatani ini:
User paste gambar di chat
│
▼
[extract-pasted-image.py] ──► ambil gambar terbaru dari opencode.db
│ (base64 → file temp)
▼
[read_document] ──► OCR ──► teks ──► LLM jawab
Pakai
python extract-pasted-image.py
# → {"paths": ["C:/.../pasted-XXXX.png"], "count": 1}
Lalu OCR hasilnya:
read_document(file_path="C:/.../pasted-XXXX.png")
Opsi:
| Flag | Fungsi |
|---|---|
--n |
ekstrak N gambar terakhir (default 1) |
--session |
filter session tertentu |
--outdir |
folder output (default temp) |
--db |
lokasi opencode.db (auto-detect) |
Butuh Python + stdlib saja (sqlite3, base64, json). Lokasi DB auto-detect dari
~/.local/share/opencode/lalu~/.config/opencode/.
Alur kerja agent (otomatis)
- User paste gambar → model dapat error
Cannot read image. - Agent jalankan
extract-pasted-image.py→ ambil file temp. - Agent panggil
read_document(file_path=)→ teks. - Agent analisa & jawab. Tanpa minta user simpan manual.
🧩 Struktur Project
Super-MCP-OCR-Deepseek/
├── README.md ← dokumentasi ini
├── SKILL.md ← skill instruction (untuk agent)
├── server.py ← MCP OCR server (inti + read_colors)
├── ocr.sh ← CLI OCR tanpa Python (tesseract + poppler)
├── extract-pasted-image.py ← helper gambar tempelan opencode
├── pyproject.toml ← dependensi
└── .python-version ← versi Python
🧠 Alur Kerja Teknis (server.py)
_resolve_path— terima path lokal / URL http(s) / file:// → file lokal.- Routing per ekstensi — gambar → OCR; pdf → ekstrak+OCR; office → ekstrak; teks → baca.
_ocr_pil(gambar) — pre-process (grayscale + autocontrast + upscale teks kecil) → RapidOCR ONNX; kalau RapidOCR absent/error/hasilnya kosong → fallback CLItesseract(TSV, conf ≥ 35). Mesin yang dipakai ditulis di header; paksa denganMCP_OCR_ENGINE._read_pdf—pypdfium2bila ada (teks native per halaman, scan di-render lalu di-OCR); kalau tidak → poppler:pdftotext, ataupdftoppm+ tesseract untuk halaman scan._extract_palette/_read_colors(gambar) — flatten RGBA→RGB → downscale → kuantisasi median-cut (PIL) → cluster warna dominan → gabung shade dekat → hitung % area + region.- Confidence filter — buang hasil OCR dengan skor < 0.35.
- Output — header metadata + teks murni, siap dianalisa LLM.
Kenapa preprocessing?
- Teks kecil (< 900px) di-upscale 2–3× agar OCR akurat.
- Gambar raksasa (> 3200px) di-cap agar tidak boros memory.
- Autocontrast meningkatkan kontras teks di screenshot gelap/terang.
🔧 Troubleshooting
| Masalah | Solusi |
|---|---|
API Error 500 max instances / 401 Insufficient balance |
Masalah kuota gateway model, bukan MCP OCR. Top up saldo, lalu ulangi. |
| Tool tidak muncul di klien | Restart sesi / mcp reconnect. Cek claude mcp get ocr → harus Connected. |
| OCR hasil jelek | Pakai mode="code" untuk stack trace; cek file dinaikkan resolusi. |
| Tidak bisa install Python env (sandbox/CI) | Pakai CLI ocr.sh (tesseract + poppler), lihat bagian 🧭 Dua Jalur. |
| Model utama teks-only tapi tool vision ada | Pakai jalur Vision (vision_analyze) dulu, OCR sebagai pembanding/presisi. |
.doc/.xls tidak terbaca |
Simpan ulang sebagai .docx/.xlsx. |
📄 Lisensi
MIT — bebas dipakai, diubah, disebarluaskan.
Dibuat untuk mengaktifkan DeepSeek & LLM teks-only lainnya di ekosistem MCP (opencode, Claude Code, dll).
Install
This server does not publish a one-line install command.
Open the repository installation guide New to MCP? Start with the mcpskill.org guide →Configuration
{
"mcpServers": {
"ocr": {
"command": "python",
"args": ["/path/ke/server.py"],
"env": { "PYTHONIOENCODING": "utf-8" }
}
}
}