Máy chủ MCP OCR hộ chiếu dành cho AI agent

Trao cho trợ lý AI khả năng đọc hộ chiếu, thẻ căn cước hoặc giấy tờ đi lại – và nhận lại các trường có cấu trúc, không phải một khối văn bản. Máy chủ giao tiếp bằng Model Context Protocol theo hai cách: qua stdio, cài từ npm và được client của bạn khởi chạy như một lệnh, hoặc qua Streamable HTTP, được lưu trữ sẵn tại mcp.doc.cheap. Dù theo cách nào, nó chỉ là một client mỏng của API HTTP công khai: nó không giữ dữ liệu nào của riêng mình.

npx -y @doc-cheap/mcp

Được phát hành với tên @doc-cheap/mcp trên npm và cheap.doc/mcp trong MCP registry chính thức; mã nguồn nằm ở bản mirror công khai trên GitLab.

Có mặt trên MCP Registry chính thức, Smithery, cursor.directory, npm.

Agent của bạn nhận lại gì

Đây là khác biệt quan trọng. Một công cụ OCR trả về cả trang văn bản sẽ bắt mô hình phải phân tích lại, và một mô hình bị yêu cầu phân tích lại ngày tháng thì sớm muộn cũng sẽ bịa ra một ngày. Công cụ này trả về các trường đã được tách sẵn:

  • Người sở hữu – tên, họ, ngày sinh, giới tính, quốc tịch.
  • Giấy tờ – loại, quốc gia, quốc gia cấp, số, sê-ri, ngày cấp, ngày hết hạn, đã hết hạn hay chưa, và còn bao nhiêu ngày.
  • Mọi trường tìm thấy, mỗi trường có độ tin cậy riêng, được đọc riêng từ vùng đọc máy (MRZ) và từ vùng thị giác in trên giấy tờ – để mô hình thấy được hai kết quả đọc khớp nhau, thay vì phải giả định.
  • Vùng đọc máy kèm kết luận: đạt, không đạt hoặc không có, cùng lý do, và chính các dòng MRZ.
  • Một bản tóm tắt một dòng mà trợ lý có thể hiển thị cho bạn trong lúc làm việc.

Lỗi được trả về dưới dạng một dòng dễ đọc trong khối lỗi, không bao giờ là một kết quả rỗng im lặng: trợ lý có thể xử lý theo đó và hiển thị cho bạn. Một lần từ chối từ API giữ nguyên cách diễn đạt của chính API, mã lỗi của nó, và liên kết tới trang giải thích lỗi đó.

Cài đặt vào client của bạn

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

một lệnh, chạy từ thư mục dự án

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, hoặc .cursor/mcp.json trong một dự án

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

VS Code

.vscode/mcp.json – lưu ý: khối nằm dưới servers, không phải 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 trong workspace, hoặc ~/.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, chỉ một cú nhấp

Liên kết cài đặt của chính client. Nó hỏi xác nhận và hiển thị lệnh cùng danh sách tham số trước khi ghi bất cứ thứ gì.

Thêm vào Kiro

  • Khởi động lại client sau khi thêm khối cấu hình. Máy chủ do client khởi chạy, nên nó chỉ nhận cấu hình và biến môi trường đã thay đổi khi khởi động lại từ đầu.
  • Không có DOC_CHEAP_API_KEY, máy chủ dùng khóa sandbox công khai thay thế: các lần quét khi đó chạy trong hạn mức miễn phí của khóa này và không có số dư nào để báo cáo. Đó là cách nhanh nhất để thấy nó hoạt động.
  • Thiết lập tùy chọn: DOC_CHEAP_DOCS_BASE (nơi kết quả tìm kiếm liên kết tới), DOC_CHEAP_DOCS_DIR (bản tài liệu nào được tìm kiếm), và DOC_CHEAP_IMAGE_ROOT (xem phần cơ chế bảo vệ bên dưới).

Hoặc kết nối tới máy chủ được lưu trữ sẵn

Cùng ba công cụ đó được lưu trữ tại https://mcp.doc.cheap/mcp qua Streamable HTTP, nên client kết nối bằng URL không cần cài đặt gì. Không cần đăng nhập: gửi khóa của bạn qua X-Doc-Cheap-Api-Key hoặc Authorization: Bearer – nếu gửi cả hai, header có tên riêng sẽ được ưu tiên – hoặc không gửi gì và khóa sandbox công khai sẽ được dùng. Máy chủ lưu trữ sẵn không đọc được tệp trên máy của bạn, nên nó nhận ảnh dưới dạng base64 hoặc một URL https.

https://mcp.doc.cheap/mcp

Claude Code

một lệnh

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"
      }
    }
  }
}

Trong Claude Desktop và claude.ai, thêm nó tại Settings, Connectors, dưới dạng custom connector với URL https://mcp.doc.cheap/mcp; nếu không có khóa, nó chạy bằng khóa sandbox.

Ba công cụ

