AI 에이전트를 위한 여권 OCR MCP 서버
어시스턴트가 여권, 신분증, 여행 문서를 읽고, 텍스트 덩어리가 아니라 구조화된 필드를 받을 수 있게 해 줍니다. 서버는 두 가지 방식으로 Model Context Protocol을 사용합니다. npm에서 설치해 클라이언트가 명령으로 실행하는 stdio 방식, 그리고 mcp.doc.cheap에 호스팅된 Streamable HTTP 방식입니다. 어느 쪽이든 공개 HTTP API의 얇은 클라이언트이며, 자체적으로 보관하는 데이터는 없습니다.
npx -y @doc-cheap/mcp npm에 @doc-cheap/mcp 패키지로, 공식 MCP 레지스트리에 cheap.doc/mcp 항목으로 게시되어 있습니다. 소스 코드는 GitLab 공개 미러에 있습니다.
등재된 곳: 공식 MCP 레지스트리, Smithery, cursor.directory, npm.
에이전트가 돌려받는 것
이것이 중요한 차이입니다. 텍스트 한 페이지를 돌려주는 OCR 도구는 모델에게 다시 파싱할 거리를 넘기고, 날짜를 다시 파싱하라는 요청을 받은 모델은 언젠가 날짜를 지어내게 됩니다. 이 도구는 이미 분리된 필드를 반환합니다.
- 소지자 – 이름, 성, 생년월일, 성별, 국적.
- 문서 – 종류, 국가, 발급 국가, 번호, 시리즈, 발급일, 만료일, 만료 여부, 남은 일수.
- 찾아낸 모든 필드. 각자의 신뢰도와 함께, 기계 판독 영역(MRZ)과 인쇄된 시각 영역에서 각각 따로 읽습니다. 그래서 모델은 두 판독 결과가 일치한다고 가정하는 대신 직접 확인할 수 있습니다.
- 판정이 포함된 기계 판독 영역: 통과, 실패 또는 없음, 그 이유, 그리고 줄 자체.
- 어시스턴트가 작업하는 동안 보여 줄 수 있는 한 줄 요약.
실패는 조용한 빈 결과가 아니라 오류 블록 안의 읽을 수 있는 한 줄로 돌아옵니다. 어시스턴트는 이를 바탕으로 조치하고 사용자에게 보여 줄 수 있습니다. API가 거부한 경우에는 API의 원래 문구, 오류 코드, 그리고 이를 설명하는 페이지 링크가 그대로 유지됩니다.
클라이언트에 설치하기
클라이언트의 MCP 설정에 블록을 추가하고 클라이언트를 다시 시작하세요. DOC_CHEAP_API_KEY에 자신의 API 키를 설정하거나, 생략하면 공개 sandbox 키가 대신 사용됩니다.
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
프로젝트 디렉터리에서 명령 한 줄
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, 또는 프로젝트의 .cursor/mcp.json
{
"mcpServers": {
"doc-cheap": {
"command": "npx",
"args": [
"-y",
"@doc-cheap/mcp"
],
"env": {
"DOC_CHEAP_API_KEY": "sk_live_your_key"
}
}
}
}VS Code
.vscode/mcp.json – mcpServers가 아니라 servers 아래에 넣는다는 점에 주의
{
"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, 또는 ~/.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"
}
}
}
}- 블록을 추가한 뒤 클라이언트를 다시 시작하세요. 서버는 클라이언트가 실행하므로, 바뀐 설정과 환경은 새로 시작할 때만 반영됩니다.
- DOC_CHEAP_API_KEY가 없으면 서버는 공개 sandbox 키를 사용합니다. 이때 스캔은 무료 한도 안에서 실행되며, 보고할 잔액이 없습니다. 작동하는 모습을 가장 빨리 확인하는 방법입니다.
- 선택 설정: DOC_CHEAP_DOCS_BASE(검색 결과가 연결되는 주소), DOC_CHEAP_DOCS_DIR(검색할 문서 사본), DOC_CHEAP_IMAGE_ROOT(아래 보호 장치 참고).
또는 호스팅 서버에 연결하기
같은 세 가지 도구가 https://mcp.doc.cheap/mcp에서 Streamable HTTP로 호스팅되므로, URL로 연결하는 클라이언트는 아무것도 설치할 필요가 없습니다. 로그인도 없습니다. API 키를 X-Doc-Cheap-Api-Key 또는 Authorization: Bearer로 보내거나(둘 다 보내면 이름이 있는 헤더가 우선합니다), 아무것도 보내지 않으면 공개 sandbox 키가 사용됩니다. 호스팅 서버는 사용자 컴퓨터의 파일을 읽을 수 없으므로, 이미지를 base64 또는 https URL로 받습니다.
https://mcp.doc.cheap/mcp Claude Code
명령 한 줄
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"
}
}
}
}Claude Desktop과 claude.ai에서는 Settings, Connectors에서 사용자 지정 커넥터로 추가하고 URL 칸에 https://mcp.doc.cheap/mcp 주소를 입력하세요. 키가 없으면 sandbox 키로 실행됩니다.
세 가지 도구
| 도구 | 하는 일 | 반환 내용 | 선언한 동작 |
|---|---|---|---|
scan_document Recognise a passport or ID document | 문서 이미지를 인식합니다 | 구조화된 전체 결과와 한 줄 요약 | 읽기 전용이 아님 – 크레딧이 차감될 수 있습니다. 파괴적이지 않음. 멱등성 키를 보낼 때에만 멱등. 개방형(open-world): 응답이 원격 서비스에서 옵니다. |
check_balance Check remaining credits | 계정 사용량을 읽습니다 | 잔액과 이번 기간의 카운터 | 읽기 전용, 개방형(open-world): 수치는 계정의 실시간 상태입니다. |
search_docs Search the doc.cheap API documentation | 문서를 검색합니다 | 일치하는 섹션의 제목, 링크, 발췌 – 오프라인 | 읽기 전용, 폐쇄형(closed-world): 검색 대상은 서버와 함께 배포되는 문서 사본이므로, 네트워크 없이도 같은 질의에는 같은 답이 나옵니다. |
- scan_document는 이미지를 image_base64, image_path 또는 image_url로 받으며, 직접 호출과 같은 옵션을 받습니다. expect_country, return_portrait, reference, idempotency_key 등이 있습니다.
- search_docs는 서버와 함께 배포된 문서 사본을 읽으므로 네트워크 없이도 응답합니다. 즉 에이전트는 호출을 소모하지 않고 필드 어휘나 오류 코드를 찾아볼 수 있습니다.
- check_balance에는 계정이 연결된 키가 필요합니다. 공개 sandbox 키로는 잔액이 없다고 분명히 알려 주며, 실제 값처럼 보이는 0으로 응답하지 않습니다.
- 모든 도구는 출력 스키마를 선언하고 그에 맞는 구조화된 콘텐츠를 반환하므로, 에이전트는 텍스트를 파싱하지 않고 필드를 사용할 수 있습니다.
- 문서의 모든 페이지는 에이전트가 읽을 수 있는 리소스이기도 하며, 네 가지 프롬프트(문서를 JSON으로 읽기, 만료일 확인, 일괄 스캔, 오류 코드 설명)로 흔한 작업을 한 번에 시작할 수 있습니다.
비용
인식된 문서 1건당 $0.01. 모든 계정에, 어떤 사용량에서나 정액입니다. 숫자는 하나이고 협상할 것은 없습니다. 문서는 인식되었을 때만 과금됩니다. 아무것도 찾지 못했거나, 이미지를 읽을 수 없거나, 유형을 식별할 수 없는 스캔은 그 판정을 응답으로 돌려주며 비용이 들지 않습니다. 모든 결과에 어느 쪽이었는지 표시되므로, 에이전트도 사용자도 그 호출에 비용이 들었는지 항상 알 수 있습니다.
계정이 생기기 전: 공개 sandbox 키로 IP 주소당 총 10건의 인식된 문서를 무료로 처리할 수 있고, 응답 결과와 관계없이 요청은 시간당 최대 10건이며, 가입하면 크레딧 20개가 추가됩니다. 크레딧 1개는 1센트이고, 1센트는 문서 1건입니다.
인식에는 프로덕션 기준 중앙값으로 약 275 ms가 걸리며, 모든 결과에 자체 소요 시간이 포함되므로 에이전트 루프가 실제 수치를 기준으로 예산을 잡을 수 있습니다.
직접 호출과 같은 가격, 같은 키, 같은 응답 구조입니다: 과금 방식, 다른 선택지와의 비교.
서버가 보고하는 것
기본적으로 서버는 어디에도 아무것도 보고하지 않습니다. 오류 보고는 사용자가 직접 보고 대상을 설정하지 않는 한 꺼져 있으며, 설정하지 않으면 추적 라이브러리는 로드조차 되지 않습니다.
알아 둘 만한 두 가지 보호 장치
서버는 사용자의 컴퓨터에서 사용자의 권한으로 실행되며, 인수는 모델이 고릅니다. 그래서 그중 두 가지에는 울타리를 쳐 두었습니다.
디렉터리 하나를 열기 전까지 로컬 파일은 꺼져 있습니다
image_path는 DOC_CHEAP_IMAGE_ROOT에 디렉터리가 지정되기 전까지 아무 동작도 하지 않고, 대신 image_base64를 보내라고 어시스턴트에게 알려 줍니다. 변수가 설정되면 디렉터리와 요청된 파일 모두 심볼릭 링크를 따라 경로를 확정한 뒤 포함 여부를 검사합니다. .. 세그먼트와 바깥을 가리키는 링크는 모두 거부되며, 상대 경로는 클라이언트가 프로세스를 시작한 위치가 아니라 그 디렉터리를 기준으로 해석됩니다. 루트 밖의 경로와 존재하지 않는 경로는 같은 메시지를 냅니다. 경우마다 메시지가 다르면 사용자 컴퓨터의 어떤 경로에 대해서든 “이 파일이 존재하는가?”에 답해 주는 셈이 되기 때문입니다.
원격 이미지는 공개 https여야 합니다
image_url은 서버가 가져오므로, 스킴은 https:여야 하고 호스트는 공개 인터넷 주소로만 해석되어야 합니다. 루프백, 사설, 링크 로컬, 통신사급 NAT(CGNAT), 멀티캐스트, 예약 대역은 IPv6 매핑 표기까지 포함해 모두 거부됩니다. 공개되지 않은 응답이 하나라도 있으면 URL 전체가 거부됩니다. 리디렉션은 직접 따라가며 최대 세 번까지이고, 매 단계마다 다시 검사합니다. 본문은 25 MB로 제한되며, 헤더를 믿지 않고 도착하는 대로 셉니다.
image_base64에는 이런 제약이 전혀 없습니다. 호출하는 쪽이 이미 바이트를 가지고 있기 때문입니다. 그래서 위의 모든 거부 메시지가 이 옵션을 안내합니다.
가이드 읽기
- MCP 서버 사용하기 – 설정, 도구, 보호 장치, 그리고 클라이언트에 도구가 보이지 않을 때 확인할 것(영문).
- API 문서 – 서버가 클라이언트로서 사용하는 HTTP 인터페이스.
- OpenAPI 명세 – 계약 그 자체.
- 먼저 계정 없이 호출해 보기 – 같은 인식 기능을 터미널에서.