MathTrail

Für Fachleute

So funktioniert der Dienst

MathTrail steht zwischen dem Chat, den eine Familie bereits nutzt, und dem Google Drive der Familie. Das Modell des Chats schreibt jede Aufgabe, und der Dienst entscheidet, ob sie das Kind erreicht. Der Dienst ist ein einziges Programm: Er ruft kein eigenes Modell auf und behält zwischen den Anfragen nichts.

  • Ein Go-Binary auf Cloud Run
  • Zustandslos
  • Keine Datenbank
  • Keine eigenen LLM-Aufrufe
  • MCP 2026-07-28 · MCP Apps

Chat-Client1 · Client

  • Claude
  • ChatGPT
  • andere MCP-Apps-Hosts

Das Modell des Chats schreibt die Aufgabe, und die Karte zeigt sie dem Kind.

MCP · Tool-Aufrufe über HTTPS

MathTrail auf Google Cloud2 · Laufzeitumgebung

Cloud Run · ein Go-Binary · zustandslos

Der Kern: reine Berechnung

  • Die Regel
  • Wertungen
  • Prüfungen
  • Löser
  • Inhalte

Um den Kern herum: OAuth, der MCP-Server, die Karte, die Versiegelung, die Limits.

Drive API v3 · mit dem eigenen Token der Familie

Google Drive3 · Speicher

MathTrail/mathtrail-profile.json

Eine Datei pro Kind, im eigenen Google Drive der Familie: das Einzige, was lange aufbewahrt wird.

01

Die Übersicht

Wer mit wem spricht. Weder das Kind noch die erwachsene Person erreicht MathTrail direkt: Beide sprechen mit dem Chat-Host. Alles im mittleren Block ist Teil eines einzigen Prozesses, kein eigener Dienst. Wählen Sie einen beliebigen Teil, um zu sehen, was er tut und womit er verbunden ist.

Teile des Dienstes

Der Chat der Familie

Claude im Browser, auf dem Computer und auf dem Smartphone · ChatGPT

Menschen

Chat-Host

MathTrail

Ein Go-Binary · Cloud Run · eine eigene Domain

zwischen den Teilen einfache Funktionsaufrufe

Der Eingang

Tools: Profil lesen, rechnen, zurückschreiben

Reine Berechnung, ohne Netzwerk

Rund um den Kern

Google und GitHub

Die einzigen Dienste außerhalb des Binarys

Das Google-Konto der Familie

Google Cloud

GitHub

Wählen Sie einen Teil der Übersicht: Alles, womit er verbunden ist, bleibt hell, und der Rest verblasst.

Der Chat der Familie

Erwachsene Person

Ein Elternteil oder eine Lehrkraft. Besitzt sowohl das Chat-Konto als auch das Google-Konto: verbindet MathTrail, meldet sich einmal an, legt das Profil an, leitet die Lektion im Chat und verfolgt den Fortschritt. Die einzige Person, die sich anmeldet, und die einzige, die schreibt.

Der Chat der Familie

Kind

Klassen 1–6. Löst Aufgaben auf der Karte, im Chat der erwachsenen Person. Hat keine eigene Anmeldung.

Chat-Host

Das Modell des Hosts

Claude oder ChatGPT. Schreibt die Aufgabe, ein Lösungsprogramm in Starlark, eine Erklärung zu jeder falschen Antwortmöglichkeit und eine Selbstprüfung; führt die Lektion in Worten, wo keine Karten angezeigt werden. MathTrail selbst ruft kein Modell auf.

Chat-Host

MCP-Apps-Laufzeitumgebung

Zeigt die Karte in einem Rahmen in einer Sandbox an, übergibt ihr die Sprache, die Plattform und die Größe und leitet die eigenen Aufrufe der Karte mit dem Token des Hosts weiter – die Karte selbst sieht das Token nie.

Chat-Host

Client-Metadatendokument

Der Host weist sich mit einer HTTPS-Adresse aus. MathTrail ruft das Dokument unter dieser Adresse ab, gegen SSRF geschützt, statt ein Register der Clients zu führen.

MathTrail · Eingang

HTTP-Router

Der einzige Eingang: /health, /mcp, die OAuth-Endpunkte und .well-known. Zeitlimits, eine Obergrenze für die Größe des Bodys, eine Origin-Prüfung; der Aussteller ist die eigene Domain, und jeder andere Host erhält die Antwort 404.

