{"ok":true,"site":{"host":"moon-gate.pages.dev","url":"https://moon-gate.pages.dev/","type":"live","desc":"Moon Gate is a bright jigsaw race. A person and an AI look at the same table. Whoever seats more pieces wins. WebMCP gives the AI controls, not answers.","tools":[{"name":"list_controls","kind":"answer","impl":"imperative","description":"How to operate this shared jigsaw race. Call this first, then start seating pieces immediately. Returns controls for human hands and AI tools. Does not return homes, solved placements, or screenshots.","annotations":{"readOnlyHint":true,"title":"List controls"},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"enter_play","kind":"act","impl":"imperative","description":"Start the race and make exactly one legal AI step. Return one short Japanese play-line, emit it, then immediately call play_next_piece exactly once. Continue until complete=true. Never batch or loop calls.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"play_next_piece","kind":"act","impl":"imperative","description":"Place exactly one piece as one unit. Internally, move the same piece in legal increments of at most 30px and rotate it at most 90° per increment until it is seated or the attempt needs another call. Verify score and complete after every increment, but return only one short Japanese play-line after the piece is actually placed. Then call this tool again for the next piece. Never speak for each 30px increment. Never batch multiple pieces, parallelize, or call document.modelContext.executeTool from JavaScript.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"play_until_complete","kind":"act","impl":"imperative","description":"Reliable finish mode. When the user asks to start and finish the game, use this tool once. It animates one placement at a time using legal increments of at most 30px, avoids the person's held piece, and continues until complete=true. It returns the final 36/36 score. This is a WebMCP-triggered tool, not a site-side timer. Do not call it in parallel or recreate it with JavaScript/CDP loops.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_score","kind":"answer","impl":"imperative","description":"Read Human vs AI seated counts. Call this after placing. If agent did not increase, the angle is wrong — rotate that piece and continue. Loop until complete is true.","annotations":{"readOnlyHint":true,"title":"Get score"},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"cheer","kind":"act","impl":"imperative","description":"Say one short Japanese play-line in chat (まずは１こ！ / がんばるぞ！ / う、負けそう), then continue the race with exactly one next tool. Do not explain rules.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_pieces","kind":"answer","impl":"imperative","description":"Random labels currently on the table, with each piece's current x,y. Labels are not row/column. Does not return homes or solved placements. Look at the shared screen to decide what to move.","annotations":{"readOnlyHint":true,"title":"List pieces"},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"select_piece","kind":"act","impl":"imperative","description":"Highlight a piece both of you can see. Does not move it.","inputSchema":{"type":"object","additionalProperties":false,"required":["piece_id"],"properties":{"piece_id":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"rotate_piece","kind":"act","impl":"imperative","description":"Rotate one piece 90°. turns: -1 is left/up (counterclockwise), +1 is right/down (clockwise). Default +1. Do not pass |turns| > 1. Do not rotate the same piece twice in a row.","inputSchema":{"type":"object","additionalProperties":false,"required":["piece_id"],"properties":{"piece_id":{"type":"string"},"turns":{"type":"number","description":"-1 counterclockwise, +1 clockwise. Default +1."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"move_piece","kind":"act","impl":"imperative","description":"Move one piece toward table x,y. Travel is capped at 30px per call; repeat until close. Never warp. Do not move the piece the person is holding. Then keep going until the picture is complete.","inputSchema":{"type":"object","additionalProperties":false,"required":["piece_id","x","y"],"properties":{"piece_id":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"nudge_piece","kind":"act","impl":"imperative","description":"Nudge one piece by dx, dy. Each call is capped at 30px. Do not move the piece the person is holding.","inputSchema":{"type":"object","additionalProperties":false,"required":["piece_id","dx","dy"],"properties":{"piece_id":{"type":"string"},"dx":{"type":"number"},"dy":{"type":"number"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"join_pair","kind":"act","impl":"imperative","description":"Try seating two pieces together only if they are already within 30px. Reports whether they snapped. Does not return homes.","inputSchema":{"type":"object","additionalProperties":false,"required":["a","b"],"properties":{"a":{"type":"string"},"b":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"select_painting","kind":"act","impl":"imperative","description":"Change the picture and start a fresh race at 16, 36, or 64 pieces. painting_id: inlet, crane, koi, trestle, picnic, balloons, market, carousel.","inputSchema":{"type":"object","additionalProperties":false,"required":["painting_id"],"properties":{"painting_id":{"type":"string","enum":["inlet","crane","koi","trestle","picnic","balloons","market","carousel"]},"cols":{"type":"number","enum":[4,6,8]},"rows":{"type":"number","enum":[4,6,8]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_piece_count","kind":"act","impl":"imperative","description":"Rebuild the current picture at 16, 36, or 64 pieces and start a fresh race.","inputSchema":{"type":"object","additionalProperties":false,"required":["count"],"properties":{"count":{"type":"number","enum":[16,36,64]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Media & Personal","apiSurface":"spec","toolCount":14}}