Server MCP OCR paspor untuk agen AI

Beri asisten kemampuan membaca paspor, kartu identitas, atau dokumen perjalanan – dan menerima kolom terstruktur, bukan segumpal teks. Server ini berbicara dengan Model Context Protocol dengan dua cara: lewat stdio, dipasang dari npm dan dijalankan klien Anda sebagai perintah, atau lewat Streamable HTTP, di-hosting di mcp.doc.cheap. Dengan cara mana pun, server ini adalah klien tipis dari API HTTP publik: server ini tidak menyimpan data apa pun miliknya sendiri.

npx -y @doc-cheap/mcp

Dipublikasikan sebagai @doc-cheap/mcp di npm dan sebagai cheap.doc/mcp di registry MCP resmi; kode sumbernya ada di mirror publik di GitLab.

Tercantum di registry MCP resmi, Smithery, cursor.directory, npm.

Apa yang diterima agen Anda

Inilah perbedaan yang penting. Alat OCR yang mengembalikan satu halaman teks memberi model sesuatu untuk diurai ulang, dan model yang diminta mengurai ulang sebuah tanggal cepat atau lambat akan mengarang tanggal. Alat ini mengembalikan kolom-kolom yang sudah dipisahkan:

  • Pemegang – nama depan, nama keluarga, tanggal lahir, jenis kelamin, kewarganegaraan.
  • Dokumen – jenis, negara, negara penerbit, nomor, seri, tanggal terbit, tanggal kedaluwarsa, apakah sudah kedaluwarsa, dan berapa hari yang tersisa.
  • Setiap kolom yang ditemukan, masing-masing dengan tingkat keyakinannya sendiri, dibaca secara terpisah dari zona baca mesin (MRZ) dan dari zona visual yang tercetak – sehingga model bisa melihat bahwa kedua hasil pembacaan cocok, bukan sekadar menganggapnya cocok.
  • Zona baca mesin dengan putusan: lolos, gagal, atau tidak ada, beserta alasannya, dan baris-barisnya sendiri.
  • Ringkasan satu baris yang bisa ditunjukkan asisten kepada Anda selagi bekerja.

Kegagalan dikembalikan sebagai satu baris yang mudah dibaca dalam blok error, tidak pernah sebagai hasil kosong yang diam: asisten bisa menindaklanjutinya dan menunjukkannya kepada Anda. Penolakan dari API mempertahankan kata-kata API itu sendiri, kode error-nya, dan tautan ke halaman yang menjelaskannya.

Pasang di klien Anda

Claude Desktop

claude_desktop_config.json

{
  "mcpServers": {
    "doc-cheap": {
      "command": "npx",
      "args": [
        "-y",
        "@doc-cheap/mcp"
      ],
      "env": {
        "DOC_CHEAP_API_KEY": "sk_live_your_key"
      }
    }
  }
}

Claude Code

satu perintah, dari direktori proyek

claude mcp add-json doc-cheap '{"command":"npx","args":["-y","@doc-cheap/mcp"],"env":{"DOC_CHEAP_API_KEY":"sk_live_your_key"}}'

Cursor

~/.cursor/mcp.json, atau .cursor/mcp.json di dalam proyek

{
  "mcpServers": {
    "doc-cheap": {
      "command": "npx",
      "args": [
        "-y",
        "@doc-cheap/mcp"
      ],
      "env": {
        "DOC_CHEAP_API_KEY": "sk_live_your_key"
      }
    }
  }
}

VS Code

.vscode/mcp.json – perhatikan bahwa blok ini berada di bawah servers, bukan mcpServers

{
  "servers": {
    "doc-cheap": {
      "command": "npx",
      "args": [
        "-y",
        "@doc-cheap/mcp"
      ],
      "type": "stdio",
      "env": {
        "DOC_CHEAP_API_KEY": "sk_live_your_key"
      }
    }
  }
}

Gemini CLI

~/.gemini/settings.json

{
  "mcpServers": {
    "doc-cheap": {
      "command": "npx",
      "args": [
        "-y",
        "@doc-cheap/mcp"
      ],
      "env": {
        "DOC_CHEAP_API_KEY": "sk_live_your_key"
      }
    }
  }
}

Windsurf

~/.codeium/windsurf/mcp_config.json