MathTrail · Eingang

Autorisierungsserver

MathTrail ist selbst ein OAuth-2.1-Server mit PKCE: Metadaten, ein eigener Zustimmungsbildschirm, Anmeldung mit Google, Tokens, Erneuerung und Widerruf. Alles, was ein Server mit Zustand speichern würde, ist in Tokens und Cookies versiegelt.

MathTrail · Eingang

MCP-Server

Das Protokoll: Streamable HTTP 2026-07-28, zustandslos, auf Basis des offiziellen Go-SDK. Der Server listet die Tools auf und ruft sie auf, liefert die Karte als ui://-Ressource aus und übergibt dem Modell seine Anweisungen samt ihrer Version.

MathTrail · Eingang

Limits

Ein Tempo pro Adresse vor der Anmeldung und pro Konto danach sowie eine Gesamtobergrenze, alles im Arbeitsspeicher – dann die täglichen Obergrenzen, die das Profil zählt. Ist ein Limit überschritten, kommt ein schlichter Satz, den das Modell weitergibt.

MathTrail · Tools

Tools

Zwölf Tools nach einem Muster: Profil lesen, rechnen, zurückschreiben. Die meisten ruft das Modell auf; die Karte ruft ihre eigenen auf – für die Aufgabe, die Antwort, den Fortschritt und das Formular des Profils. Nichts Geheimes gelangt je in ein Ergebnis.

MathTrail · reine Berechnung

Die Regel

Wählt den Auftrag deterministisch: nach einem Fehler dasselbe Thema, um es zu festigen; sonst das Thema, das am längsten nicht vorkam; die Schwierigkeit aus dem Korridor, in dem die Lösungswahrscheinlichkeit bei 70–85 % liegt. Ein Thema, in dem das Kind zurückliegt, kommt doppelt so oft. Themen, die vorerst zu schwer sind, werden pausiert, und sobald das Gesamtniveau des Kindes eines davon erreicht, kann jede sechste Aufgabe es als Themencheck zurückbringen.

MathTrail · reine Berechnung

Wertungen

P = 0,2 + 0,8·σ(θ + δ − β). Elo bewegt sich nur danach, ob eine Antwort richtig ist, mit einer Schrittweite, die schrumpft; eine Skala wie beim Schach und elf Ränge; ein Thema gilt nach einer vorsichtigen Schätzung als gemeistert.

MathTrail · reine Berechnung

Prüfungen

Was eine eingereichte Aufgabe bestehen muss: ihre Struktur und fünf verschiedene Antwortmöglichkeiten, die Buchstaben der Lektionssprache, unterschiedliche Erklärungen, das Lösungsprogramm, die Selbstprüfung, die Lesbarkeit, Beinahe-Duplikate und das Bild: sein Format, seine Beschriftungen im Abgleich mit dem Aufgabentext und dass keine Antwort darauf steht. Alle nicht bestandenen Prüfungen werden auf einmal gemeldet.

MathTrail · reine Berechnung

Löser

Führt das Starlark-Programm des Modells aus, das die Antwortmöglichkeiten durchprobiert; genau eine muss sich als richtig erweisen. Limits für Schritte und Zeit, kein Netzwerk und keine Dateien.

MathTrail · reine Berechnung

Inhalte

Alles, was in das Binary eingebaut und kein Code ist: die Kataloge der Themen, Fallen und Fähigkeiten, die Referenzaufgaben, die Schemas, die Vorlagen für Lösungsprogramme, ein Beispiel für jede Art von Bild und die Anweisungen an das Modell samt ihrer Version.

MathTrail · rund um den Kern

Widget

Die Karte: Preact, gebaut zu einer einzigen HTML-Datei, die nichts von anderswo lädt, mit den Wörterbüchern der Sprachen darin. Das Layout funktioniert ab 320 px, und die Schaltflächen lassen sich gut mit dem Finger treffen.

MathTrail · rund um den Kern

Speicher

Findet das Profil anhand einer versteckten Markierung, vergleicht vor dem Schreiben, bringt zwei Tabs in Einklang, stellt die Datei auf Wunsch der erwachsenen Person aus Versionen wieder her, die Google Drive für immer behält – und kommt mit einem kleinen Budget an Drive-Aufrufen aus.