Ba công cụ mà máy chủ MCP cung cấp
Công cụChức năngTrả vềHành vi được khai báo
scan_document Recognise a passport or ID documentNhận dạng ảnh giấy tờToàn bộ kết quả có cấu trúc, kèm bản tóm tắt một dòngKhông phải chỉ đọc – nó có thể trừ một credit. Không mang tính phá hủy. Idempotent khi bạn gửi idempotency key, và chỉ khi đó. Open-world: câu trả lời đến từ một dịch vụ từ xa.
check_balance Check remaining creditsĐọc mức sử dụng của tài khoảnSố dư và các bộ đếm của kỳ hiện tạiChỉ đọc, và open-world: các con số là tình trạng tài khoản theo thời gian thực.
search_docs Search the doc.cheap API documentationTìm kiếm trong tài liệuCác phần khớp, kèm tiêu đề, liên kết và đoạn trích – ngoại tuyếnChỉ đọc, và closed-world: kho dữ liệu là bản tài liệu được đóng gói cùng máy chủ, nên cùng một truy vấn cho cùng một câu trả lời mà không cần mạng.
  • scan_document nhận ảnh qua image_base64, image_path hoặc image_url, cùng các tùy chọn giống một lệnh gọi trực tiếp, trong đó có expect_country, return_portrait, reference và idempotency_key.
  • search_docs đọc bản tài liệu được đóng gói cùng máy chủ, nên nó trả lời mà không cần mạng – nghĩa là agent có thể tra cứu bộ từ vựng các trường hoặc một mã lỗi mà không tốn lệnh gọi nào.
  • check_balance cần một khóa gắn với tài khoản. Với khóa sandbox công khai, nó nói rõ rằng không có số dư, thay vì trả về các số 0 trông như một kết quả đọc thật.
  • Mỗi công cụ khai báo một output schema và trả về nội dung có cấu trúc khớp với schema đó, nên agent có thể dùng các trường mà không phải phân tích văn bản.
  • Mỗi trang tài liệu cũng là một resource mà agent có thể đọc, và bốn prompt – đọc giấy tờ thành JSON, kiểm tra ngày hết hạn, quét một loạt, giải thích mã lỗi – khởi động các tác vụ thường gặp chỉ trong một bước.

Chi phí

$0.01 cho mỗi giấy tờ được nhận dạng. Giá cố định, cho mọi tài khoản, ở mọi khối lượng – một con số duy nhất, không có gì phải thương lượng. Giấy tờ chỉ bị tính phí khi đã được nhận dạng: một lần quét không tìm thấy gì, không đọc được ảnh hoặc không xác định được loại giấy tờ sẽ trả về kết luận của nó và không mất phí. Mỗi kết quả đều cho biết đó là trường hợp nào, nên agent – và bạn – luôn biết lệnh gọi đó có tốn gì không.

Trước khi có tài khoản: khóa sandbox công khai chạy tổng cộng 10 giấy tờ được nhận dạng miễn phí cho mỗi địa chỉ IP, tối đa 10 yêu cầu mỗi giờ bất kể kết quả trả về, và khi đăng ký bạn được cộng thêm 20 credit. Một credit là một cent, và một cent là một giấy tờ.

Việc nhận dạng mất khoảng 275 ms ở mức trung vị trên production, và mỗi kết quả kèm thời gian xử lý của chính nó, nên vòng lặp của agent có thể lập ngân sách dựa trên một con số thực.

Máy chủ báo cáo những gì

Theo mặc định, máy chủ không gửi báo cáo đi đâu cả: tính năng báo lỗi bị tắt trừ khi bạn tự đặt một endpoint nhận báo cáo, và khi không có endpoint thì thư viện theo dõi lỗi thậm chí không được tải.

Hai cơ chế bảo vệ nên biết

Máy chủ chạy trên máy của bạn với quyền của bạn, và các tham số của nó do mô hình chọn. Vì vậy hai trong số đó được rào chắn:

Tệp cục bộ bị tắt cho đến khi bạn mở một thư mục

image_path từ chối làm bất cứ điều gì cho đến khi DOC_CHEAP_IMAGE_ROOT chỉ định một thư mục, và bảo trợ lý gửi image_base64 thay thế. Khi biến này được đặt, cả thư mục lẫn tệp được yêu cầu đều được phân giải qua symlink trước khi kiểm tra tệp có nằm trong thư mục hay không; cả đoạn .. lẫn liên kết trỏ ra ngoài đều bị từ chối, và đường dẫn tương đối được tính từ thư mục đó chứ không phải từ nơi client tình cờ khởi chạy tiến trình. Một đường dẫn nằm ngoài thư mục gốc và một đường dẫn không tồn tại cho cùng một thông báo – nếu mỗi trường hợp có thông báo riêng, nó sẽ trả lời câu hỏi “tệp này có tồn tại không?” cho bất kỳ đường dẫn nào trên máy của bạn.

Ảnh từ xa phải là https công khai

image_url do máy chủ tải về, nên scheme phải là https: và host chỉ được phân giải tới các địa chỉ internet công khai: các dải loopback, private, link-local, carrier-grade NAT, multicast và reserved đều bị từ chối, kể cả các dạng viết IPv6-mapped của chúng. Chỉ cần một kết quả phân giải không công khai là cả URL bị từ chối. Chuyển hướng được xử lý thủ công, tối đa ba bước, và mỗi bước đều được kiểm tra lại. Nội dung tải về bị giới hạn 25 MB, được đếm khi dữ liệu đến chứ không tin vào header.

image_base64 không chịu ràng buộc nào trong số này, vì bên gọi đã nắm sẵn các byte dữ liệu – đó là lý do mọi lần từ chối ở trên đều hướng bạn tới nó.

Đọc hướng dẫn