Für Entwickler

Langrit-Referenz für Entwickler

Bau deinen eigenen Tutor, Bot oder dein Skript auf dem Lerngedächtnis: ein Standard-MCP-Server, OAuth 2.1, persönliche Tokens und eine REST API.

Überblick

Zwei Zugänge, ein Gedächtnis. Jeder Aufruf liest oder schreibt dieselben Lerndaten wie die Langrit-App, also bleiben Wiederholungen, Serien und Niveaus synchron.

MCP-Serverhttps://langrit.com/mcp
REST APIhttps://langrit.com/api/v1

Schnellstart

MCP-Client verbinden

terminal
claude mcp add --transport http langrit https://langrit.com/mcp
JSON-RPC
curl https://langrit.com/mcp \
  -H "Authorization: Bearer lgr_…" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"whats_due","arguments":{"limit":5}}}'

REST API mit persönlichem Token aufrufen

REST
curl https://langrit.com/api/v1/due?limit=5 \
  -H "Authorization: Bearer lgr_…"

Authentifizierung

Sende bei jeder Anfrage ein Bearer-Token mit. Nutze OAuth 2.1, wenn sich Leute aus deiner App verbinden, oder ein persönliches Token für deine eigenen Skripte.

OAuth 2.1

Clients finden den Autorisierungsserver per Discovery, ausgehend vom WWW-Authenticate-Header einer 401 auf /mcp. Dynamische Client-Registrierung und Client-ID-Metadaten-Dokumente werden unterstützt, deshalb brauchen die meisten Clients keine Einrichtung.

401
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://langrit.com/.well-known/oauth-protected-resource/mcp"
OAuth 2.1
GET https://langrit.com/.well-known/oauth-protected-resource/mcp
GET https://langrit.com/.well-known/oauth-authorization-server

authorize  https://langrit.com/oauth/authorize
token      https://langrit.com/oauth/token
register   https://langrit.com/oauth/register
revoke     https://langrit.com/oauth/revoke
  • Nur Authorization Code mit PKCE (S256). Der Redirect enthält code, state und iss.
  • Access-Tokens gelten eine Stunde. Refresh-Tokens gelten 60 Tage und wechseln bei jeder Nutzung; ein altes Refresh-Token funktioniert dann nicht mehr.
  • Redirect-URIs: https, http auf localhost (beliebiger Port) oder ein eigenes App-Schema.

Scopes

readProfil, fällige Wiederholungen, Muster, Export
writeZusätzlich Fehler speichern und Wiederholungen bewerten (inklusive read)

Persönliche Tokens

Erstelle bis zu fünf unter Einstellungen, API-Zugang. Ein Token wird nur einmal angezeigt und lässt sich jederzeit widerrufen.

MCP-Server

Streamable HTTP, zustandslos, JSON-Antworten. Sende jede JSON-RPC-Nachricht per POST; GET liefert 405, weil es keinen Server-Stream gibt.

Tools

ToolScopeEingabeRückgabe
learner_profileread{}Sprachen, Niveau, Tarif, Zahl fälliger Karten
whats_duereadlimit?Fällige Karten mit Modus, Frage und Auswahl
my_patternsreadwindow? 7d | 30d | 90dMuster mit Häufigkeit und Beispielen
remember_mistakewritewrong, correct, rule?, context? | items[≤20]Neue oder zusammengeführte Karten, Muster, Hinweis
grade_reviewwritecard_id, answer, mode, elapsed_ms?Richtig oder falsch, erwartete Antwort, nächste Wiederholung, Stufenleiter

Prompts und Ressourcen

Die Prompts today, quiz, my-mistakes und write starten eine Lerneinheit in den Sprachen der lernenden Person. Die Ressource langrit://me liefert das Profil als JSON.

Fragemodi

recognition kommt mit Auswahl und erwarteter Antwort; typed und translate zeigen die Antwort nie vor der Bewertung.

REST API

Dasselbe Gedächtnis über HTTPS. JSON rein, JSON raus.

EndpointWas er macht
GET /api/v1/meDein Profil, dein Tarif und die Zahl fälliger Karten
POST /api/v1/mistakesEinen Fehler oder bis zu 20 speichern (write)
GET /api/v1/dueFällige Wiederholungen mit dem Fragemodus
POST /api/v1/reviewsEine Antwort bewerten (write)
GET /api/v1/patternsFehlermuster für 7, 30 oder 90 Tage
GET /api/v1/exportKarten, Fehler und Wiederholungen als JSON, CSV oder Anki

Beispiel

mistakes
POST /api/v1/mistakes
Idempotency-Key: 6f1c…

{ "wrong": "de huis", "correct": "het huis", "rule": "huis is a het-word" }

201 -> { "created": 1, "merged": 0,
         "cards": [{ "id": 812, "pattern": "article_de_het", "pattern_label": "de vs het",
                     "merged": false, "l1_hint": "…" }] }
reviews
POST /api/v1/reviews
{ "card_id": 812, "answer": "het huis", "mode": "typed" }

200 -> { "correct": true, "expected": "het huis", "explanation_l1": null,
         "next_due_at": "2026-11-08T09:00:00Z", "interval_days": 4,
         "ladder": { "before": 1, "after": 2 }, "streak": 12 }

Fehler

Fehler kommen als JSON mit error, message und hint. Der Hinweis ist so geschrieben, dass ein Modell damit weitermachen kann; gib ihn einfach weiter.

StatusBedeutung
401Token fehlt, ist ungültig oder abgelaufen
402Kein aktiver Tarif und keine Testphase (Profil und Export funktionieren weiter)
403Dem Token fehlt der nötige Scope
404Unbekannte Karte oder Route
422Der Body ist ungültig
429Rate Limit oder Tagesbudget für KI-Bewertung erreicht
402
402 -> { "error": "subscription_required",
         "message": "The Langrit subscription for this account is not active.",
         "url": "https://langrit.com/pricing?ref=api",
         "hint": "Tell the learner their Langrit trial or subscription has ended and give them the url." }

Limits

60 Anfragen pro Minute und Token bei der REST API und 120 bei MCP. POST-Anfragen akzeptieren einen Idempotency-Key-Header; eine Wiederholung innerhalb von 24 Stunden liefert die erste Antwort.

Datenexport

GET /api/v1/export liefert alles als JSON. Füge format=csv mit table=cards, mistakes oder reviews hinzu, oder format=anki für eine Anki-Importdatei. Funktioniert auch nach Ende deines Tarifs.