MathTrail · rund um den Kern

Versiegelung

Ein Mechanismus, zwei Zwecke: Er versiegelt die Anmeldung und die Tokens von Google in die Tokens, die der Host hält, und die Antwort einer Aufgabe – der aktuellen und der vorab geschriebenen – ins Profil. Die Schlüssel kommen aus Secret Manager und werden anhand der Schlüssel-ID rotiert.

MathTrail · rund um den Kern

Protokollierung

Eine strukturierte Zusammenfassung pro Aufruf: das Tool, das Ergebnis, die Dauer, die Version der Anweisungen; Versuche und die Gründe einer Ablehnung als Ereignisse der Aufgabe. Keine personenbezogenen Daten, kein Aufgabentext, keine Antworten.

MathTrail · rund um den Kern

Container und Konfiguration

Verbindet die Teile miteinander und schließt sie in umgekehrter Reihenfolge, arbeitet mit Zeitlimits und geordnetem Herunterfahren, liest die gesamte Konfiguration aus der Umgebung – und weigert sich, mit Entwicklungsschaltern auf Cloud Run zu starten.

Das Google-Konto der Familie

Google OAuth

Die Anmeldung der erwachsenen Person, nur mit der Berechtigung drive.file, dazu Erneuerung und Widerruf. Der Widerruf eines beliebigen Tokens beendet jeden Zugriff.

Das Google-Konto der Familie

Drive API v3

Der einzige Langzeitspeicher: ein JSON-Profil in einem sichtbaren Ordner namens MathTrail im Google Drive der Familie, gelesen und geschrieben mit dem eigenen Token der Familie.

Google Cloud

Secret Manager

Die Siegelschlüssel und das Client-Secret von Google: festgelegte Versionen, einmal beim Start einer Instanz gelesen.

Google Cloud

Artifact Registry

Das Image jeder Revision, per Digest; alte Images werden gelöscht.

Google Cloud

Cloud Logging

Wohin das stdout des Dienstes geht. Die Zeilen, nach denen Kinder gezählt werden, bleiben 62 Tage in einem eigenen Bucket.

Google Cloud

BigQuery → Data Studio

Nutzungszahlen werden jahrelang aufbewahrt und jede Nacht neu gezählt; keine Tabelle enthält den Namen, unter dem ein Kind gezählt wird. Ein privater Bericht und ein öffentlicher, der keine Gruppe mit weniger als zehn Kindern zeigt.

GitHub

Actions

Der Build, die Prüfungen, das Veröffentlichen des Images und das Deployment über Workload Identity-Föderation – ohne Dienstkontoschlüssel.

GitHub

Pages

Diese Website: die Seiten der Themen sowie die Datenschutzerklärung und die Nutzungsbedingungen, auf die der Zustimmungsbildschirm verlinkt.

02

Eine Lektion, Aufruf für Aufruf

Das Modell und die Karte rufen dieselben Tools auf und stützen sich auf eine einzige Quelle der Wahrheit: die Profildatei im Google Drive der Familie. Damit eine Lektion weitergeht, müssen sie einander nichts mitteilen.

Szenario
  • ein Aufruf
  • seine Antwort
  • im Host

Aufgabe

  • Erwachsene Person
  • Karte
  • Modell des Hosts
  • MathTrail
  • Drive
  1. 1Erwachsene Person → Modell des Hosts: „Eine neue Aufgabe, bitte“

  2. 2Modell des Hosts → MathTrail: next_task

  3. Der Host zeigt die Karte an, sobald der Aufruf beginnt: „Die nächste Aufgabe wird vorbereitet…“

  4. Limits · die Regel wählt das Thema, das Niveau und die Schwierigkeit

  5. 3MathTrail → Drive: die offene Anfrage schreiben

  6. 4MathTrail → Modell des Hosts: die Anfrage ist offen – Paket abholen

  7. 5Modell des Hosts → MathTrail: get_package

  8. 6MathTrail → Modell des Hosts: Auftrag · 3 Referenzaufgaben · Fallen · Vorlagen · Beispielbilder

  9. Das Modell schreibt die Aufgabe, ein Lösungsprogramm in Starlark und eine Selbstprüfung

  10. 7Modell des Hosts → MathTrail: submit_task – bis zu 3 Versuche

  11. Prüfungen · das Lösungsprogramm muss genau eine richtige Antwortmöglichkeit finden

  12. 8MathTrail → Drive: die Aufgabe wird zur aktuellen, ihre Antwort versiegelt

  13. 9Karte → MathTrail: read_task – die Karte fragt alle 4 s nach

  14. 10MathTrail → Karte: Text · Bild · fünf Antwortmöglichkeiten · Tipp – ohne die Antwort

