Tool tree
gradeNot graded
start_sessionAction
Start a new quiz session on the page. Clears any previous session's cards and summary (the study plan survives). Returns an error if a session is already active — either keep adding to it, or call end_session first. After starting, add cards with add_questions. Example: {"topic": "Causes of World War I", "difficulty": "medium", "target_count": 10}
View tool JSON
{
"name": "start_session",
"kind": "act",
"impl": "imperative",
"description": "Start a new quiz session on the page. Clears any previous session's cards and summary (the study plan survives). Returns an error if a session is already active — either keep adding to it, or call end_session first. After starting, add cards with add_questions. Example: {\"topic\": \"Causes of World War I\", \"difficulty\": \"medium\", \"target_count\": 10}",
"inputSchema": {
"type": "object",
"properties": {
"topic": {
"type": "string",
"maxLength": 120,
"description": "What the session is about. Shown in the page header."
},
"difficulty": {
"type": "string",
"enum": [
"easy",
"medium",
"hard"
],
"description": "Session-wide default difficulty. Default: medium."
},
"target_count": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "How many questions you plan to reach in total. Default: 10."
}
},
"required": [
"topic"
]
}
}add_questionsAction
Add 1–20 multiple-choice question cards to the page in one call. Cards appear instantly with an animation; the STUDENT answers them by tapping on the page — never answer for them. If no session exists yet, one is auto-started from the first topic_tag. If the previous session has ended, call start_session first. Validation is all-or-nothing: on any error, nothing is added — fix and resend the batch. After the student has answered some cards, call get_session_state and add targeted follow-ups on weak topics. Example: {"questions": [{"prompt": "Which two alliances faced each other in 1914?", "options": ["NATO and the Warsaw Pact", "The Triple Entente and the Triple Alliance"], "correct_option": 1, "topic_tag": "alliances", "explanation": "The Entente (France, Russia, Britain) faced the Triple Alliance (Germany, Austria-Hungary, Italy)."}]}
View tool JSON
{
"name": "add_questions",
"kind": "act",
"impl": "imperative",
"description": "Add 1–20 multiple-choice question cards to the page in one call. Cards appear instantly with an animation; the STUDENT answers them by tapping on the page — never answer for them. If no session exists yet, one is auto-started from the first topic_tag. If the previous session has ended, call start_session first. Validation is all-or-nothing: on any error, nothing is added — fix and resend the batch. After the student has answered some cards, call get_session_state and add targeted follow-ups on weak topics. Example: {\"questions\": [{\"prompt\": \"Which two alliances faced each other in 1914?\", \"options\": [\"NATO and the Warsaw Pact\", \"The Triple Entente and the Triple Alliance\"], \"correct_option\": 1, \"topic_tag\": \"alliances\", \"explanation\": \"The Entente (France, Russia, Britain) faced the Triple Alliance (Germany, Austria-Hungary, Italy).\"}]}",
"inputSchema": {
"type": "object",
"properties": {
"questions": {
"type": "array",
"minItems": 1,
"maxItems": 20,
"items": {
"type": "object",
"properties": {
"prompt": {
"type": "string",
"maxLength": 400,
"description": "The question text shown on the card."
},
"options": {
"type": "array",
"minItems": 2,
"maxItems": 6,
"items": {
"type": "string",
"maxLength": 200
},
"description": "2–6 answer choices, shown as buttons A/B/C/…"
},
"correct_option": {
"type": "integer",
"minimum": 0,
"description": "0-based index into options of the correct answer."
},
"topic_tag": {
"type": "string",
"maxLength": 60,
"description": "Short sub-topic label (e.g. 'alliances'). Drives the per-topic accuracy bars — reuse the same tag for related questions."
},
"explanation": {
"type": "string",
"maxLength": 600,
"description": "Optional. Why the correct answer is correct. Revealed only after the student answers, so it cannot spoil."
},
"difficulty": {
"type": "string",
"enum": [
"easy",
"medium",
"hard"
],
"description": "Optional. Defaults to the session difficulty."
}
},
"required": [
"prompt",
"options",
"correct_option",
"topic_tag"
]
},
"description": "The cards to add, in display order."
}
},
"required": [
"questions"
]
}
}get_session_stateAction
Read the full live state of the session — THE feedback tool; call it whenever you need to know how the student is doing (after they've answered a few cards, before deciding follow-ups, when they ask how they're doing). Returns structured JSON: progress {total, answered, correct, accuracy_pct, current_streak, unanswered_ids}; questions[] with each card's result (answered, correct, selected_option, flagged, has_explanation); per_topic accuracy; study_plan; and needs_attention {flagged_question_ids: cards the student marked 'I don't get this' — explain these and consider easier follow-ups; missed_without_explanation_ids: wrong answers you haven't explained yet — call add_explanation for each; weak_topics: below 60% accuracy — add targeted questions with add_questions}. Takes no arguments. When the student asks for help, review, or follow-ups, prefer writing back to the page — add_explanation on missed or flagged cards, add_questions on weak topics — rather than replying only in chat: the page is the shared workspace. Note: reading the state intentionally leaves a visible 'agent checked your progress' line in the page's activity feed (consecutive checks collapse into one line), so this tool is not annotated read-only.
View tool JSON
{
"name": "get_session_state",
"kind": "act",
"impl": "imperative",
"description": "Read the full live state of the session — THE feedback tool; call it whenever you need to know how the student is doing (after they've answered a few cards, before deciding follow-ups, when they ask how they're doing). Returns structured JSON: progress {total, answered, correct, accuracy_pct, current_streak, unanswered_ids}; questions[] with each card's result (answered, correct, selected_option, flagged, has_explanation); per_topic accuracy; study_plan; and needs_attention {flagged_question_ids: cards the student marked 'I don't get this' — explain these and consider easier follow-ups; missed_without_explanation_ids: wrong answers you haven't explained yet — call add_explanation for each; weak_topics: below 60% accuracy — add targeted questions with add_questions}. Takes no arguments. When the student asks for help, review, or follow-ups, prefer writing back to the page — add_explanation on missed or flagged cards, add_questions on weak topics — rather than replying only in chat: the page is the shared workspace. Note: reading the state intentionally leaves a visible 'agent checked your progress' line in the page's activity feed (consecutive checks collapse into one line), so this tool is not annotated read-only.",
"inputSchema": {
"type": "object",
"properties": {}
}
}add_explanationAction
Attach (or replace) an explanation on one question card, shown as a note from you. Use it on cards the student missed or flagged — get_session_state's needs_attention lists exactly which. The note is revealed only after the student answers that card (immediately if they already answered, or once the session ends), so it never spoils. Example: {"question_id": "q3", "text": "Serbia rejected only one clause of the ultimatum — the one allowing Austrian officials to operate on Serbian soil."}
View tool JSON
{
"name": "add_explanation",
"kind": "act",
"impl": "imperative",
"description": "Attach (or replace) an explanation on one question card, shown as a note from you. Use it on cards the student missed or flagged — get_session_state's needs_attention lists exactly which. The note is revealed only after the student answers that card (immediately if they already answered, or once the session ends), so it never spoils. Example: {\"question_id\": \"q3\", \"text\": \"Serbia rejected only one clause of the ultimatum — the one allowing Austrian officials to operate on Serbian soil.\"}",
"inputSchema": {
"type": "object",
"properties": {
"question_id": {
"type": "string",
"description": "Card id from get_session_state, e.g. \"q3\"."
},
"text": {
"type": "string",
"maxLength": 600,
"description": "The explanation to show the student."
}
},
"required": [
"question_id",
"text"
]
}
}update_questionAction
Edit fields of an existing question card (typo fixes, clearer wording, difficulty retag). Cards the student already answered are locked except for their explanation — results stay honest; add a fresh card with add_questions instead. Editing content clears the card's flag. Example: {"question_id": "q2", "fields": {"prompt": "Clearer wording of the question?", "difficulty": "easy"}}
View tool JSON
{
"name": "update_question",
"kind": "act",
"impl": "imperative",
"description": "Edit fields of an existing question card (typo fixes, clearer wording, difficulty retag). Cards the student already answered are locked except for their explanation — results stay honest; add a fresh card with add_questions instead. Editing content clears the card's flag. Example: {\"question_id\": \"q2\", \"fields\": {\"prompt\": \"Clearer wording of the question?\", \"difficulty\": \"easy\"}}",
"inputSchema": {
"type": "object",
"properties": {
"question_id": {
"type": "string",
"description": "Card id from get_session_state, e.g. \"q2\"."
},
"fields": {
"type": "object",
"properties": {
"prompt": {
"type": "string",
"maxLength": 400,
"description": "The question text shown on the card."
},
"options": {
"type": "array",
"minItems": 2,
"maxItems": 6,
"items": {
"type": "string",
"maxLength": 200
},
"description": "2–6 answer choices, shown as buttons A/B/C/…"
},
"correct_option": {
"type": "integer",
"minimum": 0,
"description": "0-based index into options of the correct answer."
},
"explanation": {
"type": "string",
"maxLength": 600,
"description": "Optional. Why the correct answer is correct. Revealed only after the student answers, so it cannot spoil."
},
"topic_tag": {
"type": "string",
"maxLength": 60,
"description": "Short sub-topic label (e.g. 'alliances'). Drives the per-topic accuracy bars — reuse the same tag for related questions."
},
"difficulty": {
"type": "string",
"enum": [
"easy",
"medium",
"hard"
],
"description": "Optional. Defaults to the session difficulty."
}
},
"description": "Only the fields you want to change."
}
},
"required": [
"question_id",
"fields"
]
}
}set_study_planAction
Render (or replace) the visible study-plan sidebar — the roadmap you are steering the student through. Set it early, then keep statuses honest as the session progresses: planned → in_progress → done. The plan survives across sessions. Replaces the whole list each call (1–12 topics). Example: {"topics": [{"topic": "alliances", "status": "done"}, {"topic": "July Crisis", "status": "in_progress"}, {"topic": "naval arms race", "status": "planned"}]} — bare strings also work: {"topics": ["alliances", "July Crisis"]}
View tool JSON
{
"name": "set_study_plan",
"kind": "act",
"impl": "imperative",
"description": "Render (or replace) the visible study-plan sidebar — the roadmap you are steering the student through. Set it early, then keep statuses honest as the session progresses: planned → in_progress → done. The plan survives across sessions. Replaces the whole list each call (1–12 topics). Example: {\"topics\": [{\"topic\": \"alliances\", \"status\": \"done\"}, {\"topic\": \"July Crisis\", \"status\": \"in_progress\"}, {\"topic\": \"naval arms race\", \"status\": \"planned\"}]} — bare strings also work: {\"topics\": [\"alliances\", \"July Crisis\"]}",
"inputSchema": {
"type": "object",
"properties": {
"topics": {
"type": "array",
"minItems": 1,
"maxItems": 12,
"items": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "object",
"properties": {
"topic": {
"type": "string",
"maxLength": 60
},
"status": {
"type": "string",
"enum": [
"planned",
"in_progress",
"done"
]
}
},
"required": [
"topic"
]
}
]
},
"description": "The full plan, in order. Strings default to status 'planned'."
}
},
"required": [
"topics"
]
}
}end_sessionAction
End the session and show the student their summary screen. Answering locks; all explanations become visible. Returns the summary to discuss with the student: score, accuracy_pct, per_topic results, weak_topics, flagged_count, best_streak, and suggested_next_steps. Call it when the target count is reached, or when the student asks to stop. Calling it again later returns a freshly recomputed summary. Takes no arguments.
View tool JSON
{
"name": "end_session",
"kind": "act",
"impl": "imperative",
"description": "End the session and show the student their summary screen. Answering locks; all explanations become visible. Returns the summary to discuss with the student: score, accuracy_pct, per_topic results, weak_topics, flagged_count, best_streak, and suggested_next_steps. Call it when the target count is reached, or when the student asks to stop. Calling it again later returns a freshly recomputed summary. Takes no arguments.",
"inputSchema": {
"type": "object",
"properties": {}
}
}