Skip to main content
Glama
slamsmart

Super-MCP-OCR-Deepseek

by slamsmart

๐Ÿฆ‰ Super MCP OCR for DeepSeek (teks-only LLM) M8ven Score

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)

๐Ÿ“„ PDF

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 gambar

  • ocr.sh โ€” ๐Ÿง CLI OCR tanpa Python (tesseract + poppler), buat mesin/sandbox tanpa env Python


Related MCP server: docling-mcp

๐ŸŽจ 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.

  • pypdfium2 tidak ada โ†’ PDF lewat poppler: pdftotext (PDF digital) atau pdftoppm + tesseract (halaman scan).

  • Env: MCP_OCR_ENGINE=auto|rapidocr|tesseract dan MCP_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 + tesseract per 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 <N>

ekstrak N gambar terakhir (default 1)

--session <id>

filter session tertentu

--outdir <dir>

folder output (default temp)

--db <path>

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)

  1. User paste gambar โ†’ model dapat error Cannot read image.

  2. Agent jalankan extract-pasted-image.py โ†’ ambil file temp.

  3. Agent panggil read_document(file_path=<hasil>) โ†’ teks.

  4. 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)

  1. _resolve_path โ€” terima path lokal / URL http(s) / file:// โ†’ file lokal.

  2. Routing per ekstensi โ€” gambar โ†’ OCR; pdf โ†’ ekstrak+OCR; office โ†’ ekstrak; teks โ†’ baca.

  3. _ocr_pil (gambar) โ€” pre-process (grayscale + autocontrast + upscale teks kecil) โ†’ RapidOCR ONNX; kalau RapidOCR absent/error/hasilnya kosong โ†’ fallback CLI tesseract (TSV, conf โ‰ฅ 35). Mesin yang dipakai ditulis di header; paksa dengan MCP_OCR_ENGINE.

  4. _read_pdf โ€” pypdfium2 bila ada (teks native per halaman, scan di-render lalu di-OCR); kalau tidak โ†’ poppler: pdftotext, atau pdftoppm + tesseract untuk halaman scan.

  5. _extract_palette / _read_colors (gambar) โ€” flatten RGBAโ†’RGB โ†’ downscale โ†’ kuantisasi median-cut (PIL) โ†’ cluster warna dominan โ†’ gabung shade dekat โ†’ hitung % area + region.

  6. Confidence filter โ€” buang hasil OCR dengan skor < 0.35.

  7. 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).

Related MCP Connectors

Related MCP Servers