Jeder Aufruf liest außerdem das Profil aus Google Drive – diese Lesezugriffe sind nicht eingezeichnet. Die wartende Karte sieht das Paket nie: Seine Referenzaufgaben enthalten ihre Antworten. Während das Kind löst, schreibt das Modell mit prepare_task schon die nächste Aufgabe, und wenn eine weitere gewünscht wird, legt next_task sie sofort auf eine neue Karte – ohne diese Wartezeit.

Antwort

  • Erwachsene Person
  • Kind
  • Karte
  • Modell des Hosts
  • MathTrail
  • Drive
  1. 1Kind → Karte: klickt auf C

  2. 2Karte → MathTrail: submit_answer – kostet den Chat keine Runde

  3. nur die erste Antwort · erst jetzt wird das Siegel geöffnet · θ und δ ändern sich nur danach, ob sie richtig ist

  4. 3MathTrail → Drive: Wertungen und Verlauf schreiben

  5. 4MathTrail → Karte: richtig oder nicht · die Falle hinter C · das Bild der Lösung · die Schritte · die Wertung vorher → nachher

  6. Die Karte wird an der Stelle der Aufgabe zur Besprechung der Antwort

  7. 5Karte → Modell des Hosts: ui/update-model-context – eine Zeile, gelesen mit der nächsten Nachricht der erwachsenen Person

  8. 6Erwachsene Person → Modell des Hosts: „Warum ein Pfosten mehr?“

  9. 7Modell des Hosts → Erwachsene Person: antwortet zu genau dieser Aufgabe und ergänzt die Karte

Der Klick speichert die Antwort, bevor irgendetwas erklärt wird, und die Karte wird sofort zur Besprechung der Antwort. Den Chat kostet das keine Runde, und das Modell zeichnet nichts. Es liest die Zeile der Karte mit der nächsten Nachricht der erwachsenen Person und beantwortet eine Frage zur Aufgabe, ohne die Karte nachzuerzählen. Geht die Zeile des Hosts an das Modell verloren, holt das Modell das beim nächsten Aufruf nach.

Anmeldung

  • Browser der Familie
  • Host
  • MathTrail
  • Google
  • Drive
  1. 1Host → MathTrail: POST /mcp, ohne Token

  2. 2MathTrail → Host: 401 · wo die Metadaten liegen

  3. 3Host → Browser der Familie: öffnet /oauth/authorize · PKCE S256

  4. 4Browser der Familie → MathTrail: authorize

  5. Ein eigener Zustimmungsbildschirm: welcher Client und wohin er die erwachsene Person zurückschickt

  6. 5Browser der Familie → Google: Anmeldung mit Google · nur drive.file

  7. 6Google → Browser der Familie: zurück, mit dem Code von Google

  8. 7Browser der Familie → MathTrail: /oauth/callback

  9. 8MathTrail → Google: Code eintauschen

  10. 9MathTrail → Drive: /about – wessen Drive ist das?

  11. Nutzer-ID = HMAC des Drive-Kontos · Tokens von Google in unseren Code versiegelt

  12. 10MathTrail → Browser der Familie: 302 · code = mt1.c.…

  13. 11Browser der Familie → Host: gibt den Code zurück

  14. 12Host → MathTrail: /oauth/token · Code + Verifier

  15. 13MathTrail → Host: Zugriff 15 min · Aktualisierung 30 Tage

Die erwachsene Person meldet sich einmal an. Der Dienst behält nichts von diesem Austausch: Die Anfrage reist versiegelt im Parameter state, die Tokens von Google in einem versiegelten Code.

Die aktuelle Aufgabe als Zustandsautomat

Jede Regel, die „nur einmal“ verlangt, ist ein Feld des Profils und wird im selben Durchgang aus Lesen, Rechnen und Schreiben geprüft. Nichts anderes merkt sich irgendetwas.

