{"server":"com.craftquantities/engine","count":38,"tools":[{"name":"calculate","title":"Calculate a material quantity (how much, how many)","description":"Computes the result of one calculator, identified by its slug, from the input values given: the amount of material a job needs, such as the bags of concrete for a slab or the sheets of drywall for a room, counted in bags, sheets, studs, tiles, litres, gallons, cubic yards or m³. Returns it in metric and US units with the inputs used, sources, a citation and the page link. No prices.","input_schema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"The calculator's slug, such as concrete-calculator."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"inputs":{"type":"object","description":"The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes \"12 ft\", \"3.5 m\", \"8' 3 1/2\\\"\" or {\"value\": 12, \"unit\": \"ft\"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.","maxProperties":100,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"market":{"enum":["US","CA","UK","AU","INTL"],"type":"string","description":"Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"explain":{"type":"boolean","default":false,"description":"true adds the working: the inputs as the calculator received them, every intermediate figure its own compute reports with its unit, the range check and the unit restatement, ending on the same figures. The answer's figures are identical either way."},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","calculator","system","inputs","result","sources","citation","links","licence","notice"],"properties":{"links":{"type":"object","required":["page","open"],"properties":{"open":{"type":"string","description":"Opens the page on these inputs."},"page":{"type":"string"}}},"engine":{"type":"object","required":["name","version","api"],"properties":{"api":{"type":"string"},"name":{"type":"string"},"version":{"type":"string"}}},"inputs":{"type":"array","items":{"type":"object","required":["id","label","type","value","source"],"properties":{"id":{"type":"string"},"read":{"type":"string"},"type":{"enum":["number","select"]},"label":{"type":"string"},"value":{"type":["number","string"]},"metric":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"type":"number"}}},"option":{"type":"string"},"source":{"enum":["caller","default"]},"baseUnit":{"type":"string"},"imperial":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"type":"number"}}},"dimension":{"type":"string"}}},"description":"Every input the calculation ran on, and where each came from."},"market":{"anyOf":[{"type":"string"},{"type":"null"}]},"notice":{"type":"string"},"result":{"type":"object","required":["label","metric","imperial"],"properties":{"label":{"type":"string"},"metric":{"type":"object","required":["value","unit","printed","breakdown","confidence","isComparison","canonical"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number","description":"The headline in this system; null where a rate it needs is not given."},{"type":"null"}]},"printed":{"anyOf":[{"type":"string","description":"The headline exactly as the page prints it."},{"type":"null"}]},"withheld":{"anyOf":[{"type":"object","properties":{"missingRates":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string"},"label":{"type":"string"}}}}}},{"type":"null"}]},"allowance":{"anyOf":[{"type":"object","properties":{"base":{"type":"number"},"label":{"type":"string"},"percent":{"type":"number"}}},{"type":"null"}]},"breakdown":{"type":"array","items":{"type":"object","required":["label","value","unit","printed"],"properties":{"unit":{"type":"string"},"label":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"printed":{"type":"string"}}}},"canonical":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]}},"description":"The figure in the calculator's own unit, before the display adapter: what its test vectors pin."},"confidence":{"enum":["high","medium","low"]},"limitations":{"type":"array","items":{"type":"string"}},"isComparison":{"type":"boolean","description":"The figure is set against a limit. It is not an approval."},"confidenceNote":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"imperial":{"type":"object","required":["value","unit","printed","breakdown","confidence","isComparison","canonical"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number","description":"The headline in this system; null where a rate it needs is not given."},{"type":"null"}]},"printed":{"anyOf":[{"type":"string","description":"The headline exactly as the page prints it."},{"type":"null"}]},"withheld":{"anyOf":[{"type":"object","properties":{"missingRates":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string"},"label":{"type":"string"}}}}}},{"type":"null"}]},"allowance":{"anyOf":[{"type":"object","properties":{"base":{"type":"number"},"label":{"type":"string"},"percent":{"type":"number"}}},{"type":"null"}]},"breakdown":{"type":"array","items":{"type":"object","required":["label","value","unit","printed"],"properties":{"unit":{"type":"string"},"label":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"printed":{"type":"string"}}}},"canonical":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]}},"description":"The figure in the calculator's own unit, before the display adapter: what its test vectors pin."},"confidence":{"enum":["high","medium","low"]},"limitations":{"type":"array","items":{"type":"string"}},"isComparison":{"type":"boolean","description":"The figure is set against a limit. It is not an approval."},"confidenceNote":{"anyOf":[{"type":"string"},{"type":"null"}]}}}}},"system":{"enum":["metric","imperial"]},"explain":{"type":"object","required":["about","coverage","steps","final","limits"],"properties":{"about":{"type":"string"},"final":{"type":"object","required":["metric","imperial"],"properties":{"metric":{"type":"object","required":["value","unit","printed"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"printed":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"imperial":{"type":"object","required":["value","unit","printed"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"printed":{"anyOf":[{"type":"string"},{"type":"null"}]}}}},"description":"The figures the answer returns, copied from it."},"steps":{"type":"array","items":{"type":"object","required":["n","kind","system","label","text"],"properties":{"n":{"type":"integer"},"kind":{"enum":["input","intermediate","result","allowance","range","rates","display"]},"text":{"type":"string","description":"The step in words."},"unit":{"type":"string","description":"The calculator's own (base) unit for the value."},"label":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}]},"metric":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]}}},"source":{"enum":["caller","default"]},"system":{"enum":["metric","imperial","both"]},"movedBy":{"type":"array","items":{"type":"string"},"description":"Input ids whose change moved this figure, measured by running compute again."},"imperial":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]}}}}}},"limits":{"type":"array","items":{"type":"string"},"description":"What the trace does not show, and why."},"coverage":{"enum":["intermediates","result-only"],"description":"result-only: the calculator reports no figures between its inputs and its result."}},"description":"Only when explain is true. Each figure is the calculator's own; no step is a formula written for the engine."},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"sources":{"type":"array","items":{"type":"object","required":["label"],"properties":{"url":{"type":"string","description":"Only where the calculator gives one; none is invented."},"label":{"type":"string","description":"The source as the calculator cites it."},"references":{"type":"array","items":{"type":"object","required":["kind","document"],"properties":{"body":{"type":"string"},"kind":{"enum":["code","standard"]},"edition":{"type":"string"},"section":{"type":"string"},"document":{"type":"string"}}}}}}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"calculator":{"type":"object","required":["slug","title","category","version","lastVerified","url","json"],"properties":{"url":{"type":"string","description":"The calculator's page on craftquantities.com."},"json":{"type":"string","description":"The calculator's static API document, with its test vectors."},"slug":{"type":"string"},"title":{"type":"string"},"version":{"type":"string","description":"The calculator's own version; a result names the calculator that produced it."},"category":{"type":"string"},"description":{"type":"string"},"lastVerified":{"type":"string","description":"The date the calculator's sources were last checked."}}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Calculate a material quantity (how much, how many)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"calculate_batch","title":"Run several calculators in one request","description":"Runs up to 25 construction calculator calculations in one request, each a calculator slug or permanent id with its own input values, and returns each run's full answer in order (metric and US units, inputs used, sources, citation, page link) or that run's refusal; one refusal leaves the rest answered. No prices.","input_schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["slug"],"properties":{"ref":{"type":"string","maxLength":80,"description":"The caller's own label for this run, returned with its result."},"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"The calculator's slug or permanent id, such as concrete-calculator or cq-c0201."},"inputs":{"type":"object","description":"The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes \"12 ft\", \"3.5 m\", \"8' 3 1/2\\\"\" or {\"value\": 12, \"unit\": \"ft\"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.","maxProperties":100,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"market":{"enum":["US","CA","UK","AU","INTL"],"type":"string","description":"Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"additionalProperties":false},"maxItems":25,"minItems":1,"description":"The runs, 1 to 25, each one calculator and its inputs; answered in the same order."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"market":{"enum":["US","CA","UK","AU","INTL"],"type":"string","description":"The market for every run that does not name its own."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system for every run that does not name its own."},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","counts","results","licence","notice"],"properties":{"counts":{"type":"object","required":["asked","answered","refused"],"properties":{"asked":{"type":"integer"},"refused":{"type":"integer"},"answered":{"type":"integer"}}},"engine":{"type":"object"},"notice":{"type":"string"},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"results":{"type":"array","items":{"anyOf":[{"type":"object","required":["index","ok","result"],"properties":{"ok":{"const":true},"ref":{"type":"string"},"index":{"type":"integer"},"result":{"type":"object","required":["engine","calculator","system","inputs","result","sources","citation","links","licence","notice"],"properties":{"links":{"type":"object","required":["page","open"],"properties":{"open":{"type":"string","description":"Opens the page on these inputs."},"page":{"type":"string"}}},"engine":{"type":"object","required":["name","version","api"],"properties":{"api":{"type":"string"},"name":{"type":"string"},"version":{"type":"string"}}},"inputs":{"type":"array","items":{"type":"object","required":["id","label","type","value","source"],"properties":{"id":{"type":"string"},"read":{"type":"string"},"type":{"enum":["number","select"]},"label":{"type":"string"},"value":{"type":["number","string"]},"metric":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"type":"number"}}},"option":{"type":"string"},"source":{"enum":["caller","default"]},"baseUnit":{"type":"string"},"imperial":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"type":"number"}}},"dimension":{"type":"string"}}},"description":"Every input the calculation ran on, and where each came from."},"market":{"anyOf":[{"type":"string"},{"type":"null"}]},"notice":{"type":"string"},"result":{"type":"object","required":["label","metric","imperial"],"properties":{"label":{"type":"string"},"metric":{"type":"object","required":["value","unit","printed","breakdown","confidence","isComparison","canonical"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number","description":"The headline in this system; null where a rate it needs is not given."},{"type":"null"}]},"printed":{"anyOf":[{"type":"string","description":"The headline exactly as the page prints it."},{"type":"null"}]},"withheld":{"anyOf":[{"type":"object","properties":{"missingRates":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string"},"label":{"type":"string"}}}}}},{"type":"null"}]},"allowance":{"anyOf":[{"type":"object","properties":{"base":{"type":"number"},"label":{"type":"string"},"percent":{"type":"number"}}},{"type":"null"}]},"breakdown":{"type":"array","items":{"type":"object","required":["label","value","unit","printed"],"properties":{"unit":{"type":"string"},"label":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"printed":{"type":"string"}}}},"canonical":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]}},"description":"The figure in the calculator's own unit, before the display adapter: what its test vectors pin."},"confidence":{"enum":["high","medium","low"]},"limitations":{"type":"array","items":{"type":"string"}},"isComparison":{"type":"boolean","description":"The figure is set against a limit. It is not an approval."},"confidenceNote":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"imperial":{"type":"object","required":["value","unit","printed","breakdown","confidence","isComparison","canonical"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number","description":"The headline in this system; null where a rate it needs is not given."},{"type":"null"}]},"printed":{"anyOf":[{"type":"string","description":"The headline exactly as the page prints it."},{"type":"null"}]},"withheld":{"anyOf":[{"type":"object","properties":{"missingRates":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string"},"label":{"type":"string"}}}}}},{"type":"null"}]},"allowance":{"anyOf":[{"type":"object","properties":{"base":{"type":"number"},"label":{"type":"string"},"percent":{"type":"number"}}},{"type":"null"}]},"breakdown":{"type":"array","items":{"type":"object","required":["label","value","unit","printed"],"properties":{"unit":{"type":"string"},"label":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"printed":{"type":"string"}}}},"canonical":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]}},"description":"The figure in the calculator's own unit, before the display adapter: what its test vectors pin."},"confidence":{"enum":["high","medium","low"]},"limitations":{"type":"array","items":{"type":"string"}},"isComparison":{"type":"boolean","description":"The figure is set against a limit. It is not an approval."},"confidenceNote":{"anyOf":[{"type":"string"},{"type":"null"}]}}}}},"system":{"enum":["metric","imperial"]},"explain":{"type":"object","required":["about","coverage","steps","final","limits"],"properties":{"about":{"type":"string"},"final":{"type":"object","required":["metric","imperial"],"properties":{"metric":{"type":"object","required":["value","unit","printed"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"printed":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"imperial":{"type":"object","required":["value","unit","printed"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"printed":{"anyOf":[{"type":"string"},{"type":"null"}]}}}},"description":"The figures the answer returns, copied from it."},"steps":{"type":"array","items":{"type":"object","required":["n","kind","system","label","text"],"properties":{"n":{"type":"integer"},"kind":{"enum":["input","intermediate","result","allowance","range","rates","display"]},"text":{"type":"string","description":"The step in words."},"unit":{"type":"string","description":"The calculator's own (base) unit for the value."},"label":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}]},"metric":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]}}},"source":{"enum":["caller","default"]},"system":{"enum":["metric","imperial","both"]},"movedBy":{"type":"array","items":{"type":"string"},"description":"Input ids whose change moved this figure, measured by running compute again."},"imperial":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"null"}]}}}}}},"limits":{"type":"array","items":{"type":"string"},"description":"What the trace does not show, and why."},"coverage":{"enum":["intermediates","result-only"],"description":"result-only: the calculator reports no figures between its inputs and its result."}},"description":"Only when explain is true. Each figure is the calculator's own; no step is a formula written for the engine."},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"sources":{"type":"array","items":{"type":"object","required":["label"],"properties":{"url":{"type":"string","description":"Only where the calculator gives one; none is invented."},"label":{"type":"string","description":"The source as the calculator cites it."},"references":{"type":"array","items":{"type":"object","required":["kind","document"],"properties":{"body":{"type":"string"},"kind":{"enum":["code","standard"]},"edition":{"type":"string"},"section":{"type":"string"},"document":{"type":"string"}}}}}}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"calculator":{"type":"object","required":["slug","title","category","version","lastVerified","url","json"],"properties":{"url":{"type":"string","description":"The calculator's page on craftquantities.com."},"json":{"type":"string","description":"The calculator's static API document, with its test vectors."},"slug":{"type":"string"},"title":{"type":"string"},"version":{"type":"string","description":"The calculator's own version; a result names the calculator that produced it."},"category":{"type":"string"},"description":{"type":"string"},"lastVerified":{"type":"string","description":"The date the calculator's sources were last checked."}}}}}}},{"type":"object","required":["index","ok","error"],"properties":{"ok":{"const":false},"ref":{"type":"string"},"error":{"type":"object","required":["title","status","problems"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"problems":{"type":"array","items":{"type":"object","required":["input","problem"],"properties":{"input":{"type":"string"},"problem":{"type":"string"},"accepted":{"type":"array","items":{"type":"string"}}}}},"didYouMean":{"type":"array","items":{"type":"string"}}}},"index":{"type":"integer"}}}]},"description":"One entry per run, in the order asked: the calculator's full answer, or why that run was refused. One refusal leaves the others answered."}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Run several calculators in one request","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"check_quote","title":"Check a builder's or contractor's quote","description":"Is a builder's quote right on quantities? Reads a contractor's quote (pasted text) against the reader's own job and returns each quoted quantity against the range the job's calculators give, the lines it leaves out or adds, and the questions to ask. Money is removed and not judged; a difference is a question, not a verdict.","input_schema":{"type":"object","required":["job","quote"],"properties":{"job":{"enum":["bathroom-quote","plastering-quote","room-fitout-quote","concrete-slab-quote","timber-deck-quote","stud-wall-quote","external-wall-quote","insulate-floor-quote","tile-floor-quote","retaining-wall-quote","plaster-room-quote","drywall-ceiling-quote","room-repaint-quote","wall-tile-quote","resilient-floor-quote","carpet-and-pad-quote","trim-run-quote","suspended-ceiling-quote","kitchen-refit-quote","garage-conversion-quote","basement-conversion-quote","staircase-replacement-quote","fitted-wardrobe-quote","party-wall-soundproofing-quote","damp-remediation-quote","floor-sanding-refinish-quote","bathroom-remodel-quote","shower-enclosure-quote","kitchen-splashback-quote","heated-bathroom-floor-quote","wet-room-tanking-quote","fiber-cement-siding-quote","asphalt-shingle-roof-quote","standing-seam-roof-quote","eaves-and-rainwater-quote","attic-insulation-quote","window-replacement-quote","framed-exterior-wall-quote","flat-roof-replacement-quote","loft-conversion-dormer-quote","pitched-roof-recovering-quote","new-external-opening-quote","external-wall-insulation-quote","rainscreen-cladding-quote","external-door-replacement-quote","exterior-repaint-quote","repointing-quote","cavity-wall-insulation-quote","sip-wall-quote","masonry-wall-quote","strip-footing-quote","concrete-driveway-quote","basement-wall-quote","service-connections-quote","paver-patio-quote","fence-run-quote","internal-wall-removal-quote","extension-shell-quote","chimney-breast-removal-quote","porch-addition-quote","garden-room-quote","electrical-rough-in-quote","panel-upgrade-quote","bathroom-ventilation-quote","radiant-floor-loop-quote","mini-split-install-quote","full-rewire-quote","central-heating-replacement-quote","air-source-heat-pump-quote","underfloor-heating-retrofit-quote","whole-house-ventilation-quote","solar-pv-battery-quote","ev-charger-installation-quote","landscape-bed-quote","irrigation-zone-quote","pool-surround-quote","garage-floor-coating-quote"],"type":"string","description":"The quote check: bathroom-quote, plastering-quote, or a takeoff's ({takeoff id}-quote)."},"quote":{"type":"string","maxLength":20000,"minLength":1,"description":"The quote's text. Prices may be left in; they are taken out before reading."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"market":{"enum":["US","CA","UK","AU","INTL"],"type":"string","description":"Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"selection":{"type":"object","description":"Build-up choice id → option id, the takeoff's own (a stud size, an insulation, a cladding). Choices left out take the page's own for the system.","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."},"measurements":{"type":"object","description":"Measurement id → value, each length, area or volume with its unit (\"12 ft\", {\"value\": 3.6, \"unit\": \"m\"}); counts as numbers. Ids are those of the takeoff; any left out opens at the page's own figure.","maxProperties":50,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","check","system","measurements","lines","reading","rows","pricesIgnored","excludes","citation","licence","notice"],"properties":{"rows":{"type":"array","items":{"type":"object","required":["text","unit","readAs"]}},"check":{"type":"object","required":["slug","job","url"],"properties":{"job":{"type":"string"},"url":{"type":"string"},"slug":{"type":"string"},"takeoff":{"type":"object"}}},"lines":{"type":"array","items":{"type":"object","required":["key","name","unit","low","high","minimum","range","calculator"],"properties":{"key":{"type":"string"},"low":{"type":"number"},"why":{"type":"string"},"high":{"anyOf":[{"type":"number","description":"Null where the line is a minimum with no upper end."},{"type":"null"}]},"name":{"type":"string"},"unit":{"type":"string"},"range":{"type":"string","description":"Why the two ends differ."},"minimum":{"type":"boolean"},"calculator":{"type":"object","required":["title","url"],"properties":{"url":{"type":"string"},"title":{"type":"string"}}},"alternativeTo":{"type":"string"}}}},"engine":{"type":"object"},"market":{"anyOf":[{"type":"string"},{"type":"null"}]},"notice":{"type":"string"},"system":{"enum":["metric","imperial"]},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"reading":{"type":"object","required":["rowsRead","differs","agrees","missing","notComparable","extras","listed","headings","unmentioned","questions"],"properties":{"agrees":{"type":"array","items":{"type":"object","required":["line","quoted","rows"]}},"extras":{"type":"array","items":{"type":"object","required":["text","unit","kind"]}},"listed":{"type":"array","items":{"type":"object","required":["text","unit","work"]}},"differs":{"type":"array","items":{"type":"object","required":["line","quoted","outcome","difference","rows","explanation","ask"],"properties":{"ask":{"type":"string"},"line":{"type":"object","required":["key","name","unit","low","high","minimum","range","calculator"],"properties":{"key":{"type":"string"},"low":{"type":"number"},"why":{"type":"string"},"high":{"anyOf":[{"type":"number","description":"Null where the line is a minimum with no upper end."},{"type":"null"}]},"name":{"type":"string"},"unit":{"type":"string"},"range":{"type":"string","description":"Why the two ends differ."},"minimum":{"type":"boolean"},"calculator":{"type":"object","required":["title","url"],"properties":{"url":{"type":"string"},"title":{"type":"string"}}},"alternativeTo":{"type":"string"}}},"rows":{"type":"array","items":{"type":"object","required":["text","unit"],"properties":{"how":{"type":"string"},"text":{"type":"string"},"unit":{"type":"string"},"quantity":{"type":"number"}}}},"quoted":{"type":"number"},"outcome":{"enum":["above","below"]},"difference":{"type":"number"},"explanation":{"type":"string"}}}},"missing":{"type":"array","items":{"type":"object","required":["line","alternatives"]}},"headings":{"type":"array","items":{"type":"string"}},"rowsRead":{"type":"integer"},"questions":{"type":"array","items":{"type":"object","required":["about","question"]}},"unmentioned":{"type":"array","items":{"type":"object","required":["heading","why","ask"]}},"notComparable":{"type":"array","items":{"type":"object","required":["line","reason","rows"]}}}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"excludes":{"type":"array","items":{"type":"string"}},"measurements":{"type":"array","items":{"type":"object","required":["id","label","value","source"]}},"pricesIgnored":{"type":"string"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Check a builder's or contractor's quote","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"classify_items","title":"Group a materials list by MasterFormat division","description":"Groups a materials list, bill of materials, takeoff, plan or project (lines, calculator slugs or a project state token) by CSI MasterFormat 2018 division, by the site's own keyword rule over each line's calculator or words. A suggested grouping, not a specification; no Uniclass or NRM grouping is given. No prices.","input_schema":{"type":"object","required":[],"properties":{"lines":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string","maxLength":160,"description":"Where the line came from, as a project file names it (calculator:…, takeoff:…)."},"slug":{"type":"string","maxLength":120,"description":"The calculator that made the line, where known."},"unit":{"type":"string","maxLength":40},"label":{"type":"string","maxLength":200},"quantity":{"type":"number"},"calculator":{"type":"string","maxLength":120},"description":{"type":"string","maxLength":200}},"additionalProperties":true},"maxItems":400,"minItems":1,"description":"Lines of a takeoff, plan, house, drawing or bill: each a label, and the calculator slug where known."},"token":{"type":"string","maxLength":16384,"minLength":8,"description":"A project state token: its lines are grouped."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"calculators":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":400,"minItems":1,"description":"Calculator slugs or permanent ids."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["scheme","divisions","counts","note","licence"],"properties":{"note":{"type":"string"},"counts":{"type":"object","required":["lines","divisions","unassigned"],"properties":{"lines":{"type":"integer"},"divisions":{"type":"integer"},"unassigned":{"type":"integer"}}},"scheme":{"type":"object","required":["name","edition","level"],"properties":{"name":{"type":"string"},"level":{"type":"string"},"edition":{"type":"string"}}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"divisions":{"type":"array","items":{"type":"object","required":["code","name","lines"],"properties":{"code":{"type":"string"},"name":{"type":"string"},"lines":{"type":"array","items":{"type":"object","required":["label","basis"],"properties":{"slug":{"type":"string"},"unit":{"type":"string"},"basis":{"enum":["calculator","words","none"]},"label":{"type":"string"},"quantity":{"type":"number"}}}}}}},"otherSchemes":{"type":"string"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Group a materials list by MasterFormat division","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"convert_units","title":"Convert a construction unit","description":"Converts one value from one unit to another, for example 2 m³ to cubic yards, with the exact factor the site's calculators apply, and returns the converted value and the factor.","input_schema":{"type":"object","required":["value","from","to"],"properties":{"to":{"type":"string","maxLength":40},"from":{"type":"string","maxLength":40},"value":{"type":"number"},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"dimension":{"type":"string","maxLength":40,"description":"Only where a unit names more than one kind of quantity."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["value","from","to","dimension","factor"],"properties":{"to":{"type":"object","required":["unit","symbol","label","value"],"properties":{"unit":{"type":"string"},"label":{"type":"string"},"value":{"type":"number"},"symbol":{"type":"string"}}},"from":{"type":"object","required":["unit","symbol","label"],"properties":{"unit":{"type":"string"},"label":{"type":"string"},"symbol":{"type":"string"}}},"value":{"type":"number"},"factor":{"anyOf":[{"type":"number"},{"type":"null"}]},"dimension":{"type":"string"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Convert a construction unit","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"create_drawing","title":"Draw a plan and list its materials","description":"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":{"type":"object","required":[],"properties":{"name":{"type":"string","maxLength":120,"description":"The project's name in the file."},"house":{"type":"object","properties":{"pitch":{"enum":["4","6","8","10","12"],"type":"string","description":"Roof pitch, rise in 12."},"family":{"enum":["wall.framed-exterior","wall.masonry","wall.sip"],"type":"string"},"values":{"type":"object","description":"The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight (\"12 m\", \"40 ft\"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it.","maxProperties":30,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"example":{"type":"string","maxLength":120,"description":"Start from one of the site's example houses (its slug) in place of the estimator's opening house."},"storeys":{"enum":[1,2],"type":"integer"},"selection":{"type":"object","description":"The exterior wall's build-up choices.","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"roofFamily":{"enum":["roof.asphalt-shingle","roof.tile-slate"],"type":"string"},"roofSelection":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}}},"description":"The House Estimator's form: the house drawn as the estimator draws it.","additionalProperties":false},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"layout":{"type":"object","required":["rooms"],"properties":{"grid":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"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."},"doors":{"type":"array","items":{"type":"object","properties":{"room":{"type":"string","maxLength":60,"description":"The room it is in, by name."},"side":{"enum":["south","east","north","west"],"description":"The side of that room."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"The opening's width; left out, the canvas's default."},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."},"between":{"type":"array","items":{"type":"string","maxLength":60},"maxItems":2,"minItems":2,"description":"A door only: the two rooms it joins, on the wall they share."}},"additionalProperties":false},"maxItems":60,"description":"Each between two rooms, or in a room's side (an outside door where that side is an exterior wall)."},"rooms":{"type":"array","items":{"type":"object","required":["name","width","depth"],"properties":{"at":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"Its south-west corner. The first room without at or against is at the origin.","additionalProperties":false},"name":{"type":"string","maxLength":60,"minLength":1,"description":"Unique in the layout; openings and later rooms refer to it."},"depth":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along y (north), wall centre to wall centre."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along x (east), wall centre to wall centre."},"against":{"type":"object","required":["room","side"],"properties":{"room":{"type":"string","maxLength":60},"side":{"enum":["south","east","north","west"]},"align":{"enum":["start","centre","end"],"description":"Along that side: flush with its west or south end (start, the default), centred, or flush with the other end."},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"Beside a side of an earlier room, sharing that wall.","additionalProperties":false}},"additionalProperties":false},"maxItems":30,"minItems":1},"windows":{"type":"array","items":{"type":"object","properties":{"room":{"type":"string","maxLength":60,"description":"The room it is in, by name."},"side":{"enum":["south","east","north","west"],"description":"The side of that room."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"The opening's width; left out, the canvas's default."},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."},"between":{"type":"array","items":{"type":"string","maxLength":60},"maxItems":2,"minItems":2,"description":"A door only: the two rooms it joins, on the wall they share."}},"additionalProperties":false},"maxItems":60,"description":"Each in a room's side, on an exterior wall."}},"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.","additionalProperties":false},"shapes":{"type":"array","items":{"type":"object","required":["shape"],"properties":{"p":{"type":"object","description":"The component's own properties: a fence's heightMm, a bed's mulchDepthMm, each length with its unit.","maxProperties":20},"at":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"The south-west corner (a path's or a fence's start). Left out: the origin.","additionalProperties":false},"ref":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","description":"A name a later shape's against uses."},"legs":{"type":"array","items":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"maxItems":20,"minItems":1,"description":"A fence's straight runs, in order."},"name":{"type":"string","maxLength":60,"description":"A room's name."},"build":{"enum":["pavers","concrete"],"description":"A patio's or path's build: a patio is concrete unless pavers; a path is pavers unless concrete."},"depth":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along y (north); for a deck or patio against a side, out from it."},"doors":{"type":"array","items":{"type":"object","required":["side","offset"],"properties":{"side":{"enum":["south","east","north","west"]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along the wall from its start: walls run counter-clockwise from the south-west corner."},"exterior":{"type":"boolean","description":"A door: an outside door (the default) or an inside one."}},"additionalProperties":false},"maxItems":20},"gates":{"type":"array","items":{"type":"object","required":["leg","offset","width"],"properties":{"leg":{"type":"integer","minimum":1},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"maxItems":20,"description":"Gate openings, by leg (from 1) and offset along it; taken out of the run, the gate itself not counted."},"scope":{"type":"object","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"shape":{"enum":["room","deck","patio","bed","path","fence"],"description":"room: four exterior walls with doors and windows; deck, patio, bed (planted): a rectangle; path: a paved strip; fence: legs and 90° turns. Anything else is refused."},"turns":{"type":"array","items":{"enum":["left","right"]},"maxItems":19,"description":"A 90° turn between each two legs."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along x (east): a room's, deck's, patio's or bed's; a path's width across it."},"length":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"A path's length."},"against":{"type":"object","required":["shape","side"],"properties":{"side":{"enum":["south","east","north","west"]},"shape":{"type":"string"},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A deck, patio or bed against a side of an earlier room or rectangle: centred on it, or from its west or south end by offset.","additionalProperties":false},"heading":{"enum":["south","east","north","west"],"description":"The way a path or a fence's first leg runs (default east)."},"windows":{"type":"array","items":{"type":"object","required":["side","offset"],"properties":{"side":{"enum":["south","east","north","west"]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along the wall from its start: walls run counter-clockwise from the south-west corner."},"exterior":{"type":"boolean","description":"A door: an outside door (the default) or an inside one."}},"additionalProperties":false},"maxItems":20},"finishes":{"type":"object","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}}},"additionalProperties":false},"maxItems":40,"minItems":1,"description":"Simple 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."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"variant":{"type":"string","pattern":"^[a-z0-9-]{1,40}$","description":"With template: one of its two \"what changes if\" variants, by id; a wrong one is refused with the template's own list."},"commands":{"type":"array","items":{"type":"object","required":["op"],"properties":{"c":{"type":"string","maxLength":40,"description":"outline: slab, roof, floor, driveway, patio, deck, landscaping; path: footing, cable, pipe, duct, fence, retaining-wall; point: column, pier, outlet, switch, light, panel, fixture, drain, radiator, register."},"p":{"type":"object","description":"The component's own properties by id (components/properties.ts): a length with its unit (widthMm, heightMm, sillMm …), a choice's option id, a count, true or false.","maxProperties":20},"at":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"op":{"enum":["level","type","wall","opening","room","outline","path","point","beam","stair"]},"to":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"ref":{"type":"string","maxLength":60,"description":"A name by which later commands refer to what this one makes."},"from":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"kind":{"enum":["door","window"]},"name":{"type":"string","maxLength":60,"description":"A level's, a type's or a room's name."},"type":{"type":"string","maxLength":60,"description":"A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."},"wall":{"type":"string","maxLength":60,"description":"The wall an opening goes in: its ref."},"level":{"type":"string","maxLength":60,"description":"A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."},"scope":{"type":"object","description":"Its scope question name → answer, by the planner's ids.","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"closed":{"type":"boolean"},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"An opening's centre, measured along its wall from the wall's start."},"points":{"type":"array","items":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"maxItems":500,"minItems":2},"assembly":{"type":"string","maxLength":80,"description":"A type's build-up: a canvas assembly id (wall.framed-exterior, roof.asphalt-shingle, slab.on-grade …)."},"finishes":{"type":"object","description":"A room's, or a driveway's, patio's, deck's, fence's or retaining wall's surface role → finish id, by the planner's ids.","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}},"elevation":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"selection":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"thickness":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"wastePercent":{"type":"number","maximum":100,"minimum":0}}},"maxItems":500,"minItems":1,"description":"Drawing 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."},"document":{"type":"object","description":"A Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener."},"template":{"type":"string","pattern":"^[a-z0-9-]{1,60}$","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."},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","system","from","document","counts","rows","objects","lines","assumptions","omitted","plans","labour","sources","file","links","howToOpen","citation","licence","notice"],"properties":{"file":{"type":"object","required":["filename","mediaType","content"],"properties":{"content":{"type":"object","required":["magic","v","exportedAt","stores"],"properties":{"v":{"type":"integer"},"magic":{"const":"craftquantities.backup"},"stores":{"type":"object"},"exportedAt":{"type":"string"}}},"filename":{"type":"string"},"mediaType":{"const":"application/json"}}},"from":{"enum":["house","commands","document","shapes","template","layout"]},"rows":{"type":"array","items":{"type":"object","required":["key","section","label","where","quantity","unit","otherSystem","calculator"],"properties":{"key":{"type":"string"},"note":{"type":"string"},"unit":{"type":"string"},"label":{"type":"string"},"order":{"type":"object","required":["quantity","unit"]},"where":{"type":"string"},"section":{"type":"string"},"quantity":{"type":"number"},"calculator":{"type":"object","required":["slug","title"]},"otherSystem":{"anyOf":[{"type":"object","required":["quantity","unit"]},{"type":"null"}]}}}},"house":{"type":"object"},"lines":{"type":"array","items":{"type":"object","required":["label","quantity","unit","zone"]}},"links":{"type":"object","required":["canvas","drawing"],"properties":{"canvas":{"type":"string"},"drawing":{"anyOf":[{"type":"string","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":"null"}]},"template":{"type":"string","description":"The template's page, when the drawing is a template's: cite it beside the drawing's link."},"estimator":{"type":"string"}}},"plans":{"type":"array"},"counts":{"type":"object","required":["walls","openings","levels"]},"engine":{"type":"object"},"labour":{"type":"object","required":["rows","totalHours","programme","likelyDays","note"]},"layout":{"type":"object","required":["grid","rooms","walls","adjustments","checks"],"description":"The rooms as laid out (both unit systems), the walls drawn, every figure snapped or room moved, and the closure check."},"notice":{"type":"string"},"shapes":{"type":"array","items":{"type":"object","required":["shape","ref","made","figures"]}},"system":{"enum":["metric","imperial"]},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"objects":{"type":"array","items":{"type":"object","required":["key","label","quantity"]}},"omitted":{"type":"array"},"sources":{"type":"array"},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"document":{"type":"object","required":["schema","units","counters","levels","types","entities","assumed","updatedAt"]},"template":{"type":"object","required":["slug","name","page","variant","variants"],"description":"The template it was drawn from: its page, the variant drawn (null: as the page shows it) and its variants."},"howToOpen":{"type":"string"},"shapeNotes":{"type":"array","items":{"type":"string"}},"assumptions":{"type":"array","items":{"type":"object","required":["field","reason"]}},"drawingLink":{"type":"string"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Draw a plan and list its materials","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"create_project_file_from_calculations","title":"Create a My Project file from calculations","description":"Creates one My Project backup file from a list of calculator lines (each a calculator slug and its input values). Each line is computed as the site's page adds it; the reader restores the file on craftquantities.com as a new project. Nothing is stored or sent; no prices.","input_schema":{"type":"object","required":["calculators"],"properties":{"name":{"type":"string","maxLength":120,"description":"The new project's name."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"market":{"enum":["US","CA","UK","AU","INTL"],"type":"string","description":"Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"calculators":{"type":"array","items":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"The calculator's slug, such as concrete-calculator."},"label":{"type":"string","maxLength":120,"description":"The line's name in the project; the calculator's title when left out."},"inputs":{"type":"object","description":"The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes \"12 ft\", \"3.5 m\", \"8' 3 1/2\\\"\" or {\"value\": 12, \"unit\": \"ft\"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.","maxProperties":100,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"additionalProperties":false},"maxItems":50,"minItems":1,"description":"The calculator lines: each a slug and its input values."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","file","project","howToImport","licence","notice"],"properties":{"file":{"type":"object","required":["filename","mediaType","content"],"properties":{"content":{"type":"object","required":["magic","v","exportedAt","stores"],"properties":{"v":{"type":"integer"},"magic":{"const":"craftquantities.backup"},"stores":{"type":"object"},"exportedAt":{"type":"string"}}},"filename":{"type":"string"},"mediaType":{"const":"application/json"}}},"state":{"type":"object","required":["token","format","note"],"properties":{"link":{"type":"string","description":"Opens the project on the site from the token, carried in the address fragment, which a browser does not send to any server."},"note":{"type":"string"},"token":{"anyOf":[{"type":"string","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":"null"}]},"format":{"type":"string","description":"The token's format and version."},"characters":{"type":"integer"}}},"engine":{"type":"object"},"notice":{"type":"string"},"drawing":{"type":"object","required":["carried"],"properties":{"note":{"type":"string"},"carried":{"type":"boolean"}}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"project":{"type":"object","required":["name","system","lines"],"properties":{"name":{"type":"string"},"lines":{"type":"array","items":{"type":"object","required":["label","quantity","unit","from"]}},"system":{"enum":["metric","imperial"]}}},"howToImport":{"type":"string"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Create a My Project file from calculations","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"create_project_file_from_drawing","title":"Create a My Project file from a drawing","description":"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":{"type":"object","required":["drawing"],"properties":{"name":{"type":"string","maxLength":120,"description":"The new project's name."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"drawing":{"type":"object","properties":{"house":{"type":"object","properties":{"pitch":{"enum":["4","6","8","10","12"],"type":"string","description":"Roof pitch, rise in 12."},"family":{"enum":["wall.framed-exterior","wall.masonry","wall.sip"],"type":"string"},"values":{"type":"object","description":"The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight (\"12 m\", \"40 ft\"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it.","maxProperties":30,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"example":{"type":"string","maxLength":120,"description":"Start from one of the site's example houses (its slug) in place of the estimator's opening house."},"storeys":{"enum":[1,2],"type":"integer"},"selection":{"type":"object","description":"The exterior wall's build-up choices.","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"roofFamily":{"enum":["roof.asphalt-shingle","roof.tile-slate"],"type":"string"},"roofSelection":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}}},"description":"The House Estimator's form: the house drawn as the estimator draws it.","additionalProperties":false},"layout":{"type":"object","required":["rooms"],"properties":{"grid":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"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."},"doors":{"type":"array","items":{"type":"object","properties":{"room":{"type":"string","maxLength":60,"description":"The room it is in, by name."},"side":{"enum":["south","east","north","west"],"description":"The side of that room."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"The opening's width; left out, the canvas's default."},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."},"between":{"type":"array","items":{"type":"string","maxLength":60},"maxItems":2,"minItems":2,"description":"A door only: the two rooms it joins, on the wall they share."}},"additionalProperties":false},"maxItems":60,"description":"Each between two rooms, or in a room's side (an outside door where that side is an exterior wall)."},"rooms":{"type":"array","items":{"type":"object","required":["name","width","depth"],"properties":{"at":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"Its south-west corner. The first room without at or against is at the origin.","additionalProperties":false},"name":{"type":"string","maxLength":60,"minLength":1,"description":"Unique in the layout; openings and later rooms refer to it."},"depth":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along y (north), wall centre to wall centre."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along x (east), wall centre to wall centre."},"against":{"type":"object","required":["room","side"],"properties":{"room":{"type":"string","maxLength":60},"side":{"enum":["south","east","north","west"]},"align":{"enum":["start","centre","end"],"description":"Along that side: flush with its west or south end (start, the default), centred, or flush with the other end."},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"Beside a side of an earlier room, sharing that wall.","additionalProperties":false}},"additionalProperties":false},"maxItems":30,"minItems":1},"windows":{"type":"array","items":{"type":"object","properties":{"room":{"type":"string","maxLength":60,"description":"The room it is in, by name."},"side":{"enum":["south","east","north","west"],"description":"The side of that room."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"The opening's width; left out, the canvas's default."},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."},"between":{"type":"array","items":{"type":"string","maxLength":60},"maxItems":2,"minItems":2,"description":"A door only: the two rooms it joins, on the wall they share."}},"additionalProperties":false},"maxItems":60,"description":"Each in a room's side, on an exterior wall."}},"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.","additionalProperties":false},"shapes":{"type":"array","items":{"type":"object","required":["shape"],"properties":{"p":{"type":"object","description":"The component's own properties: a fence's heightMm, a bed's mulchDepthMm, each length with its unit.","maxProperties":20},"at":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"The south-west corner (a path's or a fence's start). Left out: the origin.","additionalProperties":false},"ref":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","description":"A name a later shape's against uses."},"legs":{"type":"array","items":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"maxItems":20,"minItems":1,"description":"A fence's straight runs, in order."},"name":{"type":"string","maxLength":60,"description":"A room's name."},"build":{"enum":["pavers","concrete"],"description":"A patio's or path's build: a patio is concrete unless pavers; a path is pavers unless concrete."},"depth":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along y (north); for a deck or patio against a side, out from it."},"doors":{"type":"array","items":{"type":"object","required":["side","offset"],"properties":{"side":{"enum":["south","east","north","west"]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along the wall from its start: walls run counter-clockwise from the south-west corner."},"exterior":{"type":"boolean","description":"A door: an outside door (the default) or an inside one."}},"additionalProperties":false},"maxItems":20},"gates":{"type":"array","items":{"type":"object","required":["leg","offset","width"],"properties":{"leg":{"type":"integer","minimum":1},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"maxItems":20,"description":"Gate openings, by leg (from 1) and offset along it; taken out of the run, the gate itself not counted."},"scope":{"type":"object","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"shape":{"enum":["room","deck","patio","bed","path","fence"],"description":"room: four exterior walls with doors and windows; deck, patio, bed (planted): a rectangle; path: a paved strip; fence: legs and 90° turns. Anything else is refused."},"turns":{"type":"array","items":{"enum":["left","right"]},"maxItems":19,"description":"A 90° turn between each two legs."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along x (east): a room's, deck's, patio's or bed's; a path's width across it."},"length":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"A path's length."},"against":{"type":"object","required":["shape","side"],"properties":{"side":{"enum":["south","east","north","west"]},"shape":{"type":"string"},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A deck, patio or bed against a side of an earlier room or rectangle: centred on it, or from its west or south end by offset.","additionalProperties":false},"heading":{"enum":["south","east","north","west"],"description":"The way a path or a fence's first leg runs (default east)."},"windows":{"type":"array","items":{"type":"object","required":["side","offset"],"properties":{"side":{"enum":["south","east","north","west"]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along the wall from its start: walls run counter-clockwise from the south-west corner."},"exterior":{"type":"boolean","description":"A door: an outside door (the default) or an inside one."}},"additionalProperties":false},"maxItems":20},"finishes":{"type":"object","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}}},"additionalProperties":false},"maxItems":40,"minItems":1,"description":"Simple 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."},"variant":{"type":"string","pattern":"^[a-z0-9-]{1,40}$","description":"With template: one of its two \"what changes if\" variants, by id; a wrong one is refused with the template's own list."},"commands":{"type":"array","items":{"type":"object","required":["op"],"properties":{"c":{"type":"string","maxLength":40,"description":"outline: slab, roof, floor, driveway, patio, deck, landscaping; path: footing, cable, pipe, duct, fence, retaining-wall; point: column, pier, outlet, switch, light, panel, fixture, drain, radiator, register."},"p":{"type":"object","description":"The component's own properties by id (components/properties.ts): a length with its unit (widthMm, heightMm, sillMm …), a choice's option id, a count, true or false.","maxProperties":20},"at":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"op":{"enum":["level","type","wall","opening","room","outline","path","point","beam","stair"]},"to":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"ref":{"type":"string","maxLength":60,"description":"A name by which later commands refer to what this one makes."},"from":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"kind":{"enum":["door","window"]},"name":{"type":"string","maxLength":60,"description":"A level's, a type's or a room's name."},"type":{"type":"string","maxLength":60,"description":"A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."},"wall":{"type":"string","maxLength":60,"description":"The wall an opening goes in: its ref."},"level":{"type":"string","maxLength":60,"description":"A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."},"scope":{"type":"object","description":"Its scope question name → answer, by the planner's ids.","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"closed":{"type":"boolean"},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"An opening's centre, measured along its wall from the wall's start."},"points":{"type":"array","items":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"maxItems":500,"minItems":2},"assembly":{"type":"string","maxLength":80,"description":"A type's build-up: a canvas assembly id (wall.framed-exterior, roof.asphalt-shingle, slab.on-grade …)."},"finishes":{"type":"object","description":"A room's, or a driveway's, patio's, deck's, fence's or retaining wall's surface role → finish id, by the planner's ids.","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}},"elevation":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"selection":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"thickness":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"wastePercent":{"type":"number","maximum":100,"minimum":0}}},"maxItems":500,"minItems":1,"description":"Drawing 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."},"document":{"type":"object","description":"A Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener."},"template":{"type":"string","pattern":"^[a-z0-9-]{1,60}$","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."},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"description":"The drawing: a house form, shapes, drawing commands or a canvas document.","additionalProperties":false}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","file","project","howToImport","licence","notice"],"properties":{"file":{"type":"object","required":["filename","mediaType","content"],"properties":{"content":{"type":"object","required":["magic","v","exportedAt","stores"],"properties":{"v":{"type":"integer"},"magic":{"const":"craftquantities.backup"},"stores":{"type":"object"},"exportedAt":{"type":"string"}}},"filename":{"type":"string"},"mediaType":{"const":"application/json"}}},"state":{"type":"object","required":["token","format","note"],"properties":{"link":{"type":"string","description":"Opens the project on the site from the token, carried in the address fragment, which a browser does not send to any server."},"note":{"type":"string"},"token":{"anyOf":[{"type":"string","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":"null"}]},"format":{"type":"string","description":"The token's format and version."},"characters":{"type":"integer"}}},"engine":{"type":"object"},"notice":{"type":"string"},"drawing":{"type":"object","required":["carried"],"properties":{"note":{"type":"string"},"carried":{"type":"boolean"}}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"project":{"type":"object","required":["name","system","lines"],"properties":{"name":{"type":"string"},"lines":{"type":"array","items":{"type":"object","required":["label","quantity","unit","from"]}},"system":{"enum":["metric","imperial"]}}},"howToImport":{"type":"string"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Create a My Project file from a drawing","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"create_project_file_from_house","title":"Create a My Project file from a house","description":"Creates one My Project backup file from a House Estimator form: the house's lines, and its drawing, 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":{"type":"object","required":["houses"],"properties":{"name":{"type":"string","maxLength":120,"description":"The new project's name."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"houses":{"type":"array","items":{"type":"object","properties":{"pitch":{"enum":["4","6","8","10","12"],"type":"string","description":"Roof pitch, rise in 12."},"family":{"enum":["wall.framed-exterior","wall.masonry","wall.sip"],"type":"string"},"values":{"type":"object","description":"The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight (\"12 m\", \"40 ft\"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it.","maxProperties":30,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"example":{"type":"string","maxLength":120,"description":"Start from one of the site's example houses (its slug) in place of the estimator's opening house."},"storeys":{"enum":[1,2],"type":"integer"},"selection":{"type":"object","description":"The exterior wall's build-up choices.","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."},"roofFamily":{"enum":["roof.asphalt-shingle","roof.tile-slate"],"type":"string"},"roofSelection":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}}},"additionalProperties":false},"maxItems":2,"minItems":1,"description":"The House Estimator form (one house; two give their lines without a drawing)."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","file","project","howToImport","licence","notice"],"properties":{"file":{"type":"object","required":["filename","mediaType","content"],"properties":{"content":{"type":"object","required":["magic","v","exportedAt","stores"],"properties":{"v":{"type":"integer"},"magic":{"const":"craftquantities.backup"},"stores":{"type":"object"},"exportedAt":{"type":"string"}}},"filename":{"type":"string"},"mediaType":{"const":"application/json"}}},"state":{"type":"object","required":["token","format","note"],"properties":{"link":{"type":"string","description":"Opens the project on the site from the token, carried in the address fragment, which a browser does not send to any server."},"note":{"type":"string"},"token":{"anyOf":[{"type":"string","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":"null"}]},"format":{"type":"string","description":"The token's format and version."},"characters":{"type":"integer"}}},"engine":{"type":"object"},"notice":{"type":"string"},"drawing":{"type":"object","required":["carried"],"properties":{"note":{"type":"string"},"carried":{"type":"boolean"}}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"project":{"type":"object","required":["name","system","lines"],"properties":{"name":{"type":"string"},"lines":{"type":"array","items":{"type":"object","required":["label","quantity","unit","from"]}},"system":{"enum":["metric","imperial"]}}},"howToImport":{"type":"string"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Create a My Project file from a house","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"create_project_file_from_plan","title":"Create a My Project file from a plan","description":"Creates one My Project backup file from a room plan: one planned space, or several spaces and a roof. Its lines and its plan are saved as the site's planner saves them; the reader restores the file on craftquantities.com as a new project. Nothing is stored or sent; no prices.","input_schema":{"type":"object","required":["plan"],"properties":{"name":{"type":"string","maxLength":120,"description":"The new project's name."},"plan":{"type":"object","properties":{"kind":{"enum":["room","bathroom","slab","deck","driveway","fence","loft","retaining-wall","exterior-wall","stair"],"type":"string","description":"The kind of space: a room or a bathroom (from its size, doors and windows), or a slab, deck, driveway, fence, loft, retaining wall, exterior wall or stair."},"name":{"type":"string","maxLength":120},"roof":{"type":"object","properties":{"pitch":{"type":"number","maximum":24,"minimum":0,"description":"The rise per 12 of run (6 = 6 in 12). Left out, each roof row says it waits for the pitch."},"scope":{"type":"object","description":"Scope question name → answer value, by the planner's ids.","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"inputs":{"type":"object","description":"Branch id → { calculator input id: value in its base unit }.","maxProperties":50,"additionalProperties":{"type":"object","maxProperties":30}},"intent":{"type":"string","maxLength":40,"description":"A trade, or everything."},"finishes":{"type":"object","description":"Surface role → finish id, by the planner's ids.","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}},"leaveOut":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":100,"description":"Branch ids to leave out."}},"additionalProperties":false},"doors":{"type":"object","properties":{"count":{"type":"integer","maximum":20,"minimum":0},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"scope":{"type":"object","description":"Scope question name → answer value, by the planner's ids.","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"inputs":{"type":"object","description":"Branch id → { calculator input id: value in its base unit }.","maxProperties":50,"additionalProperties":{"type":"object","maxProperties":30}},"intent":{"type":"string","maxLength":40,"description":"A trade, or everything."},"spaces":{"type":"array","items":{"type":"object","required":["kind","figures"],"properties":{"kind":{"enum":["room","bathroom","slab","deck","driveway","fence","loft","retaining-wall","exterior-wall","stair"],"type":"string","description":"The kind of space: a room or a bathroom (from its size, doors and windows), or a slab, deck, driveway, fence, loft, retaining wall, exterior wall or stair."},"name":{"type":"string","maxLength":120},"doors":{"type":"object","properties":{"count":{"type":"integer","maximum":20,"minimum":0},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"scope":{"type":"object","description":"Scope question name → answer value, by the planner's ids.","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"inputs":{"type":"object","description":"Branch id → { calculator input id: value in its base unit }.","maxProperties":50,"additionalProperties":{"type":"object","maxProperties":30}},"intent":{"type":"string","maxLength":40,"description":"A trade, or everything."},"figures":{"type":"object","description":"The space's figures, by the planner's ids, each a length with its unit (a room: length, width, height, wallThickness; a fence: length, height; a stair: totalRise, width …).","maxProperties":10,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"windows":{"type":"object","properties":{"count":{"type":"integer","maximum":20,"minimum":0},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"finishes":{"type":"object","description":"Surface role → finish id, by the planner's ids.","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}},"leaveOut":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":100,"description":"Branch ids to leave out."}},"additionalProperties":false},"maxItems":12,"minItems":1,"description":"The spaces, in order, each one planned space."},"figures":{"type":"object","description":"The space's figures, by the planner's ids, each a length with its unit (a room: length, width, height, wallThickness; a fence: length, height; a stair: totalRise, width …).","maxProperties":10,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"windows":{"type":"object","properties":{"count":{"type":"integer","maximum":20,"minimum":0},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"finishes":{"type":"object","description":"Surface role → finish id, by the planner's ids.","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}},"leaveOut":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":100,"description":"Branch ids to leave out."},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"description":"One planned space, or a planned project of spaces and a roof.","additionalProperties":false},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","file","project","howToImport","licence","notice"],"properties":{"file":{"type":"object","required":["filename","mediaType","content"],"properties":{"content":{"type":"object","required":["magic","v","exportedAt","stores"],"properties":{"v":{"type":"integer"},"magic":{"const":"craftquantities.backup"},"stores":{"type":"object"},"exportedAt":{"type":"string"}}},"filename":{"type":"string"},"mediaType":{"const":"application/json"}}},"state":{"type":"object","required":["token","format","note"],"properties":{"link":{"type":"string","description":"Opens the project on the site from the token, carried in the address fragment, which a browser does not send to any server."},"note":{"type":"string"},"token":{"anyOf":[{"type":"string","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":"null"}]},"format":{"type":"string","description":"The token's format and version."},"characters":{"type":"integer"}}},"engine":{"type":"object"},"notice":{"type":"string"},"drawing":{"type":"object","required":["carried"],"properties":{"note":{"type":"string"},"carried":{"type":"boolean"}}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"project":{"type":"object","required":["name","system","lines"],"properties":{"name":{"type":"string"},"lines":{"type":"array","items":{"type":"object","required":["label","quantity","unit","from"]}},"system":{"enum":["metric","imperial"]}}},"howToImport":{"type":"string"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Create a My Project file from a plan","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"create_project_file_from_takeoffs","title":"Create a My Project file from takeoffs","description":"Creates one My Project backup file from a list of whole-job takeoffs (each a takeoff id and its measurements). Each takeoff's lines are worked as its page commits them; the reader restores the file on craftquantities.com as a new project. Nothing is stored or sent; no prices.","input_schema":{"type":"object","required":["takeoffs"],"properties":{"name":{"type":"string","maxLength":120,"description":"The new project's name."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"market":{"enum":["US","CA","UK","AU","INTL"],"type":"string","description":"Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"takeoffs":{"type":"array","items":{"type":"object","required":["takeoff"],"properties":{"takeoff":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$"},"leaveOut":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":100,"description":"Rows the reader leaves out of the job: still worked and shown, not put in the project or counted in labour."},"selection":{"type":"object","description":"Build-up choice id → option id, the takeoff's own (a stud size, an insulation, a cladding). Choices left out take the page's own for the system.","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"allowances":{"type":"object","description":"Row → an allowance the reader sets: a percentage (cutting waste, overlap), or the option an allowance follows (a lay pattern). Row names are the takeoff's steps (the calculator slug, or the step key where one runs twice).","maxProperties":50,"additionalProperties":{"anyOf":[{"type":"number","maximum":100,"minimum":0},{"type":"string","maxLength":80}]}},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."},"measurements":{"type":"object","description":"Measurement id → value, each length, area or volume with its unit (\"12 ft\", {\"value\": 3.6, \"unit\": \"m\"}); counts as numbers. Ids are those of the takeoff; any left out opens at the page's own figure.","maxProperties":50,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}}},"additionalProperties":false},"maxItems":10,"minItems":1,"description":"The takeoffs: each an id and its measurements."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","file","project","howToImport","licence","notice"],"properties":{"file":{"type":"object","required":["filename","mediaType","content"],"properties":{"content":{"type":"object","required":["magic","v","exportedAt","stores"],"properties":{"v":{"type":"integer"},"magic":{"const":"craftquantities.backup"},"stores":{"type":"object"},"exportedAt":{"type":"string"}}},"filename":{"type":"string"},"mediaType":{"const":"application/json"}}},"state":{"type":"object","required":["token","format","note"],"properties":{"link":{"type":"string","description":"Opens the project on the site from the token, carried in the address fragment, which a browser does not send to any server."},"note":{"type":"string"},"token":{"anyOf":[{"type":"string","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":"null"}]},"format":{"type":"string","description":"The token's format and version."},"characters":{"type":"integer"}}},"engine":{"type":"object"},"notice":{"type":"string"},"drawing":{"type":"object","required":["carried"],"properties":{"note":{"type":"string"},"carried":{"type":"boolean"}}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"project":{"type":"object","required":["name","system","lines"],"properties":{"name":{"type":"string"},"lines":{"type":"array","items":{"type":"object","required":["label","quantity","unit","from"]}},"system":{"enum":["metric","imperial"]}}},"howToImport":{"type":"string"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Create a My Project file from takeoffs","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"create_supplier_quote_request","title":"Create a request for quote to suppliers","description":"Creates a request for quote from a materials list or bill of materials (the lines of a takeoff, house, plan or calculation, or the reader's own): Markdown to paste, a CSV, the site's link a merchant opens to price it, and a My Project file. It carries no price and sends nothing to anyone.","input_schema":{"type":"object","required":["items"],"properties":{"note":{"type":"string","maxLength":600,"description":"A note to the merchants: delivery address area, dates, access."},"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":200},"unit":{"type":"string","maxLength":24},"label":{"type":"string","maxLength":200},"notes":{"type":"string","maxLength":200},"order":{"type":"object","properties":{"unit":{"type":"string"},"quantity":{"type":"number"}}},"packs":{"type":"number","minimum":0},"packName":{"type":"string","maxLength":120},"packSize":{"type":"number","exclusiveMinimum":0},"quantity":{"type":"number","exclusiveMinimum":0},"description":{"type":"string","maxLength":160}},"description":"A bill line: as a takeoff, house, plan or calculation answer gives it (label or name, quantity, unit, and order where it says what to buy), or the reader's own."},"maxItems":400,"minItems":1},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"market":{"enum":["US","CA","UK","AU","INTL"],"type":"string","description":"Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."},"project":{"type":"string","maxLength":120,"description":"The project's name, as the merchants will see it."},"currency":{"type":"string","maxLength":8,"description":"The currency prices are asked in; left out, the market's."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","project","currency","rows","markdown","csv","link","howToSend","requestFile","file","howToImport","links","licence","notice"],"properties":{"csv":{"type":"object","required":["filename","mediaType","content"]},"file":{"type":"object","required":["filename","mediaType","content"]},"link":{"type":"string","description":"The site's request link: the merchant opens it, prices it in their own browser and sends a reply link back."},"rows":{"type":"array","items":{"type":"object","required":["label","quantity","unit"],"properties":{"unit":{"type":"string"},"label":{"type":"string"},"packs":{"type":"number"},"packName":{"type":"string"},"packSize":{"type":"number"},"quantity":{"type":"number"}}}},"links":{"type":"object","required":["rfq","project"]},"engine":{"type":"object"},"notice":{"type":"string"},"dropped":{"type":"integer"},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"project":{"type":"string"},"currency":{"type":"string"},"markdown":{"type":"string","description":"The request, to paste into a message."},"howToSend":{"type":"string"},"howToImport":{"type":"string"},"requestFile":{"type":"object","required":["filename","mediaType","content"],"properties":{"schema":{"type":"string","description":"The open JSON Schema the request file follows, for a supplier's own software."}}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Create a request for quote to suppliers","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"diagnose_symptom","title":"Diagnose a building defect (crack, damp, leak)","description":"Matches one building defect described in plain words, such as a crack, a damp patch, a water leak or a tripping breaker, to the site's diagnosis pages, and returns the candidate causes, what tells them apart, the checks in order and when to call a professional; ambiguous words return candidates. It does not say which cause it is.","input_schema":{"type":"object","required":["symptom"],"properties":{"limit":{"type":"integer","maximum":3,"minimum":1,"description":"How many diagnoses at most. Left out: one when the match is clear, up to three when it is not."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"market":{"enum":["US","CA","UK","AU","INTL"],"type":"string","description":"Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."},"symptom":{"type":"string","maxLength":300,"minLength":3,"description":"What the reader sees, hears or smells, in their own words: \"my breaker keeps tripping when the kettle is on\"."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","symptom","match","matchedBy","note","diagnoses","alsoConsider","links","citation","licence","notice"],"properties":{"note":{"type":"string"},"links":{"type":"object","required":["hub","structural"]},"match":{"enum":["clear","ambiguous","none"]},"engine":{"type":"object"},"market":{"anyOf":[{"type":"string"},{"type":"null"}]},"notice":{"type":"string"},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"symptom":{"type":"string"},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"diagnoses":{"type":"array","items":{"type":"object","required":["kind","slug","symptom","url","callAProfessional"],"properties":{"url":{"type":"string"},"kind":{"enum":["diagnosis","structural"]},"slug":{"type":"string"},"causes":{"type":"array","items":{"type":"object","required":["cause","likelihood","distinguishedBy","check"],"properties":{"cause":{"type":"string"},"check":{"type":"string","description":"The one thing to look at to confirm or rule it out."},"likelihood":{"enum":["most common","common","less common","uncommon"]},"distinguishedBy":{"type":"string","description":"What tells this cause apart from the others."}}}},"checks":{"type":"array","items":{"type":"object","required":["step","why"],"properties":{"why":{"type":"string"},"step":{"type":"string"}}}},"family":{"type":"string"},"related":{"type":"array","items":{"type":"object","required":["slug","url"]}},"symptom":{"type":"string"},"urgency":{"type":"string"},"verdict":{"type":"string","description":"The page's first line: what to act on before reading further. Not a diagnosis."},"looksLike":{"type":"string"},"calculators":{"type":"array","items":{"type":"object","required":["slug","title","url"],"properties":{"url":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"}}}},"whyStructural":{"type":"string"},"callAProfessional":{"type":"array","items":{"type":"string"}}}}},"matchedBy":{"enum":["site-search","shared-words"]},"alsoConsider":{"type":"array","items":{"type":"object","required":["slug","symptom"]}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Diagnose a building defect (crack, damp, leak)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"estimate_house","title":"Estimate the materials to build a house","description":"Estimates the materials to build one rectangular house of one or two storeys from a few figures (footprint, walls, roof, openings): every quantity with what to order, assumptions, plans of each storey and labour hours, as the site's House Estimator does. It counts; it does not design a structure. No prices.","input_schema":{"type":"object","required":[],"properties":{"pitch":{"enum":["4","6","8","10","12"],"type":"string","description":"Roof pitch, rise in 12."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"family":{"enum":["wall.framed-exterior","wall.masonry","wall.sip"],"type":"string"},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"values":{"type":"object","description":"The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight (\"12 m\", \"40 ft\"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it.","maxProperties":30,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"example":{"type":"string","maxLength":120,"description":"Start from one of the site's example houses (its slug) in place of the estimator's opening house."},"storeys":{"enum":[1,2],"type":"integer"},"selection":{"type":"object","description":"The exterior wall's build-up choices.","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."},"roofFamily":{"enum":["roof.asphalt-shingle","roof.tile-slate"],"type":"string"},"roofSelection":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","house","system","values","rows","counts","unplaced","raised","assumptions","omitted","plans","labour","sources","citation","links","licence","notice"],"properties":{"rows":{"type":"array","items":{"type":"object","required":["key","section","label","where","quantity","unit","otherSystem","calculator"],"properties":{"key":{"type":"string"},"note":{"type":"string"},"unit":{"type":"string"},"label":{"type":"string"},"order":{"type":"object","required":["quantity","unit"]},"where":{"type":"string"},"section":{"type":"string"},"quantity":{"type":"number"},"calculator":{"type":"object","required":["slug","title"]},"otherSystem":{"anyOf":[{"type":"object","required":["quantity","unit"]},{"type":"null"}]}}}},"house":{"type":"object","required":["storeys","family","selection","pitch","roofFamily","roofSelection"]},"links":{"type":"object","required":["page"]},"plans":{"type":"array","items":{"type":"object","required":["level","name","unit","walls","openings","box"]}},"counts":{"type":"array","items":{"type":"object","required":["key","label","quantity"]}},"engine":{"type":"object"},"labour":{"type":"object","required":["rows","totalHours","programme","likelyDays","note"]},"notice":{"type":"string"},"raised":{"type":"array","items":{"type":"string"}},"system":{"enum":["metric","imperial"]},"values":{"type":"array","items":{"type":"object","required":["id","label","value","source"]}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"omitted":{"type":"array","items":{"type":"object","required":["assembly","step","why"]}},"sources":{"type":"array","items":{"type":"object","required":["calculator","title","version","sources"]}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"unplaced":{"type":"object"},"assumptions":{"type":"array","items":{"type":"string"}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Estimate the materials to build a house","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"export_drawing","title":"Export a drawing as DXF, SVG or IFC (CAD and BIM files)","description":"Exports a Construction Canvas drawing (a template, shapes, a room layout, drawing commands, house figures or a canvas document) as DXF for CAD, with the site's CQ-* layers, and as SVG, one plan per level in millimetres, or as one openBIM IFC4 model with quantity sets, as the canvas's own download writes them; a file too large to return is rebuilt from the drawing's link.","input_schema":{"type":"object","required":[],"properties":{"house":{"type":"object","properties":{"pitch":{"enum":["4","6","8","10","12"],"type":"string","description":"Roof pitch, rise in 12."},"family":{"enum":["wall.framed-exterior","wall.masonry","wall.sip"],"type":"string"},"values":{"type":"object","description":"The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight (\"12 m\", \"40 ft\"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it.","maxProperties":30,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"example":{"type":"string","maxLength":120,"description":"Start from one of the site's example houses (its slug) in place of the estimator's opening house."},"storeys":{"enum":[1,2],"type":"integer"},"selection":{"type":"object","description":"The exterior wall's build-up choices.","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"roofFamily":{"enum":["roof.asphalt-shingle","roof.tile-slate"],"type":"string"},"roofSelection":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}}},"description":"The House Estimator's form: the house drawn as the estimator draws it.","additionalProperties":false},"level":{"type":"string","maxLength":60,"description":"One level by its id or name; left out, every level with something on its plan."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"layout":{"type":"object","required":["rooms"],"properties":{"grid":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"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."},"doors":{"type":"array","items":{"type":"object","properties":{"room":{"type":"string","maxLength":60,"description":"The room it is in, by name."},"side":{"enum":["south","east","north","west"],"description":"The side of that room."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"The opening's width; left out, the canvas's default."},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."},"between":{"type":"array","items":{"type":"string","maxLength":60},"maxItems":2,"minItems":2,"description":"A door only: the two rooms it joins, on the wall they share."}},"additionalProperties":false},"maxItems":60,"description":"Each between two rooms, or in a room's side (an outside door where that side is an exterior wall)."},"rooms":{"type":"array","items":{"type":"object","required":["name","width","depth"],"properties":{"at":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"Its south-west corner. The first room without at or against is at the origin.","additionalProperties":false},"name":{"type":"string","maxLength":60,"minLength":1,"description":"Unique in the layout; openings and later rooms refer to it."},"depth":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along y (north), wall centre to wall centre."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along x (east), wall centre to wall centre."},"against":{"type":"object","required":["room","side"],"properties":{"room":{"type":"string","maxLength":60},"side":{"enum":["south","east","north","west"]},"align":{"enum":["start","centre","end"],"description":"Along that side: flush with its west or south end (start, the default), centred, or flush with the other end."},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"Beside a side of an earlier room, sharing that wall.","additionalProperties":false}},"additionalProperties":false},"maxItems":30,"minItems":1},"windows":{"type":"array","items":{"type":"object","properties":{"room":{"type":"string","maxLength":60,"description":"The room it is in, by name."},"side":{"enum":["south","east","north","west"],"description":"The side of that room."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"The opening's width; left out, the canvas's default."},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."},"between":{"type":"array","items":{"type":"string","maxLength":60},"maxItems":2,"minItems":2,"description":"A door only: the two rooms it joins, on the wall they share."}},"additionalProperties":false},"maxItems":60,"description":"Each in a room's side, on an exterior wall."}},"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.","additionalProperties":false},"shapes":{"type":"array","items":{"type":"object","required":["shape"],"properties":{"p":{"type":"object","description":"The component's own properties: a fence's heightMm, a bed's mulchDepthMm, each length with its unit.","maxProperties":20},"at":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"The south-west corner (a path's or a fence's start). Left out: the origin.","additionalProperties":false},"ref":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","description":"A name a later shape's against uses."},"legs":{"type":"array","items":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"maxItems":20,"minItems":1,"description":"A fence's straight runs, in order."},"name":{"type":"string","maxLength":60,"description":"A room's name."},"build":{"enum":["pavers","concrete"],"description":"A patio's or path's build: a patio is concrete unless pavers; a path is pavers unless concrete."},"depth":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along y (north); for a deck or patio against a side, out from it."},"doors":{"type":"array","items":{"type":"object","required":["side","offset"],"properties":{"side":{"enum":["south","east","north","west"]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along the wall from its start: walls run counter-clockwise from the south-west corner."},"exterior":{"type":"boolean","description":"A door: an outside door (the default) or an inside one."}},"additionalProperties":false},"maxItems":20},"gates":{"type":"array","items":{"type":"object","required":["leg","offset","width"],"properties":{"leg":{"type":"integer","minimum":1},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"maxItems":20,"description":"Gate openings, by leg (from 1) and offset along it; taken out of the run, the gate itself not counted."},"scope":{"type":"object","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"shape":{"enum":["room","deck","patio","bed","path","fence"],"description":"room: four exterior walls with doors and windows; deck, patio, bed (planted): a rectangle; path: a paved strip; fence: legs and 90° turns. Anything else is refused."},"turns":{"type":"array","items":{"enum":["left","right"]},"maxItems":19,"description":"A 90° turn between each two legs."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along x (east): a room's, deck's, patio's or bed's; a path's width across it."},"length":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"A path's length."},"against":{"type":"object","required":["shape","side"],"properties":{"side":{"enum":["south","east","north","west"]},"shape":{"type":"string"},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A deck, patio or bed against a side of an earlier room or rectangle: centred on it, or from its west or south end by offset.","additionalProperties":false},"heading":{"enum":["south","east","north","west"],"description":"The way a path or a fence's first leg runs (default east)."},"windows":{"type":"array","items":{"type":"object","required":["side","offset"],"properties":{"side":{"enum":["south","east","north","west"]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along the wall from its start: walls run counter-clockwise from the south-west corner."},"exterior":{"type":"boolean","description":"A door: an outside door (the default) or an inside one."}},"additionalProperties":false},"maxItems":20},"finishes":{"type":"object","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}}},"additionalProperties":false},"maxItems":40,"minItems":1,"description":"Simple 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."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"formats":{"type":"array","items":{"enum":["dxf","svg","ifc"]},"maxItems":3,"minItems":1,"description":"dxf, svg, ifc (openBIM IFC4: one file for the whole drawing, every level, with quantity sets), or several; left out, dxf and svg."},"variant":{"type":"string","pattern":"^[a-z0-9-]{1,40}$","description":"With template: one of its two \"what changes if\" variants, by id; a wrong one is refused with the template's own list."},"commands":{"type":"array","items":{"type":"object","required":["op"],"properties":{"c":{"type":"string","maxLength":40,"description":"outline: slab, roof, floor, driveway, patio, deck, landscaping; path: footing, cable, pipe, duct, fence, retaining-wall; point: column, pier, outlet, switch, light, panel, fixture, drain, radiator, register."},"p":{"type":"object","description":"The component's own properties by id (components/properties.ts): a length with its unit (widthMm, heightMm, sillMm …), a choice's option id, a count, true or false.","maxProperties":20},"at":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"op":{"enum":["level","type","wall","opening","room","outline","path","point","beam","stair"]},"to":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"ref":{"type":"string","maxLength":60,"description":"A name by which later commands refer to what this one makes."},"from":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"kind":{"enum":["door","window"]},"name":{"type":"string","maxLength":60,"description":"A level's, a type's or a room's name."},"type":{"type":"string","maxLength":60,"description":"A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."},"wall":{"type":"string","maxLength":60,"description":"The wall an opening goes in: its ref."},"level":{"type":"string","maxLength":60,"description":"A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."},"scope":{"type":"object","description":"Its scope question name → answer, by the planner's ids.","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"closed":{"type":"boolean"},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"An opening's centre, measured along its wall from the wall's start."},"points":{"type":"array","items":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"maxItems":500,"minItems":2},"assembly":{"type":"string","maxLength":80,"description":"A type's build-up: a canvas assembly id (wall.framed-exterior, roof.asphalt-shingle, slab.on-grade …)."},"finishes":{"type":"object","description":"A room's, or a driveway's, patio's, deck's, fence's or retaining wall's surface role → finish id, by the planner's ids.","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}},"elevation":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"selection":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"thickness":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"wastePercent":{"type":"number","maximum":100,"minimum":0}}},"maxItems":500,"minItems":1,"description":"Drawing 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."},"document":{"type":"object","description":"A Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener."},"template":{"type":"string","pattern":"^[a-z0-9-]{1,60}$","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."},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","system","from","levels","files","units","layers","links","rebuild","citation","licence","notice"],"properties":{"from":{"type":"string"},"files":{"type":"array","items":{"type":"object","required":["format","filename","mediaType","bytes","content"],"properties":{"note":{"type":"string"},"bytes":{"type":"integer"},"level":{"type":"object"},"format":{"enum":["dxf","svg","ifc"]},"layers":{"type":"array","items":{"type":"string"}},"content":{"anyOf":[{"type":"string","description":"The file's text."},{"type":"null"}]},"filename":{"type":"string"},"mediaType":{"type":"string"}}}},"links":{"type":"object","required":["canvas","drawing"],"properties":{"canvas":{"type":"string"},"drawing":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"units":{"type":"string"},"engine":{"type":"object"},"layers":{"type":"string"},"levels":{"type":"array","items":{"type":"object","required":["id","name"]}},"notice":{"type":"string"},"system":{"enum":["metric","imperial"]},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"rebuild":{"type":"string"},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"document":{"type":"object"},"template":{"type":"object"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Export a drawing as DXF, SVG or IFC (CAD and BIM files)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"fetch","title":"Read one page as text","description":"Returns the full text of one Craft Quantities page, identified by its id: what the page works out, its inputs or measurements with units and opening values, and its sources.","input_schema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","maxLength":200,"description":"A page id, such as calculator:concrete-calculator, takeoff:concrete-slab or diagnosis:drain-gurgles."}},"additionalProperties":false},"output_schema":{"type":"object","required":["id","title","text","url"],"properties":{"id":{"type":"string"},"url":{"type":"string"},"text":{"type":"string"},"title":{"type":"string"},"metadata":{"type":"object","additionalProperties":{"type":"string"}}}},"annotations":{"title":"Read one page as text","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"get_benchmark","title":"Get the Construction Quantities Benchmark","description":"Returns items of the Construction Quantities Benchmark, a CC BY 4.0 dataset of construction quantity questions built from the site's calculator test vectors: each with its inputs and a prompt in metric and US units, the expected answer in each system with its tolerance, and the worked steps. A page of calculators at a time or one calculator's items, with the download link and how to cite it.","input_schema":{"type":"object","required":[],"properties":{"page":{"type":"integer","minimum":1,"description":"Which page of the benchmark, from 1: each page holds the items of a few calculators, in slug order. 1 when left out."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"calculator":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"One calculator's items only, by its slug, such as concrete-calculator."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","dataset","items","excluded"],"properties":{"none":{"type":"string"},"page":{"anyOf":[{"type":"integer"},{"type":"null"}]},"items":{"type":"array","items":{"type":"object","required":["id","dataset","calculator","case","task","inputs","prompt","answer","steps","allowance","confidence"],"properties":{"id":{"type":"string","description":"The calculator's slug and the vector's position among its test cases, such as concrete-calculator/1."},"case":{"type":"string","description":"The test vector's own name."},"task":{"type":"string","description":"What is worked out: the calculator's result label."},"steps":{"type":"array","items":{"type":"object","required":["label","value","unit"],"properties":{"unit":{"type":"string"},"label":{"type":"string"},"value":{"type":"number"}}}},"answer":{"type":"object","required":["canonical","metric","imperial"],"properties":{"metric":{"type":"object","required":["value","unit","printed","tolerance"],"properties":{"unit":{"type":"string"},"value":{"type":"number"},"printed":{"type":"string","description":"The figure as the page prints it."},"tolerance":{"type":"number","description":"An answer in this unit is right when it is within this of the value."}}},"imperial":{"type":"object","required":["value","unit","printed","tolerance"],"properties":{"unit":{"type":"string"},"value":{"type":"number"},"printed":{"type":"string","description":"The figure as the page prints it."},"tolerance":{"type":"number","description":"An answer in this unit is right when it is within this of the value."}}},"canonical":{"type":"object","required":["value","unit","toleranceDecimalPlaces"],"properties":{"unit":{"type":"string"},"value":{"type":"number"},"toleranceDecimalPlaces":{"type":"number"}},"description":"What the test vector pins, in the calculator's own unit: met when |x − value| < 0.5 × 10^−toleranceDecimalPlaces."}}},"inputs":{"type":"array","items":{"type":"object","required":["id","label","value","fromVector","metric","imperial"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"In the base unit for a dimension (metres, m², litres, kg), the option value for a select."},"metric":{"type":"object","required":["value","unit"],"properties":{"unit":{"anyOf":[{"type":"string"},{"type":"null"}]},"value":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"baseUnit":{"type":"string"},"imperial":{"type":"object","required":["value","unit"],"properties":{"unit":{"anyOf":[{"type":"string"},{"type":"null"}]},"value":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"fromVector":{"type":"boolean","description":"False where the vector leaves the input out and it takes the value the page opens on."}}}},"prompt":{"type":"object","required":["metric","imperial"],"properties":{"metric":{"type":"string"},"imperial":{"type":"string"}}},"dataset":{"type":"string"},"allowance":{"anyOf":[{"type":"object","required":["label","percent"],"properties":{"label":{"type":"string"},"percent":{"type":"number"}}},{"type":"null"}]},"calculator":{"type":"object","required":["slug","title","category","version","url"],"properties":{"url":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"version":{"type":"string"},"category":{"type":"string"}}},"confidence":{"type":"string"}}}},"engine":{"type":"object"},"dataset":{"type":"object","required":["name","id","version","edition","items","pages","download","method","scoring","licence","status","citation"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"items":{"type":"number"},"pages":{"type":"number"},"method":{"type":"string"},"status":{"type":"string"},"edition":{"type":"string","description":"The first twelve hex digits of the JSONL file's SHA-256: which content a citation means."},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"scoring":{"type":"string"},"vectors":{"type":"number"},"version":{"type":"string","description":"The method and fields version."},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"download":{"type":"object","required":["jsonl","manifest"],"properties":{"bytes":{"type":"number"},"jsonl":{"type":"string"},"sha256":{"type":"string"},"manifest":{"type":"string"}}},"excluded":{"type":"object","properties":{"money":{"type":"number"},"refused":{"type":"number"},"no-figure":{"type":"number"},"partial-vector":{"type":"number"}},"description":"Vectors left out, by reason: money (the calculator takes or returns a price), partial-vector (its figure needs an input left undefined), refused, no-figure."},"pageSize":{"type":"string"},"currentTo":{"type":"string"},"calculators":{"type":"number"}}},"excluded":{"type":"array","items":{"type":"object","required":["id","reason"],"properties":{"id":{"type":"string"},"reason":{"enum":["money","partial-vector","refused","no-figure"]}}}},"nextPage":{"type":"integer"},"calculator":{"type":"string"},"calculators":{"type":"array","items":{"type":"string"}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Get the Construction Quantities Benchmark","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"get_calculator","title":"Get one calculator's input fields","description":"Returns the input fields of one calculator, identified by its slug: each field's id, label, accepted units, range and default value in metric and US units, with the calculator's version, page and citation. It computes nothing.","input_schema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"The calculator's slug, such as concrete-calculator."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["calculator","inputs","citation","licence"],"properties":{"inputs":{"type":"array","items":{"type":"object","required":["id","label","type","help","opening"],"properties":{"id":{"type":"string"},"help":{"type":"string"},"type":{"enum":["number","select"]},"label":{"type":"string"},"money":{"enum":["rate","amount"]},"range":{"type":"object","properties":{"max":{"type":"number"},"min":{"type":"number"}}},"opening":{"type":"object","required":["metric","imperial"]},"options":{"type":"array","items":{"type":"object","required":["value","label"],"properties":{"label":{"type":"string"},"value":{"type":"string"}}}},"baseUnit":{"type":"string"},"dimension":{"type":"string"},"acceptedUnits":{"type":"array","items":{"type":"string"}}}}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"related":{"type":"array","items":{"type":"string"}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"changelog":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"change":{"type":"string"},"version":{"type":"string"}}}},"testCases":{"type":"integer"},"calculator":{"type":"object","required":["slug","title","category","version","lastVerified","url","json"],"properties":{"url":{"type":"string","description":"The calculator's page on craftquantities.com."},"json":{"type":"string","description":"The calculator's static API document, with its test vectors."},"slug":{"type":"string"},"title":{"type":"string"},"version":{"type":"string","description":"The calculator's own version; a result names the calculator that produced it."},"category":{"type":"string"},"description":{"type":"string"},"lastVerified":{"type":"string","description":"The date the calculator's sources were last checked."}}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Get one calculator's input fields","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"get_example","title":"Get one worked example","description":"Returns one worked construction estimate from the site, identified by its slug: the measurements, the steps in order with the calculator each uses, the figure each step pins and the waste chosen.","input_schema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"A worked example's slug, such as bathroom-gutted-and-retiled."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["example","measurements","steps","wasteFactors","citation","licence"],"properties":{"steps":{"type":"array","items":{"type":"object","required":["step","calculator","needs","produces","run"]}},"example":{"type":"object","required":["slug","title","job","market","system","basis","summary","url"],"properties":{"job":{"type":"string"},"url":{"type":"string"},"slug":{"type":"string"},"basis":{"enum":["modelled","recorded"]},"title":{"type":"string"},"market":{"type":"string"},"system":{"enum":["metric","imperial"]},"summary":{"type":"string"},"takeoff":{"anyOf":[{"type":"string"},{"type":"null"}]},"updated":{"type":"string"},"published":{"type":"string"}}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"measurements":{"type":"array","items":{"type":"object","required":["what","how","value"]}},"wasteFactors":{"type":"array","items":{"type":"object","required":["material","factor","why"]}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Get one worked example","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"get_planner","title":"Get the planner's fields for one kind of space","description":"Returns the room planner's fields for one kind of space: its figures, surfaces and finish ids, scope questions and rows, with their ids.","input_schema":{"type":"object","required":["kind"],"properties":{"kind":{"enum":["room","bathroom","slab","deck","driveway","fence","loft","retaining-wall","exterior-wall","stair"],"type":"string","description":"The kind of space: a room or a bathroom (from its size, doors and windows), or a slab, deck, driveway, fence, loft, retaining wall, exterior wall or stair."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["kind","modelSchemaVersion","url","figures","surfaces","scope","intents","branches","decisions","licence"],"properties":{"url":{"type":"string"},"kind":{"type":"string"},"scope":{"type":"array","items":{"type":"object","required":["name","label","answers","help"]}},"figures":{"type":"array","items":{"type":"object","required":["id","label","dimension","required"]}},"intents":{"type":"array","items":{"type":"string"}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"branches":{"type":"array","items":{"type":"object","required":["id","label","trade","surface","role"]}},"openings":{"type":"array"},"surfaces":{"type":"array","items":{"type":"object","required":["role","label","finishes"]}},"decisions":{"type":"object"},"modelSchemaVersion":{"type":"integer"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Get the planner's fields for one kind of space","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"get_sources","title":"Sources and citation for a calculation","description":"Where does a figure come from, and how is it cited? Returns a calculator's sources as it cites them, the codes and standards they name, the site's standards pages, and a citation in plain, APA, Harvard and BibTeX. It adds no source the calculator does not cite.","input_schema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"The calculator's slug, such as concrete-calculator."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["calculator","sources","standards","citation","licence"],"properties":{"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"sources":{"type":"array","items":{"type":"object","required":["label"],"properties":{"url":{"type":"string","description":"Only where the calculator gives one; none is invented."},"label":{"type":"string","description":"The source as the calculator cites it."},"references":{"type":"array","items":{"type":"object","required":["kind","document"],"properties":{"body":{"type":"string"},"kind":{"enum":["code","standard"]},"edition":{"type":"string"},"section":{"type":"string"},"document":{"type":"string"}}}}}}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"standards":{"type":"array","items":{"type":"object","required":["title","page"],"properties":{"page":{"type":"string"},"title":{"type":"string"},"publisher":{"type":"string"}}}},"calculator":{"type":"object","required":["slug","title","category","version","lastVerified","url","json"],"properties":{"url":{"type":"string","description":"The calculator's page on craftquantities.com."},"json":{"type":"string","description":"The calculator's static API document, with its test vectors."},"slug":{"type":"string"},"title":{"type":"string"},"version":{"type":"string","description":"The calculator's own version; a result names the calculator that produced it."},"category":{"type":"string"},"description":{"type":"string"},"lastVerified":{"type":"string","description":"The date the calculator's sources were last checked."}}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Sources and citation for a calculation","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"get_takeoff","title":"Get one takeoff's measurements","description":"Returns the measurements one whole-job takeoff needs, identified by its id: each measurement's id, unit and opening figure, its build-up choices, the calculators it runs and what it leaves out.","input_schema":{"type":"object","required":["takeoff"],"properties":{"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"takeoff":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"A takeoff id, such as concrete-slab."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["takeoff","measurements","choices","steps","excludes","citation","licence"],"properties":{"steps":{"type":"array","items":{"type":"object","required":["key","calculator","name"]}},"choices":{"type":"array","items":{"type":"object","required":["id","label","options","opening"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"opening":{"type":"object"},"options":{"type":"array","items":{"type":"object","required":["id","label"]}}}}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"takeoff":{"type":"object","required":["id","name","category","description","url"],"properties":{"id":{"type":"string"},"url":{"type":"string","description":"The takeoff's page on craftquantities.com."},"name":{"type":"string"},"category":{"type":"string"},"description":{"type":"string"}}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"excludes":{"type":"array","items":{"type":"string"}},"measurements":{"type":"array","items":{"type":"object","required":["id","label","opening"],"properties":{"id":{"type":"string"},"help":{"type":"string"},"basis":{"type":"object","properties":{"source":{"type":"object","required":["kind"],"properties":{"kind":{"type":"string"}}},"unsourced":{"type":"string"}},"description":"Where a figure comes from: a source the site publishes, or the reason there is none."},"label":{"type":"string"},"opening":{"type":"object"},"dimension":{"type":"string"},"acceptedUnits":{"type":"array","items":{"type":"string"}}}}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Get one takeoff's measurements","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"import_quote","title":"Turn my quote into an estimate","description":"Turns a supplier's or builder's quote the reader has, prices and all, into a My Project file, as the site's Quote to Estimate does, and checks its own arithmetic. The prices are the reader's figures from their document, not the site's.","input_schema":{"type":"object","required":["quote"],"properties":{"name":{"type":"string","maxLength":120},"quote":{"type":"string","maxLength":20000,"minLength":1,"description":"The quote's text, one item to a line, with its prices."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"market":{"enum":["US","CA","UK","AU","INTL"],"type":"string","description":"Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."},"currency":{"type":"string","maxLength":8,"description":"The quote's currency symbol, where the quote does not show it."},"supplier":{"type":"string","maxLength":120}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","pricesAreTheReaders","currency","lines","declared","totals","arithmetic","skipped","file","howToImport","licence"],"properties":{"file":{"type":"object","required":["filename","mediaType","content"]},"lines":{"type":"array","items":{"type":"object","required":["section","text","unit","kind","doubts","source"]}},"engine":{"type":"object"},"totals":{"type":"object","required":["subtotal","tax","total","unpriced"]},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"skipped":{"type":"array","items":{"type":"string"}},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"declared":{"type":"object"},"arithmetic":{"type":"array"},"howToImport":{"type":"string"},"pricesAreTheReaders":{"type":"string"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Turn my quote into an estimate","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"layout_reinforcement","title":"Rebar layout drawing and bar counts for a slab or footing","description":"Lays out reinforcing bars in a rectangular slab or footing from the bar size, spacing and cover the engineer gives: bars each way, bar lengths, total length with lap, stock sticks, weight where the site's calculator carries the size, and the layout as SVG and DXF. A quantity layout, not a design: it does not size structure or check a code.","input_schema":{"type":"object","required":["length","width","cover","barSize"],"properties":{"mats":{"enum":[1,2],"default":1,"description":"One mat, or two (top and bottom) laid out alike."},"cover":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"The cover to the bars on plan, as the engineer gives it."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along y, with its unit."},"chairs":{"type":"object","required":["supportSpacing"],"properties":{"supportSpacing":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"The bar-support supplier's rated spacing."},"supportEveryNth":{"enum":["1","2","3"]}},"description":"Count the bar supports too, from the supplier's support spacing.","additionalProperties":false},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"length":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along x, with its unit."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"barSize":{"type":"string","maxLength":12,"minLength":2,"description":"As the engineer gives it: #4, 15M, N12, H12, T12 or 12 mm."},"element":{"enum":["slab","footing"],"default":"slab","description":"A slab, or a pad or strip footing, as a rectangle on plan."},"formats":{"type":"array","items":{"enum":["svg","dxf"]},"maxItems":2,"minItems":1,"description":"The drawing's files: svg, dxf or both (the default)."},"spacing":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"The spacing both ways, as the engineer gives it."},"widthwise":{"type":"object","properties":{"count":{"type":"integer","maximum":1000,"minimum":0,"description":"A number of bars spread evenly from cover to cover; 0 leaves this direction out."},"spacing":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"The bars running along the width (spaced along the length): a spacing of their own, or a count.","additionalProperties":false},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."},"lapPercent":{"type":"number","maximum":40,"minimum":0,"description":"The lap-splice allowance on the total; left out, the Rebar Calculator's own default."},"lengthwise":{"type":"object","properties":{"count":{"type":"integer","maximum":1000,"minimum":0,"description":"A number of bars spread evenly from cover to cover; 0 leaves this direction out."},"spacing":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"The bars running along the length (spaced across the width): a spacing of their own, or a count.","additionalProperties":false}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","system","element","given","clear","bars","totals","calculatorCheck","weight","chairs","files","method","leftOut","notDesign","citation","licence","notice"],"properties":{"bars":{"type":"object","required":["lengthwise","widthwise","totalBars"]},"clear":{"type":"object","required":["length","width"],"properties":{"width":{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string"}}},"length":{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string"}}}}},"files":{"type":"array","items":{"type":"object","required":["format","filename","mediaType","bytes","content"],"properties":{"note":{"type":"string"},"bytes":{"type":"integer"},"level":{"type":"object"},"format":{"enum":["dxf","svg","ifc"]},"layers":{"type":"array","items":{"type":"string"}},"content":{"anyOf":[{"type":"string","description":"The file's text."},{"type":"null"}]},"filename":{"type":"string"},"mediaType":{"type":"string"}}}},"given":{"type":"object","required":["length","width","cover","barSize","mats","lapPercent"]},"chairs":{"anyOf":[{"type":"object","required":["value","unit","calculator"]},{"type":"null"}]},"engine":{"type":"object"},"method":{"type":"array","items":{"type":"string"}},"notice":{"type":"string"},"system":{"enum":["metric","imperial"]},"totals":{"type":"object","required":["barLength","withLap","lapPercent","stockLength","sticks","sticksUnit"]},"weight":{"anyOf":[{"type":"object","required":["metric","imperial","calculator"]},{"type":"null"}]},"element":{"enum":["slab","footing"]},"leftOut":{"type":"array","items":{"type":"string"}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"notDesign":{"type":"string"},"weightNote":{"type":"string"},"calculatorCheck":{"anyOf":[{"type":"object","required":["calculator","sticksOneMat","barsLengthwise","barsWidthwise","agrees"]},{"type":"null"}]}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Rebar layout drawing and bar counts for a slab or footing","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"market_documents","title":"Find the building code for a kind of work","description":"Finds which family of building codes or standards governs one kind of work in one market (US, Canada, UK or Australia, or a country mapped to one), who publishes it and the site's standards page. It does not say which edition is in force: adoption is local, and the answer names who decides.","input_schema":{"type":"object","required":["market"],"properties":{"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"market":{"type":"string","maxLength":60,"description":"US, CA, UK, AU or INTL — or a country's name (\"England\", \"Canada\"); a country the site has no market for answers as INTL."},"subject":{"type":"string","maxLength":200,"description":"The work, in words: \"kitchen wiring\", \"stair handrails\", \"gas boiler flue\"."},"calculator":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"Or a calculator's slug: the subjects its own sources name."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","market","place","asked","matchedFrom","subjects","adoption","decidedBy","notice","links","citation","licence"],"properties":{"none":{"type":"string"},"asked":{"type":"object"},"links":{"type":"object","required":["standards"]},"place":{"type":"string"},"engine":{"type":"object"},"market":{"enum":["US","CA","UK","AU","INTL"]},"notice":{"type":"string"},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"adoption":{"type":"string","description":"The market's fixed sentence: adoption, edition and amendments are decided locally."},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"subjects":{"type":"array","items":{"type":"object","required":["topic","subject","documents"],"properties":{"none":{"type":"string"},"topic":{"type":"string"},"subject":{"type":"string"},"byMarket":{"type":"array","items":{"type":"object","required":["market","place","documents"],"properties":{"place":{"type":"string"},"market":{"type":"string"},"documents":{"type":"array","items":{"type":"object","required":["document","publishers","standardsPages"],"properties":{"document":{"type":"string","description":"The document family, as the site names it — not an edition."},"publishers":{"type":"array","items":{"type":"string"}},"standardsPages":{"type":"array","items":{"type":"string"}}}}}}}},"documents":{"type":"array","items":{"type":"object","required":["document","publishers","standardsPages"],"properties":{"document":{"type":"string","description":"The document family, as the site names it — not an edition."},"publishers":{"type":"array","items":{"type":"string"}},"standardsPages":{"type":"array","items":{"type":"string"}}}}}}}},"decidedBy":{"type":"string"},"calculator":{"type":"object"},"marketNote":{"type":"string"},"matchedFrom":{"enum":["subject","calculator-sources","calculator-title"]}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Find the building code for a kind of work","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"measure_sketch","title":"Measure a plan, sketch or photo from its points","description":"Measures areas, perimeters and lengths from points read off a floor plan, sketch or photo (pixel coordinates) and one known reference (a figured dimension, an ID-1 card or an A4 or Letter sheet): scaled figures in metric and US units with an uncertainty band, closure and crossing checks, and a canvas link. It receives no image.","input_schema":{"type":"object","required":["shapes","reference"],"properties":{"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"shapes":{"type":"array","items":{"type":"object","required":["kind","points"],"properties":{"as":{"enum":["measure","room","slab","floor","patio","deck","driveway","landscaping","roof","fence","footing","retaining-wall"],"description":"What it is drawn as on the canvas: a kept measure (the default), or a room (walls round it), slab, floor, patio, deck, driveway, landscaping or roof outline; a fence, footing or retaining wall path. A component is listed with its materials."},"kind":{"enum":["area","length"],"description":"area: a closed outline (a floor, a slab, a roof plane on plan); length: a line or a path (a fence, a footing, a run)."},"name":{"type":"string","maxLength":60},"closed":{"type":"boolean","description":"A length only: the path closes back to its first point."},"points":{"type":"array","items":{"type":"object","required":["x","y"],"properties":{"x":{"type":"number"},"y":{"type":"number"}},"description":"A point in the image's own pixels: x to the right, y down from the top-left corner.","additionalProperties":false},"maxItems":501,"minItems":2,"description":"In order round the outline or along the path."},"calculator":{"type":"object","required":["slug","input"],"properties":{"slug":{"type":"string","maxLength":120},"input":{"type":"string","maxLength":80,"description":"The id of the calculator's input that takes the figure."},"figure":{"enum":["area","perimeter","length"]},"inputs":{"type":"object","description":"The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes \"12 ft\", \"3.5 m\", \"8' 3 1/2\\\"\" or {\"value\": 12, \"unit\": \"ft\"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.","maxProperties":100,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}}},"description":"A calculator the figure goes into, run on the figure and on both ends of its band (at most 10 per request).","additionalProperties":false}},"additionalProperties":false},"maxItems":40,"minItems":1,"description":"The outlines and lines read off the image, in its pixels."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"reference":{"type":"object","properties":{"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"object":{"enum":["card","a4","letter","custom"],"description":"card: ISO/IEC 7810 ID-1 (85.60 × 53.98 mm); a4: 210 × 297 mm; letter: 8.5 × 11 in; custom: width and height given."},"corners":{"type":"array","items":{"type":"object","required":["x","y"],"properties":{"x":{"type":"number"},"y":{"type":"number"}},"description":"A point in the image's own pixels: x to the right, y down from the top-left corner.","additionalProperties":false},"maxItems":4,"minItems":4,"description":"Top-left, top-right, bottom-right, bottom-left; the width runs from the first to the second."},"dimension":{"type":"object","required":["from","to","length"],"properties":{"to":{"type":"object","required":["x","y"],"properties":{"x":{"type":"number"},"y":{"type":"number"}},"description":"A point in the image's own pixels: x to the right, y down from the top-left corner.","additionalProperties":false},"from":{"type":"object","required":["x","y"],"properties":{"x":{"type":"number"},"y":{"type":"number"}},"description":"A point in the image's own pixels: x to the right, y down from the top-left corner.","additionalProperties":false},"length":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"tolerance":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"How far the figure itself may be off (a dimension rounded to the nearest 10 mm: 5 mm)."}},"additionalProperties":false}},"description":"ONE known size in the same image: a figured dimension, or an object of known size by its four corners.","additionalProperties":false},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."},"pixelError":{"type":"number","default":2,"maximum":50,"minimum":0.1,"description":"How far any point may be off, in pixels: it sets the band."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","system","scale","shapes","document","links","drawingLink","accuracy","privacy","citation","licence","notice"],"properties":{"rows":{"type":"array","items":{"type":"object","required":["key","label","quantity","unit","calculator"]}},"links":{"type":"object","required":["canvas","drawing","page"],"properties":{"page":{"type":"string","description":"The site's Photo Takeoff page, whose geometry this is."},"canvas":{"type":"string"},"drawing":{"anyOf":[{"type":"string","description":"Opens the scaled shapes on the canvas; the drawing rides in the fragment, so nothing is uploaded."},{"type":"null"}]}}},"scale":{"type":"object","required":["pixelsPerMm","perPixel","reference","pixelError","scaleUncertaintyPercent"]},"engine":{"type":"object"},"notice":{"type":"string"},"shapes":{"type":"array","items":{"type":"object","required":["name","kind","as","points","closed","uncertaintyPercent"],"properties":{"as":{"type":"string"},"area":{"type":"object","required":["m2","ft2","low","high","text"],"properties":{"m2":{"type":"number"},"ft2":{"type":"number"},"low":{"type":"object"},"high":{"type":"object"},"text":{"type":"string"}}},"kind":{"enum":["area","length"]},"name":{"type":"string"},"closed":{"type":"boolean"},"length":{"type":"object","required":["m","ft","low","high","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"low":{"type":"object"},"high":{"type":"object"},"text":{"type":"string"}}},"points":{"type":"integer"},"closure":{"type":"string"},"perimeter":{"type":"object","required":["m","ft","low","high","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"low":{"type":"object"},"high":{"type":"object"},"text":{"type":"string"}}},"calculator":{"type":"object"},"uncertaintyPercent":{"type":"object"}}}},"system":{"enum":["metric","imperial"]},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"privacy":{"type":"string"},"accuracy":{"type":"array","items":{"type":"string"}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"document":{"type":"object","required":["schema","levels","entities"]},"drawingLink":{"type":"string"},"notMeasured":{"type":"array","items":{"type":"string"},"description":"What the canvas could not measure among the components drawn, and why (a patio, deck or driveway outline that is not square-cornered is drawn, not measured)."}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Measure a plan, sketch or photo from its points","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"open_in_site_link","title":"Link to the calculator page with these figures","description":"Returns a link that opens a construction calculator's page on craftquantities.com with the reader's figures filled in and their unit system, so a person can see or change the working on the page.","input_schema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"The calculator's slug, such as concrete-calculator."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"inputs":{"type":"object","description":"The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes \"12 ft\", \"3.5 m\", \"8' 3 1/2\\\"\" or {\"value\": 12, \"unit\": \"ft\"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.","maxProperties":100,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"market":{"enum":["US","CA","UK","AU","INTL"],"type":"string","description":"Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["url","page","inputs"],"properties":{"url":{"type":"string","description":"Opens the calculator's page on these inputs, in the chosen system."},"page":{"type":"string"},"inputs":{"type":"array","items":{"type":"object","required":["id","label","type","value","source"],"properties":{"id":{"type":"string"},"read":{"type":"string"},"type":{"enum":["number","select"]},"label":{"type":"string"},"value":{"type":["number","string"]},"metric":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"type":"number"}}},"option":{"type":"string"},"source":{"enum":["caller","default"]},"baseUnit":{"type":"string"},"imperial":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"type":"number"}}},"dimension":{"type":"string"}}}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Link to the calculator page with these figures","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"optimise_cuts","title":"Optimise a cut list: stock lengths and sheet layouts","description":"Optimises a cut list: pieces of given lengths cut from the stock lengths a merchant sells (timber, studs, joists, rafters, rebar, trim), or rectangles nested on sheets (plasterboard, drywall, plywood, OSB, tiles) in straight edge-to-edge cuts. Gives the stock or sheets to buy, a cutting plan per bar or sheet, the real waste and a lower bound. Quantities only: no prices, no structural design.","input_schema":{"type":"object","required":["kind","pieces"],"properties":{"kerf":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"The saw's kerf, charged on every piece (both ways on a sheet). Left out, the material's: 3 mm or 1/8 in for a saw, none for a bar shear or a board knife."},"kind":{"enum":["linear","sheet"],"description":"linear: lengths cut from stock lengths (studs, plates, joists, rafters, bars, trim, boards). sheet: rectangles nested on sheets (plasterboard or drywall, plywood, OSB, tiles)."},"stock":{"type":"array","items":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"maxItems":12,"minItems":1,"description":"linear: the stock lengths on offer, each in any number, with units (\"4.8 m\", \"16 ft\"). Left out, the market's usual lengths for the material in the system asked for."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"pieces":{"type":"array","items":{"type":"object","required":["count"],"properties":{"join":{"type":"boolean","description":"linear: a run that may be joined where a stock length runs out (a plate, a rim, trim, a board run). Left out, a piece longer than every stock length is listed, not split: a joint in a joist, a rafter or a bar is the designer's."},"count":{"type":"integer","maximum":3000,"minimum":1},"label":{"type":"string","maxLength":60},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"sheet: the piece's width, with its unit."},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"sheet: the piece's height (along the grain), with its unit."},"length":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"linear: the finished length, with its unit."},"rotate":{"type":"boolean","description":"sheet: whether this piece may turn a quarter; left out, as the request says."}},"additionalProperties":false},"maxItems":200,"minItems":1,"description":"The cut list: up to 200 lines and 3000 pieces (1500 for sheets) in all."},"rotate":{"type":"boolean","description":"sheet: whether pieces may turn a quarter (no grain or strength axis to keep). Left out: yes for plasterboard and tiles, no for plywood and OSB."},"sheets":{"type":"array","items":{"type":"object","required":["width","height"],"properties":{"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"maxItems":6,"minItems":1,"description":"sheet: the sheet sizes on offer (the plan takes the one that buys the least area). Left out, the market's usual size for the material."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"material":{"enum":["timber","rebar","casing","plasterboard","plywood","osb","tile"],"description":"What is cut, for the market's stock lengths or sheet sizes, saw kerf and grain when they are left out: timber (the default for linear), rebar or casing; plasterboard (the default for sheet), plywood, OSB or tile."},"minOffcut":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"linear: the shortest offcut worth keeping; shorter ones count as waste."},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","system","kind","material","given","buy","waste","bound","proven","patterns","patternsTotal","notDesign","method","citation","licence","notice","links"],"properties":{"buy":{"type":"array","items":{"type":"object","required":["count","text"],"properties":{"text":{"type":"string"},"count":{"type":"integer"},"sheet":{"type":"object"},"stock":{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string","description":"In the system asked for, then the other."}}}}},"description":"What to buy: each stock length or the sheet size, and how many."},"kind":{"enum":["linear","sheet"]},"bound":{"type":"object","required":["wastePercent"],"description":"The floor no plan can beat: the pieces with their kerf over the stock (with one stock length, at least one bar for each piece over half a bar; on sheets, one sheet for each piece too big to share one)."},"given":{"type":"object","description":"What the plan was worked from, in both systems: the stock lengths or sheet sizes, the kerf, the minimum offcut, whether pieces turn."},"links":{"type":"object","required":["page"],"properties":{"page":{"type":"string"}}},"steps":{"type":"integer","description":"Search steps spent (bounded)."},"waste":{"type":"object","required":["percent"],"properties":{"percent":{"type":"number"},"keptOffcut":{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string","description":"In the system asked for, then the other."}}},"excludingKeptOffcutsPercent":{"type":"number"}}},"bought":{"anyOf":[{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string","description":"In the system asked for, then the other."}}},{"type":"object","required":["m2","ft2","text"],"properties":{"m2":{"type":"number"},"ft2":{"type":"number"},"text":{"type":"string"}}}]},"engine":{"type":"object"},"method":{"type":"array","items":{"type":"string"}},"notice":{"type":"string"},"pieces":{"type":"integer"},"proven":{"type":"boolean","description":"True when no plan buys less: the exact branch and bound finished, or the plan meets the bound."},"system":{"enum":["metric","imperial"]},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"tooLong":{"type":"array","items":{"type":"object"},"description":"Pieces no stock length or sheet takes, listed rather than split."},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"material":{"type":"string"},"patterns":{"type":"array","items":{"anyOf":[{"type":"object","required":["times","stock","cuts","offcut","keep"],"properties":{"cuts":{"type":"array","items":{"type":"object","required":["length"],"properties":{"label":{"type":"string"},"joined":{"type":"boolean"},"length":{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string","description":"In the system asked for, then the other."}}}}}},"keep":{"type":"boolean"},"stock":{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string","description":"In the system asked for, then the other."}}},"times":{"type":"integer"},"offcut":{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string","description":"In the system asked for, then the other."}}}}},{"type":"object","required":["times","placed"],"properties":{"times":{"type":"integer"},"placed":{"type":"array","items":{"type":"object","required":["x","y","width","height","rotated"],"properties":{"x":{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string","description":"In the system asked for, then the other."}}},"y":{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string","description":"In the system asked for, then the other."}}},"label":{"type":"string"},"width":{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string","description":"In the system asked for, then the other."}}},"height":{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string","description":"In the system asked for, then the other."}}},"rotated":{"type":"boolean"}}}},"largestOffcut":{"type":"object"}}}]},"description":"Each way a bar or sheet is cut, with how many are cut that way; up to 150, most used first."},"required":{"anyOf":[{"type":"object","required":["m","ft","text"],"properties":{"m":{"type":"number"},"ft":{"type":"number"},"text":{"type":"string","description":"In the system asked for, then the other."}}},{"type":"object","required":["m2","ft2","text"],"properties":{"m2":{"type":"number"},"ft2":{"type":"number"},"text":{"type":"string"}}}]},"notDesign":{"type":"string"},"gapPercent":{"type":"number","description":"How far this plan is above the bound, percent."},"joinedRuns":{"type":"integer"},"patternsTotal":{"type":"integer"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Optimise a cut list: stock lengths and sheet layouts","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"plan_programme","title":"Build programme (construction schedule) from labour hours","description":"Builds a construction programme (build schedule, Gantt) from a project's labour hours: tasks by trade, stage and level in the usual order of work, each its hours over the crew and working day given, with totals, a CSV and, with a start date, an iCalendar file. Reads a project state token, a My Project file, takeoffs or a drawing. Weather, inspections and lead times are not modelled. No prices.","input_schema":{"type":"object","required":[],"properties":{"crew":{"type":"integer","default":2,"maximum":50,"minimum":1,"description":"People in each trade's crew, unless named in crews."},"file":{"type":"object","description":"A My Project file (the backup a project-file answer returns, or one the reader exported): its active project's lines and any hours typed on them."},"name":{"type":"string","maxLength":120,"description":"The project's name, for the files."},"crews":{"type":"object","description":"People in a trade's crew, by trade id (carpentry, drywall, electrical, roofing …).","additionalProperties":{"type":"integer","maximum":50,"minimum":1}},"token":{"type":"string","maxLength":16384,"minLength":8,"description":"A project state token (cqp1.…) from a project-file answer or an update: the project whose lines are put in order."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"market":{"enum":["US","CA","UK","AU","INTL"],"type":"string","description":"Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"daysOff":{"type":"array","items":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"maxItems":400,"description":"Dates not worked (holidays, a shutdown), YYYY-MM-DD."},"drawing":{"type":"object","properties":{"house":{"type":"object","properties":{"pitch":{"enum":["4","6","8","10","12"],"type":"string","description":"Roof pitch, rise in 12."},"family":{"enum":["wall.framed-exterior","wall.masonry","wall.sip"],"type":"string"},"values":{"type":"object","description":"The form's figures, each length with its unit: length, width, storeyHeight, eaveOverhang, rakeOverhang, slabThickness, footingWidth, footingDepth, trenchDepth, windowWidth, windowHeight, doorWidth, doorHeight (\"12 m\", \"40 ft\"); and the counts partitions, windows, outsideDoors, interiorDoors, iceDamEaves. Any left out opens where the page opens it.","maxProperties":30,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"example":{"type":"string","maxLength":120,"description":"Start from one of the site's example houses (its slug) in place of the estimator's opening house."},"storeys":{"enum":[1,2],"type":"integer"},"selection":{"type":"object","description":"The exterior wall's build-up choices.","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"roofFamily":{"enum":["roof.asphalt-shingle","roof.tile-slate"],"type":"string"},"roofSelection":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}}},"description":"The House Estimator's form: the house drawn as the estimator draws it.","additionalProperties":false},"layout":{"type":"object","required":["rooms"],"properties":{"grid":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"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."},"doors":{"type":"array","items":{"type":"object","properties":{"room":{"type":"string","maxLength":60,"description":"The room it is in, by name."},"side":{"enum":["south","east","north","west"],"description":"The side of that room."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"The opening's width; left out, the canvas's default."},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."},"between":{"type":"array","items":{"type":"string","maxLength":60},"maxItems":2,"minItems":2,"description":"A door only: the two rooms it joins, on the wall they share."}},"additionalProperties":false},"maxItems":60,"description":"Each between two rooms, or in a room's side (an outside door where that side is an exterior wall)."},"rooms":{"type":"array","items":{"type":"object","required":["name","width","depth"],"properties":{"at":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"Its south-west corner. The first room without at or against is at the origin.","additionalProperties":false},"name":{"type":"string","maxLength":60,"minLength":1,"description":"Unique in the layout; openings and later rooms refer to it."},"depth":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along y (north), wall centre to wall centre."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along x (east), wall centre to wall centre."},"against":{"type":"object","required":["room","side"],"properties":{"room":{"type":"string","maxLength":60},"side":{"enum":["south","east","north","west"]},"align":{"enum":["start","centre","end"],"description":"Along that side: flush with its west or south end (start, the default), centred, or flush with the other end."},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"Beside a side of an earlier room, sharing that wall.","additionalProperties":false}},"additionalProperties":false},"maxItems":30,"minItems":1},"windows":{"type":"array","items":{"type":"object","properties":{"room":{"type":"string","maxLength":60,"description":"The room it is in, by name."},"side":{"enum":["south","east","north","west"],"description":"The side of that room."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"The opening's width; left out, the canvas's default."},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle."},"between":{"type":"array","items":{"type":"string","maxLength":60},"maxItems":2,"minItems":2,"description":"A door only: the two rooms it joins, on the wall they share."}},"additionalProperties":false},"maxItems":60,"description":"Each in a room's side, on an exterior wall."}},"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.","additionalProperties":false},"shapes":{"type":"array","items":{"type":"object","required":["shape"],"properties":{"p":{"type":"object","description":"The component's own properties: a fence's heightMm, a bed's mulchDepthMm, each length with its unit.","maxProperties":20},"at":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"The south-west corner (a path's or a fence's start). Left out: the origin.","additionalProperties":false},"ref":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","description":"A name a later shape's against uses."},"legs":{"type":"array","items":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"maxItems":20,"minItems":1,"description":"A fence's straight runs, in order."},"name":{"type":"string","maxLength":60,"description":"A room's name."},"build":{"enum":["pavers","concrete"],"description":"A patio's or path's build: a patio is concrete unless pavers; a path is pavers unless concrete."},"depth":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along y (north); for a deck or patio against a side, out from it."},"doors":{"type":"array","items":{"type":"object","required":["side","offset"],"properties":{"side":{"enum":["south","east","north","west"]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along the wall from its start: walls run counter-clockwise from the south-west corner."},"exterior":{"type":"boolean","description":"A door: an outside door (the default) or an inside one."}},"additionalProperties":false},"maxItems":20},"gates":{"type":"array","items":{"type":"object","required":["leg","offset","width"],"properties":{"leg":{"type":"integer","minimum":1},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"maxItems":20,"description":"Gate openings, by leg (from 1) and offset along it; taken out of the run, the gate itself not counted."},"scope":{"type":"object","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"shape":{"enum":["room","deck","patio","bed","path","fence"],"description":"room: four exterior walls with doors and windows; deck, patio, bed (planted): a rectangle; path: a paved strip; fence: legs and 90° turns. Anything else is refused."},"turns":{"type":"array","items":{"enum":["left","right"]},"maxItems":19,"description":"A 90° turn between each two legs."},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along x (east): a room's, deck's, patio's or bed's; a path's width across it."},"length":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"A path's length."},"against":{"type":"object","required":["shape","side"],"properties":{"side":{"enum":["south","east","north","west"]},"shape":{"type":"string"},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A deck, patio or bed against a side of an earlier room or rectangle: centred on it, or from its west or south end by offset.","additionalProperties":false},"heading":{"enum":["south","east","north","west"],"description":"The way a path or a fence's first leg runs (default east)."},"windows":{"type":"array","items":{"type":"object","required":["side","offset"],"properties":{"side":{"enum":["south","east","north","west"]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"Along the wall from its start: walls run counter-clockwise from the south-west corner."},"exterior":{"type":"boolean","description":"A door: an outside door (the default) or an inside one."}},"additionalProperties":false},"maxItems":20},"finishes":{"type":"object","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}}},"additionalProperties":false},"maxItems":40,"minItems":1,"description":"Simple 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."},"variant":{"type":"string","pattern":"^[a-z0-9-]{1,40}$","description":"With template: one of its two \"what changes if\" variants, by id; a wrong one is refused with the template's own list."},"commands":{"type":"array","items":{"type":"object","required":["op"],"properties":{"c":{"type":"string","maxLength":40,"description":"outline: slab, roof, floor, driveway, patio, deck, landscaping; path: footing, cable, pipe, duct, fence, retaining-wall; point: column, pier, outlet, switch, light, panel, fixture, drain, radiator, register."},"p":{"type":"object","description":"The component's own properties by id (components/properties.ts): a length with its unit (widthMm, heightMm, sillMm …), a choice's option id, a count, true or false.","maxProperties":20},"at":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"op":{"enum":["level","type","wall","opening","room","outline","path","point","beam","stair"]},"to":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"ref":{"type":"string","maxLength":60,"description":"A name by which later commands refer to what this one makes."},"from":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"kind":{"enum":["door","window"]},"name":{"type":"string","maxLength":60,"description":"A level's, a type's or a room's name."},"type":{"type":"string","maxLength":60,"description":"A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."},"wall":{"type":"string","maxLength":60,"description":"The wall an opening goes in: its ref."},"level":{"type":"string","maxLength":60,"description":"A ref given to an earlier command, or the name of a level or type (the blank drawing has the level \"ground\" and the types EW-1, IW-1, WN-1, DR-1)."},"scope":{"type":"object","description":"Its scope question name → answer, by the planner's ids.","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"closed":{"type":"boolean"},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"offset":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}],"description":"An opening's centre, measured along its wall from the wall's start."},"points":{"type":"array","items":{"type":"object","required":["x","y"],"properties":{"x":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"y":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"description":"A point on plan, each coordinate a length with its unit.","additionalProperties":false},"maxItems":500,"minItems":2},"assembly":{"type":"string","maxLength":80,"description":"A type's build-up: a canvas assembly id (wall.framed-exterior, roof.asphalt-shingle, slab.on-grade …)."},"finishes":{"type":"object","description":"A room's, or a driveway's, patio's, deck's, fence's or retaining wall's surface role → finish id, by the planner's ids.","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}},"elevation":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"selection":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"thickness":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"wastePercent":{"type":"number","maximum":100,"minimum":0}}},"maxItems":500,"minItems":1,"description":"Drawing 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."},"document":{"type":"object","description":"A Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener."},"template":{"type":"string","pattern":"^[a-z0-9-]{1,60}$","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."},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"description":"A Construction Canvas drawing (a template, a house form, shapes, drawing commands or a canvas document), as a project file takes it; its levels set the level-by-level order.","additionalProperties":false},"takeoffs":{"type":"array","items":{"type":"object","required":["takeoff"],"properties":{"takeoff":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$"},"leaveOut":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":100,"description":"Rows the reader leaves out of the job: still worked and shown, not put in the project or counted in labour."},"selection":{"type":"object","description":"Build-up choice id → option id, the takeoff's own (a stud size, an insulation, a cladding). Choices left out take the page's own for the system.","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"allowances":{"type":"object","description":"Row → an allowance the reader sets: a percentage (cutting waste, overlap), or the option an allowance follows (a lay pattern). Row names are the takeoff's steps (the calculator slug, or the step key where one runs twice).","maxProperties":50,"additionalProperties":{"anyOf":[{"type":"number","maximum":100,"minimum":0},{"type":"string","maxLength":80}]}},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."},"measurements":{"type":"object","description":"Measurement id → value, each length, area or volume with its unit (\"12 ft\", {\"value\": 3.6, \"unit\": \"m\"}); counts as numbers. Ids are those of the takeoff; any left out opens at the page's own figure.","maxProperties":50,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}}},"additionalProperties":false},"maxItems":10,"minItems":1,"description":"Whole-job takeoffs, each an id and its measurements, as a project file takes them."},"workDays":{"type":"array","items":{"type":"integer","maximum":7,"minimum":1},"default":[1,2,3,4,5],"maxItems":7,"minItems":1,"description":"The days of the week worked, 1 Monday to 7 Sunday.","uniqueItems":true},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional first day (YYYY-MM-DD): the working days are then given dates and a calendar file is returned. No date is assumed without it."},"hoursPerDay":{"type":"number","default":8,"maximum":24,"minimum":1,"description":"Working hours in a crew's day."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","from","project","settings","tasks","totals","trades","leftOut","files","note","overlap","licence","notice"],"properties":{"from":{"enum":["token","file","takeoffs","drawing"]},"note":{"type":"string"},"files":{"type":"object","required":["csv"],"properties":{"csv":{"type":"object","required":["filename","mediaType","content"],"properties":{"content":{"type":"string"},"filename":{"type":"string"},"mediaType":{"type":"string"}}},"ics":{"type":"object","required":["filename","mediaType","content"],"properties":{"content":{"type":"string"},"filename":{"type":"string"},"mediaType":{"type":"string"}}}}},"tasks":{"type":"array","items":{"type":"object","required":["id","stage","stageName","trade","tradeName","level","items","hours","basis","crew","days","start","finish","dependsOn"],"properties":{"id":{"type":"string"},"crew":{"type":"integer","description":"People."},"days":{"type":"number","description":"Working days, in halves."},"basis":{"enum":["site","yours","both"]},"hours":{"type":"object","required":["low","likely","high"],"properties":{"low":{"type":"number"},"high":{"type":"number"},"likely":{"type":"number"}},"description":"Person-hours (h): the likely figure sets the duration."},"items":{"type":"array","items":{"type":"string"}},"level":{"type":["object","null"],"required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"stage":{"type":"string"},"start":{"type":"number","description":"Working days from the start, in halves."},"trade":{"type":"string"},"finish":{"type":"number","description":"Working days from the start, in halves."},"endDate":{"type":"string","description":"Last working date (YYYY-MM-DD), with a start date."},"dependsOn":{"type":"array","items":{"type":"string"}},"stageName":{"type":"string"},"startDate":{"type":"string","description":"First working date (YYYY-MM-DD), with a start date."},"tradeName":{"type":"string"}}}},"engine":{"type":"object"},"levels":{"type":"array","items":{"type":["object","null"],"required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}}},"notice":{"type":"string"},"totals":{"type":"object","required":["hours","personDays","crewDays","elapsedDays","tasks"],"properties":{"hours":{"type":"object","required":["low","likely","high"],"properties":{"low":{"type":"number"},"high":{"type":"number"},"likely":{"type":"number"}}},"tasks":{"type":"integer"},"endDate":{"type":"string"},"crewDays":{"type":"number","description":"Crew-days (d)."},"startDate":{"type":"string"},"personDays":{"type":"number","description":"Person-days (d)."},"elapsedDays":{"type":"number","description":"Working days (d), first start to last finish."}}},"trades":{"type":"array","items":{"type":"object","required":["id","name","crew"],"properties":{"id":{"type":"string"},"crew":{"type":"integer"},"name":{"type":"string"}}}},"leftOut":{"type":"object","required":["noHours","notATrade","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["title","why"],"properties":{"why":{"enum":["no-hours","not-a-trade"]},"title":{"type":"string"}}}},"noHours":{"type":"integer"},"notATrade":{"type":"integer"}}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"overlap":{"type":"string"},"project":{"type":"object","required":["name","lines"],"properties":{"name":{"type":"string"},"lines":{"type":"integer"}}},"settings":{"type":"object","required":["crew","crews","hoursPerDay","workDays"],"properties":{"crew":{"type":"integer"},"crews":{"type":"object"},"daysOff":{"type":"array","items":{"type":"string"}},"workDays":{"type":"array","items":{"type":"integer"}},"startDate":{"type":"string"},"hoursPerDay":{"type":"number"}}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Build programme (construction schedule) from labour hours","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"plan_project","title":"Plan the materials for several rooms","description":"Plans several spaces together, with an optional roof over them, as one project in the site's room planner, and returns each space's rows, every line together, labour hours and the plan. Quantities only; it does not size structure.","input_schema":{"type":"object","required":["spaces"],"properties":{"roof":{"type":"object","properties":{"pitch":{"type":"number","maximum":24,"minimum":0,"description":"The rise per 12 of run (6 = 6 in 12). Left out, each roof row says it waits for the pitch."},"scope":{"type":"object","description":"Scope question name → answer value, by the planner's ids.","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"inputs":{"type":"object","description":"Branch id → { calculator input id: value in its base unit }.","maxProperties":50,"additionalProperties":{"type":"object","maxProperties":30}},"intent":{"type":"string","maxLength":40,"description":"A trade, or everything."},"finishes":{"type":"object","description":"Surface role → finish id, by the planner's ids.","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}},"leaveOut":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":100,"description":"Branch ids to leave out."}},"additionalProperties":false},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"spaces":{"type":"array","items":{"type":"object","required":["kind","figures"],"properties":{"kind":{"enum":["room","bathroom","slab","deck","driveway","fence","loft","retaining-wall","exterior-wall","stair"],"type":"string","description":"The kind of space: a room or a bathroom (from its size, doors and windows), or a slab, deck, driveway, fence, loft, retaining wall, exterior wall or stair."},"name":{"type":"string","maxLength":120},"doors":{"type":"object","properties":{"count":{"type":"integer","maximum":20,"minimum":0},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"scope":{"type":"object","description":"Scope question name → answer value, by the planner's ids.","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"inputs":{"type":"object","description":"Branch id → { calculator input id: value in its base unit }.","maxProperties":50,"additionalProperties":{"type":"object","maxProperties":30}},"intent":{"type":"string","maxLength":40,"description":"A trade, or everything."},"figures":{"type":"object","description":"The space's figures, by the planner's ids, each a length with its unit (a room: length, width, height, wallThickness; a fence: length, height; a stair: totalRise, width …).","maxProperties":10,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"windows":{"type":"object","properties":{"count":{"type":"integer","maximum":20,"minimum":0},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"finishes":{"type":"object","description":"Surface role → finish id, by the planner's ids.","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}},"leaveOut":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":100,"description":"Branch ids to leave out."}},"additionalProperties":false},"maxItems":12,"minItems":1,"description":"The spaces, in order, each one planned space."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","system","spaces","lines","labour","assumptions","model","sources","citation","licence","notice"],"properties":{"lines":{"type":"array","items":{"type":"object","required":["label","quantity","unit","branch","zone"]}},"model":{"type":"object"},"engine":{"type":"object"},"labour":{"type":"object","required":["rows","totalHours","programme","likelyDays","note"]},"notice":{"type":"string"},"spaces":{"type":"array","items":{"type":"object","required":["space","outcomes","lines"],"properties":{"lines":{"type":"array","items":{"type":"object","required":["label","quantity","unit","branch","zone"]}},"space":{"type":"object","required":["id","kind","name","url"]},"outcomes":{"type":"array","items":{"type":"object","required":["branch","label","trade","status","comparison"],"properties":{"label":{"type":"string"},"trade":{"type":"string"},"branch":{"type":"string"},"status":{"enum":["ready","needs","loading","did-not-load","no-answer","gap","left-out","not-applicable"]},"comparison":{"type":"boolean"}}}}}}},"system":{"enum":["metric","imperial"]},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"sources":{"type":"array"},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"assumptions":{"type":"array","items":{"type":"object","required":["field","reason"]}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Plan the materials for several rooms","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"plan_room","title":"Plan the materials for one room or space","description":"Plans one space, such as a room or a bathroom, from its size, openings and the finishes chosen, as the site's room planner does, and returns its materials list: each row with its quantity, what it still needs, what is not built and why, and labour hours. Quantities only; it does not size structure.","input_schema":{"type":"object","required":["kind","figures"],"properties":{"kind":{"enum":["room","bathroom","slab","deck","driveway","fence","loft","retaining-wall","exterior-wall","stair"],"type":"string","description":"The kind of space: a room or a bathroom (from its size, doors and windows), or a slab, deck, driveway, fence, loft, retaining wall, exterior wall or stair."},"name":{"type":"string","maxLength":120},"doors":{"type":"object","properties":{"count":{"type":"integer","maximum":20,"minimum":0},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"scope":{"type":"object","description":"Scope question name → answer value, by the planner's ids.","maxProperties":30,"additionalProperties":{"type":["string","number","boolean"]}},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"inputs":{"type":"object","description":"Branch id → { calculator input id: value in its base unit }.","maxProperties":50,"additionalProperties":{"type":"object","maxProperties":30}},"intent":{"type":"string","maxLength":40,"description":"A trade, or everything."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"figures":{"type":"object","description":"The space's figures, by the planner's ids, each a length with its unit (a room: length, width, height, wallThickness; a fence: length, height; a stair: totalRise, width …).","maxProperties":10,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"windows":{"type":"object","properties":{"count":{"type":"integer","maximum":20,"minimum":0},"width":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"height":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"finishes":{"type":"object","description":"Surface role → finish id, by the planner's ids.","maxProperties":10,"additionalProperties":{"type":"string","maxLength":80}},"leaveOut":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":100,"description":"Branch ids to leave out."},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","space","system","outcomes","lines","labour","assumptions","model","sources","citation","licence","notice"],"properties":{"lines":{"type":"array","items":{"type":"object","required":["label","quantity","unit","branch","zone"]}},"model":{"type":"object"},"space":{"type":"object","required":["id","kind","name","url"]},"engine":{"type":"object"},"labour":{"type":"object","required":["rows","totalHours","programme","likelyDays","note"]},"notice":{"type":"string"},"system":{"enum":["metric","imperial"]},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"sources":{"type":"array"},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"outcomes":{"type":"array","items":{"type":"object","required":["branch","label","trade","status","comparison"],"properties":{"label":{"type":"string"},"trade":{"type":"string"},"branch":{"type":"string"},"status":{"enum":["ready","needs","loading","did-not-load","no-answer","gap","left-out","not-applicable"]},"comparison":{"type":"boolean"}}}},"assumptions":{"type":"array","items":{"type":"object","required":["field","reason"]}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Plan the materials for one room or space","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"resolve_id","title":"Find a page by its permanent id or old link","description":"Resolves a permanent Craft Quantities id (such as cq-c0412), a current or earlier slug, or a craftquantities.com address to the page as it is today: its kind, current slug, slug history, page link and permanent /id/ link. Ids are assigned once and kept when a page is renamed or moved; a removed page names its replacement.","input_schema":{"type":"object","required":["ref"],"properties":{"ref":{"type":"string","maxLength":300,"minLength":2,"description":"A permanent id (cq-c0412), a current or earlier slug, or a craftquantities.com address."},"kind":{"enum":["calculator","takeoff","guide","example","term","diagnosis"],"description":"Only pages of this kind."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["matches","licence"],"properties":{"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"matches":{"type":"array","items":{"type":"object","required":["id","kind","slug","history","url","permanentUrl"],"properties":{"id":{"type":"string","description":"The permanent id: assigned once, kept whatever the page's slug or category becomes."},"url":{"type":"string","description":"The page's address today."},"kind":{"enum":["calculator","takeoff","guide","example","term","diagnosis"]},"slug":{"type":"string","description":"The slug the page answers on today."},"history":{"type":"array","items":{"type":"string"},"description":"Every slug the page has had, the current one last."},"retired":{"type":"object","properties":{"replacedBy":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"permanentUrl":{"type":"string","description":"The site's /id/ address for the page, which redirects to wherever the page is."}}},"description":"The pages the reference names: one for an id, more where pages of different kinds share a slug."}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Find a page by its permanent id or old link","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"run_example","title":"Re-check a worked example's figures","description":"Re-runs every pinned step of a worked construction estimate now, in both unit systems, and returns whether each still meets the published figure.","input_schema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"A worked example's slug, such as bathroom-gutted-and-retiled."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","example","steps","unpinned","allMeet","citation","licence","notice"],"properties":{"steps":{"type":"array","items":{"type":"object","required":["step","calculator","answer","otherSystem","canonical","expect","places","meets","shown","link"],"properties":{"link":{"type":"string"},"step":{"type":"string"},"meets":{"type":"boolean"},"shown":{"type":"string"},"answer":{"type":"object"},"expect":{"type":"number"},"places":{"type":"integer"},"canonical":{"type":"object"},"calculator":{"type":"object"},"otherSystem":{"type":"object"}}}},"engine":{"type":"object"},"notice":{"type":"string"},"allMeet":{"type":"boolean"},"example":{"type":"object","required":["slug","title","job","market","system","basis","summary","url"],"properties":{"job":{"type":"string"},"url":{"type":"string"},"slug":{"type":"string"},"basis":{"enum":["modelled","recorded"]},"title":{"type":"string"},"market":{"type":"string"},"system":{"enum":["metric","imperial"]},"summary":{"type":"string"},"takeoff":{"anyOf":[{"type":"string"},{"type":"null"}]},"updated":{"type":"string"},"published":{"type":"string"}}},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"unpinned":{"type":"array","items":{"type":"string"}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Re-check a worked example's figures","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"run_takeoff","title":"Materials list for a whole job (takeoff)","description":"Works one whole-job takeoff, identified by its id, from the measurements given: the materials list of a job such as a slab or a deck, each line from its own calculator, with what to order, waste allowances, metric and US units, labour hours (not a price), what is not counted, a citation and the page link. It does not size structure.","input_schema":{"type":"object","required":["takeoff"],"properties":{"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"market":{"enum":["US","CA","UK","AU","INTL"],"type":"string","description":"Optional. A market whose own opening choice some inputs take (a UK reader's code, an IEC motor), and whose currency symbol prints the caller's own money figures."},"system":{"enum":["metric","imperial"],"type":"string","default":"metric","description":"The unit system inputs left out open in, and the one the page link opens in. The answer comes in both."},"takeoff":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"A takeoff id, such as concrete-slab."},"leaveOut":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":100,"description":"Rows the reader leaves out of the job: still worked and shown, not put in the project or counted in labour."},"selection":{"type":"object","description":"Build-up choice id → option id, the takeoff's own (a stud size, an insulation, a cladding). Choices left out take the page's own for the system.","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"allowances":{"type":"object","description":"Row → an allowance the reader sets: a percentage (cutting waste, overlap), or the option an allowance follows (a lay pattern). Row names are the takeoff's steps (the calculator slug, or the step key where one runs twice).","maxProperties":50,"additionalProperties":{"anyOf":[{"type":"number","maximum":100,"minimum":0},{"type":"string","maxLength":80}]}},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."},"measurements":{"type":"object","description":"Measurement id → value, each length, area or volume with its unit (\"12 ft\", {\"value\": 3.6, \"unit\": \"m\"}); counts as numbers. Ids are those of the takeoff; any left out opens at the page's own figure.","maxProperties":50,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","takeoff","system","selection","measurements","rows","sizingWithheld","labour","excludes","sources","citation","links","licence","notice"],"properties":{"rows":{"type":"array","items":{"type":"object","required":["key","name","calculator","state","quantity","unit","order","chain","printed","otherSystem","inputs"],"properties":{"key":{"type":"string"},"name":{"type":"string"},"note":{"type":"string"},"unit":{"type":"string"},"chain":{"anyOf":[{"type":"object","properties":{"base":{"type":"number"},"mode":{"type":"string"},"allowanceName":{"type":"string"},"allowancePercent":{"type":"number"},"calculatorVersion":{"type":"string"}}},{"type":"null"}]},"order":{"anyOf":[{"type":"object","required":["quantity","unit","rule"],"properties":{"rule":{"enum":["pack","whole","as-measured"]},"unit":{"type":"string"},"quantity":{"type":"number"}}},{"type":"null"}]},"state":{"enum":["ready","untraced","pending","failed","no-answer"]},"inputs":{"type":"array","items":{"type":"object","required":["id","value","origin"],"properties":{"id":{"type":"string"},"basis":{"type":"object","properties":{"source":{"type":"object","required":["kind"],"properties":{"kind":{"type":"string"}}},"unsourced":{"type":"string"}},"description":"Where a figure comes from: a source the site publishes, or the reason there is none."},"value":{"type":["number","string"]},"origin":{"type":"string"}}}},"leftOut":{"type":"boolean"},"printed":{"anyOf":[{"type":"string"},{"type":"null"}]},"quantity":{"anyOf":[{"type":"number","description":"What a project line carries, after any allowance, in this system's unit."},{"type":"null"}]},"calculator":{"type":"object","required":["slug","title","url"],"properties":{"url":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"version":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"labourHours":{"anyOf":[{"type":"object","required":["low","likely","high"],"properties":{"low":{"type":"number"},"high":{"type":"number"},"likely":{"type":"number"}}},{"type":"null"}]},"otherSystem":{"anyOf":[{"type":"object","required":["quantity","unit"],"properties":{"unit":{"type":"string"},"quantity":{"anyOf":[{"type":"number"},{"type":"null"}]}}},{"type":"null"}]},"alternativeTo":{"type":"string"}}}},"links":{"type":"object","required":["page","open"],"properties":{"open":{"type":"string","description":"Opens the takeoff page on this job."},"page":{"type":"string"}}},"engine":{"type":"object"},"labour":{"type":"object","required":["rows","totalHours","programme","likelyDays","note"],"properties":{"note":{"type":"string"},"rows":{"type":"array","items":{"type":"object","required":["key","name","kind"],"properties":{"key":{"type":"string"},"kind":{"enum":["rated","part","not-rated","unmeasured","no-work","sizing"]},"name":{"type":"string"},"rate":{"type":"object","properties":{"id":{"type":"string"},"per":{"type":"string"},"basis":{"type":"string"},"source":{"type":"string"},"operation":{"type":"string"},"whatMovesIt":{"type":"string"},"personHoursPerUnit":{"type":"object","required":["low","likely","high"],"properties":{"low":{"type":"number"},"high":{"type":"number"},"likely":{"type":"number"}}}}},"unit":{"type":"string"},"hours":{"type":"object","required":["low","likely","high"],"properties":{"low":{"type":"number"},"high":{"type":"number"},"likely":{"type":"number"}}},"reason":{"type":"string"},"countedWith":{"type":"array","items":{"type":"string"}}}}},"programme":{"type":"array","items":{"type":"object","required":["trade","crew","rows","hours","days","startDay"]}},"likelyDays":{"type":"number"},"totalHours":{"type":"object","required":["low","likely","high"],"properties":{"low":{"type":"number"},"high":{"type":"number"},"likely":{"type":"number"}}}}},"market":{"anyOf":[{"type":"string"},{"type":"null"}]},"notice":{"type":"string"},"system":{"enum":["metric","imperial"]},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"sources":{"type":"array","items":{"type":"object","required":["calculator","title","version","sources"],"properties":{"title":{"type":"string"},"sources":{"type":"array","items":{"type":"object","required":["label"],"properties":{"url":{"type":"string","description":"Only where the calculator gives one; none is invented."},"label":{"type":"string","description":"The source as the calculator cites it."},"references":{"type":"array","items":{"type":"object","required":["kind","document"],"properties":{"body":{"type":"string"},"kind":{"enum":["code","standard"]},"edition":{"type":"string"},"section":{"type":"string"},"document":{"type":"string"}}}}}}},"version":{"type":"string"},"calculator":{"type":"string"}}}},"takeoff":{"type":"object","required":["id","name","category","description","url"],"properties":{"id":{"type":"string"},"url":{"type":"string","description":"The takeoff's page on craftquantities.com."},"name":{"type":"string"},"category":{"type":"string"},"description":{"type":"string"}}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"excludes":{"type":"array","items":{"type":"string"}},"selection":{"type":"object","additionalProperties":{"type":"string"}},"measurements":{"type":"array","items":{"type":"object","required":["id","label","value","source"],"properties":{"id":{"type":"string"},"read":{"type":"string"},"basis":{"type":"object","properties":{"source":{"type":"object","required":["kind"],"properties":{"kind":{"type":"string"}}},"unsourced":{"type":"string"}},"description":"Where a figure comes from: a source the site publishes, or the reason there is none."},"label":{"type":"string"},"value":{"type":"number"},"metric":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"type":"number"}}},"source":{"enum":["caller","default"]},"baseUnit":{"type":"string"},"imperial":{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"type":"number"}}},"dimension":{"type":"string"}}}},"sizingWithheld":{"type":"array","items":{"type":"string"}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Materials list for a whole job (takeoff)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"search","title":"Search the construction calculators and pages","description":"Searches the site's construction pages for a question in everyday words, such as how much concrete or tile a job needs, and returns the matching pages: id, kind, title, link, description and slug. It finds; it computes nothing.","input_schema":{"type":"object","required":["query"],"properties":{"kinds":{"type":"array","items":{"enum":["calculator","takeoff","example","diagnosis"]},"minItems":1,"description":"Only these kinds of result; every kind when left out."},"limit":{"type":"integer","default":10,"maximum":25,"minimum":1},"query":{"type":"string","maxLength":200,"minLength":1,"description":"What to find, such as \"concrete slab\" or \"skirting board\"."}},"additionalProperties":false},"output_schema":{"type":"object","required":["results"],"properties":{"results":{"type":"array","items":{"type":"object","required":["id","title","url"],"properties":{"id":{"type":"string","description":"The result's id: calculator:{slug}, takeoff:{id}, example:{slug} or diagnosis:{slug}."},"url":{"type":"string"},"kind":{"enum":["calculator","takeoff","example","diagnosis"]},"slug":{"type":"string"},"title":{"type":"string"},"category":{"type":"string"},"description":{"type":"string"}}}}}},"annotations":{"title":"Search the construction calculators and pages","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"solve_backwards","title":"How far a material goes","description":"Works out how far one amount of material goes, such as 40 bags of concrete or 24 gallons of paint: the area it covers and the size of slab, room, deck or wall that is, as the site's Solve Backwards page works it, waste taken off. It does not size structure.","input_schema":{"type":"object","required":["have"],"properties":{"have":{"oneOf":[{"type":"number","exclusiveMinimum":0},{"type":"string","maxLength":60},{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string","maxLength":20},"value":{"type":"number"}},"additionalProperties":false}],"description":"How much the reader has: a count for counted things (20, \"20 sheets\"); a measure with its unit for paint, concrete, soil (\"24 gal\", \"2 m3\", {\"value\": 90, \"unit\": \"L\"})."},"page":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,80}$","description":"A Solve Backwards page's slug, such as wall-paint, drywall-sheets, bricks, concrete-bags, ready-mix-concrete."},"query":{"type":"string","maxLength":200,"minLength":2,"description":"Or what the reader has, in words (\"sheets of drywall\", \"bags of concrete\"), when the slug is not known."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"system":{"enum":["metric","imperial"],"type":"string","description":"The page's system; it sets the market's product (a 4 × 8 ft sheet in imperial). Left out: the unit's system, else metric."},"settings":{"type":"object","description":"Optional: another calculator input, with its unit (a slab's thickness \"4 in\", coats 3). The inputs the page grows cannot be set.","maxProperties":20,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":60},{"type":"object","required":["value","unit"],"properties":{"unit":{"type":"string"},"value":{"type":"number"}}}]}}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","page","calculator","system","have","status","answer","area","size","typical","chain","forwards","assumptions","settings","links","citation","licence","notice"],"properties":{"area":{"anyOf":[{"type":"object","required":["noun","exact","metric","imperial"]},{"type":"null"}]},"have":{"type":"object","required":["amount","unit","inCalculatorUnit"]},"note":{"type":"string"},"page":{"type":"object","required":["slug","question","material","url"]},"size":{"anyOf":[{"type":"object","required":["metres","feet"],"properties":{"feet":{"type":"object","additionalProperties":{"type":"number"}},"metres":{"type":"object","additionalProperties":{"type":"number"}}}},{"type":"null"}]},"chain":{"type":"array","items":{"type":"string"}},"links":{"type":"object","required":["page","openInSite","calculator"]},"answer":{"type":"string","description":"The page's own answer line."},"engine":{"type":"object"},"notice":{"type":"string"},"status":{"enum":["reached","capped","too-little"],"description":"reached: the largest size whose requirement fits; capped: more than the calculator's largest job; too-little: less than its smallest."},"system":{"enum":["metric","imperial"]},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"typical":{"type":"object","required":["count","each","size"]},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"forwards":{"anyOf":[{"type":"object","required":["inputs","asks","left"]},{"type":"null"}]},"settings":{"type":"array"},"calculator":{"type":"object","required":["slug","title","version","url"]},"otherPages":{"type":"array","items":{"type":"object","required":["slug","question","url"]}},"assumptions":{"type":"array","items":{"type":"object","required":["id","label","value"]}}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"How far a material goes","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"translate_term","title":"Translate or match a trade word between markets","description":"Says one building-trade word in US, Canadian, UK and Australian usage, such as plasterboard (drywall in the US) or skirting (baseboard): each market's word, how close each is, false-friend warnings, unit traps such as US and imperial gallons or short and metric tons with their conversions, and the market's document family. Brand names, plurals and misspellings match too.","input_schema":{"type":"object","required":["term"],"properties":{"to":{"enum":["US","CA","UK","AU"],"type":"string","description":"The market to say it in."},"from":{"enum":["US","CA","UK","AU"],"type":"string","description":"The market whose word it is, where known."},"term":{"type":"string","maxLength":80,"minLength":2,"description":"A trade word or phrase as one market says it, a brand name said for the product, or a misspelling: \"plasterboard\", \"gyprock\", \"casing\", \"skirting\", \"eavestrough\", \"a yard of concrete\"."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","term","matchedBy","concepts","links","citation","licence"],"properties":{"to":{"type":"string"},"from":{"type":"string"},"none":{"type":"string"},"note":{"type":"string"},"term":{"type":"string"},"links":{"type":"object","required":["glossary"]},"engine":{"type":"object"},"readAs":{"type":"string"},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"matched":{"type":"array","items":{"type":"object","required":["concept","name","market","as"],"properties":{"as":{"enum":["term","also called"]},"name":{"type":"string","description":"The glossary's own name that matched."},"market":{"type":"string"},"concept":{"type":"string"}}}},"citation":{"type":"object","required":["author","title","url","formats","accessDate"],"properties":{"url":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"formats":{"type":"object","required":["plain","apa","harvard","bibtex"],"properties":{"apa":{"type":"string"},"plain":{"type":"string"},"bibtex":{"type":"string"},"harvard":{"type":"string"}}},"version":{"anyOf":[{"type":"string"},{"type":"null"}]},"accessDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourcesChecked":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"concepts":{"type":"array","items":{"type":"object","required":["slug","concept","url","definition","matchedAs","names","warnings","calculators","confusions"],"properties":{"url":{"type":"string"},"slug":{"type":"string"},"names":{"type":"array","items":{"type":"object","required":["market","term","alsoCalled","exactness","note"],"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"term":{"type":"string"},"market":{"type":"string"},"exactness":{"enum":["identical","close","false-friend","absent"]},"alsoCalled":{"type":"array","items":{"type":"string"}}}}},"concept":{"type":"string"},"warnings":{"type":"array","items":{"type":"string"}},"matchedAs":{"type":"array","items":{"type":"object","required":["market","as"]}},"confusions":{"type":"array","items":{"type":"string"}},"definition":{"type":"string"},"calculators":{"type":"array"},"translation":{"type":"object"}}}},"documents":{"type":"object","required":["market","place","subjects","adoption","decidedBy","page"],"properties":{"for":{"type":"string","description":"The calculator whose sources, or the document the glossary names for the concept, the subject was read from."},"page":{"type":"string"},"place":{"type":"string"},"market":{"type":"string"},"adoption":{"type":"string"},"subjects":{"type":"array","items":{"type":"object","required":["subject","documents"],"properties":{"subject":{"type":"string"},"documents":{"type":"array","items":{"type":"string"}}}}},"decidedBy":{"type":"string"}},"description":"The family of documents that governs the concept's subject in the named market. No edition, and no claim that it matches another market's document."},"matchedBy":{"enum":["term","variant","within","fuzzy","search"],"description":"How the word was matched: a glossary name exactly; the same name spaced, hyphenated or plural; a phrase holding a name; a misspelling of one name; or the site's ranking of the definitions."},"unitTraps":{"type":"array","items":{"type":"object","required":["id","title","says","markets","conversions","page"],"properties":{"id":{"type":"string"},"bags":{"type":"array","items":{"type":"object","required":["calculator","input","metric","imperial"],"properties":{"input":{"type":"string"},"metric":{"type":"array","items":{"type":"string"}},"imperial":{"type":"array","items":{"type":"string"}},"calculator":{"type":"object"}}}},"page":{"type":"string"},"says":{"type":"string"},"title":{"type":"string"},"markets":{"type":"array","items":{"type":"string"}},"conversions":{"type":"array","items":{"type":"object","required":["value","from","to","result","by"],"properties":{"by":{"type":"string","description":"The engine's unit conversion that gave the result."},"to":{"type":"string"},"from":{"type":"string"},"value":{"type":"number"},"factor":{"anyOf":[{"type":"number"},{"type":"null"}]},"result":{"type":"number"},"definition":{"type":"string","description":"The defining relation, where one side is not a unit of the conversion table."}}}}}}},"unitSystems":{"type":"array","items":{"type":"object","required":["market","system"],"properties":{"market":{"type":"string"},"system":{"enum":["metric","imperial"]}}},"description":"Each named market's primary measurement system, as the site's market registry holds it."}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Translate or match a trade word between markets","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"},{"name":"update_project","title":"Change a project held in a state token","description":"Changes a My Project project carried in a state token (cqp1.…, from a project file answer): add or remove a room or space, change a dimension, add or remove a takeoff or calculator line, change a roof pitch, rename. Rebuilds every line and returns the new token, a short diff, the totals and a site link. The token is compressed, not encrypted; nothing is stored. No prices.","input_schema":{"type":"object","required":["token"],"properties":{"file":{"type":"boolean","default":false,"description":"true: the updated My Project file as well."},"token":{"type":"string","maxLength":16384,"minLength":8,"description":"A project state token from a project-file answer or an earlier update."},"detail":{"enum":["full","summary"],"type":"string","default":"full","description":"full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read."},"operations":{"type":"array","items":{"type":"object","required":["op"],"properties":{"op":{"enum":["add_space","remove_space","set_dimension","add_takeoff","remove_takeoff","add_calculator","remove_calculator","set_roof_pitch","rename"],"description":"add_space (space) and remove_space (index) on a plan; set_dimension (target, index, field, value) on a space's figure, a calculator's input, a takeoff's measurement or a house's figure; add_takeoff (takeoff) and remove_takeoff (index or takeoff id); add_calculator (calculator) and remove_calculator (index); set_roof_pitch (pitch) on a plan's roof or a house; rename (name)."},"name":{"type":"string","maxLength":120},"field":{"type":"string","maxLength":60,"description":"set_dimension: the figure's id (a space's figure, a calculator's input, a takeoff's measurement, a house's value)."},"index":{"type":"integer","maximum":49,"minimum":0,"description":"Which space, calculator, takeoff or house, counting from 0 (default 0)."},"pitch":{"anyOf":[{"type":"number","maximum":24,"minimum":0},{"type":"string","maxLength":8}],"description":"set_roof_pitch: rise in 12 (a plan's roof takes 0 to 24; a house 4, 6, 8, 10 or 12)."},"space":{"type":"object","description":"add_space: one space as a plan takes it (kind, figures, doors, windows, finishes …)."},"value":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]},"target":{"enum":["space","calculator","takeoff","house"],"description":"set_dimension: what the figure belongs to."},"takeoff":{"anyOf":[{"type":"object","required":["takeoff"],"properties":{"takeoff":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$"},"leaveOut":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":100,"description":"Rows the reader leaves out of the job: still worked and shown, not put in the project or counted in labour."},"selection":{"type":"object","description":"Build-up choice id → option id, the takeoff's own (a stud size, an insulation, a cladding). Choices left out take the page's own for the system.","maxProperties":20,"additionalProperties":{"type":"string","maxLength":80}},"allowances":{"type":"object","description":"Row → an allowance the reader sets: a percentage (cutting waste, overlap), or the option an allowance follows (a lay pattern). Row names are the takeoff's steps (the calculator slug, or the step key where one runs twice).","maxProperties":50,"additionalProperties":{"anyOf":[{"type":"number","maximum":100,"minimum":0},{"type":"string","maxLength":80}]}},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."},"measurements":{"type":"object","description":"Measurement id → value, each length, area or volume with its unit (\"12 ft\", {\"value\": 3.6, \"unit\": \"m\"}); counts as numbers. Ids are those of the takeoff; any left out opens at the page's own figure.","maxProperties":50,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}}},"additionalProperties":false},{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$"}],"description":"add_takeoff: a takeoff and its measurements; remove_takeoff: a takeoff id."},"calculator":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,119}$","description":"The calculator's slug, such as concrete-calculator."},"label":{"type":"string","maxLength":120,"description":"The line's name in the project; the calculator's title when left out."},"inputs":{"type":"object","description":"The calculator's input values, by input id (an unknown id is refused with the accepted ids). A length, area, volume or other measured input takes \"12 ft\", \"3.5 m\", \"8' 3 1/2\\\"\" or {\"value\": 12, \"unit\": \"ft\"}; a count or percentage takes a number; a select takes one of its option values. Inputs left out take the value the calculator's page opens on.","maxProperties":100,"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200},{"type":"object","required":["value"],"properties":{"unit":{"type":"string","maxLength":40},"value":{"type":"number"}},"additionalProperties":false}]}},"inputUnits":{"enum":["base"],"type":"string","description":"Send \"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."}},"additionalProperties":false}},"additionalProperties":false},"maxItems":20,"description":"The changes, applied in order (0 to 20); none returns the project as the token holds it."}},"additionalProperties":false},"output_schema":{"type":"object","anyOf":[{"type":"object","required":["engine","kind","state","applied","project","diff","totals","licence","notice"],"properties":{"diff":{"type":"object","required":["added","removed","changed","unchanged"],"properties":{"more":{"type":"integer"},"added":{"type":"array","items":{"type":"object","required":["zone","label","unit","quantity"],"properties":{"unit":{"type":"string"},"zone":{"type":"string"},"label":{"type":"string"},"quantity":{"type":"number"}}}},"changed":{"type":"array","items":{"type":"object","required":["zone","label","unit","from","to"],"properties":{"to":{"type":"number"},"from":{"type":"number"},"unit":{"type":"string"},"zone":{"type":"string"},"label":{"type":"string"}}}},"removed":{"type":"array","items":{"type":"object","required":["zone","label","unit","quantity"],"properties":{"unit":{"type":"string"},"zone":{"type":"string"},"label":{"type":"string"},"quantity":{"type":"number"}}}},"unchanged":{"type":"integer"}},"description":"What the operations changed, line by line (lines that share a zone, a name and a unit are summed)."},"file":{"type":"object","required":["filename","mediaType","content"],"properties":{"content":{"type":"object","required":["magic","v","exportedAt","stores"],"properties":{"v":{"type":"integer"},"magic":{"const":"craftquantities.backup"},"stores":{"type":"object"},"exportedAt":{"type":"string"}}},"filename":{"type":"string"},"mediaType":{"const":"application/json"}}},"kind":{"enum":["calculators","takeoffs","houses","plan","drawing"]},"state":{"type":"object","required":["token","format","note"],"properties":{"link":{"type":"string","description":"Opens the project on the site from the token, carried in the address fragment, which a browser does not send to any server."},"note":{"type":"string"},"token":{"anyOf":[{"type":"string","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":"null"}]},"format":{"type":"string","description":"The token's format and version."},"characters":{"type":"integer"}}},"engine":{"type":"object"},"notice":{"type":"string"},"totals":{"type":"object","required":["lines","byUnit","note"],"properties":{"note":{"type":"string"},"lines":{"type":"integer"},"byUnit":{"type":"array","items":{"type":"object","required":["unit","quantity","lines"],"properties":{"unit":{"type":"string"},"lines":{"type":"integer"},"quantity":{"type":"number"}}}}}},"applied":{"type":"array","items":{"type":"string"},"description":"Each operation as it was applied."},"licence":{"type":"object","required":["name","url","attribution"],"properties":{"url":{"type":"string"},"name":{"type":"string"},"attribution":{"type":"string"}}},"project":{"type":"object","required":["name","system","lines"],"properties":{"name":{"type":"string"},"lines":{"type":"array","items":{"type":"object","required":["label","quantity","unit","from"]}},"system":{"enum":["metric","imperial"]}}},"howToImport":{"type":"string"}}},{"type":"object","required":["detail","tool","title","lines","notes","citation","url","open","more"],"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"more":{"anyOf":[{"type":"string"},{"type":"null"}]},"open":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool":{"type":"string"},"lines":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"The result lines, as the report's table gives them."},"notes":{"type":"array","items":{"type":"string"},"description":"What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary."},"title":{"type":"string"},"detail":{"const":"summary"},"citation":{"type":"string","description":"The one citation line, built from the answer's own data."}}}]},"annotations":{"title":"Change a project held in a state token","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:35:32.544Z"}],"next_cursor":null,"next_actions":[{"action":"get_connection","description":"Connection block to call these tools","href":"/v1/servers/com.craftquantities%2Fengine/connection?target=mcpServers","arguments":{"name":"com.craftquantities/engine","target":"mcpServers"}},{"action":"get_server","description":"Full descriptor with trust and connectability","href":"/v1/servers/com.craftquantities%2Fengine","arguments":{"name":"com.craftquantities/engine"}}]}