Reisepass-OCR als MCP-Server für KI-Agenten

Geben Sie einem Assistenten die Fähigkeit, einen Reisepass, einen Personalausweis oder ein Reisedokument zu lesen – und strukturierte Felder zurückzubekommen, keinen Textblock. Der Server spricht Model Context Protocol auf zwei Wegen: über stdio, aus npm installiert und von Ihrem Client als Befehl gestartet, oder über Streamable HTTP, gehostet unter mcp.doc.cheap. In beiden Fällen ist er ein schlanker Client der öffentlichen HTTP-API: Er hält keine eigenen Daten.

npx -y @doc-cheap/mcp

Veröffentlicht als @doc-cheap/mcp auf npm und als cheap.doc/mcp in der offiziellen MCP-Registry; der Quellcode liegt im öffentlichen Mirror auf GitLab.

Gelistet bei der offiziellen MCP-Registry, Smithery, cursor.directory und npm.

Was Ihr Agent zurückbekommt

Das ist der Unterschied, auf den es ankommt. Ein OCR-Tool, das eine Seite Text liefert, gibt dem Modell etwas zum erneuten Parsen, und ein Modell, das ein Datum neu parsen soll, erfindet irgendwann eins. Dieses Tool liefert die Felder bereits getrennt:

  • Der Inhaber – Vornamen, Nachname, Geburtsdatum, Geschlecht, Staatsangehörigkeit.
  • Das Dokument – Art, Land, ausstellender Staat, Nummer, Serie, Ausstellungsdatum, Ablaufdatum, ob es abgelaufen ist und wie viele Tage bleiben.
  • Jedes gefundene Feld, jedes mit eigener Konfidenz, getrennt aus der maschinenlesbaren Zone (MRZ) und aus der gedruckten Sichtzone gelesen – so kann das Modell sehen, dass die beiden Lesungen übereinstimmen, statt es anzunehmen.
  • Die maschinenlesbare Zone mit einem Urteil: bestanden, fehlgeschlagen oder nicht vorhanden, mit dem Grund, und die Zeilen selbst.
  • Eine einzeilige Zusammenfassung, die der Assistent Ihnen während der Arbeit zeigen kann.

Fehler kommen als eine lesbare Zeile in einem Fehlerblock zurück, nie als stilles leeres Ergebnis: Der Assistent kann darauf reagieren und sie Ihnen zeigen. Eine Ablehnung durch die API behält den Wortlaut der API, ihren Fehlercode und den Link zu der Seite, die sie erklärt.

In Ihrem Client installieren

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

ein Befehl, im Projektverzeichnis

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, oder .cursor/mcp.json in einem Projekt

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

VS Code

.vscode/mcp.json – Achtung: verschachtelt unter servers, nicht unter 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 im Workspace, oder ~/.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, mit einem Klick

Der eigene Installationslink des Clients. Er fragt nach einer Bestätigung und zeigt den Befehl und die Argumentliste, bevor er etwas schreibt.

Zu Kiro hinzufügen

  • Starten Sie den Client neu, nachdem Sie den Block hinzugefügt haben. Der Server wird vom Client gestartet, daher übernimmt er eine geänderte Konfiguration und eine geänderte Umgebung erst bei einem Neustart.
  • Ohne DOC_CHEAP_API_KEY greift der Server auf den öffentlichen Sandbox-Schlüssel zurück: Scans laufen dann innerhalb dessen kostenlosen Kontingents, und es gibt kein Guthaben abzufragen. So sehen Sie am schnellsten, dass es funktioniert.
  • Optionale Einstellungen: DOC_CHEAP_DOCS_BASE (wohin Suchergebnisse verlinken), DOC_CHEAP_DOCS_DIR (welche Kopie der Dokumentation durchsucht wird) und DOC_CHEAP_IMAGE_ROOT (siehe die Schutzmechanismen unten).

Oder mit dem gehosteten Server verbinden

Dieselben drei Tools werden unter https://mcp.doc.cheap/mcp über Streamable HTTP gehostet, sodass ein Client, der sich mit einer URL verbindet, nichts installieren muss. Kein Login: Senden Sie Ihren Schlüssel als X-Doc-Cheap-Api-Key oder als Authorization: Bearer – werden beide gesendet, gewinnt der benannte Header –, oder senden Sie keinen, dann wird der öffentliche Sandbox-Schlüssel verwendet. Der gehostete Server kann keine Dateien auf Ihrem Rechner lesen, daher nimmt er das Bild als base64 oder als https-URL entgegen.

https://mcp.doc.cheap/mcp

Claude Code

ein Befehl

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

In Claude Desktop und auf claude.ai fügen Sie ihn unter Settings, Connectors als benutzerdefinierten Connector mit der URL https://mcp.doc.cheap/mcp hinzu; ohne Schlüssel läuft er mit dem Sandbox-Schlüssel.

Die drei Tools