nonenext_taskAuftrag bereitrequestedsubmit_task ✓versiegelt, gestelltissuedsubmit_answereinmal gespeichertanswered

  • requested ↺abgelehnt, Versuche übrig – höchstens drei pro Anfrage
  • requested → nonedrei Ablehnungen oder 15 Minuten seit dem Öffnen der Anfrage; die Aufgaben des Tages werden nicht verbraucht, und drei Ablehnungen zählen als gescheiterte Anfrage des Tages
  • issued → requested„Neue Aufgabe“ vor einer Antwort – als übersprungen gespeichert, die Wertung bleibt unberührt
  • answered ↺jede spätere Antwort – aus einem zweiten Tab oder vom Modell – bekommt das erste Ergebnis zurück und schreibt nichts
  • answered → requesteddie nächste Aufgabe, auf einer neuen Karte; die beantwortete ist nicht mehr aktuell
  • answered → issueddie nächste Aufgabe wurde vorab geschrieben – next_task legt sie sofort auf eine neue Karte und überspringt requested
  • issued → nonedas Siegel lässt sich nicht mehr öffnen – der Schlüssel wurde zweimal rotiert; nichts wird gespeichert

03

Wo der Zustand liegt

Alles, was ein Server mit Zustand in einer Datenbank hielte, bewahrt jemand anderes auf: in einem versiegelten Token, das der Chat hält, in einem Cookie im Browser der Familie oder im eigenen Google Drive der Familie. Starten Sie den Dienst neu oder starten Sie eine zweite Kopie: Nichts geht verloren.

MathTrail selbst

Nichts

Keine Konten, keine Sitzungen, keine Registrierungen, keine Tokens von Google. Jede Anfrage bringt alles mit, was sie braucht.

Der Token-Speicher des Chats

Versiegelte Tokens, für den Host undurchsichtig

Zugriffstoken
15 min
Token zum Aktualisieren
30 Tage, ≤ 90

Darin versiegelt sind die Tokens von Google, eine undurchsichtige Nutzer-ID für die Limits und das Land, aus dem sich die erwachsene Person angemeldet hat.

Der Browser der Familie

Zwei Cookies, keine Sitzung

Genehmigte Clients
180 Tage
Schutz der Anmeldung (CSRF)
10 min

Gehen sie verloren, kostet das einen Zustimmungsbildschirm mehr oder eine neue Anmeldung.

Das Google Drive der Familie

Das Einzige, was lange aufbewahrt wird

mathtrail-profile.json
bis zur Löschung

Das Profil, die Wertungen und die aktuelle Aufgabe mit versiegelter Antwort. Die erwachsene Person kann die Datei öffnen, und Google Drive bewahrt ihren Versionsverlauf auf.

Secret Manager

Einmal gelesen, beim Start einer Instanz

Siegelschlüsselnach einer Rotation gilt der vorige Schlüssel weiter
90 Tage
Client-Secret von Google
festgelegt

Der Arbeitsspeicher der Instanz

Nur Caches: bei einem Neustart verloren, und nichts geht kaputt

Zähler der Anfragerate
Minuten
Wo die Profildatei liegt
10 min
Dokumente der Clients
5 min bis 24 h

In v1 bewusst weggelassen

  • Eine Datenbank
  • Warteschlangen
  • Ein Sitzungsspeicher
  • Ein gemeinsamer Cache
  • Ein Vorrat fertiger Aufgaben
  • Ein Client für eine LLM-API
  • REST und OpenAPI

04

Die Profildatei

Ein Kind, eine JSON-Datei: kein Cache irgendeiner Wahrheit auf einem Server, sondern die Wahrheit selbst. Jeder Block hat eine Obergrenze, die bei jedem Schreiben eingehalten wird, sodass die Datei nie unbegrenzt wächst: Eine übliche hält das Ziel ein, und eine nahe an ihren Obergrenzen überschreitet es. Vergangene Aufgaben werden als Fingerabdrücke aufbewahrt, nicht als Text.

Größe der Datei

≈ 61 KB / ≈ 79 KB

