{"ok":true,"site":{"host":"lpcode808.github.io","url":"https://lpcode808.github.io/challenge-webmcp/","type":"live","desc":"A classroom seating chart that exposes its own verbs to an AI agent through WebMCP. Say the constraints out loud; drag to fix what the agent got wrong.","tools":[{"name":"get_chart_state","kind":"answer","impl":"imperative","description":"Read the whole seating chart at once: every table with its students, who is unseated, the active rules, and any rule conflicts. Call this first, and again after the teacher moves someone by hand, so you are not working from a stale picture.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"list_students","kind":"answer","impl":"imperative","description":"List students with their reading band, support flag, and current table. Optionally filter to one trait value, for example every student whose support flag is \"front\".","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"trait":{"type":"string","enum":["reading","support"],"description":"Which trait to filter on. Omit to list everyone."},"value":{"type":"string","description":"The trait value to match, e.g. \"emerging\", \"extending\", \"multilingual\", \"front\"."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"list_rules","kind":"answer","impl":"imperative","description":"List the seating rules currently in force, with the id needed to remove one.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"explain_seat","kind":"act","impl":"imperative","description":"Explain why one student is where they are: which table, which row, which rules mention them, and whether those rules are currently satisfied. Use this when the teacher asks \"why is X there?\".","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"student":{"type":"string","description":"Student name or partial name."}},"required":["student"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"set_room","kind":"act","impl":"imperative","description":"Set how many tables the room has and how many seats are at each. Tables fill left to right, three per row; row one is the front of the room nearest the board.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"count":{"type":"integer","minimum":1,"maximum":12,"description":"Number of tables, 1 to 12."},"capacity":{"type":"integer","minimum":1,"maximum":8,"description":"Seats at each table, 1 to 8."}},"required":["count","capacity"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"seat_student","kind":"act","impl":"imperative","description":"Move one student to a table. Names match loosely, so a first name is usually enough. Omit the seat number to take the first open seat; if the seat is taken, the occupant moves rather than being dropped.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"student":{"type":"string","description":"Student name or partial name."},"table":{"type":"string","description":"Table label such as \"Table 3\", or just the number 3."},"seat":{"type":"integer","minimum":1,"maximum":8,"description":"Optional seat number at that table."}},"required":["student","table"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"swap_students","kind":"act","impl":"imperative","description":"Exchange the seats of two students who are both already seated. Use this rather than two seat_student calls when the teacher says \"switch these two\".","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"a":{"type":"string","description":"First student name."},"b":{"type":"string","description":"Second student name."}},"required":["a","b"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"unseat_student","kind":"act","impl":"imperative","description":"Take a student out of their seat and put them back on the bench. Use for an absence, or to free a seat before a rearrangement.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"student":{"type":"string","description":"Student name or partial name."}},"required":["student"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"add_rule","kind":"act","impl":"imperative","description":"Add a seating constraint. \"apart\" keeps two students at different tables, \"together\" puts them at the same one, \"front\" puts a student in the front row, and \"spread\" distributes a trait evenly across tables. Adding a rule does not move anyone — call auto_arrange to apply it.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["apart","together","front","spread"],"description":"Which kind of rule to add."},"a":{"type":"string","description":"First student. Required for apart, together, and front."},"b":{"type":"string","description":"Second student. Required for apart and together."},"trait":{"type":"string","enum":["reading","support"],"description":"Trait to balance. Required for spread."}},"required":["type"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"remove_rule","kind":"act","impl":"imperative","description":"Drop a rule from the list, by its id from list_rules or by a phrase from the rule text.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Rule id, or part of the rule wording."}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"auto_arrange","kind":"act","impl":"imperative","description":"Seat the whole class to satisfy as many rules as possible, then report which conflicts are left. This is the heavy one: it reshuffles everybody, so say what changed afterward and remind the teacher that Undo reverses it in one step.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"seed":{"type":"integer","description":"Optional seed. The same seed gives the same arrangement; change it to see a different valid one."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"export_chart","kind":"act","impl":"imperative","description":"Return the finished chart as plain text, table by table, ready to paste into a sub plan or an email.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"import_roster","kind":"act","impl":"imperative","description":"Add a whole class at once from pasted text, one student per line as \"Name\" or \"Name | reading | support\". Duplicates are skipped, not overwritten. This is the fast path when a teacher has a class list in an email or a spreadsheet column — use it instead of calling add_student thirty times.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"The class list. One student per line; pipes separate optional reading band and support flag."},"replace":{"type":"boolean","description":"True to clear the existing roster and rules first. Defaults to false, which appends."}},"required":["text"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"reset_chart","kind":"act","impl":"imperative","description":"Discard the current chart and restore the bundled demo class of 24 fictional students. Destructive — confirm with the teacher before calling it, and say that Undo will not bring a hand-built roster back once the page is reloaded.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/challenge-webmcp/"},{"name":"add_student","kind":"act","impl":"declarative","description":"Add one student to the class roster with optional traits. Use this before seating anyone new.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Ada Okonkwo"},"reading":{"type":"string","enum":["secure","emerging","extending"]},"support":{"type":"string","enum":["none","multilingual","front","lowdistraction"]}},"required":["name"]},"__source":"spec","__declarative":true,"page":"/challenge-webmcp/"}],"category":"Health & Education","favicon":"/favicons/lpcode808.github.io.svg","apiSurface":"spec","toolCount":15}}