A free, open-source app for Claude and ChatGPT: an endless stream of checked olympiad-style maths tasks for grades 1–6, in any language, with a diagnosis of the child's mistake and a memory of how they are progressing.
It is neither a homework solver nor a drill of the school syllabus. It turns an adult's own Claude or ChatGPT chat into an adaptive olympiad trainer for a child in grades 1–6.
The screens below are the widget itself, photographed by every release from the scenes of its preview, at a large phone's width, so the version on the card is the one the service runs. The card follows the chat's light or dark theme, and the screens show the dark one. The fence task, its options and its traps are an example.
A child asks in the chat for a new task, and it arrives as a card:
- The task. The chat's model wrote it, and the service let it through only after its checks. The drawing is plain text, laid out left to right in any language.
- Five options, A to E. The answer is not in the card: it is sealed in the parent's Drive until the child picks one.
- Help that stays the child's own. Hint shows a leading question or a first step, which the model wrote with the task. Another task skips this one. A question about the task is asked in the chat, and the model helps without giving the answer away; a child who says "I don't know" there gets the solution, and it counts as a wrong answer.
- The next one, at once. While the child solves, the chat's model writes the next task ahead, sealed in the same file. Another task asks the chat for it, and the new card the chat draws below shows it at once.
- A topic of the child's own. Once the first five tasks have found where the child stands, Topic, at the end of the row, keeps the next tasks to one topic the child or the adult picks — the ones the progress suggests first, then every topic in its group — or gives the choice back to the coach. Asking in the chat does the same.
- The top line. It shows the child's pseudonym, never a real name, and opens the progress screen.
A tap records the answer at once, before any explanation, so nothing in the chat can talk it into being right. Every wrong option was written with a named trap behind it, and the card shows the trap the child fell into — here, counting the gaps instead of the posts — then the solution. The model explains in the chat starting from that trap, not from the right answer, and the child's rating in the topic moves.
The same screen opens from the card's top line or when the child or the parent asks in the chat. It shows the rank reached on a chess-style rating, with the school grades whose tasks it roughly matches marked for the parent, and how it moved since the last task or over the past week, what comes next, the rank of every topic and how it moved, a review for the parent — what goes well, what to develop and why, the traps that keep coming back and what to do next —, the recent answers, and the profile, which the parent changes right there with Edit. All of it is one JSON file in the parent's own Google Drive.
You need a Claude or ChatGPT account and a Google account; your child needs neither. MathTrail is used by an adult — a parent or a tutor — in their own chat (Claude is for 18+, ChatGPT for 13+), and the child solves the tasks next to them. It is free and stays free, with no payment and no advertising.
Works now, on the free plan too:
- In Claude, open Customize → Connectors.
- Press + and choose Add custom connector.
- Paste the address:
https://mcp.mathtrail.app/mcp - Press Add, then Connect, and sign in with Google. MathTrail asks to keep one file in your Google Drive — your child's profile. Allow it on Google's screen: without that file there is nowhere to keep the progress.
- In a chat, press + → Connectors, switch MathTrail on and say: "Let's do a MathTrail task."
The free plan allows one custom connector. A connector added on claude.ai or in Claude Desktop is in Claude's mobile apps too, on the same account.
The first time, the chat asks you to say you are the child's parent or tutor, then for a pseudonym for your child — never a real name — and the grade, 1 to 6, and, if you like, their interests and anything to leave out of the tasks. You can change any of it later, in the chat or with Edit on the progress screen. The first five tasks are a trial series that finds where your child stands; after it, the tasks follow the answers.
Free ChatGPT accounts add apps only from ChatGPT's directory. As soon as MathTrail is listed there, find it by name, connect it and sign in with Google. It is not listed yet.
Until then, ChatGPT's developer mode adds an app by its address, on Plus, Pro, Business, Enterprise and Education plans, on the web: turn it on and add an app with the address above, as OpenAI describes. MathTrail is still being tested in ChatGPT.
Something not working, or a question? The help page goes through what to do and how to reach us.
- A file in your Google Drive. The profile, the ratings and the current task live in one file,
mathtrail-profile.json, in a folder namedMathTrailin your own Drive. You can open it, and Drive keeps its history. - Nothing on our side. The service stores nothing between requests. Its logs hold counts, an opaque code standing for the account, a counting name for the child that changes every month, and a country by its code, never text, names or an email address.
- A pseudonym, not a name. No real name, birth date or school; the pseudonym never goes into a task. A country, and a state in the United States, only if you choose to give them.
- Leave any time. Download the file, delete it, disconnect MathTrail in your chat and remove its access in your Google account — step by step.
What is collected and where it goes is in the privacy policy, and the rules are in the terms of use.
MathTrail connects to Claude or ChatGPT as an app over the Model Context Protocol, and draws its screens with the MCP Apps extension. A parent (or tutor) adds it to their own chat, and the child solves tasks there:
- The service picks a topic and difficulty for the child and gives the chat's model a brief, reference examples and formats.
- The chat's model writes the task.
- The service checks the task: structure, a solver program that brute-forces the answer options, readability, near-duplicates and text drawings.
- The child sees the task in a widget, answers with a button, and gets an explanation of the mistake. Ratings are updated.
The unusual part is step 2: the task is written by the chat's own model, and the service is what decides whether it reaches the child.
sequenceDiagram
participant C as Child
participant M as Claude or ChatGPT
participant T as MathTrail
participant D as The parent's Drive
C->>M: a new task, please
M->>T: what should it be about?
T->>D: read the profile
T-->>M: topic, difficulty, reference tasks, formats
Note over M: the model writes the task,<br/>a solver program and a self-check
M->>T: here is the task
Note over T: structure · the solver runs · readability ·<br/>near-duplicates · the drawing
T->>D: store it, with the answer sealed
T-->>C: the task card, without the answer
C->>T: presses an option
T->>D: record the answer, update the ratings
T-->>C: right or wrong, the trap behind that option, the solution
Design points:
- No LLM calls of its own. Only the chat's model writes text.
- Stateless. The service stores nothing between requests. The child's profile is a JSON file in the parent's own Google Drive, and the answer to the current task is encrypted there.
- Self-contained. It runs as a single Go binary on Google Cloud Run: no database, no queues, no other services.
The paper about the service, and how its student model stands against its goals, in numbers computed anew from the code of each release, are on the site's Research page.
Ask a chat model for "an olympiad task for grade 2" and it will cheerfully hand you a task with no solution, with two correct options, or with the arithmetic wrong. MathTrail leaves the writing to the model and puts a program behind it:
- Tasks do not run out. Every task is written for the child's topic, difficulty, interests and yesterday's mistake, in the language of the chat — not drawn from a fixed bank in one language.
- A program checks the model. A task reaches the child only after it passes the checks: exactly one correct option, the answer reproduced by a brute-force solver, readability for the grade, no near-duplicate of an earlier task, a well-formed text drawing.
- A wrong answer is a diagnosis. Every wrong option is tied to a named trap — off-by-one in gaps, a missed case while enumerating, double counting — and the explanation starts from how the child reasoned, not from the right answer.
"Checked" means exactly what the program checks. Whether the wording, the drawing and the solution agree in meaning is checked by the model's own self-check, so this is not a promise of a flawless task every time.
A copy runs in a Google Cloud project of your own, within its free tier, on a domain of your own: one Cloud Run service and three secrets, delivered by GitHub Actions from your fork. docs/self-hosting.md goes through it step by step — the project, the Google sign-in, the domain, the site with your own privacy policy, and the variables.
CONTRIBUTING.md says what helps, what will be declined and how to set up the development container. A security fault is reported privately, as SECURITY.md describes — never in a public issue.
The code and the bundled content — the catalogs, the reference tasks and the instructions for the model — are released under the MIT License. The licenses of the dependencies are listed in THIRD_PARTY_LICENSES.
The MIT License grants no rights to the name MathTrail or to its logos. A fork that runs publicly goes by a name of its own.
Nor does it cover the photographs of the family on the site's page "About", in site/assets/photos/: they are the family's own, all rights reserved, and a fork does not use them.


