{"ok":true,"site":{"host":"study-tree-web-mcp-alpha.vercel.app","url":"https://study-tree-web-mcp-alpha.vercel.app/","type":"live","desc":"CanvasQuest","tools":[{"name":"get_board","kind":"answer","impl":"imperative","description":"Read the current board: the question, gamePhase (setup, opening, playing or ended), every node (id, label, kind, parentId, createdBy, isGap, gapReason, note, url), both move budgets, whose turn it is, openingMovesLeft, the live score out of 100, openGaps (explicit gaps plus implicit ones: concepts with no resource or skill beneath them), selectedNodeId (the node the human clicked), visualization (forest or board) and focusedTree. Free: costs no move. Call it before every move so you use real node ids.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_node_state","kind":"answer","impl":"imperative","description":"Read one node in detail: its label, kind, parent, children, gap flag and reason, note, url, who created it and whether the human has it selected. Omit nodeId to read the node the human currently has selected. Free: costs no move.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"The id (for example \"n2\") or the exact label of the node. Omit it to read the selected node."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"plant","kind":"act","impl":"imperative","description":"Plant the root node on an empty board, using the question itself as the label. Free: costs no move. Before a game has started this starts one, with the label as the question. As the agent you then open the game: grow up to 3 free branches under the root and call pass to hand over to the human.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"label":{"type":"string","description":"Label for the root node, usually the learning question itself."},"note":{"type":"string","description":"Optional short note to attach to the root."}},"required":["label"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"branch","kind":"act","impl":"imperative","description":"Add a child node under an existing node. Costs one of your 6 moves and ends your turn. During your opening (gamePhase \"opening\") it is free instead, and the opening ends after 3 such moves or when you pass. A resource or skill branched directly under a gap closes that gap automatically. A concept with no resource or skill anywhere beneath it counts as an implicit gap and costs points at the end, so follow concepts with resources and skills. Scoring rewards coverage (concepts with a resource or skill under them), depth up to three levels, having all three kinds, both players contributing, and notes or urls on nodes.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"parentId":{"type":"string","description":"The id (for example \"n2\") or the exact label of the target node. This node becomes the parent."},"label":{"type":"string","description":"A short label for the new node, two to five words."},"kind":{"type":"string","enum":["concept","resource","skill"],"description":"concept for an idea or topic, resource for a book, course, article or tool (add its url), skill for an ability to practise."},"note":{"type":"string","description":"Optional short note explaining the node."},"url":{"type":"string","description":"Optional http(s) link, especially for a resource."}},"required":["parentId","label","kind"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"prune","kind":"act","impl":"imperative","description":"Remove a node and everything under it. Costs one of your 6 moves and ends your turn. During your opening (gamePhase \"opening\") it is free instead, and the opening ends after 3 such moves or when you pass. The root cannot be pruned. The human can undo your most recent action, so prune only what is clearly off-topic or duplicated.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"The id (for example \"n2\") or the exact label of the target node."}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"mark_gap","kind":"act","impl":"imperative","description":"Flag a node as an open knowledge gap that the other player should fill, keeping its kind. Costs one of your 6 moves and ends your turn. During your opening (gamePhase \"opening\") it is free instead, and the opening ends after 3 such moves or when you pass. You cannot mark the root, a node that is already a gap, or a node that already has a resource or skill directly under it. Every gap still open when the game ends costs 5 points, so mark gaps you expect to be filled and give a reason.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"The id (for example \"n2\") or the exact label of the target node."},"reason":{"type":"string","description":"Optional challenge question explaining what is missing."}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"annotate","kind":"act","impl":"imperative","description":"Attach or replace a note and/or an http(s) url on any node. Free: costs no move and does not end your turn, so you can annotate on either turn. Each node with a note or url earns 1 point, up to 10. Pass an empty string to clear a field. To add to a note or change one passage of it without retyping the rest, use edit_note.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"The id (for example \"n2\") or the exact label of the target node."},"note":{"type":"string","description":"The note for the node, in Markdown if you like: headings, lists, links and code all render."},"url":{"type":"string","description":"An http(s) link for the node."}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"edit_note","kind":"act","impl":"imperative","description":"Co-write the Markdown note on a node with the human. Read the note first with get_node_state (it is the node's note field), then either append a new paragraph or section at the end, or replace one passage quoted exactly from the note. The human sees the change at once, even while the note is open in their editor, and keeps anything they are still typing. Free: costs no move and does not end your turn. Use annotate to replace a whole note. Notes are limited to 20000 characters.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"The id (for example \"n2\") or the exact label of the target node."},"mode":{"type":"string","enum":["append","replace"],"description":"append adds text after the current note as a new paragraph; replace swaps the passage in find for text."},"text":{"type":"string","description":"The Markdown to add, or the replacement for the passage in find (empty removes the passage)."},"find":{"type":"string","description":"For replace only: a passage quoted exactly from the current note. It has to match exactly once, so quote enough of it."}},"required":["nodeId","mode","text"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"pass","kind":"act","impl":"imperative","description":"End your turn without moving. Free: costs no move. During your opening this hands the board to the human, which is how the opening should end. Later, if both players yield in a row the game ends, so pass only when you have nothing to add or want the human to respond first.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"announce","kind":"act","impl":"imperative","description":"Tell the human what you are doing, in your own words. The page shows the text over the board and reads it aloud (unless a voice session is already speaking for you). Free: costs no move and never changes the turn, so call it in any phase. Call it right before or after each move with a one- or two-sentence first-person summary, and whenever you hand the board over (after a pass, or a move that ends your turn) add a handoff line that tells the human it is their turn and suggests what to do next. Keep each field under 200 characters.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"summary":{"type":"string","description":"What you are doing and why, in one or two short first-person sentences. Example: I added the resource \"Eloquent JavaScript\" under Closures, which closes that gap."},"handoff":{"type":"string","description":"Optional \"your turn\" line, spoken after the summary when you are handing the board to the human. Example: Your turn: fill the gap under Agent loops, or deepen another concept."}},"required":["summary"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Health & Education","favicon":"/favicons/study-tree-web-mcp-alpha.vercel.app.svg","apiSurface":"spec","toolCount":10}}