{"ok":true,"site":{"host":"groundplan-nine.vercel.app","url":"https://groundplan-nine.vercel.app/","type":"live","desc":"Design a home with an agent that actually measures. Groundplan exposes its geometry engine as WebMCP tools, so an agent can check doorway clearances, turning circles and step-free reach — and every…","tools":[{"name":"get_capabilities","kind":"answer","impl":"imperative","description":"What this page can and cannot do, in one call. Read it before attempting anything unusual, and read it when a request does not obviously map onto a tool — it lists the limits explicitly, so you can tell someone plainly that a thing is not possible here and offer the nearest thing that is, instead of guessing.","annotations":{"title":"What can I do here?","readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_tracing_image","kind":"answer","impl":"imperative","description":"Fetch the floor plan picture the person has dropped onto the page, as an image you can read. Call this when someone says \"trace this\", \"use my plan\" or asks about a home whose drawing they have just added. The result carries the picture itself along with the real-world scale and position it has been placed at, so rooms you add line up with what they can see. Read the room names, the printed areas and the dimension strings off it, then build the rooms with apply_batch and confirm the result with check_against_source.","annotations":{"title":"Read the traced picture","readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"check_against_source","kind":"answer","impl":"imperative","description":"Check a plan you have traced against the numbers printed on the original drawing. Give the areas you read off the source and it tells you, room by room, how far your version is out and in which direction. Use it after tracing anything: it is the difference between a drawing that looks about right and one that measures right.","annotations":{"title":"Check against the original","readOnlyHint":true},"inputSchema":{"type":"object","properties":{"rooms":{"type":"array","description":"What the source drawing says, as { room, area_m2 } — the room name or id, and its printed area.","items":{"type":"object"}},"total_area_m2":{"type":"number","description":"The whole flat's area, if the drawing states one."}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_plan","kind":"answer","impl":"imperative","description":"Read the whole floor plan: every room with its position, size, area, neighbours and external walls; every door and window; every piece of furniture. Start here. All lengths are millimetres, x grows east and y grows south.","annotations":{"title":"Read the plan","readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"check_plan","kind":"answer","impl":"imperative","description":"Run every accessibility, daylight, circulation and layout rule over the plan and return what fails. Each finding carries the measured value, the value required, the entities involved and a concrete fix. Call this after any change to see whether it helped.","annotations":{"title":"Check the plan","readOnlyHint":true},"inputSchema":{"type":"object","properties":{"severity":{"type":"string","enum":["error","warning","info"],"description":"Only findings of this severity."},"rule":{"type":"string","description":"Only this rule id, e.g. \"door.clear_width\"."}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"analyse_access","kind":"act","impl":"imperative","description":"Measure how much of the home a wheelchair user can actually reach from the front door, room by room, plus the clear width of every doorway and the largest turning circle in each room. Use this when someone asks whether the home works for a wheelchair, a walker, or moving furniture in.","annotations":{"title":"Accessibility analysis","readOnlyHint":true},"inputSchema":{"type":"object","properties":{"mobility_diameter_mm":{"type":"number","description":"Width of the body being tested, mm. Defaults to the plan setting (900 mm)."}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"compare_standards","kind":"act","impl":"imperative","description":"Measure the same home against several different bodies at once — a walking frame, a standard wheelchair, a large powered chair — and report what each one can reach and what stops it. This is the tool for \"would this flat work for my mother?\", and for separating how much of a problem is the home from how much is the chair.","annotations":{"title":"Compare mobility standards","readOnlyHint":true},"inputSchema":{"type":"object","properties":{"diameters_mm":{"type":"array","items":{"type":"number"},"description":"Body widths to test, mm. Defaults to 700, 900 and 1000 — a walking frame, the standard reference wheelchair, and a large powered chair."}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"measure","kind":"act","impl":"imperative","description":"Measure the plan like a tape measure. Give two things — room names, furniture labels, opening ids, or literal \"x,y\" points in millimetres — and get the straight-line distance between them plus the clear floor radius at each end.","annotations":{"title":"Measure","readOnlyHint":true},"inputSchema":{"type":"object","properties":{"from":{"type":"string","description":"A room, furniture item, opening id, or \"x,y\" in mm."},"to":{"type":"string","description":"A room, furniture item, opening id, or \"x,y\" in mm."}},"required":["from","to"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_catalog","kind":"answer","impl":"imperative","description":"List the furniture and fixtures that can be placed, with real dimensions in millimetres and the clear floor each one needs in front of it to be usable.","annotations":{"title":"Furniture catalogue","readOnlyHint":true},"inputSchema":{"type":"object","properties":{"for_room_type":{"type":"string","enum":["living","bedroom","kitchen","bathroom","hall","office","dining","utility","storage","balcony"],"description":"Only items normally found in this kind of room."}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_selection","kind":"answer","impl":"imperative","description":"See what the person at the keyboard currently has selected, which editing mode they are in, and which overlays are switched on. Call this when they say \"this room\", \"that door\" or \"here\" — the page knows what they mean.","annotations":{"title":"What the user is looking at","readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"export_plan","kind":"act","impl":"imperative","description":"Hand the person something they can keep: a shareable link that carries the whole drawing in the URL, a markdown room schedule to paste into a message, or the plan as SVG. Use \"link\" when you finish a piece of work — it is the fastest way to give someone the result.","annotations":{"title":"Export the plan","readOnlyHint":true},"inputSchema":{"type":"object","properties":{"format":{"type":"string","enum":["link","schedule","svg"],"description":"link: a URL containing the plan. schedule: a markdown table of rooms, areas and clearances. svg: the drawing as vector source."}},"required":["format"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_activity","kind":"answer","impl":"imperative","description":"Read the shared edit history — what changed, when, and whether a person or an agent did it. Useful for picking up where a previous session left off, or for explaining what you just did.","annotations":{"title":"Edit history","readOnlyHint":true},"inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"How many entries, newest first. Default 20."}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"highlight","kind":"act","impl":"imperative","description":"Point at things on the plan so the person can see what you are talking about. Pass room names, furniture labels or entity ids; they pulse on the canvas for a few seconds. Does not change the drawing.","annotations":{"title":"Point at something","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"targets":{"type":"array","items":{"type":"string"},"description":"Rooms, furniture or ids to flash."},"label":{"type":"string","description":"Short caption shown beside them."}},"required":["targets"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"show_route","kind":"act","impl":"imperative","description":"Play the journey from the front door into a room on the drawing. A body of the given width travels the widest route the home allows and stops, at full scale, exactly where it stops fitting — with the measurement labelled on the spot. Use this whenever someone asks why a room is unreachable, or wants to see whether a wider wheelchair would still get through: showing them beats quoting a number at them.","annotations":{"title":"Show the route","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"to_room":{"type":"string","description":"Room id, exact name, partial name or room type. Case-insensitive."},"body_diameter_mm":{"type":"number","description":"Width of the body making the trip, mm. Defaults to the plan setting (900 mm). 700 mm is a walking frame; 1000 mm is a large powered chair."}},"required":["to_room"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"edit_underlay","kind":"act","impl":"imperative","description":"Adjust the reference picture the user is tracing over: set how wide it really is, nudge it into position, fade it, or lock it so the mouse goes back to the drawing. Use it when someone says the traced image is the wrong size or out of line. It does not change the plan itself.","annotations":{"title":"Adjust the tracing image","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"real_width_m":{"type":"number","description":"How wide the picture is in the real world, metres."},"dx_mm":{"type":"number","description":"Nudge east, mm."},"dy_mm":{"type":"number","description":"Nudge south, mm."},"opacity":{"type":"number","description":"Between 0.1 and 1."},"locked":{"type":"boolean","description":"True to fix it in place so the drawing takes the mouse."}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_view","kind":"act","impl":"imperative","description":"Turn the drawing overlays on and off so the person can see what you measured: the clearance heatmap, the step-free reachable area, door swings, and the clear floor each item needs. Use this to show your reasoning rather than describing it.","annotations":{"title":"Change the view","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"heatmap":{"type":"boolean","description":"Colour the floor by how much clear space there is."},"reach":{"type":"boolean","description":"Shade what can be reached from the front door."},"swings":{"type":"boolean","description":"Draw door swing arcs."},"approach":{"type":"boolean","description":"Draw the clear floor each fitting needs."},"dimensions":{"type":"boolean","description":"Show room dimensions."},"grid":{"type":"boolean","description":"Show the metric grid."},"fit":{"type":"boolean","description":"Zoom the drawing so the whole plan is visible."},"select":{"type":"string","description":"Select a room, opening or item of furniture, as the person would by clicking it. Pass an empty string to deselect."}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_room","kind":"act","impl":"imperative","description":"Add a rectangular room. Place it flush against an existing room with against_room + against_side (the usual way — rooms must meet edge to edge, never overlap), or give absolute x_mm / y_mm.","annotations":{"title":"Add a room","readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["living","bedroom","kitchen","bathroom","hall","office","dining","utility","storage","balcony"],"description":"What kind of room."},"width_mm":{"type":"number","description":"East-west clear dimension."},"depth_mm":{"type":"number","description":"North-south clear dimension."},"name":{"type":"string","description":"Optional label, e.g. \"Nursery\"."},"against_room":{"type":"string","description":"Attach flush to this room."},"against_side":{"type":"string","enum":["n","e","s","w"],"description":"Which side of that room to attach to."},"align_mm":{"type":"number","description":"Slide along that wall from its start, mm."},"x_mm":{"type":"number","description":"Absolute position instead of against_room."},"y_mm":{"type":"number","description":"Absolute position instead of against_room."}},"required":["type","width_mm","depth_mm"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"edit_room","kind":"act","impl":"imperative","description":"Change one room: resize it, move it, rename it, or change what kind of room it is. Only the fields you pass are touched. Resizing is rejected if it would overlap a neighbour, so move the neighbour first.","annotations":{"title":"Edit a room","readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"room":{"type":"string","description":"Room id, exact name, partial name or room type. Case-insensitive."},"width_mm":{"type":"number"},"depth_mm":{"type":"number"},"anchor":{"type":"string","enum":["centre","n","e","s","w"],"description":"Which edge stays put while resizing. Default centre."},"dx_mm":{"type":"number","description":"Move east by this much (negative for west)."},"dy_mm":{"type":"number","description":"Move south by this much (negative for north)."},"name":{"type":"string"},"type":{"type":"string","enum":["living","bedroom","kitchen","bathroom","hall","office","dining","utility","storage","balcony"]}},"required":["room"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_opening","kind":"act","impl":"imperative","description":"Cut a door, archway or window into a wall. For an internal door give to_room and the side is worked out for you. For a front door or a window set exterior: true. Openings wider than 1400 mm become archways with no leaf.","annotations":{"title":"Add a door or window","readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"room":{"type":"string","description":"Room id, exact name, partial name or room type. Case-insensitive."},"kind":{"type":"string","enum":["door","window","archway"]},"to_room":{"type":"string","description":"For internal doors: the room on the other side."},"side":{"type":"string","enum":["n","e","s","w"],"description":"Compass side: n, e, s or w."},"exterior":{"type":"boolean","description":"True for a front door or a window onto the outside."},"width_mm":{"type":"number","description":"Structural width. Doors default to 900 mm, windows to 1200 mm."},"offset_mm":{"type":"number","description":"Distance along the wall from its start. Omit to centre it."},"swing":{"type":"string","enum":["n","e","s","w","none"],"description":"Which way a door leaf opens."},"sill_mm":{"type":"number","description":"Windows: height of the sill above the floor."},"head_mm":{"type":"number","description":"Windows: height of the head above the floor."}},"required":["room","kind"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"edit_opening","kind":"act","impl":"imperative","description":"Change a door or window that already exists: widen it, slide it along its wall, or reverse the way the leaf swings. Widening a door is the usual fix for a room that measures as unreachable.","annotations":{"title":"Edit a door or window","readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"opening_id":{"type":"string","description":"Id from get_plan or check_plan."},"width_mm":{"type":"number"},"offset_mm":{"type":"number"},"swing":{"type":"string","enum":["n","e","s","w","none"]}},"required":["opening_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_furniture","kind":"act","impl":"imperative","description":"Place a piece of furniture or a fixture. Give a room and it is parked against a free wall facing into the room; give x_mm / y_mm to put it exactly somewhere. Use list_catalog for the available types.","annotations":{"title":"Place furniture","readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"type":{"type":"string","description":"Catalog type, e.g. \"bed_double\". See list_catalog."},"room":{"type":"string","description":"Room id, exact name, partial name or room type. Case-insensitive."},"against_side":{"type":"string","enum":["n","e","s","w"],"description":"Prefer this wall."},"x_mm":{"type":"number","description":"Exact centre position instead of automatic placement."},"y_mm":{"type":"number"},"rotation_deg":{"type":"number","enum":[0,90,180,270]},"label":{"type":"string","description":"Optional custom label."}},"required":["type","room"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"edit_furniture","kind":"act","impl":"imperative","description":"Move or rotate a piece of furniture. Reference it by label, type or id. Rotation is clockwise; 0° faces south.","annotations":{"title":"Move furniture","readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"item":{"type":"string","description":"Furniture label, type or id."},"x_mm":{"type":"number"},"y_mm":{"type":"number"},"dx_mm":{"type":"number","description":"Relative move east."},"dy_mm":{"type":"number","description":"Relative move south."},"rotation_deg":{"type":"number","enum":[0,90,180,270]}},"required":["item"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"furnish_room","kind":"act","impl":"imperative","description":"Fill a room with a sensible kit for its type — a bed, wardrobe and bedside for a bedroom; counter, fridge, oven and sink for a kitchen — parked against the walls so the middle stays clear. Follow with check_plan.","annotations":{"title":"Furnish a room","readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"room":{"type":"string","description":"Room id, exact name, partial name or room type. Case-insensitive."},"extra_items":{"type":"array","items":{"type":"string"},"description":"Additional catalog types to add on top of the standard kit."}},"required":["room"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"delete_entity","kind":"transact","impl":"imperative","description":"Remove a room, a door or window, or a piece of furniture. Deleting a room also deletes its openings and everything inside it. This always asks the person at the keyboard first.","annotations":{"title":"Delete something","readOnlyHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["room","opening","furniture"]},"reference":{"type":"string","description":"Id, name or label of the thing to remove."}},"required":["kind","reference"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"clear_room","kind":"act","impl":"imperative","description":"Take every piece of furniture out of one room, leaving the shell. Asks for confirmation.","annotations":{"title":"Empty a room","readOnlyHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"room":{"type":"string","description":"Room id, exact name, partial name or room type. Case-insensitive."}},"required":["room"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"edit_plan","kind":"act","impl":"imperative","description":"Rename the drawing, or change the standards it is measured against — the body diameter used for circulation, the turning circle, the minimum clear doorway, and how thick the walls are. Raise the standards to design for a wheelchair user; lower them to check an existing home against a walking frame.","annotations":{"title":"Rename or re-standardise the plan","readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"What to call this drawing."},"mobility_diameter_mm":{"type":"number","description":"Body width used for circulation. 900 mm is the wheelchair default; 700 mm is a walking frame."},"turning_circle_mm":{"type":"number","description":"Clear circle required in key rooms. 1500 mm is standard."},"min_clear_door_mm":{"type":"number","description":"Minimum clear doorway. 815 mm is the usual figure."},"interior_wall_mm":{"type":"number","description":"Thickness of internal partitions. 100 mm by default."},"exterior_wall_mm":{"type":"number","description":"Thickness of the outside envelope. 250 mm by default."}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"apply_batch","kind":"act","impl":"imperative","description":"Apply several edits as ONE atomic change with a single approval. Use this whenever a task needs more than one step — designing a room, fixing a list of findings, furnishing a flat — instead of asking the person to approve each edit separately. If any step is rejected, nothing is applied and you are told which step failed and why.","annotations":{"title":"Apply a set of changes","readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"intent":{"type":"string","description":"One sentence saying what this batch is for. It is the heading the person sees on the approval card, so write it for them."},"operations":{"type":"array","description":"The steps, applied in order.","items":{"type":"object","properties":{"op":{"type":"string","enum":["add_room","edit_room","add_opening","edit_opening","add_furniture","edit_furniture","furnish_room","delete_entity","clear_room","edit_plan","fix_violation"],"description":"Which operation to run."},"args":{"type":"object","description":"Exactly the arguments the standalone tool of that name takes."}},"required":["op","args"],"additionalProperties":false}}},"required":["intent","operations"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"undo","kind":"act","impl":"imperative","description":"Step the drawing backwards or forwards through its history, whoever made the changes. Use it when the person says an edit was wrong, or asks you to put something back. The history is shared, so this undoes their edits as readily as your own — say what you are about to roll back before you do it.","annotations":{"title":"Undo or redo","readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"steps":{"type":"number","description":"How many changes to step through. Default 1."},"direction":{"type":"string","enum":["undo","redo"],"description":"Default undo."}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"load_sample","kind":"act","impl":"imperative","description":"Replace the whole drawing: \"apartment\" is a furnished two-bedroom flat with real problems in it, \"accessible\" a bungalow that passes every rule (a worked example to copy from), \"shell\" an empty 48 m² box, and \"blank\" a completely empty page to design a home from nothing. Asks for confirmation because it discards the current plan.","annotations":{"title":"Load a starter plan","readOnlyHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"which":{"type":"string","enum":["apartment","accessible","shell","blank"]},"name":{"type":"string","description":"What to call the new drawing. Blank pages default to \"Untitled plan\"."}},"required":["which"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"fix_violation","kind":"act","impl":"imperative","description":"Apply the standard repair for one finding from check_plan — widen the door, add the window, re-park the furniture that is blocking the turning circle. Currently repairable rules: door.clear_width, access.unreachable, access.partial, access.turning_circle, plan.circulation. Prefer this over hand-editing when the fix is obvious.","annotations":{"title":"Repair a finding","readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"rule":{"type":"string","enum":["door.clear_width","access.unreachable","access.partial","access.turning_circle","plan.circulation"],"description":"The rule id from check_plan."},"entity":{"type":"string","description":"Optional: which room, door or item, when the rule fires more than once."}},"required":["rule"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"favicon":"/favicons/groundplan-nine.vercel.app.svg","apiSurface":"spec","category":"Productivity & Business","toolCount":30}}