← WebMCP Directory

Tool tree

groundplan-nine.vercel.app

Productivity & BusinessTools verified
Website
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…
Explore capabilities
    get_capabilitiesAnswer

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    get_tracing_imageAnswer

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    check_against_sourceAnswer

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    get_planAnswer

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    check_planAnswer

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    analyse_accessAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    compare_standardsAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    measureAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    list_catalogAnswer

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    get_selectionAnswer

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    export_planAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    get_activityAnswer

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "number",
            "description": "How many entries, newest first. Default 20."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    highlightAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    show_routeAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    edit_underlayAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    set_viewAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    add_roomAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    edit_roomAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    add_openingAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    edit_openingAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    add_furnitureAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    edit_furnitureAction

    Move or rotate a piece of furniture. Reference it by label, type or id. Rotation is clockwise; 0° faces south.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    furnish_roomAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    delete_entitySensitive Action

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    clear_roomAction

    Take every piece of furniture out of one room, leaving the shell. Asks for confirmation.

    View tool JSON
    {
      "name": "clear_room",
      "kind": "act",
      "impl": "imperative",
      "description": "Take every piece of furniture out of one room, leaving the shell. Asks for confirmation.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "room": {
            "type": "string",
            "description": "Room id, exact name, partial name or room type. Case-insensitive."
          }
        },
        "required": [
          "room"
        ],
        "additionalProperties": false
      }
    }
    edit_planAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    apply_batchAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    undoAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    load_sampleAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }
    fix_violationAction

    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.

    View tool JSON
    {
      "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.",
      "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
      }
    }