Die drei Tools, die der MCP-Server veröffentlicht
ToolWas es tutAntwortet mitDeklariertes Verhalten
scan_document Recognise a passport or ID documentErkennt ein DokumentbildDas gesamte strukturierte Ergebnis plus die einzeilige ZusammenfassungNicht schreibgeschützt – es kann einen Credit verbrauchen. Nicht destruktiv. Idempotent, wenn Sie einen Idempotenzschlüssel senden, und nur dann. Open-World: Die Antwort kommt von einem entfernten Dienst.
check_balance Check remaining creditsLiest die Nutzung des KontosDas Guthaben und die Zähler des laufenden ZeitraumsSchreibgeschützt und Open-World: Die Zahlen sind der aktuelle Kontostand.
search_docs Search the doc.cheap API documentationDurchsucht die DokumentationPassende Abschnitte mit Titeln, Links und Auszügen – offlineSchreibgeschützt und Closed-World: Der Korpus ist die mit dem Server ausgelieferte Kopie der Dokumentation, sodass dieselbe Abfrage ganz ohne Netzwerk dieselbe Antwort liefert.
  • scan_document nimmt das Bild als image_base64, image_path oder image_url entgegen, dazu dieselben Optionen wie ein direkter Aufruf, darunter expect_country, return_portrait, reference und idempotency_key.
  • search_docs liest eine mit dem Server ausgelieferte Kopie der Dokumentation und antwortet daher ganz ohne Netzwerk – der Agent kann also das Feldvokabular oder einen Fehlercode nachschlagen, ohne einen Aufruf zu verbrauchen.
  • check_balance braucht einen Schlüssel mit einem Konto dahinter. Mit dem öffentlichen Sandbox-Schlüssel sagt es klar, dass es kein Guthaben gibt, statt mit Nullen zu antworten, die wie ein Messwert aussehen.
  • Jedes Tool deklariert ein Ausgabeschema und liefert strukturierten Inhalt, der ihm entspricht, sodass ein Agent die Felder ohne Textparsing nutzen kann.
  • Jede Seite der Dokumentation ist auch eine Ressource, die der Agent lesen kann, und vier Prompts – ein Dokument in JSON auslesen, ein Ablaufdatum prüfen, einen Stapel scannen, einen Fehlercode erklären – starten die üblichen Aufgaben in einem Schritt.

Was es kostet

$0.01 pro erkanntem Dokument. Pauschal, für jedes Konto, bei jedem Volumen – eine Zahl, nichts zu verhandeln. Ein Dokument wird nur berechnet, wenn es erkannt wurde: Ein Scan, der nichts findet, das Bild nicht lesen oder den Typ nicht bestimmen kann, antwortet mit seinem Urteil und kostet nichts. Jedes Ergebnis sagt, welcher Fall es war, sodass der Agent – und Sie – immer wissen, ob dieser Aufruf etwas gekostet hat.

Bevor Sie ein Konto haben: Der öffentliche Sandbox-Schlüssel führt insgesamt 10 kostenlos erkannte Dokumente pro IP-Adresse aus, höchstens 10 Anfragen pro Stunde, unabhängig von der Antwort, und die Registrierung bringt 20 Credits dazu. Ein Credit ist ein Cent, und ein Cent ist ein Dokument.

Die Erkennung dauert in Produktion im Median etwa 275 ms, und jedes Ergebnis enthält seine eigenen Zeitangaben, sodass eine Agentenschleife mit einer echten Zahl planen kann.

Was der Server meldet

Standardmäßig meldet der Server nirgendwohin etwas: Die Fehlermeldung ist ausgeschaltet, solange Sie nicht selbst einen Meldeendpunkt setzen, und ohne ihn wird die Tracker-Bibliothek nicht einmal geladen.

Zwei Schutzmechanismen, die Sie kennen sollten

Der Server läuft auf Ihrem Rechner mit Ihren Rechten, und seine Argumente wählt ein Modell. Zwei davon sind deshalb eingezäunt:

Lokale Dateien sind gesperrt, bis Sie ein Verzeichnis freigeben

image_path verweigert jede Aktion, bis DOC_CHEAP_IMAGE_ROOT ein Verzeichnis nennt, und weist den Assistenten an, stattdessen image_base64 zu senden. Ist die Variable gesetzt, werden sowohl das Verzeichnis als auch die angeforderte Datei vor der Enthaltenseinsprüfung über Symlinks aufgelöst; ein ..-Segment und ein nach außen zeigender Link werden beide abgelehnt, und ein relativer Pfad wird von diesem Verzeichnis aus genommen, nicht von dort, wo der Client den Prozess zufällig gestartet hat. Ein Pfad außerhalb der Wurzel und ein Pfad, der nicht existiert, ergeben dieselbe Meldung – eine eigene für jeden Fall würde für jeden Pfad auf Ihrem Rechner die Frage „Gibt es diese Datei?“ beantworten.

Entfernte Bilder müssen öffentliches https sein

image_url wird vom Server abgerufen, daher muss das Schema https: sein und der Host darf nur auf öffentliche Internetadressen auflösen: Loopback, private, link-lokale, Carrier-Grade-NAT-, Multicast- und reservierte Bereiche werden abgelehnt, auch in ihren IPv6-gemappten Schreibweisen. Eine einzige nicht öffentliche Antwort lässt die ganze URL ablehnen. Weiterleitungen werden von Hand verfolgt, höchstens drei Sprünge, und jeder Sprung wird erneut geprüft. Der Body ist auf 25 MB begrenzt, gezählt, während er ankommt, statt einem Header zu vertrauen.

image_base64 unterliegt keiner dieser Einschränkungen, weil der Aufrufer die Bytes schon hat – deshalb verweist jede Ablehnung oben darauf.

Zur Anleitung