Skip to main content
Glama

Craft Quantities: construction material calculators

Draw a plan and list its materials

create_drawing
Read-onlyIdempotent

Draws one plan on the Construction Canvas from the shapes, rooms laid out by adjacency on a grid, house figures, drawing commands, canvas document or template given, and returns its materials list, a plan of each level, labour hours, a link that opens the drawing on the canvas, and a file. It does not size structure.

Input Schema

NameRequiredDescriptionDefault
nameNoThe project's name in the file.
houseNoThe House Estimator's form: the house drawn as the estimator draws it.
detailNofull (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read.full
layoutNoRooms by name, size and which room each stands against, laid out on a grid: shared walls drawn once as partitions, every snap or move reported, and each room checked to close.
shapesNoSimple shapes the assistant has read from the reader's words — a room, a deck, a patio, a bed, a path, a fence of legs and turns — compiled into the canvas's own commands. Every length with its unit.
systemNoThe unit system inputs left out open in, and the one the page link opens in. The answer comes in both.metric
variantNoWith template: one of its two "what changes if" variants, by id; a wrong one is refused with the template's own list.
commandsNoDrawing commands, in order, on the canvas's blank drawing (one storey; the wall, partition, window and door types). The whole request is at most 64 KiB.
documentNoA Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener.
templateNoA Construction Canvas template's slug (the template index lists them: single-room, deck, two-car-garage …): the drawing its page shows, in the reader's system, with a link that opens it.
inputUnitsNoSend "base" to pass bare numbers on dimensioned inputs in base units (m, m², L, kg …), as the published test vectors are written. Without it a length, area or volume must carry its unit.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "assumptions": {
      -        "items": {
      -          "required": [
      -            "field",
      -            "reason"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "citation": {
      -        "properties": {
      -          "accessDate": {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "author": {
      -            "type": "string"
      -          },
      -          "formats": {
      -            "properties": {
      -              "apa": {
      -                "type": "string"
      -              },
      -              "bibtex": {
      -                "type": "string"
      -              },
      -              "harvard": {
      -                "type": "string"
      -              },
      -              "plain": {
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "plain",
      -              "apa",
      -              "harvard",
      -              "bibtex"
      -            ],
      -            "type": "object"
      -          },
      -          "sourcesChecked": {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "title": {
      -            "type": "string"
      -          },
      -          "url": {
      -            "type": "string"
      -          },
      -          "version": {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          }
      -        },
      -        "required": [
      -          "author",
      -          "title",
      -          "url",
      -          "formats",
      -          "accessDate"
      -        ],
      -        "type": "object"
      -      },
      -      "counts": {
      -        "required": [
      -          "walls",
      -          "openings",
      -          "levels"
      -        ],
      -        "type": "object"
      -      },
      -      "document": {
      -        "required": [
      -          "schema",
      -          "units",
      -          "counters",
      -          "levels",
      -          "types",
      -          "entities",
      -          "assumed",
      -          "updatedAt"
      -        ],
      -        "type": "object"
      -      },
      -      "drawingLink": {
      -        "type": "string"
      -      },
      -      "engine": {
      -        "type": "object"
      -      },
      -      "file": {
      -        "properties": {
      -          "content": {
      -            "properties": {
      -              "exportedAt": {
      -                "type": "string"
      -              },
      -              "magic": {
      -                "const": "craftquantities.backup"
      -              },
      -              "stores": {
      -                "type": "object"
      -              },
      -              "v": {
      -                "type": "integer"
      -              }
      -            },
      -            "required": [
      -              "magic",
      -              "v",
      -              "exportedAt",
      -              "stores"
      -            ],
      -            "type": "object"
      -          },
      -          "filename": {
      -            "type": "string"
      -          },
      -          "mediaType": {
      -            "const": "application/json"
      -          }
      -        },
      -        "required": [
      -          "filename",
      -          "mediaType",
      -          "content"
      -        ],
      -        "type": "object"
      -      },
      -      "from": {
      -        "enum": [
      -          "house",
      -          "commands",
      -          "document",
      -          "shapes",
      -          "template",
      -          "layout"
      -        ]
      -      },
      -      "house": {
      -        "type": "object"
      -      },
      -      "howToOpen": {
      -        "type": "string"
      -      },
      -      "labour": {
      -        "required": [
      -          "rows",
      -          "totalHours",
      -          "programme",
      -          "likelyDays",
      -          "note"
      -        ],
      -        "type": "object"
      -      },
      -      "layout": {
      -        "description": "The rooms as laid out (both unit systems), the walls drawn, every figure snapped or room moved, and the closure check.",
      -        "required": [
      -          "grid",
      -          "rooms",
      -          "walls",
      -          "adjustments",
      -          "checks"
      -        ],
      -        "type": "object"
      -      },
      -      "licence": {
      -        "properties": {
      -          "attribution": {
      -            "type": "string"
      -          },
      -          "name": {
      -            "type": "string"
      -          },
      -          "url": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "name",
      -          "url",
      -          "attribution"
      -        ],
      -        "type": "object"
      -      },
      -      "lines": {
      -        "items": {
      -          "required": [
      -            "label",
      -            "quantity",
      -            "unit",
      -            "zone"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "links": {
      -        "properties": {
      -          "canvas": {
      -            "type": "string"
      -          },
      -          "drawing": {
      -            "anyOf": [
      -              {
      -                "description": "Opens this drawing on the canvas as a new project's: the drawing rides in the fragment, so nothing is uploaded. Null when the drawing is too large for a link.",
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "estimator": {
      -            "type": "string"
      -          },
      -          "template": {
      -            "description": "The template's page, when the drawing is a template's: cite it beside the drawing's link.",
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "canvas",
      -          "drawing"
      -        ],
      -        "type": "object"
      -      },
      -      "notice": {
      -        "type": "string"
      -      },
      -      "objects": {
      -        "items": {
      -          "required": [
      -            "key",
      -            "label",
      -            "quantity"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "omitted": {
      -        "type": "array"
      -      },
      -      "plans": {
      -        "type": "array"
      -      },
      -      "rows": {
      -        "items": {
      -          "properties": {
      -            "calculator": {
      -              "required": [
      -                "slug",
      -                "title"
      -              ],
      -              "type": "object"
      -            },
      -            "key": {
      -              "type": "string"
      -            },
      -            "label": {
      -              "type": "string"
      -            },
      -            "note": {
      -              "type": "string"
      -            },
      -            "order": {
      -              "required": [
      -                "quantity",
      -                "unit"
      -              ],
      -              "type": "object"
      -            },
      -            "otherSystem": {
      -              "anyOf": [
      -                {
      -                  "required": [
      -                    "quantity",
      -                    "unit"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "quantity": {
      -              "type": "number"
      -            },
      -            "section": {
      -              "type": "string"
      -            },
      -            "unit": {
      -              "type": "string"
      -            },
      -            "where": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "key",
      -            "section",
      -            "label",
      -            "where",
      -            "quantity",
      -            "unit",
      -            "otherSystem",
      -            "calculator"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "shapeNotes": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "shapes": {
      -        "items": {
      -          "required": [
      -            "shape",
      -            "ref",
      -            "made",
      -            "figures"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "sources": {
      -        "type": "array"
      -      },
      -      "system": {
      -        "enum": [
      -          "metric",
      -          "imperial"
      -        ]
      -      },
      -      "template": {
      -        "description": "The template it was drawn from: its page, the variant drawn (null: as the page shows it) and its variants.",
      -        "required": [
      -          "slug",
      -          "name",
      -          "page",
      -          "variant",
      -          "variants"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "engine",
      -      "system",
      -      "from",
      -      "document",
      -      "counts",
      -      "rows",
      -      "objects",
      -      "lines",
      -      "assumptions",
      -      "omitted",
      -      "plans",
      -      "labour",
      -      "sources",
      -      "file",
      -      "links",
      -      "howToOpen",
      -      "citation",
      -      "licence",
      -      "notice"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "citation": {
      -        "description": "The one citation line, built from the answer's own data.",
      -        "type": "string"
      -      },
      -      "detail": {
      -        "const": "summary"
      -      },
      -      "lines": {
      -        "description": "The result lines, as the report's table gives them.",
      -        "items": {
      -          "additionalProperties": {
      -            "type": "string"
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "more": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "notes": {
      -        "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "open": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "title": {
      -        "type": "string"
      -      },
      -      "tool": {
      -        "type": "string"
      -      },
      -      "url": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "required": [
      -      "detail",
      -      "tool",
      -      "title",
      -      "lines",
      -      "notes",
      -      "citation",
      -      "url",
      -      "open",
      -      "more"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "assumptions": {
      +        "items": {
      +          "required": [
      +            "field",
      +            "reason"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "citation": {
      +        "properties": {
      +          "accessDate": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "author": {
      +            "type": "string"
      +          },
      +          "formats": {
      +            "properties": {
      +              "apa": {
      +                "type": "string"
      +              },
      +              "bibtex": {
      +                "type": "string"
      +              },
      +              "harvard": {
      +                "type": "string"
      +              },
      +              "plain": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "plain",
      +              "apa",
      +              "harvard",
      +              "bibtex"
      +            ],
      +            "type": "object"
      +          },
      +          "sourcesChecked": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": "string"
      +          },
      +          "version": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          }
      +        },
      +        "required": [
      +          "author",
      +          "title",
      +          "url",
      +          "formats",
      +          "accessDate"
      +        ],
      +        "type": "object"
      +      },
      +      "counts": {
      +        "required": [
      +          "walls",
      +          "openings",
      +          "levels"
      +        ],
      +        "type": "object"
      +      },
      +      "document": {
      +        "required": [
      +          "schema",
      +          "units",
      +          "counters",
      +          "levels",
      +          "types",
      +          "entities",
      +          "assumed",
      +          "updatedAt"
      +        ],
      +        "type": "object"
      +      },
      +      "drawingLink": {
      +        "type": "string"
      +      },
      +      "engine": {
      +        "type": "object"
      +      },
      +      "file": {
      +        "properties": {
      +          "content": {
      +            "properties": {
      +              "exportedAt": {
      +                "type": "string"
      +              },
      +              "magic": {
      +                "const": "craftquantities.backup"
      +              },
      +              "stores": {
      +                "type": "object"
      +              },
      +              "v": {
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "magic",
      +              "v",
      +              "exportedAt",
      +              "stores"
      +            ],
      +            "type": "object"
      +          },
      +          "filename": {
      +            "type": "string"
      +          },
      +          "mediaType": {
      +            "const": "application/json"
      +          }
      +        },
      +        "required": [
      +          "filename",
      +          "mediaType",
      +          "content"
      +        ],
      +        "type": "object"
      +      },
      +      "from": {
      +        "enum": [
      +          "house",
      +          "commands",
      +          "document",
      +          "shapes",
      +          "template",
      +          "layout"
      +        ]
      +      },
      +      "house": {
      +        "type": "object"
      +      },
      +      "howToOpen": {
      +        "type": "string"
      +      },
      +      "labour": {
      +        "required": [
      +          "rows",
      +          "totalHours",
      +          "programme",
      +          "likelyDays",
      +          "note"
      +        ],
      +        "type": "object"
      +      },
      +      "layout": {
      +        "description": "The rooms as laid out (both unit systems), the walls drawn, every figure snapped or room moved, and the closure check.",
      +        "required": [
      +          "grid",
      +          "rooms",
      +          "walls",
      +          "adjustments",
      +          "checks"
      +        ],
      +        "type": "object"
      +      },
      +      "licence": {
      +        "properties": {
      +          "attribution": {
      +            "type": "string"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "url",
      +          "attribution"
      +        ],
      +        "type": "object"
      +      },
      +      "lines": {
      +        "items": {
      +          "required": [
      +            "label",
      +            "quantity",
      +            "unit",
      +            "zone"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "links": {
      +        "properties": {
      +          "canvas": {
      +            "type": "string"
      +          },
      +          "drawing": {
      +            "anyOf": [
      +              {
      +                "description": "Opens this drawing on the canvas as a new project's: the drawing rides in the fragment, so nothing is uploaded. Null when the drawing is too large for a link.",
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "estimator": {
      +            "type": "string"
      +          },
      +          "template": {
      +            "description": "The template's page, when the drawing is a template's: cite it beside the drawing's link.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "canvas",
      +          "drawing"
      +        ],
      +        "type": "object"
      +      },
      +      "notice": {
      +        "type": "string"
      +      },
      +      "objects": {
      +        "items": {
      +          "required": [
      +            "key",
      +            "label",
      +            "quantity"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "omitted": {
      +        "type": "array"
      +      },
      +      "plans": {
      +        "type": "array"
      +      },
      +      "rows": {
      +        "items": {
      +          "properties": {
      +            "calculator": {
      +              "required": [
      +                "slug",
      +                "title"
      +              ],
      +              "type": "object"
      +            },
      +            "key": {
      +              "type": "string"
      +            },
      +            "label": {
      +              "type": "string"
      +            },
      +            "note": {
      +              "type": "string"
      +            },
      +            "order": {
      +              "required": [
      +                "quantity",
      +                "unit"
      +              ],
      +              "type": "object"
      +            },
      +            "otherSystem": {
      +              "anyOf": [
      +                {
      +                  "required": [
      +                    "quantity",
      +                    "unit"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "quantity": {
      +              "type": "number"
      +            },
      +            "section": {
      +              "type": "string"
      +            },
      +            "unit": {
      +              "type": "string"
      +            },
      +            "where": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "key",
      +            "section",
      +            "label",
      +            "where",
      +            "quantity",
      +            "unit",
      +            "otherSystem",
      +            "calculator"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "shapeNotes": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "shapes": {
      +        "items": {
      +          "required": [
      +            "shape",
      +            "ref",
      +            "made",
      +            "figures"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "sources": {
      +        "type": "array"
      +      },
      +      "system": {
      +        "enum": [
      +          "metric",
      +          "imperial"
      +        ]
      +      },
      +      "template": {
      +        "description": "The template it was drawn from: its page, the variant drawn (null: as the page shows it) and its variants.",
      +        "required": [
      +          "slug",
      +          "name",
      +          "page",
      +          "variant",
      +          "variants"
      +        ],
      +        "type": "object"
      +      },
      +      "worktops": {
      +        "description": "The drawing's worktops as the canvas's dock lists them: each fitted piece's true lengths, the worktop lengths to buy and the edge banding, in both unit systems.",
      +        "items": {
      +          "properties": {
      +            "detail": {
      +              "type": "string"
      +            },
      +            "figure": {
      +              "type": "string"
      +            },
      +            "key": {
      +              "type": "string"
      +            },
      +            "label": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "key",
      +            "label",
      +            "figure"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "engine",
      +      "system",
      +      "from",
      +      "document",
      +      "counts",
      +      "rows",
      +      "objects",
      +      "lines",
      +      "assumptions",
      +      "omitted",
      +      "plans",
      +      "labour",
      +      "sources",
      +      "file",
      +      "links",
      +      "howToOpen",
      +      "citation",
      +      "licence",
      +      "notice"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "citation": {
      +        "description": "The one citation line, built from the answer's own data.",
      +        "type": "string"
      +      },
      +      "detail": {
      +        "const": "summary"
      +      },
      +      "lines": {
      +        "description": "The result lines, as the report's table gives them.",
      +        "items": {
      +          "additionalProperties": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "more": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "notes": {
      +        "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "open": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "tool": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "detail",
      +      "tool",
      +      "title",
      +      "lines",
      +      "notes",
      +      "citation",
      +      "url",
      +      "open",
      +      "more"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed4 schema fields changed
    • addedInput schema / properties / layout
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Rooms by name, size and which room each stands against, laid out on a grid: shared walls drawn once as partitions, every snap or move reported, and each room checked to close.",
      +  "properties": {
      +    "doors": {
      +      "description": "Each between two rooms, or in a room's side (an outside door where that side is an exterior wall).",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "between": {
      +            "description": "A door only: the two rooms it joins, on the wall they share.",
      +            "items": {
      +              "maxLength": 60,
      +              "type": "string"
      +            },
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "type": "array"
      +          },
      +          "offset": {
      +            "description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle.",
      +            "oneOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "maxLength": 200,
      +                "type": "string"
      +              },
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "unit": {
      +                    "maxLength": 40,
      +                    "type": "string"
      +                  },
      +                  "value": {
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "value"
      +                ],
      +                "type": "object"
      +              }
      +            ]
      +          },
      +          "room": {
      +            "description": "The room it is in, by name.",
      +            "maxLength": 60,
      +            "type": "string"
      +          },
      +          "side": {
      +            "description": "The side of that room.",
      +            "enum": [
      +              "south",
      +              "east",
      +              "north",
      +              "west"
      +            ]
      +          },
      +          "width": {
      +            "description": "The opening's width; left out, the canvas's default.",
      +            "oneOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "maxLength": 200,
      +                "type": "string"
      +              },
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "unit": {
      +                    "maxLength": 40,
      +                    "type": "string"
      +                  },
      +                  "value": {
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "value"
      +                ],
      +                "type": "object"
      +              }
      +            ]
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "maxItems": 60,
      +      "type": "array"
      +    },
      +    "grid": {
      +      "description": "The grid every figure is snapped to (default 10 mm, or 1/2 in in US units). Each snap that changed a figure is reported.",
      +      "oneOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "maxLength": 200,
      +          "type": "string"
      +        },
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "unit": {
      +              "maxLength": 40,
      +              "type": "string"
      +            },
      +            "value": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "value"
      +          ],
      +          "type": "object"
      +        }
      +      ]
      +    },
      +    "rooms": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "against": {
      +            "additionalProperties": false,
      +            "description": "Beside a side of an earlier room, sharing that wall.",
      +            "properties": {
      +              "align": {
      +                "description": "Along that side: flush with its west or south end (start, the default), centred, or flush with the other end.",
      +                "enum": [
      +                  "start",
      +                  "centre",
      +                  "end"
      +                ]
      +              },
      +              "offset": {
      +                "oneOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "maxLength": 200,
      +                    "type": "string"
      +                  },
      +                  {
      +                    "additionalProperties": false,
      +                    "properties": {
      +                      "unit": {
      +                        "maxLength": 40,
      +                        "type": "string"
      +                      },
      +                      "value": {
      +                        "type": "number"
      +                      }
      +                    },
      +                    "required": [
      +                      "value"
      +                    ],
      +                    "type": "object"
      +                  }
      +                ]
      +              },
      +              "room": {
      +                "maxLength": 60,
      +                "type": "string"
      +              },
      +              "side": {
      +                "enum": [
      +                  "south",
      +                  "east",
      +                  "north",
      +                  "west"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "room",
      +              "side"
      +            ],
      +            "type": "object"
      +          },
      +          "at": {
      +            "additionalProperties": false,
      +            "description": "Its south-west corner. The first room without at or against is at the origin.",
      +            "properties": {
      +              "x": {
      +                "oneOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "maxLength": 200,
      +                    "type": "string"
      +                  },
      +                  {
      +                    "additionalProperties": false,
      +                    "properties": {
      +                      "unit": {
      +                        "maxLength": 40,
      +                        "type": "string"
      +                      },
      +                      "value": {
      +                        "type": "number"
      +                      }
      +                    },
      +                    "required": [
      +                      "value"
      +                    ],
      +                    "type": "object"
      +                  }
      +                ]
      +              },
      +              "y": {
      +                "oneOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "maxLength": 200,
      +                    "type": "string"
      +                  },
      +                  {
      +                    "additionalProperties": false,
      +                    "properties": {
      +                      "unit": {
      +                        "maxLength": 40,
      +                        "type": "string"
      +                      },
      +                      "value": {
      +                        "type": "number"
      +                      }
      +                    },
      +                    "required": [
      +                      "value"
      +                    ],
      +                    "type": "object"
      +                  }
      +                ]
      +              }
      +            },
      +            "required": [
      +              "x",
      +              "y"
      +            ],
      +            "type": "object"
      +          },
      +          "depth": {
      +            "description": "Along y (north), wall centre to wall centre.",
      +            "oneOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "maxLength": 200,
      +                "type": "string"
      +              },
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "unit": {
      +                    "maxLength": 40,
      +                    "type": "string"
      +                  },
      +                  "value": {
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "value"
      +                ],
      +                "type": "object"
      +              }
      +            ]
      +          },
      +          "name": {
      +            "description": "Unique in the layout; openings and later rooms refer to it.",
      +            "maxLength": 60,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "width": {
      +            "description": "Along x (east), wall centre to wall centre.",
      +            "oneOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "maxLength": 200,
      +                "type": "string"
      +              },
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "unit": {
      +                    "maxLength": 40,
      +                    "type": "string"
      +                  },
      +                  "value": {
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "value"
      +                ],
      +                "type": "object"
      +              }
      +            ]
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "width",
      +          "depth"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 30,
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "windows": {
      +      "description": "Each in a room's side, on an exterior wall.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "between": {
      +            "description": "A door only: the two rooms it joins, on the wall they share.",
      +            "items": {
      +              "maxLength": 60,
      +              "type": "string"
      +            },
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "type": "array"
      +          },
      +          "offset": {
      +            "description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle.",
      +            "oneOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "maxLength": 200,
      +                "type": "string"
      +              },
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "unit": {
      +                    "maxLength": 40,
      +                    "type": "string"
      +                  },
      +                  "value": {
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "value"
      +                ],
      +                "type": "object"
      +              }
      +            ]
      +          },
      +          "room": {
      +            "description": "The room it is in, by name.",
      +            "maxLength": 60,
      +            "type": "string"
      +          },
      +          "side": {
      +            "description": "The side of that room.",
      +            "enum": [
      +              "south",
      +              "east",
      +              "north",
      +              "west"
      +            ]
      +          },
      +          "width": {
      +            "description": "The opening's width; left out, the canvas's default.",
      +            "oneOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "maxLength": 200,
      +                "type": "string"
      +              },
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "unit": {
      +                    "maxLength": 40,
      +                    "type": "string"
      +                  },
      +                  "value": {
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "value"
      +                ],
      +                "type": "object"
      +              }
      +            ]
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "maxItems": 60,
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "rooms"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / template
      Added value: +{
      +  "description": "A Construction Canvas template's slug (the template index lists them: single-room, deck, two-car-garage …): the drawing its page shows, in the reader's system, with a link that opens it.",
      +  "pattern": "^[a-z0-9-]{1,60}$",
      +  "type": "string"
      +}
    • addedInput schema / properties / variant
      Added value: +{
      +  "description": "With template: one of its two \"what changes if\" variants, by id; a wrong one is refused with the template's own list.",
      +  "pattern": "^[a-z0-9-]{1,40}$",
      +  "type": "string"
      +}
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "assumptions": {
      -        "items": {
      -          "required": [
      -            "field",
      -            "reason"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "citation": {
      -        "properties": {
      -          "accessDate": {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "author": {
      -            "type": "string"
      -          },
      -          "formats": {
      -            "properties": {
      -              "apa": {
      -                "type": "string"
      -              },
      -              "bibtex": {
      -                "type": "string"
      -              },
      -              "harvard": {
      -                "type": "string"
      -              },
      -              "plain": {
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "plain",
      -              "apa",
      -              "harvard",
      -              "bibtex"
      -            ],
      -            "type": "object"
      -          },
      -          "sourcesChecked": {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "title": {
      -            "type": "string"
      -          },
      -          "url": {
      -            "type": "string"
      -          },
      -          "version": {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          }
      -        },
      -        "required": [
      -          "author",
      -          "title",
      -          "url",
      -          "formats",
      -          "accessDate"
      -        ],
      -        "type": "object"
      -      },
      -      "counts": {
      -        "required": [
      -          "walls",
      -          "openings",
      -          "levels"
      -        ],
      -        "type": "object"
      -      },
      -      "document": {
      -        "required": [
      -          "schema",
      -          "units",
      -          "counters",
      -          "levels",
      -          "types",
      -          "entities",
      -          "assumed",
      -          "updatedAt"
      -        ],
      -        "type": "object"
      -      },
      -      "drawingLink": {
      -        "type": "string"
      -      },
      -      "engine": {
      -        "type": "object"
      -      },
      -      "file": {
      -        "properties": {
      -          "content": {
      -            "properties": {
      -              "exportedAt": {
      -                "type": "string"
      -              },
      -              "magic": {
      -                "const": "craftquantities.backup"
      -              },
      -              "stores": {
      -                "type": "object"
      -              },
      -              "v": {
      -                "type": "integer"
      -              }
      -            },
      -            "required": [
      -              "magic",
      -              "v",
      -              "exportedAt",
      -              "stores"
      -            ],
      -            "type": "object"
      -          },
      -          "filename": {
      -            "type": "string"
      -          },
      -          "mediaType": {
      -            "const": "application/json"
      -          }
      -        },
      -        "required": [
      -          "filename",
      -          "mediaType",
      -          "content"
      -        ],
      -        "type": "object"
      -      },
      -      "from": {
      -        "enum": [
      -          "house",
      -          "commands",
      -          "document",
      -          "shapes"
      -        ]
      -      },
      -      "house": {
      -        "type": "object"
      -      },
      -      "howToOpen": {
      -        "type": "string"
      -      },
      -      "labour": {
      -        "required": [
      -          "rows",
      -          "totalHours",
      -          "programme",
      -          "likelyDays",
      -          "note"
      -        ],
      -        "type": "object"
      -      },
      -      "licence": {
      -        "properties": {
      -          "attribution": {
      -            "type": "string"
      -          },
      -          "name": {
      -            "type": "string"
      -          },
      -          "url": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "name",
      -          "url",
      -          "attribution"
      -        ],
      -        "type": "object"
      -      },
      -      "lines": {
      -        "items": {
      -          "required": [
      -            "label",
      -            "quantity",
      -            "unit",
      -            "zone"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "links": {
      -        "properties": {
      -          "canvas": {
      -            "type": "string"
      -          },
      -          "drawing": {
      -            "anyOf": [
      -              {
      -                "description": "Opens this drawing on the canvas as a new project's: the drawing rides in the fragment, so nothing is uploaded. Null when the drawing is too large for a link.",
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "estimator": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "canvas",
      -          "drawing"
      -        ],
      -        "type": "object"
      -      },
      -      "notice": {
      -        "type": "string"
      -      },
      -      "objects": {
      -        "items": {
      -          "required": [
      -            "key",
      -            "label",
      -            "quantity"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "omitted": {
      -        "type": "array"
      -      },
      -      "plans": {
      -        "type": "array"
      -      },
      -      "rows": {
      -        "items": {
      -          "properties": {
      -            "calculator": {
      -              "required": [
      -                "slug",
      -                "title"
      -              ],
      -              "type": "object"
      -            },
      -            "key": {
      -              "type": "string"
      -            },
      -            "label": {
      -              "type": "string"
      -            },
      -            "note": {
      -              "type": "string"
      -            },
      -            "order": {
      -              "required": [
      -                "quantity",
      -                "unit"
      -              ],
      -              "type": "object"
      -            },
      -            "otherSystem": {
      -              "anyOf": [
      -                {
      -                  "required": [
      -                    "quantity",
      -                    "unit"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "quantity": {
      -              "type": "number"
      -            },
      -            "section": {
      -              "type": "string"
      -            },
      -            "unit": {
      -              "type": "string"
      -            },
      -            "where": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "key",
      -            "section",
      -            "label",
      -            "where",
      -            "quantity",
      -            "unit",
      -            "otherSystem",
      -            "calculator"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "shapeNotes": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "shapes": {
      -        "items": {
      -          "required": [
      -            "shape",
      -            "ref",
      -            "made",
      -            "figures"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "sources": {
      -        "type": "array"
      -      },
      -      "system": {
      -        "enum": [
      -          "metric",
      -          "imperial"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "engine",
      -      "system",
      -      "from",
      -      "document",
      -      "counts",
      -      "rows",
      -      "objects",
      -      "lines",
      -      "assumptions",
      -      "omitted",
      -      "plans",
      -      "labour",
      -      "sources",
      -      "file",
      -      "links",
      -      "howToOpen",
      -      "citation",
      -      "licence",
      -      "notice"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "citation": {
      -        "description": "The one citation line, built from the answer's own data.",
      -        "type": "string"
      -      },
      -      "detail": {
      -        "const": "summary"
      -      },
      -      "lines": {
      -        "description": "The result lines, as the report's table gives them.",
      -        "items": {
      -          "additionalProperties": {
      -            "type": "string"
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "more": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "notes": {
      -        "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "open": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "title": {
      -        "type": "string"
      -      },
      -      "tool": {
      -        "type": "string"
      -      },
      -      "url": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "required": [
      -      "detail",
      -      "tool",
      -      "title",
      -      "lines",
      -      "notes",
      -      "citation",
      -      "url",
      -      "open",
      -      "more"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "assumptions": {
      +        "items": {
      +          "required": [
      +            "field",
      +            "reason"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "citation": {
      +        "properties": {
      +          "accessDate": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "author": {
      +            "type": "string"
      +          },
      +          "formats": {
      +            "properties": {
      +              "apa": {
      +                "type": "string"
      +              },
      +              "bibtex": {
      +                "type": "string"
      +              },
      +              "harvard": {
      +                "type": "string"
      +              },
      +              "plain": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "plain",
      +              "apa",
      +              "harvard",
      +              "bibtex"
      +            ],
      +            "type": "object"
      +          },
      +          "sourcesChecked": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": "string"
      +          },
      +          "version": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          }
      +        },
      +        "required": [
      +          "author",
      +          "title",
      +          "url",
      +          "formats",
      +          "accessDate"
      +        ],
      +        "type": "object"
      +      },
      +      "counts": {
      +        "required": [
      +          "walls",
      +          "openings",
      +          "levels"
      +        ],
      +        "type": "object"
      +      },
      +      "document": {
      +        "required": [
      +          "schema",
      +          "units",
      +          "counters",
      +          "levels",
      +          "types",
      +          "entities",
      +          "assumed",
      +          "updatedAt"
      +        ],
      +        "type": "object"
      +      },
      +      "drawingLink": {
      +        "type": "string"
      +      },
      +      "engine": {
      +        "type": "object"
      +      },
      +      "file": {
      +        "properties": {
      +          "content": {
      +            "properties": {
      +              "exportedAt": {
      +                "type": "string"
      +              },
      +              "magic": {
      +                "const": "craftquantities.backup"
      +              },
      +              "stores": {
      +                "type": "object"
      +              },
      +              "v": {
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "magic",
      +              "v",
      +              "exportedAt",
      +              "stores"
      +            ],
      +            "type": "object"
      +          },
      +          "filename": {
      +            "type": "string"
      +          },
      +          "mediaType": {
      +            "const": "application/json"
      +          }
      +        },
      +        "required": [
      +          "filename",
      +          "mediaType",
      +          "content"
      +        ],
      +        "type": "object"
      +      },
      +      "from": {
      +        "enum": [
      +          "house",
      +          "commands",
      +          "document",
      +          "shapes",
      +          "template",
      +          "layout"
      +        ]
      +      },
      +      "house": {
      +        "type": "object"
      +      },
      +      "howToOpen": {
      +        "type": "string"
      +      },
      +      "labour": {
      +        "required": [
      +          "rows",
      +          "totalHours",
      +          "programme",
      +          "likelyDays",
      +          "note"
      +        ],
      +        "type": "object"
      +      },
      +      "layout": {
      +        "description": "The rooms as laid out (both unit systems), the walls drawn, every figure snapped or room moved, and the closure check.",
      +        "required": [
      +          "grid",
      +          "rooms",
      +          "walls",
      +          "adjustments",
      +          "checks"
      +        ],
      +        "type": "object"
      +      },
      +      "licence": {
      +        "properties": {
      +          "attribution": {
      +            "type": "string"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "url",
      +          "attribution"
      +        ],
      +        "type": "object"
      +      },
      +      "lines": {
      +        "items": {
      +          "required": [
      +            "label",
      +            "quantity",
      +            "unit",
      +            "zone"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "links": {
      +        "properties": {
      +          "canvas": {
      +            "type": "string"
      +          },
      +          "drawing": {
      +            "anyOf": [
      +              {
      +                "description": "Opens this drawing on the canvas as a new project's: the drawing rides in the fragment, so nothing is uploaded. Null when the drawing is too large for a link.",
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "estimator": {
      +            "type": "string"
      +          },
      +          "template": {
      +            "description": "The template's page, when the drawing is a template's: cite it beside the drawing's link.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "canvas",
      +          "drawing"
      +        ],
      +        "type": "object"
      +      },
      +      "notice": {
      +        "type": "string"
      +      },
      +      "objects": {
      +        "items": {
      +          "required": [
      +            "key",
      +            "label",
      +            "quantity"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "omitted": {
      +        "type": "array"
      +      },
      +      "plans": {
      +        "type": "array"
      +      },
      +      "rows": {
      +        "items": {
      +          "properties": {
      +            "calculator": {
      +              "required": [
      +                "slug",
      +                "title"
      +              ],
      +              "type": "object"
      +            },
      +            "key": {
      +              "type": "string"
      +            },
      +            "label": {
      +              "type": "string"
      +            },
      +            "note": {
      +              "type": "string"
      +            },
      +            "order": {
      +              "required": [
      +                "quantity",
      +                "unit"
      +              ],
      +              "type": "object"
      +            },
      +            "otherSystem": {
      +              "anyOf": [
      +                {
      +                  "required": [
      +                    "quantity",
      +                    "unit"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "quantity": {
      +              "type": "number"
      +            },
      +            "section": {
      +              "type": "string"
      +            },
      +            "unit": {
      +              "type": "string"
      +            },
      +            "where": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "key",
      +            "section",
      +            "label",
      +            "where",
      +            "quantity",
      +            "unit",
      +            "otherSystem",
      +            "calculator"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "shapeNotes": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "shapes": {
      +        "items": {
      +          "required": [
      +            "shape",
      +            "ref",
      +            "made",
      +            "figures"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "sources": {
      +        "type": "array"
      +      },
      +      "system": {
      +        "enum": [
      +          "metric",
      +          "imperial"
      +        ]
      +      },
      +      "template": {
      +        "description": "The template it was drawn from: its page, the variant drawn (null: as the page shows it) and its variants.",
      +        "required": [
      +          "slug",
      +          "name",
      +          "page",
      +          "variant",
      +          "variants"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "engine",
      +      "system",
      +      "from",
      +      "document",
      +      "counts",
      +      "rows",
      +      "objects",
      +      "lines",
      +      "assumptions",
      +      "omitted",
      +      "plans",
      +      "labour",
      +      "sources",
      +      "file",
      +      "links",
      +      "howToOpen",
      +      "citation",
      +      "licence",
      +      "notice"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "citation": {
      +        "description": "The one citation line, built from the answer's own data.",
      +        "type": "string"
      +      },
      +      "detail": {
      +        "const": "summary"
      +      },
      +      "lines": {
      +        "description": "The result lines, as the report's table gives them.",
      +        "items": {
      +          "additionalProperties": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "more": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "notes": {
      +        "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "open": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "tool": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "detail",
      +      "tool",
      +      "title",
      +      "lines",
      +      "notes",
      +      "citation",
      +      "url",
      +      "open",
      +      "more"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. First observed

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds the capability boundary ('does not size structure') and enumerates return artifacts, but says nothing about whether the drawing is persisted, what authorization is needed, or what happens on invalid geometry beyond what the schema states. There is mild tension between 'create/draws' and readOnlyHint=true, but the description's 'returns ... a link ... and a file' framing is consistent with a non-persisting generator.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the opening clause, but the single sentence then runs long enumerating return values that the output schema already describes. Splitting out the 'does not size structure' boundary and trimming the output list would make it tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 11 optional top-level parameters, deeply nested objects, and no required fields, the critical missing piece is guidance on input-mode selection and precedence — an agent cannot tell from the description whether layout and commands can be combined or which wins. The output side is fully covered by the output schema, so that omission is not a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and an output schema exists, so the baseline of 3 applies. The description names the six alternative input channels, which mirrors the top-level property names but adds no precedence, unit, or interaction semantics beyond what the schema documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Draws one plan on the Construction Canvas') and enumerates the alternative input forms it accepts (shapes, layout rooms, house figures, commands, document, template). What it produces is spelled out too. It does not, however, distinguish itself from close siblings such as create_project_file_from_drawing or export_drawing, which an agent must infer.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by listing the accepted input modes; the agent is never told whether shapes, layout, house, commands, document and template are mutually exclusive or what happens when several are supplied. The one explicit boundary — 'It does not size structure' — is genuinely useful because it routes structural sizing elsewhere, but it is the sole guideline.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources