{"ok":true,"site":{"host":"open-architect.vercel.app","url":"https://open-architect.vercel.app/","type":"live","desc":"OpenArchitect — describe a home. An agent asks follow-ups, then draws a schematic floor plan on a live canvas. The same tools are exposed to browser agents via WebMCP.","tools":[{"name":"get_brief","kind":"answer","impl":"imperative","description":"Read the current project brief: description, plot size, bedroom/bathroom counts, notes, and answers already collected.","title":"Get brief","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_design_rules","kind":"answer","impl":"imperative","description":"Return the house-making standards this studio enforces: NBC-aligned room sizes, doors, windows, and adjacency rules for living, dining, bedrooms, kitchen, bathrooms, and hallways.","title":"Get design rules","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_standards_check","kind":"answer","impl":"imperative","description":"Return only the current standards-check issues (errors and warnings): room size minima, overlaps, openings, adjacency, missing porch/stairs/street, etc. Prefer this over get_floor_plan when you only need to know what is failing.","title":"Get standards check","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_brief","kind":"act","impl":"imperative","description":"Patch the project brief. Use this to store requirements from the conversation. If plotWidthM and plotHeightM are set, the canvas plot is resized to match.","title":"Update brief","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"description":{"type":"string"},"plotWidthM":{"type":"number","exclusiveMinimum":0},"plotHeightM":{"type":"number","exclusiveMinimum":0},"bedroomCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"bathroomCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"type":"array","items":{"type":"string"}},"answers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"ask_user","kind":"act","impl":"imperative","description":"Ask the human one to six structured follow-up questions before drawing. Opens a modal on the OpenArchitect page and WAITS until they click Send answers. The questions are also in this tool's arguments for ChatGPT to display. When it returns, answers are already saved in the brief — continue with set_plot / apply_layout. Do not call apply_layout before this tool returns.","title":"Ask the user","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"questions":{"minItems":1,"maxItems":6,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"prompt":{"type":"string","minLength":1},"type":{"type":"string","enum":["text","choice","number"]},"options":{"type":"array","items":{"type":"string"}}},"required":["id","prompt","type"],"additionalProperties":false}}},"required":["questions"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_floor_plan","kind":"answer","impl":"imperative","description":"Return the full floor plan JSON plus validation issues (overlaps, NBC size minima, missing exterior windows, awkward adjacencies).","title":"Get floor plan","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_plot","kind":"act","impl":"imperative","description":"Set the overall rectangular plot size in meters. Origin is the top-left (northwest) corner. x increases east, y increases south.","title":"Set plot size","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"width":{"type":"number","exclusiveMinimum":0,"description":"Plot width in meters"},"height":{"type":"number","exclusiveMinimum":0,"description":"Plot height in meters"}},"required":["width","height"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"apply_layout","kind":"act","impl":"imperative","description":"Replace rooms, openings, furniture, and the frontage street in one shot. Prefer this for the first draft. Include an entrance porch, a stairs area, and street.edge on the same side as the main door unless the user declined them. Room ids must be stable slugs (kitchen, bed-1, porch, stairs). Coordinates are meters on a 0.5 m grid.","title":"Apply full layout","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"plot":{"type":"object","properties":{"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}},"required":["width","height"],"additionalProperties":false},"street":{"anyOf":[{"type":"object","properties":{"edge":{"type":"string","enum":["north","south","east","west"],"description":"Plot edge the street runs along — the same side as the main entrance"},"width":{"description":"Street carriageway width in meters","type":"number","exclusiveMinimum":0}},"required":["edge"],"additionalProperties":false},{"type":"null"}]},"rooms":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"description":"Stable id, e.g. kitchen or bed-1","type":"string","minLength":1,"maxLength":48,"pattern":"^[a-z][a-z0-9_-]*$"},"name":{"type":"string","minLength":1,"description":"Human label shown on the canvas"},"type":{"type":"string","enum":["bedroom","bathroom","kitchen","living","dining","hallway","closet","balcony","office","laundry","stairs","porch","other"]},"x":{"type":"number","description":"Meters from the plot's left (west) edge"},"y":{"type":"number","description":"Meters from the plot's top (north) edge"},"width":{"type":"number","exclusiveMinimum":0,"description":"Room width in meters"},"height":{"type":"number","exclusiveMinimum":0,"description":"Room height in meters"}},"required":["name","type","x","y","width","height"],"additionalProperties":false}},"openings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":48,"pattern":"^[a-z][a-z0-9_-]*$"},"kind":{"type":"string","enum":["door","window"]},"roomId":{"type":"string","description":"Id of the room this opening belongs to"},"edge":{"type":"string","enum":["north","south","east","west"],"description":"Wall: north is top of the canvas"},"offset":{"type":"number","minimum":0,"description":"Meters along the edge from its start (west for N/S, north for E/W)"},"width":{"type":"number","exclusiveMinimum":0,"description":"Opening width in meters"}},"required":["kind","roomId","edge","offset","width"],"additionalProperties":false}},"furniture":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":48,"pattern":"^[a-z][a-z0-9_-]*$"},"roomId":{"type":"string"},"name":{"type":"string","minLength":1},"kind":{"type":"string","minLength":1,"description":"bed, sofa, table, counter, toilet, sink, stove, wardrobe, desk, other"},"x":{"type":"number","description":"Meters from the room's left edge"},"y":{"type":"number","description":"Meters from the room's top edge"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}},"required":["roomId","name","kind","x","y","width","height"],"additionalProperties":false}}},"required":["rooms"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_room","kind":"act","impl":"imperative","description":"Add a single axis-aligned room rectangle. Coordinates are meters from the plot origin (top-left).","title":"Add room","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"description":"Stable id, e.g. kitchen or bed-1","type":"string","minLength":1,"maxLength":48,"pattern":"^[a-z][a-z0-9_-]*$"},"name":{"type":"string","minLength":1,"description":"Human label shown on the canvas"},"type":{"type":"string","enum":["bedroom","bathroom","kitchen","living","dining","hallway","closet","balcony","office","laundry","stairs","porch","other"]},"x":{"type":"number","description":"Meters from the plot's left (west) edge"},"y":{"type":"number","description":"Meters from the plot's top (north) edge"},"width":{"type":"number","exclusiveMinimum":0,"description":"Room width in meters"},"height":{"type":"number","exclusiveMinimum":0,"description":"Room height in meters"}},"required":["name","type","x","y","width","height"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_room","kind":"act","impl":"imperative","description":"Move or resize one room by id. Does not push shared walls into neighbors — use resize_wall for that.","title":"Update room","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string","enum":["bedroom","bathroom","kitchen","living","dining","hallway","closet","balcony","office","laundry","stairs","porch","other"]},"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_room","kind":"act","impl":"imperative","description":"Remove a room and any openings or furniture attached to it.","title":"Remove room","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"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 on a room edge. offset is meters from the start of that edge (west end for north/south, north end for east/west).","title":"Add door or window","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":48,"pattern":"^[a-z][a-z0-9_-]*$"},"kind":{"type":"string","enum":["door","window"]},"roomId":{"type":"string","description":"Id of the room this opening belongs to"},"edge":{"type":"string","enum":["north","south","east","west"],"description":"Wall: north is top of the canvas"},"offset":{"type":"number","minimum":0,"description":"Meters along the edge from its start (west for N/S, north for E/W)"},"width":{"type":"number","exclusiveMinimum":0,"description":"Opening width in meters"}},"required":["kind","roomId","edge","offset","width"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_opening","kind":"act","impl":"imperative","description":"Remove a door or window by id.","title":"Remove opening","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_furniture","kind":"act","impl":"imperative","description":"Add a labeled furniture block inside a room. x/y are relative to the room origin, not the plot.","title":"Add furniture","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":48,"pattern":"^[a-z][a-z0-9_-]*$"},"roomId":{"type":"string"},"name":{"type":"string","minLength":1},"kind":{"type":"string","minLength":1,"description":"bed, sofa, table, counter, toilet, sink, stove, wardrobe, desk, other"},"x":{"type":"number","description":"Meters from the room's left edge"},"y":{"type":"number","description":"Meters from the room's top edge"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}},"required":["roomId","name","kind","x","y","width","height"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_furniture","kind":"act","impl":"imperative","description":"Remove a furniture item by id.","title":"Remove furniture","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"resize_wall","kind":"act","impl":"imperative","description":"Move one wall of a room. Neighbors that share that wall move with it. Prefer this over update_room when stretching a room against another. Provide position (plot meters) or delta (positive = east/south).","title":"Move a wall","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"roomId":{"type":"string","description":"Room whose wall to move"},"edge":{"type":"string","enum":["north","south","east","west"],"description":"Which wall: north is the top of the canvas, east is the right"},"position":{"description":"New plot coordinate of that wall in meters (x for east/west, y for north/south)","type":"number"},"delta":{"description":"Meters to shift the wall from where it is now. Positive moves east or south.","type":"number"}},"required":["roomId","edge"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"replace_furniture","kind":"act","impl":"imperative","description":"Swap an existing furniture piece for a catalog object (bed, sofa, table, desk, wardrobe, counter, stove, sink, fridge, toilet, chair). Keeps the same id and recenters in place.","title":"Replace furniture","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Furniture id from get_floor_plan"},"kind":{"type":"string","minLength":1,"description":"Catalog kind: bed, sofa, table, desk, wardrobe, counter, stove, sink, fridge, toilet, chair"}},"required":["id","kind"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"move_furniture","kind":"act","impl":"imperative","description":"Move furniture inside its room. x/y are meters from the room's top-left, not the plot.","title":"Move furniture","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string"},"x":{"type":"number","description":"Meters from the room's left (west) edge"},"y":{"type":"number","description":"Meters from the room's top (north) edge"}},"required":["id","x","y"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"resize_furniture","kind":"act","impl":"imperative","description":"Change a furniture block's width and height in meters.","title":"Resize furniture","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string"},"width":{"type":"number","exclusiveMinimum":0,"description":"New width in meters"},"height":{"type":"number","exclusiveMinimum":0,"description":"New height in meters"}},"required":["id","width","height"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"replace_opening","kind":"act","impl":"imperative","description":"Change an existing opening between door and window without moving it.","title":"Replace door or window","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Door or window id from get_floor_plan"},"kind":{"type":"string","enum":["door","window"],"description":"door or window"}},"required":["id","kind"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"move_opening","kind":"act","impl":"imperative","description":"Slide a door or window along its wall, or onto another wall of the same room. offset is meters from the start of that edge (west for N/S, north for E/W).","title":"Move door or window","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Door or window id from get_floor_plan"},"offset":{"type":"number","minimum":0,"description":"Meters along the edge from its start (west for N/S, north for E/W)"},"edge":{"description":"Move onto another wall of the same room. Omit to stay on the current wall.","type":"string","enum":["north","south","east","west"]}},"required":["id","offset"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"resize_opening","kind":"act","impl":"imperative","description":"Change a door or window width in meters along the wall.","title":"Resize door or window","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Door or window id from get_floor_plan"},"width":{"type":"number","exclusiveMinimum":0,"description":"New opening width in meters along the wall"}},"required":["id","width"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"export_png","kind":"act","impl":"imperative","description":"Download the current floor plan as a PNG image in the user's browser. Optional filename (extension added automatically).","title":"Export PNG","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"filename":{"description":"Download name without path, e.g. 3bhk-ground-floor. Extension is added.","type":"string"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"export_pdf","kind":"act","impl":"imperative","description":"Download the current floor plan as a PDF in the user's browser. Optional filename (extension added automatically).","title":"Export PDF","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"filename":{"description":"Download name without path, e.g. 3bhk-ground-floor. Extension is added.","type":"string"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"export_project","kind":"act","impl":"imperative","description":"Download the current brief + floor plan as an OpenArchitect JSON project file the user can re-import later. Optional filename.","title":"Export project JSON","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"filename":{"description":"Download name without path, e.g. 3bhk-ground-floor. Extension is added.","type":"string"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"import_project","kind":"act","impl":"imperative","description":"Replace the canvas with a project JSON payload (plan required; brief optional). Accepts OpenArchitect exports or a bare plan object.","title":"Import project JSON","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"version":{"type":"number","const":1},"kind":{"type":"string","const":"openarchitect"},"brief":{"type":"object","properties":{"description":{"type":"string"},"plotWidthM":{"type":"number"},"plotHeightM":{"type":"number"},"bedroomCount":{"type":"number"},"bathroomCount":{"type":"number"},"notes":{"type":"array","items":{"type":"string"}},"answers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["description","notes","answers"],"additionalProperties":false},"plan":{"type":"object","properties":{"units":{"type":"string","const":"m"},"gridSize":{"type":"number","exclusiveMinimum":0},"plot":{"type":"object","properties":{"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}},"required":["width","height"],"additionalProperties":false},"street":{"anyOf":[{"type":"object","properties":{"edge":{"type":"string","enum":["north","south","east","west"]},"width":{"type":"number","exclusiveMinimum":0}},"required":["edge","width"],"additionalProperties":false},{"type":"null"}]},"rooms":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1,"description":"Human label shown on the canvas"},"type":{"type":"string","enum":["bedroom","bathroom","kitchen","living","dining","hallway","closet","balcony","office","laundry","stairs","porch","other"]},"x":{"type":"number","description":"Meters from the plot's left (west) edge"},"y":{"type":"number","description":"Meters from the plot's top (north) edge"},"width":{"type":"number","exclusiveMinimum":0,"description":"Room width in meters"},"height":{"type":"number","exclusiveMinimum":0,"description":"Room height in meters"}},"required":["id","name","type","x","y","width","height"],"additionalProperties":false}},"openings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"kind":{"type":"string","enum":["door","window"]},"roomId":{"type":"string","description":"Id of the room this opening belongs to"},"edge":{"type":"string","enum":["north","south","east","west"],"description":"Wall: north is top of the canvas"},"offset":{"type":"number","minimum":0,"description":"Meters along the edge from its start (west for N/S, north for E/W)"},"width":{"type":"number","exclusiveMinimum":0,"description":"Opening width in meters"}},"required":["id","kind","roomId","edge","offset","width"],"additionalProperties":false}},"furniture":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"roomId":{"type":"string"},"name":{"type":"string","minLength":1},"kind":{"type":"string","minLength":1,"description":"bed, sofa, table, counter, toilet, sink, stove, wardrobe, desk, other"},"x":{"type":"number","description":"Meters from the room's left edge"},"y":{"type":"number","description":"Meters from the room's top edge"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}},"required":["id","roomId","name","kind","x","y","width","height"],"additionalProperties":false}}},"required":["units","gridSize","plot","rooms","openings","furniture"],"additionalProperties":false}},"required":["plan"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_display_layers","kind":"act","impl":"imperative","description":"Toggle canvas display layers: roomColors (fill colors), doors (door openings), and objects (furniture/fixtures). Pass only the layers you want to change. Does not modify the floor plan data.","title":"Set display layers","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"roomColors":{"description":"Show or hide room fill colors on the 2D/3D canvas.","type":"boolean"},"doors":{"description":"Show or hide doors on walls (windows stay visible).","type":"boolean"},"objects":{"description":"Show or hide furniture and fixture blocks.","type":"boolean"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"generate_3d","kind":"act","impl":"imperative","description":"Build an interactive 3D dollhouse from the current floor plan (extruded rooms, walls, doors, windows, furniture). Opens the 3D viewer so the user can orbit it and download a GLB. Optional filename for the GLB. Call this when the user asks to see the house in 3D, generate 3D, or export a 3D model.","title":"Generate 3D","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"filename":{"description":"Download name without path, e.g. 3bhk-ground-floor. Extension is added.","type":"string"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"favicon":"/favicons/open-architect.vercel.app.ico","apiSurface":"spec","category":"Productivity & Business","toolCount":28}}