Search / cheap.doc/mcp
mcp
not classifiedPassport, ID and MRZ recognition via doc.cheap – Free: 100 documents every month, then $0.01 each
v0.3.10 · active · repository · website · descriptor JSON · versions
Search / cheap.doc/mcp
Passport, ID and MRZ recognition via doc.cheap – Free: 100 documents every month, then $0.01 each
v0.3.10 · active · repository · website · descriptor JSON · versions
{
"mcpServers": {
"doc": {
"type": "http",
"url": "https://mcp.doc.cheap/mcp",
"headers": {
"Authorization": "Bearer ${api_key}",
"X-Doc-Cheap-Api-Key": "${api_key}"
}
}
}
}claude mcp add --transport http doc https://mcp.doc.cheap/mcp --header "Authorization: Bearer ${api_key}" --header "X-Doc-Cheap-Api-Key: ${api_key}"[mcp_servers.doc]
url = "https://mcp.doc.cheap/mcp"
bearer_token_env_var = "api_key"
env_http_headers = { "X-Doc-Cheap-Api-Key" = "api_key" }
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"doc": {
"type": "remote",
"url": "https://mcp.doc.cheap/mcp",
"enabled": true,
"headers": {
"Authorization": "Bearer {env:api_key}",
"X-Doc-Cheap-Api-Key": "{env:api_key}"
}
}
}
}{
"mcpServers": {
"doc": {
"type": "http",
"url": "https://mcp.doc.cheap/mcp",
"headers": {
"Authorization": "Bearer ${api_key}",
"X-Doc-Cheap-Api-Key": "${api_key}"
}
}
},
"deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=doc&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vbWNwLmRvYy5jaGVhcC9tY3AiLCJoZWFkZXJzIjp7IkF1dGhvcml6YXRpb24iOiJCZWFyZXIgJHthcGlfa2V5fSIsIlgtRG9jLUNoZWFwLUFwaS1LZXkiOiIke2FwaV9rZXl9In19"
}{
"servers": {
"doc": {
"type": "http",
"url": "https://mcp.doc.cheap/mcp",
"headers": {
"Authorization": "Bearer ${api_key}",
"X-Doc-Cheap-Api-Key": "${api_key}"
}
}
}
}{
"mcpServers": {
"doc": {
"httpUrl": "https://mcp.doc.cheap/mcp",
"headers": {
"Authorization": "Bearer ${api_key}",
"X-Doc-Cheap-Api-Key": "${api_key}"
}
}
}
}extensions:
"doc":
enabled: true
name: "doc"
type: streamable_http
uri: "https://mcp.doc.cheap/mcp"
headers:
"Authorization": "Bearer ${api_key}"
"X-Doc-Cheap-Api-Key": "${api_key}"
timeout: 300
Placeholders to fill from your own secret store: ${api_key}, ${api_key}. The registry never accepts secret values.
protocol.modernnewest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28protocol.statelessonly applies to 2026-07-28 serversprotocol.transportstreamable HTTPprotocol.list_ttlonly applies to 2026-07-28 serversauth.prm, auth.as_metadata, auth.cimdno remote uses OAuthauth.secret_in_urlno templated URLtools.descriptionsevery tool has a descriptiontools.description_length4 tools have descriptions over 1,024 characters, which crowds the contexttools.schemasevery tool has an object input schematools.annotations6 of 6 tools declare readOnlyHint or destructiveHinttools.directory_hints2 of 6 tools declare all four hints; missing: check_balance (destructiveHint, idempotentHint); search_docs (destructiveHint, idempotentHint); get_scan (destructiveHint, idempotentHint); …tools.token_costabout 2,382 tokens to load every tooltools.api_dumptools are not a one-to-one API dumpstability.changes16 tool changes in 30 daysstability.rug_pullno tool changed its meaning under the same namedeps.known_vulns, deps.mcp_sdk_version, deps.resolvabledeps.dev does not know @doc-cheap/[email protected]get_scanchangedoutput schemalist_scanschangedoutput schemascan_documentchangedoutput schemaget_scanchangedoutput schemascan_documentchangeddescription, output schemaRecognise a passport, national ID card or driver's licence from a photo or scan and return what is printed on it as structured JSON. Inputs: the image as image_base64 or image_url (https, on a public address); plus the optional expect_country, return_portrait, retain_hours, reference and idempotency_key. Output: a Scan object – meta (id, status, billed, confidence, timing), document (kind, issuing country, number, series, date of issue, date of expiry, whether it has expired and how many days are left), holder (given names, surname, date of birth, sex, nationality), fields (every field read off the printed page, each with its own confidence), mrz (whether the machine-readable zone checks out, why not when it does not, and its lines exactly as read), images, quality and authenticity – plus a one-line summary of the same result. Calls POST /v1/scans. Cost: it bills one credit ($0.01) only when a document is recognised; an unreadable image, an empty frame or an unsupported type costs nothing, and meta.billed says which happened. Without a key, the public sandbox key is used. It gives 10 free recognised documents per address in all, and at most 10 requests per address an hour, whatever their answer. Registering gives 100 free documents every month. Use it whenever someone hands over an identity document and wants it read, transcribed, or checked against what they claim – a name, a document number, a date of birth or an expiry date.
Recognise a passport, national ID card or driver's licence from a photo or scan and return what is printed on it as structured JSON. Inputs: the image as image_base64 or image_url (https, on a public address); plus the optional expect_country, return_portrait, retain_hours, reference and idempotency_key. Output: a Scan object – meta (id, status, billed, confidence, timing), document (kind, issuing country, number, series, date of issue, date of expiry, whether it has expired and how many days are left), holder (given names, surname, date of birth, sex, nationality) – country codes are the document's own three-letter ICAO codes, each with a *_detail object giving the code as written, its ISO 3166-1 alpha-3 and alpha-2 and its category, fields (every field read off the printed page, each with its own confidence), mrz (whether the machine-readable zone checks out, why not when it does not, and its lines exactly as read), images, quality and authenticity – plus a one-line summary of the same result. Calls POST /v1/scans. Cost: it bills one credit ($0.01) only when a document is recognised; an unreadable image, an empty frame or an unsupported type costs nothing, and meta.billed says which happened. Without a key, the public sandbox key is used. It gives 10 free recognised documents per address in all, and at most 10 requests per address an hour, whatever their answer. Registering gives 100 free documents every month. Use it whenever someone hands over an identity document and wants it read, transcribed, or checked against what they claim – a name, a document number, a date of birth or an expiry date.
get_scanchangedoutput schemascan_documentchangedoutput schemadelete_scanaddedPermanently delete one stored scan now, before its retention window would end. This cannot be undone: the stored result, its history row and its thumbnail are removed, and the scan can no longer be listed, fetched or replayed through its idempotency_key. The credit it drew is not refunded, and this period's usage counters still count it. Input: scan_id – meta.id of a scan_document result, or id of a list_scans row. Output: { id, deleted: true }. Calls DELETE /v1/scans/{id}. Only scans made with a live key under a non-zero retention window are stored, and only until that window ends (retain_hours on the scan, or the account's history-retention setting, one year by default); a scan made with retain_hours 0 was never stored. A key reaches its own account's scans and no other account's. Under a sandbox key – the public one or an account's own sk_sandbox_ key – nothing is stored. Errors: an id that is unknown, belongs to another account, has passed its window or was already deleted is refused as not_found, and nothing is deleted. Use it when someone asks for a document's data to be removed; confirm the id with list_scans or get_scan first, because the deletion is final.
get_scanaddedFetch the full result of one stored scan by its id, as it was returned when the document was recognised. Input: scan_id – meta.id of a scan_document result, or id of a list_scans row. Output: the same Scan object scan_document returns (meta, document, holder, fields, mrz and the rest) plus a one-line summary, with two differences: the image crops are never stored, so every images slot is null, and quality reads not_checked. Calls GET /v1/scans/{id}; it never re-runs recognition and never charges a credit. Only scans made with a live key under a non-zero retention window are stored, and only until that window ends (retain_hours on the scan, or the account's history-retention setting, one year by default); a scan made with retain_hours 0 was never stored. A key reaches its own account's scans and no other account's. Under a sandbox key – the public one or an account's own sk_sandbox_ key – nothing is stored. Errors: an id that is unknown, belongs to another account, was made with retain_hours 0 or has passed its window is refused as not_found – the cases are not told apart. Use it to read back a document recognised earlier instead of scanning the image again.
list_scansaddedList the account's stored scans, most recent first, one page at a time. Inputs: the optional limit (1 to 100 rows, default 20) and cursor (the next_cursor of the previous page; omit it for the first page). Output: scans – one row per scan with id, status (recognized, unreadable, no_document_found, unsupported_document or rejected), billed, duration_ms, reference (your own string from the scan) and created_at – and next_cursor, which is null on the last page. A row holds no extracted data; call get_scan with its id for the full result. Calls GET /v1/scans; it never charges a credit. Only scans made with a live key under a non-zero retention window are stored, and only until that window ends (retain_hours on the scan, or the account's history-retention setting, one year by default); a scan made with retain_hours 0 was never stored. A key reaches its own account's scans and no other account's. Under a sandbox key – the public one or an account's own sk_sandbox_ key – nothing is stored. Under the public sandbox key the answer is an empty list, given without calling the API. Errors: a cursor this API did not issue is refused (validation_failed); a key the API does not know is refused (unauthorized). Use it to find a scan made earlier – by its reference or its time – before reading or deleting it.
Showing the latest 10. Full history: list_changes · trend: quality JSON.
Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.
+repository +dns-namespace +website -unreachable(1 failures) +updated-8d-ago
Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.
@doc-cheap/[email protected] npmthis version is not known to the dependency resolver
Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.
| remote | auth | reachable | uptime 30d | p50 | protocol | last ok |
|---|---|---|---|---|---|---|
https://mcp.doc.cheap/mcp streamable-http | none | no (1 failures) | 98% | 776 ms | 2025-11-25 | 2026-10-19 |
| package | registry | version | runtime | secrets |
|---|---|---|---|---|
@doc-cheap/mcp | npm | 0.3.10 | – | DOC_CHEAP_API_KEY |
https://gitlab.com/doccheap/ocr-mcp/-/releases/v0.3.10/downloads/doc-cheap-0.3.10.mcpb | mcpb | 0.3.10 | – |
check_balanceread-only | Return how many credits are left on the account and what the current period has used: the balance, split into this month's free credits (100 every month, drawn first) and the paid credits, the credits spent, and the scan counters broken down by status (recognized, unreadable, no document found, unsupported document, rejected). Takes no arguments and calls GET /v1/usage; under the public sandbox key it answers without calling anything. One recognised document draws one credit, at $0.01; scans that recognised nothing are counted and never charged. Needs a real API key – under the public sandbox key there is no account behind the call, and the answer says so instead of reporting zeros that read like a balance. Use it before working through a batch of documents, or when a scan is refused for lack of credit. |
delete_scandestructive | Permanently delete one stored scan now, before its retention window would end. This cannot be undone: the stored result, its history row and its thumbnail are removed, and the scan can no longer be listed, fetched or replayed through its idempotency_key. The credit it drew is not refunded, and this period's usage counters still count it. Input: scan_id – meta.id of a scan_document result, or id of a list_scans row. Output: { id, deleted: true }. Calls DELETE /v1/scans/{id}. Only scans made with a live key under a non-zero retention window are stored, and only until that window ends (retain_hours on the scan, or the account's history-retention setting, one year by default); a scan made with retain_hours 0 was never stored. A key reaches its own account's scans and no other account's. Under a sandbox key – the public one or an account's own sk_sandbox_ key – nothing is stored. Errors: an id that is unknown, belongs to another account, has passed its window or was already deleted is refused as not_found, and nothing is deleted. Use it when someone asks for a document's data to be removed; confirm the id with list_scans or get_scan first, because the deletion is final. |
get_scanread-only | Fetch the full result of one stored scan by its id, as it was returned when the document was recognised. Input: scan_id – meta.id of a scan_document result, or id of a list_scans row. Output: the same Scan object scan_document returns (meta, document, holder, fields, mrz and the rest) plus a one-line summary, with two differences: the image crops are never stored, so every images slot is null, and quality reads not_checked. Calls GET /v1/scans/{id}; it never re-runs recognition and never charges a credit. Only scans made with a live key under a non-zero retention window are stored, and only until that window ends (retain_hours on the scan, or the account's history-retention setting, one year by default); a scan made with retain_hours 0 was never stored. A key reaches its own account's scans and no other account's. Under a sandbox key – the public one or an account's own sk_sandbox_ key – nothing is stored. Errors: an id that is unknown, belongs to another account, was made with retain_hours 0 or has passed its window is refused as not_found – the cases are not told apart. Use it to read back a document recognised earlier instead of scanning the image again. |
list_scansread-only | List the account's stored scans, most recent first, one page at a time. Inputs: the optional limit (1 to 100 rows, default 20) and cursor (the next_cursor of the previous page; omit it for the first page). Output: scans – one row per scan with id, status (recognized, unreadable, no_document_found, unsupported_document or rejected), billed, duration_ms, reference (your own string from the scan) and created_at – and next_cursor, which is null on the last page. A row holds no extracted data; call get_scan with its id for the full result. Calls GET /v1/scans; it never charges a credit. Only scans made with a live key under a non-zero retention window are stored, and only until that window ends (retain_hours on the scan, or the account's history-retention setting, one year by default); a scan made with retain_hours 0 was never stored. A key reaches its own account's scans and no other account's. Under a sandbox key – the public one or an account's own sk_sandbox_ key – nothing is stored. Under the public sandbox key the answer is an empty list, given without calling the API. Errors: a cursor this API did not issue is refused (validation_failed); a key the API does not know is refused (unauthorized). Use it to find a scan made earlier – by its reference or its time – before reading or deleting it. |
scan_document | Recognise a passport, national ID card or driver's licence from a photo or scan and return what is printed on it as structured JSON. Inputs: the image as image_base64 or image_url (https, on a public address); plus the optional expect_country, return_portrait, retain_hours, reference and idempotency_key. Output: a Scan object – meta (id, status, billed, confidence, timing), document (kind, issuing country, number, series, date of issue, date of expiry, whether it has expired and how many days are left), holder (given names, surname, date of birth, sex, nationality) – country codes are the document's own three-letter ICAO codes, each with a *_detail object giving the code as written, its ISO 3166-1 alpha-3 and alpha-2 and its category, fields (every field read off the printed page, each with its own confidence), mrz (whether the machine-readable zone checks out, why not when it does not, and its lines exactly as read), images, quality and authenticity – plus a one-line summary of the same result. Calls POST /v1/scans. Cost: it bills one credit ($0.01) only when a document is recognised; an unreadable image, an empty frame or an unsupported type costs nothing, and meta.billed says which happened. Without a key, the public sandbox key is used. It gives 10 free recognised documents per address in all, and at most 10 requests per address an hour, whatever their answer. Registering gives 100 free documents every month. Use it whenever someone hands over an identity document and wants it read, transcribed, or checked against what they claim – a name, a document number, a date of birth or an expiry date. |
search_docsread-only | Full-text search over the doc.cheap API documentation – endpoints, request options, every response field, the error codes and what to do about each, MRZ rules, retention and pricing. Takes a query and an optional limit (1 to 20, default 5), and answers with the matching sections: title, a snippet, and a link to the page. It reads a copy of the documentation shipped beside this server, so it makes no network call and works offline. Use it before guessing at a field name, an error code or a scan option – what it returns is the published contract rather than a recollection of it. |
Schemas: list_tools.
{
"name": "cheap.doc/mcp",
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"remotes": [
{
"url": "https://mcp.doc.cheap/mcp",
"type": "streamable-http",
"headers": [
{
"name": "Authorization",
"value": "Bearer {api_key}",
"isSecret": true,
"variables": {
"api_key": {
"isSecret": true,
"description": "Your doc.cheap API key."
}
},
"description": "Your doc.cheap API key as `Bearer <key>`, for clients that leave `Authorization` free; `X-Doc-Cheap-Api-Key` wins when both are sent. Without a key, the public sandbox key is used. It gives 10 free recognised documents per address in all, and at most 10 requests per address an hour, whatever their answer. Registering gives 100 free documents every month."
},
{
"name": "X-Doc-Cheap-Api-Key",
"value": "{api_key}",
"isSecret": true,
"variables": {
"api_key": {
"isSecret": true,
"description": "Your doc.cheap API key."
}
},
"description": "Your doc.cheap API key, for clients that reserve `Authorization` for their own use. It wins over `Authorization` when both are sent. Without a key, the public sandbox key is used. It gives 10 free recognised documents per address in all, and at most 10 requests per address an hour, whatever their answer. Registering gives 100 free documents every month."
}
]
}
],
"version": "0.3.10",
"packages": [
{
"version": "0.3.10",
"transport": {
"type": "stdio"
},
"identifier": "@doc-cheap/mcp",
"registryType": "npm",
"environmentVariables": [
{
"name": "DOC_CHEAP_API_KEY",
"isSecret": true,
"description": "Your doc.cheap API key. Without a key, the public sandbox key is used. It gives 10 free recognised documents per address in all, and at most 10 requests per address an hour, whatever their answer. Registering gives 100 free documents every month. The sandbox key has no balance."
},
{
"name": "DOC_CHEAP_API_BASE",
"default": "https://api.doc.cheap",
"description": "Base URL of the doc.cheap API. Only set this to reach a different deployment."
}
]
},
{
"version": "0.3.10",
"transport": {
"type": "stdio"
},
"fileSha256": "9e2d7e7428798afcdc493ba912da5c6ed55412047bc93197c41c71002ed51a3a",
"identifier": "https://gitlab.com/doccheap/ocr-mcp/-/releases/v0.3.10/downloads/doc-cheap-0.3.10.mcpb",
"registryType": "mcpb"
}
],
"repository": {
"url": "https://gitlab.com/doccheap/ocr-mcp",
"source": "gitlab"
},
"websiteUrl": "https://doc.cheap/docs/guides/use-the-mcp-server",
"description": "Passport, ID and MRZ recognition via doc.cheap – Free: 100 documents every month, then $0.01 each"
}