{
  "mcpServers": {
    "doc-cheap": {
      "command": "npx",
      "args": [
        "-y",
        "@doc-cheap/mcp"
      ],
      "env": {
        "DOC_CHEAP_API_KEY": "sk_live_your_key"
      }
    }
  }
}

Kiro

.kiro/settings/mcp.json di workspace, atau ~/.kiro/settings/mcp.json

{
  "mcpServers": {
    "doc-cheap": {
      "command": "npx",
      "args": [
        "-y",
        "@doc-cheap/mcp"
      ],
      "disabled": false,
      "autoApprove": [
        "check_balance",
        "search_docs"
      ],
      "env": {
        "DOC_CHEAP_API_KEY": "sk_live_your_key"
      }
    }
  }
}

Kiro, dengan satu klik

Tautan instalasi milik klien itu sendiri. Tautan ini meminta konfirmasi dan menampilkan perintah serta daftar argumennya sebelum menulis apa pun.

Tambahkan ke Kiro

  • Mulai ulang klien setelah menambahkan blok. Server dijalankan oleh klien, jadi konfigurasi dan environment yang berubah baru terbaca saat klien dijalankan dari awal.
  • Tanpa DOC_CHEAP_API_KEY, server beralih ke kunci sandbox publik: pemindaian lalu berjalan dalam jatah gratisnya dan tidak ada saldo yang bisa dilaporkan. Itulah cara tercepat untuk melihatnya bekerja.
  • Pengaturan opsional: DOC_CHEAP_DOCS_BASE (ke mana hasil pencarian ditautkan), DOC_CHEAP_DOCS_DIR (salinan dokumentasi mana yang dicari), dan DOC_CHEAP_IMAGE_ROOT (lihat pengaman di bawah).

Atau hubungkan ke server yang di-hosting

Tiga alat yang sama di-hosting di https://mcp.doc.cheap/mcp lewat Streamable HTTP, sehingga klien yang terhubung ke sebuah URL tidak perlu memasang apa pun. Tanpa login: kirim kunci Anda sebagai X-Doc-Cheap-Api-Key atau sebagai Authorization: Bearer – header bernama yang menang jika keduanya dikirim – atau jangan kirim apa pun dan kunci sandbox publik yang dipakai. Server yang di-hosting tidak bisa membaca file di mesin Anda, jadi server ini menerima gambar sebagai base64 atau sebagai URL https.

https://mcp.doc.cheap/mcp

Claude Code

satu perintah

claude mcp add --transport http doc-cheap https://mcp.doc.cheap/mcp --header "Authorization: Bearer sk_live_your_key"

Cursor

~/.cursor/mcp.json

{
  "mcpServers": {
    "doc-cheap": {
      "url": "https://mcp.doc.cheap/mcp",
      "headers": {
        "Authorization": "Bearer sk_live_your_key"
      }
    }
  }
}

VS Code

.vscode/mcp.json

{
  "servers": {
    "doc-cheap": {
      "type": "http",
      "url": "https://mcp.doc.cheap/mcp",
      "headers": {
        "Authorization": "Bearer sk_live_your_key"
      }
    }
  }
}

Di Claude Desktop dan claude.ai, tambahkan di Settings, Connectors, sebagai custom connector dengan URL https://mcp.doc.cheap/mcp; tanpa kunci, server berjalan dengan kunci sandbox.

Tiga alat

