{"ok":true,"site":{"host":"dattheshshenoy.github.io","url":"https://dattheshshenoy.github.io/roomwright/","type":"live","desc":"Roomwright — furnish a room by talking to your AI agent. A WebMCP room planner.","tools":[{"name":"roomwright_get_room","kind":"answer","impl":"imperative","description":"Return the room's dimensions and openings plus every placed piece with its id, product, variant, position (metres, origin at the near-left corner), and rotation. Call this first to learn what is in the room and to get placement ids.","inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_list_catalog","kind":"act","impl":"imperative","description":"List the furniture catalogue. Optionally filter by category. Each entry has product_id, dimensions (metres), colour/finish variants, price (USD), and the free space the piece needs in front of it.","inputSchema":{"type":"object","properties":{"category":{"type":"string","description":"optional filter","enum":["seating","tables","sleeping","storage","lighting","decor","custom"]}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_add_item","kind":"act","impl":"imperative","description":"Place a piece in the room. Give product_id (from list_catalog). Optional: variant_id, x and z in metres, rotation_degrees. With no position the piece is auto-placed — wall-hugging pieces against the emptiest wall, others near the centre clear of what is there. Returns the new placement_id and any clearance issues it introduces.","inputSchema":{"type":"object","properties":{"product_id":{"type":"string","description":"a product_id from list_catalog, its exact name, or an unambiguous part of the name (e.g. \"milo\" or \"coffee table\")"},"variant_id":{"type":"string","description":"optional variant id"},"x":{"type":"number","description":"centre x, metres"},"z":{"type":"number","description":"centre z, metres"},"rotation_degrees":{"type":"number","description":"clockwise from facing +z"}},"required":["product_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_create_custom_item","kind":"act","impl":"imperative","description":"Make a custom piece from a primitive and place it in the room. shape is box (cabinet, built-in, block), cylinder (column, round pouffe), panel (a thin room divider), or platform (a low step or podium). width/depth/height in metres (cylinder ignores depth). Optional name, hex colour, position and rotation. Returns the new product_id and placement_id.","inputSchema":{"type":"object","properties":{"shape":{"type":"string","description":"primitive","enum":["box","cylinder","panel","platform"]},"width":{"type":"number","description":"metres"},"depth":{"type":"number","description":"metres (ignored for cylinder)"},"height":{"type":"number","description":"metres"},"name":{"type":"string","description":"optional label"},"color":{"type":"string","description":"optional hex, e.g. #8a6a49"},"x":{"type":"number","description":"centre x, metres"},"z":{"type":"number","description":"centre z, metres"},"rotation_degrees":{"type":"number","description":"clockwise from facing +z"}},"required":["shape","width","height"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_move_item","kind":"act","impl":"imperative","description":"Move a placed piece to a new centre position in metres. The position is clamped so the piece stays fully inside the room. Returns whether it was clamped and any clearance issues at the new spot.","inputSchema":{"type":"object","properties":{"placement_id":{"type":"string","description":"from get_room"},"x":{"type":"number","description":"centre x, metres"},"z":{"type":"number","description":"centre z, metres"}},"required":["placement_id","x","z"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_rotate_item","kind":"act","impl":"imperative","description":"Rotate a placed piece about the vertical axis. degrees is relative by default; set absolute true to set the heading directly. Angles snap to 15-degree steps.","inputSchema":{"type":"object","properties":{"placement_id":{"type":"string","description":"from get_room"},"degrees":{"type":"number","description":"rotation, degrees"},"absolute":{"type":"boolean"}},"required":["placement_id","degrees"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_resize_item","kind":"act","impl":"imperative","description":"Override a placed piece's size — width (along its own left-right), depth (front-back), height, in metres. Give any subset; each is clamped to 0.15-8 m. The piece re-renders at the new size and its clearance is recomputed. Setting all three back to the catalogue size clears the override.","inputSchema":{"type":"object","properties":{"placement_id":{"type":"string","description":"from get_room"},"width":{"type":"number","description":"new width, metres"},"depth":{"type":"number","description":"new depth, metres"},"height":{"type":"number","description":"new height, metres"}},"required":["placement_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_set_variant","kind":"act","impl":"imperative","description":"Change a placed piece's colour or material. variant_id comes from list_catalog's variants list for that product.","inputSchema":{"type":"object","properties":{"placement_id":{"type":"string","description":"from get_room"},"variant_id":{"type":"string","description":"a variant id for the piece's product"}},"required":["placement_id","variant_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_duplicate_item","kind":"act","impl":"imperative","description":"Add another copy of a placed piece — same product and variant. By default the copy is nudged clear of the original. Pass mirror to place it as a mirror image across the room's centre line instead: \"east-west\" for a matching piece on the opposite left/right side (same distance from its wall, heading flipped), \"north-south\" for front/back. Use \"east-west\" for a chair on each side of a sofa.","inputSchema":{"type":"object","properties":{"placement_id":{"type":"string","description":"from get_room"},"mirror":{"type":"string","description":"optional — \"east-west\" or \"north-south\"","enum":["east-west","north-south"]}},"required":["placement_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_remove_item","kind":"act","impl":"imperative","description":"Remove a placed piece from the room by its placement_id.","inputSchema":{"type":"object","properties":{"placement_id":{"type":"string","description":"from get_room"}},"required":["placement_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_set_room_dimensions","kind":"act","impl":"imperative","description":"Resize the room. Any of width, length, height in metres (width 1.5-20, length 1.5-20, height 2.2-4.5). Pieces that fall outside the new bounds are pulled back inside and reported.","inputSchema":{"type":"object","properties":{"width":{"type":"number","description":"interior width, metres"},"length":{"type":"number","description":"interior length, metres"},"height":{"type":"number","description":"ceiling height, metres"}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_set_opening","kind":"act","impl":"imperative","description":"Add or change a door or window. Omit opening_id to ADD one — give kind (door or window) and wall (north, south, east, west); it starts centred, and you may also pass offset_m, width_m, sill_m or height_m to place it exactly. Pass opening_id (from get_room) to CHANGE that opening — any of wall, offset_m (from the wall's start corner), width_m, sill_m (windows), height_m, or kind. Values are clamped to fit the wall and ceiling.","inputSchema":{"type":"object","properties":{"opening_id":{"type":"string","description":"omit to add a new opening; give it to change an existing one"},"kind":{"type":"string","description":"door or window","enum":["door","window"]},"wall":{"type":"string","description":"which wall","enum":["north","south","east","west"]},"offset_m":{"type":"number","description":"distance from the wall's start corner to the opening's near edge"},"width_m":{"type":"number","description":"opening width"},"sill_m":{"type":"number","description":"height of the sill above the floor (windows)"},"height_m":{"type":"number","description":"opening height"}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_remove_opening","kind":"act","impl":"imperative","description":"Remove a door or window by its opening_id.","inputSchema":{"type":"object","properties":{"opening_id":{"type":"string","description":"from get_room"}},"required":["opening_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_suggest_spot","kind":"act","impl":"imperative","description":"Ask where a piece could go. Optionally pass product_id (so the spots actually fit that piece) and near (a wall, the centre, the window, or the door) to bias the result. Returns the total open floor, the longest clear run along each wall, and up to three candidate positions with x/z in metres, a rotation, whether each sits against a wall, and how much clear space surrounds it.","inputSchema":{"type":"object","properties":{"product_id":{"type":"string","description":"optional — a product_id, name, or name fragment, so candidates fit this piece"},"near":{"type":"string","description":"optional bias","enum":["north","south","east","west","centre","window","door"]}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_check_layout","kind":"act","impl":"imperative","description":"Evaluate the current arrangement: overlapping pieces, pieces that block a door or window, pieces that do not have their required free space, and walkways under 0.75 m. Returns an overall status (ok, warn, bad), each issue with the piece it concerns, and the narrowest gap in the room.","inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_get_shopping_list","kind":"answer","impl":"imperative","description":"The pieces currently in the room as a shopping list — each product with quantity, unit price, and line total, plus the grand total in USD.","inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_select_item","kind":"act","impl":"imperative","description":"Highlight a placed piece in the 3D view and open its Inspector panel, so the user can see which piece you are talking about or about to change. Pass no placement_id to clear the selection.","inputSchema":{"type":"object","properties":{"placement_id":{"type":"string","description":"from get_room; omit to deselect"}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_set_view","kind":"act","impl":"imperative","description":"Switch the camera between 'orbit' (an angled 3D view of the room) and 'plan' (looking straight down at the floor plan). Use plan to let the user judge the layout, orbit to show the room.","inputSchema":{"type":"object","properties":{"view":{"type":"string","description":"orbit or plan","enum":["orbit","plan"]}},"required":["view"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]},{"name":"roomwright_reset_layout","kind":"act","impl":"imperative","description":"Clear everything and start over: removes every placed piece, every custom piece, and every opening you added, and restores the default room size and its original door and window. Undoable in the app. Use this when the user asks to start fresh.","inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/roomwright/","pages":["/roomwright/"]}],"favicon":"/favicons/dattheshshenoy.github.io.svg","apiSurface":"spec","category":"Productivity & Business","toolCount":19}}