Welche Größe angezeigt wird
BlockWas er enthältWer ihn schreibtGröße
FingerabdrückeBis zu 200 Skizzen der gestellten Aufgaben für die Prüfung auf Beinahe-Duplikate – ohne Text, ohne Thema, ohne Datumnext_tasksubmit_task27 KB / 29 KB
Verlauf der WertungWo θ und das δ des Themas vor jeder der letzten Antworten standen, und θ und jedes Thema zu Beginn jedes der letzten 7 Tage mit Antwortensubmit_answer14 KB / 15 KB
Wertungen und Themenθ und wo das Kind angefangen hat; für jedes Thema: δ, die Antworten, die Fallen, in die es getappt ist, ob das Thema gemeistert ist und auf welcher Stufenext_tasksubmit_tasksubmit_answer8 KB / 14 KB
Letzte AntwortenDie letzten 20 Antworten und übersprungenen Aufgaben – und nie weniger als die 5 Antworten, die die Regel liestnext_tasksubmit_answer4 KB / 5 KB
Aktuelle Aufgabe, versiegeltDie Antwort, die Falle hinter jeder falschen Antwortmöglichkeit, die Lösung und das Lösungsprogramm – eine einzige undurchsichtige Zeichenkettenext_tasksubmit_tasksubmit_answer4 KB / 8 KB
Aktuelle Aufgabe, offenWas die Karte zeigt: der Text, das Bild, fünf Antwortmöglichkeiten, der Tipp – und nach der Antwort die Antwort selbstnext_tasksubmit_tasksubmit_answer2 KB / 4 KB
Offene AnfrageWährend die Aufgabe geschrieben wird: ihre ID, der Auftrag, die verbrauchten Versuche und wer das Thema gewählt hatnext_taskprepare_tasksubmit_task1,5 KB / 2 KB
Dienst und KindDie Version des Schemas, eine zufällige UUID, die Revision; das Pseudonym, die Klasse, die Interessen, die Notizen; die Zähler des Tagessave_profileedit_profilejeder Schreibvorgang0,6 KB / 1,5 KB

Eine vorab geschriebene Aufgabe liegt neben der aktuellen und wiegt ungefähr gleich viel. Was die Datei nicht enthält: die Texte vergangener Aufgaben, die Antwort im Klartext, bevor das Kind geantwortet hat, irgendetwas, das die erwachsene Person benennt, und einen Rang – Ränge werden beim Anzeigen berechnet. Google Drive kennt kein bedingtes Schreiben, deshalb wird die Datei vor dem Speichern noch einmal gelesen, und das Schreiben wird abgelehnt, wenn sie sich geändert hat: Zwei Tabs überschreiben einander nie stillschweigend.

05

Versiegelt – und wie lange

Ein Mechanismus für zwei Zwecke: Er versiegelt die Anmeldung in die Tokens, die der Chat hält, und die Antwort einer Aufgabe – der aktuellen und der vorab geschriebenen – ins Profil. Jedes Siegel trägt seinen Zweck, sodass ein Zugriffstoken nicht als Aktualisierungstoken durchgehen kann und eine versiegelte Antwort als nichts anderes.

Ein Token, zerlegt

mt1.a.kQ7fWx.5rJ0Yb2mQ8vK1nT4pXc9…

mt1
Version des Formats
Zweck
c Code · a Zugriff · r Aktualisierung · d Client · s state · k Zustimmung · t Antwort einer Aufgabe
Schlüssel-ID
stammt aus dem Schlüssel selbst, daher fällt eine Rotation nicht auf
Geheimtext
XChaCha20-Poly1305, eine zufällige 192-Bit-Nonce

Kein JWT: Niemand außer dem Dienst liest es, und aus einer undurchsichtigen Zeichenkette kann kein Claim in ein Protokoll gelangen.

Gültigkeitsdauern, auf logarithmischer Skala

  • Autorisierungscode
    60 s
  • Laufende Anmeldung
    10 min
  • Zugriffstoken
    15 min
  • Aktualisierungstoken
    30 Tage, gleitend, höchstens 90
  • Siegelschlüssel
    alle 90 Tage rotiert
  • Genehmigte Clients
    180 Tage

Ein Server ohne Zustand kann einen Code nicht als benutzt markieren, deshalb bleibt das Zeitfenster des Codes klein. Nach einer Rotation gilt der vorige Schlüssel weiter, sodass beim Wechsel des Schlüssels weder ein Token noch eine versiegelte Antwort verloren geht.