dust-off-piano.netlify.app
A beginner piano tutor that can hear what you play and play back to you, built on WebMCP. Works with a MIDI keyboard or the keys on screen.
First seen 2026-11-05 · Last seen 2026-11-05 · Source: webmcp.com
Answer 7 · Act 8 · Transact 1 · Score: Not yet scored
Tool inspector
save_lesson
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.
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
id |
string | no | Omit to create. Pass an existing id to revise that lesson. |
title |
string | yes | Short and concrete, e.g. "G to A, slowly". |
summary |
string | no | One line the student will read on the lesson card. |
level |
string | no | How hard it is. |
tempo |
integer | no | Beats per minute for the demonstrations. 60-80 suits a beginner. |
steps |
array | yes | The lesson, in order. |
Raw JSON schema
{
"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"
]
}
Similar websites
pocketgull.app
Pocket Gull is a real-time clinical AI consult engine powered by Google Gemini. Features 10D multi-paradigm strategy, FHIR R4 export & 3D spatial anatomy.
webmcp-six-lac.vercel.app
AI Navigation Layer: Model Context Protocol (MCP) Semantic DOM integration for intelligent, safe, and observable web navigation.
ghqsandbox.net
Interactive math and physics tools an AI agent can drive directly through WebMCP.
app.formative.com
Formative classroom assessment and learning platform