Skip to main content
Glama

Craft Quantities: construction material calculators

Create a My Project file from a drawing

create_project_file_from_drawing
Read-onlyIdempotent

Creates one My Project backup file from a Construction Canvas drawing: its lines, and the drawing itself, which the site's canvas reopens. The reader restores the file on craftquantities.com as a new project. Nothing is stored or sent; no prices.

Input Schema

NameRequiredDescriptionDefault
nameNoThe new project's name.
detailNofull (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read.full
systemNoThe unit system inputs left out open in, and the one the page link opens in. The answer comes in both.metric
drawingYesThe drawing: a house form, shapes, drawing commands or a canvas document.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • addedInput schema / properties / drawing / 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 / drawing / 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 / drawing / 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": {
      -      "drawing": {
      -        "properties": {
      -          "carried": {
      -            "type": "boolean"
      -          },
      -          "note": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "carried"
      -        ],
      -        "type": "object"
      -      },
      -      "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"
      -      },
      -      "howToImport": {
      -        "type": "string"
      -      },
      -      "licence": {
      -        "properties": {
      -          "attribution": {
      -            "type": "string"
      -          },
      -          "name": {
      -            "type": "string"
      -          },
      -          "url": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "name",
      -          "url",
      -          "attribution"
      -        ],
      -        "type": "object"
      -      },
      -      "notice": {
      -        "type": "string"
      -      },
      -      "project": {
      -        "properties": {
      -          "lines": {
      -            "items": {
      -              "required": [
      -                "label",
      -                "quantity",
      -                "unit",
      -                "from"
      -              ],
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "name": {
      -            "type": "string"
      -          },
      -          "system": {
      -            "enum": [
      -              "metric",
      -              "imperial"
      -            ]
      -          }
      -        },
      -        "required": [
      -          "name",
      -          "system",
      -          "lines"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "engine",
      -      "file",
      -      "project",
      -      "howToImport",
      -      "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": {
      +      "drawing": {
      +        "properties": {
      +          "carried": {
      +            "type": "boolean"
      +          },
      +          "note": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "carried"
      +        ],
      +        "type": "object"
      +      },
      +      "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"
      +      },
      +      "howToImport": {
      +        "type": "string"
      +      },
      +      "licence": {
      +        "properties": {
      +          "attribution": {
      +            "type": "string"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "url",
      +          "attribution"
      +        ],
      +        "type": "object"
      +      },
      +      "notice": {
      +        "type": "string"
      +      },
      +      "project": {
      +        "properties": {
      +          "lines": {
      +            "items": {
      +              "required": [
      +                "label",
      +                "quantity",
      +                "unit",
      +                "from"
      +              ],
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "system": {
      +            "enum": [
      +              "metric",
      +              "imperial"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "system",
      +          "lines"
      +        ],
      +        "type": "object"
      +      },
      +      "state": {
      +        "properties": {
      +          "characters": {
      +            "type": "integer"
      +          },
      +          "format": {
      +            "description": "The token's format and version.",
      +            "type": "string"
      +          },
      +          "link": {
      +            "description": "Opens the project on the site from the token, carried in the address fragment, which a browser does not send to any server.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "token": {
      +            "anyOf": [
      +              {
      +                "description": "The project's inputs, deflated and base64url-encoded with a format version and a CRC-32 check (cqp1.…). Compact, not encrypted: anyone who has it can read it.",
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          }
      +        },
      +        "required": [
      +          "token",
      +          "format",
      +          "note"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "engine",
      +      "file",
      +      "project",
      +      "howToImport",
      +      "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. Added

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds genuinely useful non-obvious context: the file is a backup the site's canvas reopens and restores as a new project, and 'Nothing is stored or sent; no prices' preempts the natural worry that 'creates a file' implies persistence or network transmission.

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

Conciseness4/5

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

Three short sentences, front-loaded with what is produced, then the restore destination, then the no-side-effects caveat. No padding, though the middle sentence about the canvas reopening is somewhat redundant with the first.

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?

An output schema exists, so return values need not be explained, and annotations carry safety. However, for a tool whose required 'drawing' input spans four very different modes (house form, shapes, commands, canvas document), the description never enumerates them, leaving the agent to discover the input branches entirely from the schema.

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 coverage is 100%, so the schema already documents name, detail, system and the whole drawing tree. The description adds no parameter syntax or format detail beyond describing the input as 'the drawing,' which is the baseline expectation when the schema does the heavy lifting.

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?

It names a specific verb and artifact: 'Creates one My Project backup file from a Construction Canvas drawing.' The input source (a drawing) is clear, but it never distinguishes itself from the many sibling generators (create_project_file_from_plan, _from_house, _from_calculations, _from_takeoffs), leaving the agent to infer the boundary.

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

Usage Guidelines2/5

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

There is no explicit when-to-use or when-not-to-use guidance, and no named alternative. The only usage signal is implicit in the input source ('from a drawing') plus the downstream note that the reader restores it on craftquantities.com — this does not tell the agent how to choose between the five create_project_file_* siblings.

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