{"ok":true,"site":{"host":"roomcraft.rohankakar.com","url":"https://roomcraft.rohankakar.com/","type":"live","desc":"Plan a room in 2D: set dimensions, place doors, windows and furniture, and check clearances. Agent-editable through WebMCP.","tools":[{"name":"get_room_state","kind":"answer","impl":"imperative","description":"Read the current room: dimensions, settings, doors and windows, room-local custom items, placed furniture, saved variants and (optionally) validation issues.","inputSchema":{"type":"object","properties":{"includeIssues":{"type":"boolean","description":"Include the validation report alongside the layout."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_room_dimensions","kind":"act","impl":"imperative","description":"Resize the room. Dimensions are interior measurements in centimetres; existing furniture and openings are pulled back inside.","inputSchema":{"type":"object","properties":{"widthCm":{"type":"number","minimum":150,"maximum":2000,"description":"Interior width in cm."},"depthCm":{"type":"number","minimum":150,"maximum":2000,"description":"Interior depth in cm."},"wallThicknessCm":{"type":"number","minimum":5,"maximum":60}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_room_settings","kind":"act","impl":"imperative","description":"Update the room name, walkway-clearance target, placement grid size, or snap-to-grid behavior as one undoable change.","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"clearanceCm":{"type":"number","minimum":0,"maximum":300},"gridCm":{"type":"number","minimum":1,"maximum":100},"snapToGrid":{"type":"boolean"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_opening","kind":"act","impl":"imperative","description":"Add a door or window to a wall. offsetCm is measured along the wall from its start corner (north/south from the west end, east/west from the north end).","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["door","window"]},"wall":{"type":"string","enum":["north","east","south","west"]},"offsetCm":{"type":"number","minimum":0},"widthCm":{"type":"number","minimum":30,"maximum":400},"swing":{"type":"string","enum":["inward-left","inward-right","outward-left","outward-right"],"description":"Doors only."},"sillHeightCm":{"type":"number","minimum":0,"description":"Windows only."}},"required":["kind","wall","offsetCm","widthCm"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_opening","kind":"act","impl":"imperative","description":"Move, resize or reorient an existing door or window. Use the opening id returned by add_opening or get_room_state.","inputSchema":{"type":"object","properties":{"id":{"type":"string"},"wall":{"type":"string","enum":["north","east","south","west"]},"offsetCm":{"type":"number","minimum":0},"widthCm":{"type":"number","minimum":30,"maximum":400},"swing":{"type":"string","enum":["inward-left","inward-right","outward-left","outward-right"],"description":"Doors only."},"sillHeightCm":{"type":"number","minimum":0,"description":"Windows only."}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_opening","kind":"act","impl":"imperative","description":"Delete an existing door or window by opening id as one undoable change.","inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"search_furniture","kind":"answer","impl":"imperative","description":"Search built-in fictional furniture and room-local custom items by keywords, category, style, footprint or USD price. Returns item ids to pass to place_furniture.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Free text matched against name and tags."},"source":{"type":"string","enum":["built-in","custom"],"description":"Restrict results to one source; omit to search both."},"category":{"type":"string","enum":["seating","tables","storage","beds","workspace","lighting","rugs","decor"]},"style":{"type":"string","enum":["modern","minimal","classic","cozy","industrial"]},"maxWidthCm":{"type":"number","minimum":1},"maxDepthCm":{"type":"number","minimum":1},"maxPriceUsdCents":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":1,"maximum":40}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_custom_item","kind":"act","impl":"imperative","description":"Store a room-local custom item from supplied data. Source URLs are kept as metadata only and are never fetched. Set place to true to place it in the same undoable change.","inputSchema":{"type":"object","properties":{"id":{"type":"string","pattern":"^custom-[a-z0-9][a-z0-9-]*$","description":"Optional stable id beginning with custom-. Omit to generate one."},"name":{"type":"string","minLength":1},"widthCm":{"type":"number","minimum":1,"maximum":2000},"depthCm":{"type":"number","minimum":1,"maximum":2000},"heightCm":{"type":"number","minimum":1,"maximum":2000},"priceUsdCents":{"type":"integer","minimum":0,"maximum":100000000},"category":{"type":"string","enum":["seating","tables","storage","beds","workspace","lighting","rugs","decor"]},"style":{"type":"string","enum":["modern","minimal","classic","cozy","industrial"]},"color":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Hex colour such as #6f8073."},"sourceUrl":{"type":"string","format":"uri"},"sourceLabel":{"type":"string"},"rawText":{"type":"string","description":"Optional user-supplied listing notes."},"place":{"type":"boolean","description":"Place the new item immediately."},"xCm":{"type":"number"},"yCm":{"type":"number"},"rotationDeg":{"type":"number"},"label":{"type":"string"}},"required":["name","widthCm","depthCm","heightCm","priceUsdCents","category","style","color"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_furniture","kind":"act","impl":"imperative","description":"Place a built-in or custom item in the room. Coordinates are the item's centre in centimetres from the room's top-left corner; omitted coordinates default to the room centre and collisions are nudged to a free spot.","inputSchema":{"type":"object","properties":{"catalogId":{"type":"string","description":"Built-in or custom item id from search_furniture."},"xCm":{"type":"number"},"yCm":{"type":"number"},"rotationDeg":{"type":"number","description":"Clockwise degrees; 0 faces the south wall."},"colorId":{"type":"string"},"label":{"type":"string"}},"required":["catalogId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_furniture","kind":"act","impl":"imperative","description":"Move, rotate, relabel or recolour one placed item. Only the supplied fields change.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Instance id from get_room_state."},"xCm":{"type":"number"},"yCm":{"type":"number"},"rotationDeg":{"type":"number"},"colorId":{"type":"string"},"label":{"type":"string"}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_furniture","kind":"act","impl":"imperative","description":"Remove one or more placed items by instance id.","inputSchema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["ids"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"apply_layout","kind":"act","impl":"imperative","description":"Place a whole layout at once. mode 'replace' clears existing furniture first, 'merge' adds to it.","inputSchema":{"type":"object","properties":{"mode":{"type":"string","enum":["replace","merge"]},"items":{"type":"array","minItems":1,"items":{"type":"object","properties":{"catalogId":{"type":"string"},"xCm":{"type":"number"},"yCm":{"type":"number"},"rotationDeg":{"type":"number"},"colorId":{"type":"string"},"label":{"type":"string"}},"required":["catalogId","xCm","yCm"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"validate_layout","kind":"act","impl":"imperative","description":"Check the layout for furniture outside the room, overlaps, blocked doors and walkways narrower than the configured clearance.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"save_layout_variant","kind":"act","impl":"imperative","description":"Save the current layout under a name, stored locally in this browser. Saving with an existing name overwrites that variant.","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1}},"required":["name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"activate_layout_variant","kind":"act","impl":"imperative","description":"Load a saved variant into the editor as an undoable change. Identify it by id or by name.","inputSchema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"reset_current_layout","kind":"act","impl":"imperative","description":"Reset the current room to a fresh default layout as one undoable change. Saved layout variants remain available.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"undo_last_change","kind":"act","impl":"imperative","description":"Undo the most recent change, whether it came from this agent or from direct canvas editing.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"favicon":"/favicons/roomcraft.rohankakar.com.ico","apiSurface":"spec","category":"Productivity & Business","toolCount":17}}