{"serverId":"mcp-registry/school.delegation/delegation-school","tools":[{"name":"course_stats","fixed":{"name":"course_stats","description":"OPERATOR / Inspectable State: usage snapshot of the whole course — learner count, level mix, completions, per-lesson pass rates, and recent reflections. Requires admin_key. Answers 'what is the state of the work?' for an operator agent.","inputSchema":{"type":"object","required":["admin_key"],"properties":{"admin_key":{"type":"string","description":"Operator admin key (Worker secret ADMIN_KEY)."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":131,"tokensAfter":131},{"name":"get_lesson","fixed":{"name":"get_lesson","description":"Get the full markdown of one lesson by slug. Teach from it: lead with the why, then run the exercise with the learner's real work.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"Lesson slug from list_lessons / start_session."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":98,"tokensAfter":98},{"name":"list_lessons","fixed":{"name":"list_lessons","description":"List lessons (slug, title, track, order, summary), optionally filtered to one track.","inputSchema":{"type":"object","properties":{"track":{"enum":["scratch","intermediate","power"],"type":"string","description":"Optional track filter."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":86,"tokensAfter":86},{"name":"set_level","fixed":{"name":"set_level","description":"OPERATOR: reclassify an existing learner's track (scratch | intermediate | power). Routes through the learner's record so the change sticks. Use when a learner was placed wrong — e.g. a scratch enrollee who's really a power operator. Requires admin_key. The learner must have started a session first.","inputSchema":{"type":"object","required":["learner","level","admin_key"],"properties":{"level":{"enum":["scratch","intermediate","power"],"type":"string","description":"The new level: scratch | intermediate | power."},"learner":{"type":"string","description":"The learner's name/email (same key used in start_session)."},"admin_key":{"type":"string","description":"Operator admin key (Worker secret ADMIN_KEY)."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":218,"tokensAfter":218},{"name":"start_session","fixed":{"name":"start_session","description":"Call FIRST. Place or resume a learner: returns their level, completed lessons, and the recommended next lesson. Ask for the learner's EMAIL ADDRESS and pass it as `learner` — emails are stable and unique; a bare name collides across learners and gets mistyped. Pass their real name as `name` for the certificate.","inputSchema":{"type":"object","required":["learner"],"properties":{"name":{"type":"string","description":"Optional: the learner's display name, for the certificate and a friendlier greeting. The email stays the key."},"level":{"enum":["scratch","intermediate","power"],"type":"string","description":"Optional: set/override their level (scratch | intermediate | power)."},"learner":{"type":"string","description":"The learner's EMAIL ADDRESS — their stable, unique progress key. Ask for it; do not key off a bare name (names collide across learners and get mistyped)."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":265,"tokensAfter":265},{"name":"submit_feedback","fixed":{"name":"submit_feedback","description":"Send the course team feedback FOR the learner — what's confusing, a bug, an idea, or praise. No grade, no admin key. Use it the moment a learner is stuck or reacts to something, AND always offer it when a session wraps ('anything confusing, or that you wish it did?'). Routes to the team's Slack + the feedback log so friction becomes a signal instead of a 1:1 text.","inputSchema":{"type":"object","required":["message"],"properties":{"kind":{"enum":["stuck","bug","idea","praise","other"],"type":"string","description":"Optional category."},"lesson":{"type":"string","description":"Optional: the lesson slug it's about."},"learner":{"type":"string","description":"Optional: the learner's name/email so the team can follow up."},"message":{"type":"string","description":"The learner's feedback, in their own words (≤2000 chars)."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":252,"tokensAfter":252}],"toolsChanged":6,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}