laydyne.com
Describe your space and workflow to AI. Build layouts, adapt process scenarios, and compare simulations through MCP or the built-in assistant.
First seen 2026-10-05 · Last seen 2026-10-05 · Source: webmcp.com
Answer 27 · Act 33 · Transact 4 · Score: Not yet scored
Tool inspector
set_underlay
Put a picture of the existing site (a floor plan, a scan, a photo) under a floor area to build over, and place it: image sends the file (base64; over 200,000 characters in pieces with uploadId); rectify straightens a photo taken at an angle from four points and their floor points (the picture is drawn again from straight above and replaces it, placed; later points name its pixels); placement sets numbers (top-left corner in floor metres, width in metres, rotation); level straightens a skewed scan (a line of the picture, or "auto"); scale sets metres from a known length between two pixels (a dimension line, a scale bar); align puts one or two pixels on floor points (two set scale, turn and place at once). Applied in that order; opacity and visible for the display; remove takes it away. A new picture on a floor area that has one starts afresh (its placement belongs to the old picture); the same picture sent again keeps it. Pixels are the picture’s own (as given, even when the stored copy is made smaller). The picture is saved with the project (files and cloud carry it; the browser keeps it apart), never in the building: calculations, checks and building.spaceHash ignore it, and it is not an edit (no revision, no Undo step). Returns where it lies (corners, metres per pixel, calibrated). Free; no AI call.
Page: /studio
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
floor |
string | no | Floor area (get_space.building.floors); the active one when left out. |
image |
object | no | A new picture (PNG, JPEG or WebP, at most 12 MB) for the floor area, replacing its old one but keeping the placement. Over 200000 base64 characters, send it in pieces: the first with offset 0, totalCharacters and sha256, the rest with uploadId and offset; the call with the last piece sets the picture, and may carry the other fields. Pictures over 4096 px or 2 MB are stored smaller; points are still given in the picture's own pixels. |
placement |
object | no | Numbers as they are: the unrotated picture’s top-left corner (floor metres), width in metres and turn, as a part is placed. |
level |
— | no | Straighten a skewed scan: turn the picture so the line from one pixel to another runs along x (horizontal) or z (vertical), 'from' staying put; or 'auto', measured from the drawing's own lines (trace_underlay reports the same skewDegrees). |
scale |
object | no | Set the scale from a known length: two pixels (the ends of a dimension line, a scale bar) and the metres between them; "from" stays where it is on the floor. |
align |
object | no | Put pixels on floor points: one point moves the picture; two set its scale and turn as well (no stretching). The quickest way to place a plan whose corner points you know. |
rectify |
object | no | Straighten a photo taken at an angle (a printed plan on a table, a map on a wall), which a scale and a turn cannot put right: the picture is drawn again as seen from straight above, from four of its points and their floor points, and replaces it, placed and scaled (scale "corners"). Points in later calls name the new picture’s pixels. Not with level, scale or align in the same call. |
opacity |
number | no | — |
visible |
boolean | no | — |
remove |
boolean | no | Take the floor area’s underlay away (alone in the call). |
operationId |
string | no | Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change. |
requestGroupId |
string | no | Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups. |
Raw JSON schema
{
"type": "object",
"properties": {
"floor": {
"description": "Floor area (get_space.building.floors); the active one when left out.",
"type": "string",
"minLength": 1,
"maxLength": 40
},
"image": {
"description": "A new picture (PNG, JPEG or WebP, at most 12 MB) for the floor area, replacing its old one but keeping the placement. Over 200000 base64 characters, send it in pieces: the first with offset 0, totalCharacters and sha256, the rest with uploadId and offset; the call with the last piece sets the picture, and may carry the other fields. Pictures over 4096 px or 2 MB are stored smaller; points are still given in the picture's own pixels.",
"type": "object",
"properties": {
"data": {
"type": "string",
"minLength": 1,
"maxLength": 200000,
"pattern": "^[A-Za-z0-9+/]*={0,2}$",
"description": "Base64 of the picture file (no data: prefix), or of one piece of it: at most 200000 characters a call."
},
"mimeType": {
"type": "string",
"enum": [
"image/png",
"image/jpeg",
"image/webp"
]
},
"name": {
"description": "Its file name.",
"type": "string",
"maxLength": 180
},
"totalCharacters": {
"description": "For a picture sent in pieces: the whole base64 length, with the first piece (offset 0).",
"type": "integer",
"minimum": 1,
"maximum": 16777216
},
"offset": {
"description": "For a piece: where it starts in the whole base64 text.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"uploadId": {
"description": "For every piece after the first: the uploadId it returned.",
"type": "string",
"maxLength": 80
},
"sha256": {
"description": "SHA-256 (hex) of the picture file’s bytes; checked when the last piece arrives.",
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"data"
],
"additionalProperties": false
},
"placement": {
"description": "Numbers as they are: the unrotated picture’s top-left corner (floor metres), width in metres and turn, as a part is placed.",
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -10000,
"maximum": 10000
},
"z": {
"type": "number",
"minimum": -10000,
"maximum": 10000
},
"width": {
"description": "Metres across the whole picture.",
"type": "number",
"minimum": 0.01,
"maximum": 20000
},
"rotation": {
"description": "Degrees counter-clockwise on the plan, about its centre.",
"type": "number",
"minimum": -360,
"maximum": 360
}
},
"additionalProperties": false
},
"level": {
"description": "Straighten a skewed scan: turn the picture so the line from one pixel to another runs along x (horizontal) or z (vertical), 'from' staying put; or 'auto', measured from the drawing's own lines (trace_underlay reports the same skewDegrees).",
"anyOf": [
{
"type": "string",
"const": "auto"
},
{
"type": "object",
"properties": {
"from": {
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -200000,
"maximum": 200000
},
"y": {
"type": "number",
"minimum": -200000,
"maximum": 200000
}
},
"required": [
"x",
"y"
],
"additionalProperties": false,
"description": "A point of the picture in its own pixels, as given: (0, 0) is its top-left corner, x to the right, y down."
},
"to": {
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -200000,
"maximum": 200000
},
"y": {
"type": "number",
"minimum": -200000,
"maximum": 200000
}
},
"required": [
"x",
"y"
],
"additionalProperties": false,
"description": "A point of the picture in its own pixels, as given: (0, 0) is its top-left corner, x to the right, y down."
},
"axis": {
"default": "nearest",
"type": "string",
"enum": [
"horizontal",
"vertical",
"nearest"
]
}
},
"required": [
"from",
"to"
],
"additionalProperties": false
}
]
},
"scale": {
"description": "Set the scale from a known length: two pixels (the ends of a dimension line, a scale bar) and the metres between them; \"from\" stays where it is on the floor.",
"type": "object",
"properties": {
"from": {
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -200000,
"maximum": 200000
},
"y": {
"type": "number",
"minimum": -200000,
"maximum": 200000
}
},
"required": [
"x",
"y"
],
"additionalProperties": false,
"description": "A point of the picture in its own pixels, as given: (0, 0) is its top-left corner, x to the right, y down."
},
"to": {
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -200000,
"maximum": 200000
},
"y": {
"type": "number",
"minimum": -200000,
"maximum": 200000
}
},
"required": [
"x",
"y"
],
"additionalProperties": false,
"description": "A point of the picture in its own pixels, as given: (0, 0) is its top-left corner, x to the right, y down."
},
"metres": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 20000,
"description": "The real distance between them."
}
},
"required": [
"from",
"to",
"metres"
],
"additionalProperties": false
},
"align": {
"description": "Put pixels on floor points: one point moves the picture; two set its scale and turn as well (no stretching). The quickest way to place a plan whose corner points you know.",
"type": "object",
"properties": {
"points": {
"minItems": 1,
"maxItems": 2,
"type": "array",
"items": {
"type": "object",
"properties": {
"pixel": {
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -200000,
"maximum": 200000
},
"y": {
"type": "number",
"minimum": -200000,
"maximum": 200000
}
},
"required": [
"x",
"y"
],
"additionalProperties": false,
"description": "A point of the picture in its own pixels, as given: (0, 0) is its top-left corner, x to the right, y down."
},
"floor": {
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -10000,
"maximum": 10000
},
"z": {
"type": "number",
"minimum": -10000,
"maximum": 10000
}
},
"required": [
"x",
"z"
],
"additionalProperties": false,
"description": "Floor metres of the floor area (x right, z down the plan)."
}
},
"required": [
"pixel",
"floor"
],
"additionalProperties": false
}
}
},
"required": [
"points"
],
"additionalProperties": false
},
"rectify": {
"description": "Straighten a photo taken at an angle (a printed plan on a table, a map on a wall), which a scale and a turn cannot put right: the picture is drawn again as seen from straight above, from four of its points and their floor points, and replaces it, placed and scaled (scale \"corners\"). Points in later calls name the new picture’s pixels. Not with level, scale or align in the same call.",
"type": "object",
"properties": {
"points": {
"minItems": 4,
"maxItems": 4,
"type": "array",
"items": {
"type": "object",
"properties": {
"pixel": {
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -200000,
"maximum": 200000
},
"y": {
"type": "number",
"minimum": -200000,
"maximum": 200000
}
},
"required": [
"x",
"y"
],
"additionalProperties": false,
"description": "A point of the picture in its own pixels, as given: (0, 0) is its top-left corner, x to the right, y down."
},
"floor": {
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -10000,
"maximum": 10000
},
"z": {
"type": "number",
"minimum": -10000,
"maximum": 10000
}
},
"required": [
"x",
"z"
],
"additionalProperties": false,
"description": "Floor metres of the floor area (x right, z down the plan)."
}
},
"required": [
"pixel",
"floor"
],
"additionalProperties": false
},
"description": "Four points of the picture and where they lie on the floor, in the same order round both: the corners of the outer walls or of a room, as far apart as the plan allows."
},
"marginMetres": {
"description": "Floor metres kept round the points (dimension lines, a scale bar); 15% of their span, at least 1 m, when left out.",
"type": "number",
"minimum": 0,
"maximum": 1000
}
},
"required": [
"points"
],
"additionalProperties": false
},
"opacity": {
"type": "number",
"minimum": 0.05,
"maximum": 1
},
"visible": {
"type": "boolean"
},
"remove": {
"description": "Take the floor area’s underlay away (alone in the call).",
"type": "boolean"
},
"operationId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$",
"description": "Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."
},
"requestGroupId": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."
}
},
"additionalProperties": false
}
Similar websites
eworker.ca
E-Worker is business infrastructure powered by AI, with focused apps and connected business work.
takemeup.cv
Free CV builder: make a polished, ATS-friendly CV in minutes. No watermarks, no sign-up. Import from LinkedIn, tailor to any job, export PDF.
urban-planning-copilot.heisenbug.in
Urban Planning Copilot
vide.zerdalu.com
Vide