Tool tree
gradeNot graded
get_statusAnswer
Find out what the page is doing right now — idle, playing a demonstration, listening to the student, or running a saved lesson on its own — plus the tempo, what is highlighted, and crucially **what instrument they have and which notes exist on it**. Call this before your first show_notes or play_notes: asking for a note their keyboard does not have is the most common way to confuse a beginner. Call it too if you are unsure why a tool is unavailable.
View tool JSON
{
"name": "get_status",
"kind": "answer",
"impl": "imperative",
"description": "Find out what the page is doing right now — idle, playing a demonstration, listening to the student, or running a saved lesson on its own — plus the tempo, what is highlighted, and crucially **what instrument they have and which notes exist on it**. Call this before your first show_notes or play_notes: asking for a note their keyboard does not have is the most common way to confuse a beginner. Call it too if you are unsure why a tool is unavailable.",
"inputSchema": {
"type": "object",
"properties": {}
}
}set_lessonAction
Put a heading and an instruction on the page, so the student can read what you are asking of them without scrolling back through chat. Use it at the start of each new thing you work on. Keep the instruction to one or two short sentences — it is a caption, not an explanation.
View tool JSON
{
"name": "set_lesson",
"kind": "act",
"impl": "imperative",
"description": "Put a heading and an instruction on the page, so the student can read what you are asking of them without scrolling back through chat. Use it at the start of each new thing you work on. Keep the instruction to one or two short sentences — it is a caption, not an explanation.",
"inputSchema": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "Short heading, e.g. \"Right hand, C major scale\"."
},
"instruction": {
"type": "string",
"description": "What the student should do next, in plain language."
}
},
"required": [
"title"
]
}
}show_notesAction
Light up keys on the on-screen keyboard with their note names and finger numbers. This is how you point at the instrument: use it whenever you name notes the student has to find. Finger numbers are 1 = thumb through 5 = little finger.
View tool JSON
{
"name": "show_notes",
"kind": "act",
"impl": "imperative",
"description": "Light up keys on the on-screen keyboard with their note names and finger numbers. This is how you point at the instrument: use it whenever you name notes the student has to find. Finger numbers are 1 = thumb through 5 = little finger.",
"inputSchema": {
"type": "object",
"properties": {
"notes": {
"type": "array",
"description": "Notes to highlight — names like \"C4\" or MIDI numbers. Nest an array for a chord.",
"items": {}
},
"chord": {
"type": "string",
"description": "A chord symbol instead, e.g. \"C\", \"Am\", \"Gmaj7\"."
},
"scale": {
"type": "string",
"description": "A scale type instead, e.g. \"major\", \"minor pentatonic\"."
},
"root": {
"type": "string",
"description": "Root note for a scale, e.g. \"C\"."
},
"octave": {
"type": "integer",
"description": "Which octave to place it in. Middle C is octave 4."
},
"fingers": {
"type": "array",
"description": "Finger number per note, 1-5. Omit to have standard scale fingering filled in.",
"items": {
"type": "integer"
}
},
"label": {
"type": "string",
"description": "Optional name to display, e.g. \"C major\"."
}
}
}
}play_notesAction
Play something on the piano for the student to hear, lighting the keys as it goes. Give it a plan and the page performs it with correct timing — you are not called per note. Use it to demonstrate before asking them to copy you, to play a reference so they can hear what they are aiming for, or to answer "what does that sound like?".
View tool JSON
{
"name": "play_notes",
"kind": "act",
"impl": "imperative",
"description": "Play something on the piano for the student to hear, lighting the keys as it goes. Give it a plan and the page performs it with correct timing — you are not called per note.\n\nUse it to demonstrate before asking them to copy you, to play a reference so they can hear what they are aiming for, or to answer \"what does that sound like?\".",
"inputSchema": {
"type": "object",
"properties": {
"notes": {
"type": "array",
"description": "Notes in order — names like \"C4\" or MIDI numbers. Nest an array to play a chord.",
"items": {}
},
"chord": {
"type": "string",
"description": "Play a chord symbol, e.g. \"Fmaj7\"."
},
"scale": {
"type": "string",
"description": "Play a scale, e.g. \"major\". Needs \"root\"."
},
"root": {
"type": "string",
"description": "Root note for a scale."
},
"octave": {
"type": "integer",
"description": "Octave. Middle C is octave 4."
},
"together": {
"type": "boolean",
"description": "Play all the notes at once as a chord rather than in sequence."
},
"beats": {
"type": "number",
"description": "Beats per note. Default 1. Use 0.5 for eighth notes."
},
"tempo": {
"type": "integer",
"description": "Set the tempo before playing."
},
"loop": {
"type": "boolean",
"description": "Repeat until stopped. Good for a groove to play along to."
},
"count_in": {
"type": "integer",
"description": "Metronome beats before starting. Use 4 when they will play along."
}
}
}
}listenAction
Wait for the student to play, then hand back what they actually did: the notes in order, chords named, timing steadiness, and how loud. Pass "expect" and it also grades them against it and marks the keyboard green and red. This blocks until they stop playing, so say what you want first (set_lesson or show_notes), then call this. It is how you ask a question and get music as the answer.
View tool JSON
{
"name": "listen",
"kind": "act",
"impl": "imperative",
"description": "Wait for the student to play, then hand back what they actually did: the notes in order, chords named, timing steadiness, and how loud. Pass \"expect\" and it also grades them against it and marks the keyboard green and red.\n\nThis blocks until they stop playing, so say what you want first (set_lesson or show_notes), then call this. It is how you ask a question and get music as the answer.",
"inputSchema": {
"type": "object",
"properties": {
"expect": {
"type": "array",
"description": "Optional — the notes you asked for, to grade against. Nest an array for a chord.",
"items": {}
},
"expect_chord": {
"type": "string",
"description": "Grade against a chord symbol instead, e.g. \"Am\"."
},
"expect_scale": {
"type": "string",
"description": "Grade against a scale type, e.g. \"major\"."
},
"root": {
"type": "string",
"description": "Root note when grading against a scale."
},
"octave": {
"type": "integer",
"description": "Octave for expect_chord / expect_scale. Default 4."
},
"ignore_octave": {
"type": "boolean",
"description": "Accept the right notes in any octave. Kind to beginners; default false."
},
"timeout_seconds": {
"type": "integer",
"description": "How long to wait. Default 30."
}
}
}
}what_am_i_holdingAnswer
Look at the keys held down at this exact moment and name them. Use it when the student asks "what is this chord?" — it answers instantly and does not wait for them to finish playing.
View tool JSON
{
"name": "what_am_i_holding",
"kind": "answer",
"impl": "imperative",
"description": "Look at the keys held down at this exact moment and name them. Use it when the student asks \"what is this chord?\" — it answers instantly and does not wait for them to finish playing.",
"inputSchema": {
"type": "object",
"properties": {}
}
}get_last_performanceAnswer
Fetch the analysis of the last thing the student played, without waiting for anything new. Useful if the conversation moved on and you want to refer back to it.
View tool JSON
{
"name": "get_last_performance",
"kind": "answer",
"impl": "imperative",
"description": "Fetch the analysis of the last thing the student played, without waiting for anything new. Useful if the conversation moved on and you want to refer back to it.",
"inputSchema": {
"type": "object",
"properties": {}
}
}set_tempoAction
Set the tempo in beats per minute for demonstrations and the metronome. Slow is a teaching tool — dropping to 50-60 bpm is usually more useful than repeating something at full speed.
View tool JSON
{
"name": "set_tempo",
"kind": "act",
"impl": "imperative",
"description": "Set the tempo in beats per minute for demonstrations and the metronome. Slow is a teaching tool — dropping to 50-60 bpm is usually more useful than repeating something at full speed.",
"inputSchema": {
"type": "object",
"properties": {
"bpm": {
"type": "integer",
"description": "Between 40 and 180."
}
},
"required": [
"bpm"
]
}
}get_practice_historyAnswer
What this student has practised before, how they did, and any notes you left yourself in earlier sessions. Call this at the start of a session — opening with "last time the left hand was the problem" is the whole point of remembering.
View tool JSON
{
"name": "get_practice_history",
"kind": "answer",
"impl": "imperative",
"description": "What this student has practised before, how they did, and any notes you left yourself in earlier sessions. Call this at the start of a session — opening with \"last time the left hand was the problem\" is the whole point of remembering.",
"inputSchema": {
"type": "object",
"properties": {}
}
}rememberAction
Leave a note for your future self about how this student is doing on something. Write the note the way you would want to read it cold at the start of the next session — specific and about them, not about the exercise. Persisted on their device.
View tool JSON
{
"name": "remember",
"kind": "act",
"impl": "imperative",
"description": "Leave a note for your future self about how this student is doing on something. Write the note the way you would want to read it cold at the start of the next session — specific and about them, not about the exercise. Persisted on their device.",
"inputSchema": {
"type": "object",
"properties": {
"topic": {
"type": "string",
"description": "What was practised, e.g. \"C major scale, right hand\"."
},
"note": {
"type": "string",
"description": "What you observed, in a sentence."
},
"accuracy": {
"type": "integer",
"description": "Percentage from the last grading, if there was one."
},
"status": {
"type": "string",
"enum": [
"new",
"shaky",
"improving",
"solid"
],
"description": "How settled this is for them."
}
},
"required": [
"topic"
]
}
}list_lessonsAnswer
Everything in this student's lesson library — the built-in ones and any you have written for them before, with how they have done on each. Call this alongside get_practice_history when a session starts: a lesson they scored 60% on last week is usually the right place to begin.
View tool JSON
{
"name": "list_lessons",
"kind": "answer",
"impl": "imperative",
"description": "Everything in this student's lesson library — the built-in ones and any you have written for them before, with how they have done on each. Call this alongside get_practice_history when a session starts: a lesson they scored 60% on last week is usually the right place to begin.",
"inputSchema": {
"type": "object",
"properties": {}
}
}get_lessonAnswer
The full step-by-step contents of one lesson, so you can teach it yourself with show_notes, play_notes and listen rather than handing it to the page. Use this when you want to talk the student through it, adapt it as you go, or explain why a step is there.
View tool JSON
{
"name": "get_lesson",
"kind": "answer",
"impl": "imperative",
"description": "The full step-by-step contents of one lesson, so you can teach it yourself with show_notes, play_notes and listen rather than handing it to the page. Use this when you want to talk the student through it, adapt it as you go, or explain why a step is there.",
"inputSchema": {
"type": "object",
"properties": {
"lesson": {
"type": "string",
"description": "The lesson id, or its title."
}
},
"required": [
"lesson"
]
}
}save_lessonAction
Write a lesson into the library so the student can do it again on their own, without you. This is the most valuable thing you can do here. A live session ends when you stop talking; a saved lesson is still there on Tuesday morning. Write one at the end of anything that went well, shaped around what you just watched them struggle with — the page can perform every step of it with no agent involved. Pass an existing id to revise a lesson instead of adding another near-duplicate. Steps run in order: "say" is text alone, "show" lights keys with finger numbers, "demo" plays it for them, "play" waits for them and grades it. Give it at least one "play" step.
View tool JSON
{
"name": "save_lesson",
"kind": "act",
"impl": "imperative",
"description": "Write a lesson into the library so the student can do it again on their own, without you.\n\nThis is the most valuable thing you can do here. A live session ends when you stop talking; a saved lesson is still there on Tuesday morning. Write one at the end of anything that went well, shaped around what you just watched them struggle with — the page can perform every step of it with no agent involved.\n\nPass an existing id to revise a lesson instead of adding another near-duplicate. Steps run in order: \"say\" is text alone, \"show\" lights keys with finger numbers, \"demo\" plays it for them, \"play\" waits for them and grades it. Give it at least one \"play\" step.",
"inputSchema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Omit to create. Pass an existing id to revise that lesson."
},
"title": {
"type": "string",
"description": "Short and concrete, e.g. \"G to A, slowly\"."
},
"summary": {
"type": "string",
"description": "One line the student will read on the lesson card."
},
"level": {
"type": "string",
"enum": [
"first steps",
"beginner",
"improver",
"challenge"
],
"description": "How hard it is."
},
"tempo": {
"type": "integer",
"description": "Beats per minute for the demonstrations. 60-80 suits a beginner."
},
"steps": {
"type": "array",
"description": "The lesson, in order.",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"say",
"show",
"demo",
"play"
],
"description": "say | show | demo | play"
},
"text": {
"type": "string",
"description": "What the page tells the student at this step."
},
"notes": {
"type": "array",
"description": "Note names like \"C4\" or MIDI numbers. Nest an array for a chord. Required except for \"say\".",
"items": {}
},
"fingers": {
"type": "array",
"description": "Finger per note, 1 = thumb to 5 = little.",
"items": {
"type": "integer"
}
},
"label": {
"type": "string",
"description": "A name for what is highlighted, e.g. \"C major\"."
},
"beats": {
"type": "number",
"description": "demo only — beats per note. 1 is a steady walk."
},
"together": {
"type": "boolean",
"description": "demo only — sound the notes as one chord."
},
"focus": {
"type": "string",
"enum": [
"accuracy",
"timing",
"evenness"
],
"description": "play only — what to judge. \"accuracy\" is the right notes, \"timing\" is steady gaps, \"evenness\" is every note the same volume. Touch is the thing beginners cannot hear in themselves and the page can measure, so it is worth a step of its own."
},
"ignore_octave": {
"type": "boolean",
"description": "play only — accept the right notes in any octave."
}
},
"required": [
"kind"
]
}
}
},
"required": [
"title",
"steps"
]
}
}start_lessonAction
Hand a saved lesson to the page and step back. The page then demonstrates, highlights, listens and grades every step by itself, at the student's pace — you are not called again until it finishes. Returns straight away; call get_lesson_result afterwards to see how it went. Use this when the student just wants to practise. Use get_lesson instead when you want to teach it yourself and talk them through it.
View tool JSON
{
"name": "start_lesson",
"kind": "act",
"impl": "imperative",
"description": "Hand a saved lesson to the page and step back. The page then demonstrates, highlights, listens and grades every step by itself, at the student's pace — you are not called again until it finishes. Returns straight away; call get_lesson_result afterwards to see how it went.\n\nUse this when the student just wants to practise. Use get_lesson instead when you want to teach it yourself and talk them through it.",
"inputSchema": {
"type": "object",
"properties": {
"lesson": {
"type": "string",
"description": "The lesson id, or its title."
}
},
"required": [
"lesson"
]
}
}delete_lessonSensitive Action
Remove a lesson from the library. Only lessons you wrote — the built-in ones stay. Use it to clear out something that turned out to be too hard, rather than leaving it there discouraging them.
View tool JSON
{
"name": "delete_lesson",
"kind": "transact",
"impl": "imperative",
"description": "Remove a lesson from the library. Only lessons you wrote — the built-in ones stay. Use it to clear out something that turned out to be too hard, rather than leaving it there discouraging them.",
"inputSchema": {
"type": "object",
"properties": {
"lesson": {
"type": "string",
"description": "The lesson id, or its title."
}
},
"required": [
"lesson"
]
}
}get_lesson_resultAnswer
How the last page-run lesson went, step by step. Call this after start_lesson to pick the conversation back up — you were not watching, so this is how you find out what happened.
View tool JSON
{
"name": "get_lesson_result",
"kind": "answer",
"impl": "imperative",
"description": "How the last page-run lesson went, step by step. Call this after start_lesson to pick the conversation back up — you were not watching, so this is how you find out what happened.",
"inputSchema": {
"type": "object",
"properties": {}
}
}