Tiga alat yang dipublikasikan server MCP
AlatFungsinyaJawabannyaPerilaku yang dinyatakan
scan_document Recognise a passport or ID documentMengenali gambar dokumenSeluruh hasil terstruktur, ditambah ringkasan satu barisBukan read-only – alat ini bisa memotong kredit. Tidak destruktif. Idempoten jika Anda mengirim idempotency key, dan hanya dalam kondisi itu. Open-world: jawabannya berasal dari layanan jarak jauh.
check_balance Check remaining creditsMembaca pemakaian akunSaldo dan penghitung periode iniRead-only, dan open-world: angkanya adalah kondisi akun saat ini.
search_docs Search the doc.cheap API documentationMencari di dokumentasiBagian yang cocok beserta judul, tautan, dan cuplikan – secara offlineRead-only, dan closed-world: korpusnya adalah salinan dokumentasi yang dikirim bersama server, sehingga kueri yang sama memberi jawaban yang sama tanpa jaringan sama sekali.
  • scan_document menerima gambar sebagai image_base64, image_path, atau image_url, serta opsi yang sama dengan panggilan langsung, di antaranya expect_country, return_portrait, reference, dan idempotency_key.
  • search_docs membaca salinan dokumentasi yang dikirim bersama server, jadi alat ini menjawab tanpa jaringan sama sekali – artinya agen bisa mencari kosakata kolom atau kode error tanpa menghabiskan satu panggilan.
  • check_balance butuh kunci yang punya akun di baliknya. Dengan kunci sandbox publik, alat ini menyatakan dengan jelas bahwa tidak ada saldo, alih-alih menjawab dengan angka nol yang tampak seperti hasil pembacaan.
  • Setiap alat mendeklarasikan output schema dan mengembalikan konten terstruktur yang sesuai dengannya, sehingga agen bisa memakai kolom-kolomnya tanpa mengurai teks.
  • Setiap halaman dokumentasi juga merupakan resource yang bisa dibaca agen, dan empat prompt – membaca dokumen menjadi JSON, memeriksa tanggal kedaluwarsa, memindai satu batch, menjelaskan kode error – memulai pekerjaan umum dalam satu langkah.

Berapa biayanya

$0.01 per dokumen yang dikenali. Tarif tetap, untuk setiap akun, di volume berapa pun – satu angka, dan tidak ada yang perlu dinegosiasikan. Dokumen hanya dikenai biaya jika berhasil dikenali: pemindaian yang tidak menemukan apa pun, tidak bisa membaca gambar, atau tidak bisa mengenali jenisnya menjawab dengan putusannya dan tidak dikenai biaya. Setiap hasil menyatakan kasus mana yang terjadi, sehingga agen – dan Anda – selalu tahu apakah panggilan itu menghabiskan sesuatu.

Sebelum Anda punya akun: kunci sandbox publik menjalankan 10 dokumen yang dikenali gratis per alamat IP secara keseluruhan, maksimal 10 permintaan per jam apa pun jawabannya, dan mendaftar menambahkan 20 kredit. Satu kredit sama dengan satu sen sama dengan satu dokumen.

Pengenalan butuh sekitar 275 ms pada median di produksi, dan setiap hasil membawa rincian waktunya sendiri, sehingga loop agen bisa menganggarkan dengan angka yang nyata.

Apa yang dilaporkan server

Secara bawaan, server tidak melaporkan apa pun ke mana pun: pelaporan kegagalan nonaktif kecuali Anda sendiri mengatur endpoint pelaporan, dan tanpa endpoint itu pustaka pelacaknya bahkan tidak pernah dimuat.

Dua pengaman yang perlu Anda ketahui

Server berjalan di mesin Anda dengan hak akses Anda, dan argumennya dipilih oleh model. Karena itu, dua di antaranya dibatasi:

File lokal nonaktif sampai Anda membuka satu direktori

image_path menolak melakukan apa pun sampai DOC_CHEAP_IMAGE_ROOT menunjuk sebuah direktori, dan meminta asisten mengirim image_base64 sebagai gantinya. Jika variabel itu diisi, direktori dan file yang diminta sama-sama di-resolve melalui symlink sebelum pemeriksaan apakah file berada di dalam direktori; segmen .. dan tautan yang mengarah ke luar sama-sama ditolak, dan path relatif dihitung dari direktori itu, bukan dari tempat mana pun klien kebetulan memulai prosesnya. Path di luar root dan path yang tidak ada menghasilkan pesan yang sama – pesan yang berbeda untuk masing-masing akan menjawab “apakah file ini ada?” untuk path apa pun di mesin Anda.

Gambar jarak jauh harus https publik

image_url diunduh oleh server, jadi skemanya harus https: dan host-nya hanya boleh di-resolve ke alamat internet publik: rentang loopback, privat, link-local, carrier-grade NAT, multicast, dan reserved ditolak, termasuk bentuk IPv6-mapped-nya. Satu jawaban yang tidak publik menolak seluruh URL. Redirect diikuti secara manual, paling banyak tiga lompatan, dan setiap lompatan diperiksa ulang. Body dibatasi 25 MB, dihitung saat data tiba, bukan dipercaya dari sebuah header.

image_base64 tidak terkena batasan-batasan ini, karena pemanggil sudah memegang byte-nya – itulah sebabnya setiap penolakan di atas mengarahkan ke opsi itu.

Baca panduannya