Craft Quantities: construction material calculators
Server Details
Construction quantities from cited calculators, takeoffs, planners, drawings, cut plans. No prices.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 56 tools
Most tools have distinct targets, but several clusters overlap heavily: the five create_project_file_from_* variants, calculate vs calculate_batch vs run_takeoff/run_example, quote tools, and plan_room vs plan_project vs create_drawing. Detailed descriptions help, but an agent still has many similar-looking choices.
Names are consistently snake_case and mostly follow a verb_noun or clear noun pattern such as run_takeoff, get_calculator, create_project_file_from_plan. A few bare verbs (calculate, fetch, search) and noun-style names are minor deviations, not confusion.
56 tools is far beyond a well-scoped MCP surface and creates a heavy selection burden, even though the construction-calculation domain is broad. The many highly specialized tools keep it from being chaotic, but the count is still excessive.
The surface covers search/fetch/resolve, individual and batch calculators, takeoffs, project files, room/house planning, drawings, quote comparison, labour, standards, units, terms, proposals and variations. It is unusually complete for the stated construction-material-calculation purpose, with pricing intentionally excluded.
Available Tools
56 toolscalculateCalculate a material quantity (how much, how many)ARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The calculator's slug, such as concrete-calculator. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| inputs | No | 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. | |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| explain | No | 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 | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world behaviour, so the bar is low. The description still adds real context: the answer comes back in both metric and US units with the inputs used, sources, citation and page link, and prices are deliberately omitted. It also notes that omitted inputs fall back to the calculator page's opening values, though it doesn't discuss failure modes for unknown slugs beyond the schema's 'refused with the accepted ids'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and a compact statement of the return shape, ending on the useful 'No prices' exclusion. The long unit enumeration adds some bulk, but each clause carries information an agent would otherwise have to dig out of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not spell out return values, and annotations cover the safety profile. It still communicates scope, unit handling, default-input behaviour and the price exclusion, leaving only sibling selection and slug discovery unaddressed for a 7-parameter tool with nested inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the per-parameter descriptions (slug, detail, inputs, market, system, explain, inputUnits) are already detailed, so a baseline of 3 applies. The description adds only marginal meaning — the unit vocabulary for counts (bags, sheets, studs, tiles, litres, gallons, cubic yards, m³) — without explaining slug discovery or how inputs map to a calculator's schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (computes) and resource (one calculator, by slug) with a concrete scope — the amount of material a job needs — illustrated by bags of concrete and sheets of drywall. The word 'one' implicitly separates it from calculate_batch, but no sibling is named outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case (compute a material quantity for a job) is implied clearly enough that an agent can infer when to call it, and 'No prices' excludes a class of content. However, it never says when to prefer calculate_batch, get_calculator, solve_backwards or run_example, so tool selection among close siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_batchRun several calculators in one requestARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | The runs, 1 to 25, each one calculator and its inputs; answered in the same order. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | The market for every run that does not name its own. | |
| system | No | The unit system for every run that does not name its own. | metric |
| inputUnits | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower, and the description still adds real behavior: results come back in request order, one refusal does not abort the other runs, and no pricing data is returned. The 'No prices' exclusion is a genuinely useful disclosure that is not encoded in any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and scope are front-loaded in the opening clause, and the trailing 'No prices.' earns its place as a constraint. It is a single long semicolon-chained sentence, which is dense but wastes no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and full schema coverage, the description need not explain return values, and it correctly focuses on the non-obvious parts: ordering, partial-failure semantics, and the absence of prices. It omits any mention of the `detail: summary` token-saving mode, which is the one usage-relevant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, including slug-or-permanent-id, the inputUnits escape hatch, and market/system overrides. The description restates slug/inputs at a high level and adds nothing about the top-level `detail` parameter (full vs summary) or override precedence, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (runs), resource (construction calculator calculations) and a hard scope (up to 25 in one request), which lets an agent separate it from the single-shot `calculate` sibling without opening either schema. It stops short of naming that sibling explicitly, so the differentiation is inferential rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The batching language ('several calculators in one request', 'up to 25') implies when this tool is appropriate versus `calculate`, but there is no explicit when-to-use or when-not-to-use statement and no alternative named. Usage must be inferred from the capability description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_quoteCheck a builder's or contractor's quoteARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes | The quote check: bathroom-quote, plastering-quote, or a takeoff's ({takeoff id}-quote). | |
| quote | Yes | The quote's text. Prices may be left in; they are taken out before reading. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| selection | No | 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. | |
| inputUnits | No | 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 | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), so the bar is lower, yet the description adds genuine behavioral context: money is stripped and not judged, and differences are returned as questions rather than verdicts. That framing is not inferable from the schema or annotations. It stops short of describing volume, cost, or latency traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with a framing question, then the mechanics, then the important caveat about money and verdicts. Dense but nearly every clause carries information; the parenthetical '(pasted text)' is the only mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with nested objects, five enums, and an output schema, the description gives enough to call it correctly and previews the return shape (per-line quantity vs. calculator range, missing/extra lines, questions to ask). The output schema carries the detail, so nothing critical is missing, though the 75-value job enum and selection/measurements interplay are left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents job, quote, detail, market, system, selection, inputUnits, and measurements. The description reinforces that the quote arrives as pasted text and that prices are tolerated, but adds no syntax or constraint detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb and object ('checks a contractor's quote against the reader's own job') and immediately distinguishes the operation from sibling quote tools like import_quote or create_supplier_quote_request by framing it as a verification against calculator ranges, not a capture or a request. The opening question plus the enumerated outputs make the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the mechanics: the caller must supply pasted quote text plus a job, so the agent can infer when it applies. However, it never explicitly says when to prefer this over import_quote or when the tool is inappropriate, and no prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
classify_itemsGroup a materials list by MasterFormat divisionARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Lines of a takeoff, plan, house, drawing or bill: each a label, and the calculator slug where known. | |
| token | No | A project state token: its lines are grouped. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| calculators | No | Calculator slugs or permanent ids. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds genuinely non-obvious context: the grouping comes from 'the site's own keyword rule over each line's calculator or words,' and the result is advisory rather than authoritative. It does not discuss failure modes or rate limits, which keeps it out of the top band.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the verb and the standard, and the trailing disclaimers ('not a specification,' 'no Uniclass or NRM,' 'no prices') each carry real information. The first sentence's stacked parentheticals are dense enough to slow reading slightly, so not a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers inputs, the classification mechanism, and the tool's limits. What remains implicit is how the three input modes interact if more than one is supplied and what an empty or unclassifiable line yields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not state outright: that `lines`, `calculators`, and `token` are alternative ways of supplying the same material set. It does not explain the `detail` enum beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (groups) applied to a specific resource (materials list / bill / takeoff / plan / project) and names the classification standard (CSI MasterFormat 2018). It also enumerates the accepted input forms (lines, calculator slugs, project state token), which no sibling tool does, so an agent can distinguish it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the output as 'a suggested grouping, not a specification' and rules out Uniclass or NRM grouping and prices, which tells the agent when this tool is and is not the right fit. It stops short of naming an alternative tool for those excluded standards, so routing guidance is incomplete but clearly present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_on_jobCompare two options on one job, with the crossoverARead-onlyIdempotentInspect
Works both sides of a comparison page (LVP vs tile, paint vs wallpaper …) on one job: each side's quantity in both unit systems, allowance, weight and person-hours, the difference, and the crossover as one job figure is swept. Each calculator runs as its page runs it. No prices.
| Name | Required | Description | Default |
|---|---|---|---|
| job | No | The job's figures by field id, each length or area with its unit ("14 ft", {"value": 4.2, "unit": "m"}), a count or pitch as a number, a choice as its option value. Fields left out open at the page's own figure. | |
| sweep | No | The job field the crossover chart sweeps; the page's own when left out. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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. | |
| points | No | Sample points across the swept field's range. | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| comparison | Yes | A comparison page's slug, such as lvp-vs-tile or paint-vs-wallpaper. | |
| inputUnits | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive and closed-world behavior. The description adds useful scope by noting both unit systems, that each calculator runs as its page runs it, the swept crossover, and the important 'No prices' constraint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences front-load the operation, then the output scope, then a useful constraint. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex eight-parameter tool with full schema coverage, annotations and an output schema, the description covers core purpose, output scope and the no-price boundary. It leaves detailed parameter semantics and when-to-use routing to structured fields, so it is not fully exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all eight parameters documented including enums and the nested job object. The description only hints at the sweep via crossover behavior and adds no syntax, defaults or input-unit details beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation: compare both sides of a named comparison page on one job, and enumerates the outputs including units, allowance, weight, person-hours, difference and crossover. The 'comparison page' framing and examples distinguish it from generic calculate siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose and examples imply when to use it, but there is no explicit 'use this when' guidance, no exclusions, and no routing to alternatives such as calculate, calculate_batch or solve_backwards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_unitsConvert a construction unitBRead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| from | Yes | ||
| value | Yes | ||
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| dimension | No | Only where a unit names more than one kind of quantity. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is covered without description help. The description does add real behavioral context by naming the return payload (converted value plus the factor) and tying results to the site's calculator factors, but it omits anything on failure modes, unknown units, or limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the core verb first and the example and return value trailing. It is efficient, though the final clause stacking factor provenance and return shape makes it slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description is not obliged to explain return values, and the annotations carry the safety profile. Still, for a five-parameter tool with 40% schema coverage, the lack of unit-format and dimension-disambiguation guidance leaves gaps an agent would hit in practice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40% across five parameters, so the description is expected to compensate and does not. It illuminates 'value', 'from' and 'to' only through an example, and says nothing about valid unit strings (the 40-character maxLength), how 'dimension' resolves ambiguous units, or how 'detail' changes output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (converts a value from one unit to another) with a concrete example (2 m³ to cubic yards). It also hints at the differentiating trait versus generic calculators by promising 'the exact factor the site's calculators apply,' though it never names calculate or solve_backwards, so the sibling distinction is only implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to prefer this tool over calculate, solve_backwards, or the many other numeric siblings, nor any prerequisite or exclusion. An agent must infer usage entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_drawingDraw a plan and list its materialsBRead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The project's name in the file. | |
| house | No | The House Estimator's form: the house drawn as the estimator draws it. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| layout | No | 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. | |
| shapes | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| variant | No | With template: one of its two "what changes if" variants, by id; a wrong one is refused with the template's own list. | |
| commands | No | 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 | No | A Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener. | |
| template | No | 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 | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds the capability boundary ('does not size structure') and enumerates return artifacts, but says nothing about whether the drawing is persisted, what authorization is needed, or what happens on invalid geometry beyond what the schema states. There is mild tension between 'create/draws' and readOnlyHint=true, but the description's 'returns ... a link ... and a file' framing is consistent with a non-persisting generator.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the opening clause, but the single sentence then runs long enumerating return values that the output schema already describes. Splitting out the 'does not size structure' boundary and trimming the output list would make it tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 optional top-level parameters, deeply nested objects, and no required fields, the critical missing piece is guidance on input-mode selection and precedence — an agent cannot tell from the description whether layout and commands can be combined or which wins. The output side is fully covered by the output schema, so that omission is not a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and an output schema exists, so the baseline of 3 applies. The description names the six alternative input channels, which mirrors the top-level property names but adds no precedence, unit, or interaction semantics beyond what the schema documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Draws one plan on the Construction Canvas') and enumerates the alternative input forms it accepts (shapes, layout rooms, house figures, commands, document, template). What it produces is spelled out too. It does not, however, distinguish itself from close siblings such as create_project_file_from_drawing or export_drawing, which an agent must infer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by listing the accepted input modes; the agent is never told whether shapes, layout, house, commands, document and template are mutually exclusive or what happens when several are supplied. The one explicit boundary — 'It does not size structure' — is genuinely useful because it routes structural sizing elsewhere, but it is the sole guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_project_file_from_calculationsCreate a My Project file from calculationsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The new project's name. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| calculators | Yes | The calculator lines: each a slug and its input values. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, and the description corroborates that with genuinely new context: 'Nothing is stored or sent; no prices' clarifies there are no side effects or pricing data, and 'Each line is computed as the site's page adds it' explains how values are resolved. It stops short of describing failure behavior or limits (max 50 lines) beyond what the schema already says.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and resource, then workflow, then the safety/no-cost guarantee. Every sentence carries distinct information with no repetition of the structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile while the schema fully documents the five parameters. The description supplies the workflow framing (compute-per-line, restore on the site) that ties the inputs to the artifact; only minor gaps like limits and error behavior remain, and the schema covers those.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (name, detail, market, system, calculators and nested fields) is already documented in the schema, including enums, defaults and unit formats. The description only restates the calculators parameter parenthetically and adds no format or fallback detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Creates one My Project backup file from a list of calculator lines') and defines the input unit ('each a calculator slug and its input values'), which separates it from the drawing/house/plan/takeoffs siblings by input mode. It never names those alternatives directly, so the differentiation relies on the name and a single clarifying clause rather than explicit contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'the reader restores the file on craftquantities.com as a new project' tells the agent the outcome and hence the general intent, but there is no when-to-use, no when-not-to-use, and no reference to the sibling create_project_file_from_* tools. The agent must infer the choice from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_project_file_from_drawingCreate a My Project file from a drawingBRead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The new project's name. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| drawing | Yes | The drawing: a house form, shapes, drawing commands or a canvas document. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds genuinely useful non-obvious context: the file is a backup the site's canvas reopens and restores as a new project, and 'Nothing is stored or sent; no prices' preempts the natural worry that 'creates a file' implies persistence or network transmission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is produced, then the restore destination, then the no-side-effects caveat. No padding, though the middle sentence about the canvas reopening is somewhat redundant with the first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations carry safety. However, for a tool whose required 'drawing' input spans four very different modes (house form, shapes, commands, canvas document), the description never enumerates them, leaving the agent to discover the input branches entirely from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents name, detail, system and the whole drawing tree. The description adds no parameter syntax or format detail beyond describing the input as 'the drawing,' which is the baseline expectation when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names a specific verb and artifact: 'Creates one My Project backup file from a Construction Canvas drawing.' The input source (a drawing) is clear, but it never distinguishes itself from the many sibling generators (create_project_file_from_plan, _from_house, _from_calculations, _from_takeoffs), leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no named alternative. The only usage signal is implicit in the input source ('from a drawing') plus the downstream note that the reader restores it on craftquantities.com — this does not tell the agent how to choose between the five create_project_file_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_project_file_from_houseCreate a My Project file from a houseARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The new project's name. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| houses | Yes | The House Estimator form (one house; two give their lines without a drawing). | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, and the description reinforces this with 'Nothing is stored or sent; no prices' and explains the downstream flow ('the reader restores the file on craftquantities.com'). That adds genuine behavioral context beyond the annotations, though it does not spell out output/size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core action front-loaded and no filler. The trailing 'no prices' fragment is slightly telegraphic but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format need not be described, and the description covers the transformation, its provenance and its lack of side effects. It could say more about the two-house case (lines without drawing) or unit behavior, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents name, detail, houses and system. The description adds only high-level framing ('the house's lines, and its drawing') and does not clarify any individual parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Creates one My Project backup file') plus the exact input source ('from a House Estimator form'), which implicitly separates it from the from_plan/from_drawing/from_calculations siblings. It is clear without being an explicit side-by-side differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the source ('from a House Estimator form'). It never states when to prefer this over create_project_file_from_calculations or the other create_project_file_* siblings, nor any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_project_file_from_planCreate a My Project file from a planARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The new project's name. | |
| plan | Yes | One planned space, or a planned project of spaces and a roof. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, and the description usefully reinforces this with the non-obvious 'Nothing is stored or sent; no prices', which resolves the apparent tension between a verb like 'Creates' and a read-only hint. It adds real behavioral context beyond the annotations, though it does not describe the returned file/response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and the plan-shape scoping; no filler. The clause about 'the site's planner saves them' is slightly roundabout but still informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a rich input schema (100% coverage), an output schema, and strong annotations, the description supplies what structured fields cannot: the side-effect profile and the downstream purpose of the file. Missing only the tool-selection guidance that would make it fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's 'one planned space, or several spaces and a roof' mirrors what the schema already states for the 'plan' parameter and adds no format or unit details beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Creates') and resource ('one My Project backup file') plus the input source ('from a room plan'), which is exactly what distinguishes it from create_project_file_from_calculations, _from_drawing, _from_house and _from_takeoffs. It also characterizes the plan shape (one space, or several spaces and a roof). It never explicitly names those siblings, so it falls short of a full 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to choose this over the other 'create_project_file_from_*' tools or any sibling; there is no when/when-not guidance and no prerequisites. It explains what the output does downstream but leaves tool selection entirely to inference from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_project_file_from_takeoffsCreate a My Project file from takeoffsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The new project's name. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| takeoffs | Yes | The takeoffs: each an id and its measurements. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly/idempotent/non-destructive, and the description usefully adds context the annotations cannot convey: nothing is stored or sent, no prices, and the resulting file is restored by the reader on craftquantities.com as a new project — which also reconciles the seemingly odd readOnlyHint on a 'create' tool. It omits the 10-takeoff cap and any note on determinism/repeat calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, and each sentence carries distinct information (what it makes, how takeoffs are processed/restored, and that nothing is persisted). Some phrasing ('as its page commits them') is dense domain jargon, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema description coverage, the description need not explain returns or parameters; it covers the action, the persistence semantics, and the restore path. It is only mildly incomplete in not linking takeoff ids to their producing tools or noting the array limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents name, detail, market, system, leaveOut, selection, allowances, inputUnits and measurements. The description only restates the takeoffs shape ('each a takeoff id and its measurements') and adds nothing about the optional parameters, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Creates one My Project backup file from a list of whole-job takeoffs') and names the input source, which is what separates it from the create_project_file_from_calculations/drawing/house/plan siblings. It does not explicitly call out those siblings, so the differentiation rests partly on the tool name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the mechanics ('each takeoff's lines are worked as its page commits them') but never says when to choose this over the other create_project_file_* variants, nor what prerequisite a takeoff id must satisfy (e.g. coming from run_takeoff/get_takeoff). No when-not guidance and no stated alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_supplier_quote_requestCreate a request for quote to suppliersARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | A note to the merchants: delivery address area, dates, access. | |
| items | Yes | ||
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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 | No | The project's name, as the merchants will see it. | |
| currency | No | The currency prices are asked in; left out, the market's. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, setting a low bar. The description still adds real value by resolving the tension created by the 'to suppliers' name: 'it carries no price and sends nothing to anyone', telling the agent this never dispatches anything externally.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, and the second short sentence carries the key behavioral caveat. The long parenthetical listing sources is dense but every clause is on-topic, so it stays reasonably tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile. The description says what is created and that nothing is sent, leaving only sibling routing and downstream handling of the created quote unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema already documents note, items, detail, market, project and currency well. The description's mention of 'Markdown to paste, a CSV, the site's link ... and a My Project file' does not map onto any of those parameters, adding little meaning to the actual argument surface.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (creates) and resource (a request for quote) plus the inputs it accepts (materials list or bill of materials from a takeoff, house, plan, calculation, or the reader's own). It does not name or distinguish itself from siblings like import_quote or check_quote, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool produces but gives no when-to-use guidance, no prerequisites, and never names an alternative sibling (e.g. import_quote or check_quote) or the condition that would select it. An agent must infer the usage context on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnose_symptomDiagnose a building defect (crack, damp, leak)ARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many diagnoses at most. Left out: one when the match is clear, up to three when it is not. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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 | Yes | What the reader sees, hears or smells, in their own words: "my breaker keeps tripping when the kettle is on". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description earns credit by disclosing output behavior beyond that: it returns ranked candidate causes with discriminators and an ordered check list, modifies its breadth on ambiguous input, and explicitly refuses a verdict ('does not say which cause it is') — a crucial expectation setter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, and every clause carries information — the matched resource, the returned content, and the ambiguity caveat. It is a single run-on sentence, which slightly hurts scanability, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't re-explain return values, and it still sketches the shape of the answer. Combined with 100% parameter coverage and full annotation coverage, the definition is complete enough to invoke correctly; only routing guidance versus siblings is thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and each of the four parameters (symptom, limit, detail, market) already carries a rich inline description, so the schema does the heavy lifting. The description adds no parameter-level detail (nothing about the limit=3 cap, the full/summary modes, or the market effect), which is acceptable at this coverage but adds no extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: matches a plain-words building defect (crack, damp, leak, tripping breaker) to the site's diagnosis pages. It also names the concrete payload (candidate causes, distinguishing signs, ordered checks, when to call a professional), which no sibling tool offers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by 'described in plain words' and the ambiguity note ('ambiguous words return candidates'), so an agent can infer it wants free-text symptom input. But no alternatives are named and no when-not guidance is given, e.g. what to do when a calculator-style sibling (get_calculator, calculate) would be the better fit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_hoursEstimated labour hours per line of a projectARead-onlyIdempotentInspect
Estimated person-hours on each line of a project, as My Project shows them: hours typed on the line, else a production rate's band for its quantity, else the reason for none; with the project's crew-days. From a token, a file, calculators, takeoffs or a drawing. Hours only: no prices.
| Name | Required | Description | Default |
|---|---|---|---|
| crew | No | People on site, for the crew-days. | |
| file | No | A My Project file (the backup a project-file answer returns, or one the reader exported): its active project's lines, with any hours and rates typed on them. | |
| name | No | The project's name. | |
| token | No | A project state token (cqp1.…) from a project-file answer or an update. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| drawing | No | A Construction Canvas drawing (a template, a house form, shapes, drawing commands or a canvas document), as a project file takes it. | |
| takeoffs | No | Whole-job takeoffs, each an id and its measurements, as a project file takes them. | |
| calculators | No | Calculator lines, each a slug and its inputs, as a project file takes them. | |
| hoursPerDay | No | Working hours in a day, for the crew-days. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnly/idempotent/non-destructive annotations already covering the safety profile, the description adds real behaviour: the precedence rule (hours typed on the line, else a rate band for its quantity, else the reason for none), the crew-days computation, and the explicit 'Hours only: no prices' scope limit. It still doesn't say what happens when no source argument is supplied, which matters for a tool with zero required parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the output stated first, then the computation precedence, then the scope exclusion — front-loaded and waste-free. The compressed phrasing ('else the reason for none') is dense but each clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with deep nested objects, the description suffices: it says what is produced, how each line's hours are derived, and that prices are excluded, while the output schema covers the response shape and annotations cover safety. The one real gap is that no-argument behaviour is never described, despite every parameter being optional.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all 11 parameters are already documented individually and the baseline of 3 applies. The description's source list is ordered as alternatives ('a token, a file, calculators, takeoffs or a drawing'), hinting at mutual exclusivity the schema never states, but it adds no guidance on combining or omitting them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names the exact computed quantity ('Estimated person-hours on each line of a project') plus the secondary output (the project's crew-days), so the resource and result are unambiguous. 'Hours only: no prices' draws a boundary against pricing siblings, but neither that nor any other tool is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'From a token, a file, calculators, takeoffs or a drawing' implies which inputs are accepted and that they are alternatives, which is useful routing. However, there is no explicit statement of when to call this instead of calculate, run_takeoff, estimate_house or create_project_file_from_* — the boundary with siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_houseEstimate the materials to build a houseARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pitch | No | Roof pitch, rise in 12. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| family | No | ||
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| values | No | 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. | |
| example | No | Start from one of the site's example houses (its slug) in place of the estimator's opening house. | |
| storeys | No | ||
| selection | No | The exterior wall's build-up choices. | |
| inputUnits | No | 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 | No | ||
| roofSelection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds genuine context beyond that: the tool is a counting/estimation pass that does not perform structural design and returns no pricing, and it details what the response body contains. It does not discuss limits or error behavior, but there is little else to disclose for a deterministic computation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose front-loaded ahead of the output description and the two exclusions. The first sentence is dense with parentheticals but every clause carries information; nothing is redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, yet the description still frames the result shape usefully. Annotations cover safety, and the description covers scope and functional limits. For an 11-parameter nested-object tool the coverage is solid, with only per-parameter unit/dimension behavior left largely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 64% across 11 params, so the schema does much of the work. The description contributes a conceptual map of the inputs ('footprint, walls, roof, openings'), which hints at the values, selection/roofSelection, and opening parameters, but it adds no per-parameter syntax or unit guidance beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (estimates) plus a tightly scoped resource: materials for one rectangular house, one or two storeys, from enumerated input groups (footprint, walls, roof, openings). It also states the output contents (quantities with what to order, assumptions, storey plans, labour hours). An agent can distinguish it from create_drawing ('does not design a structure') and from quoting tools ('No prices') without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear about what the tool is for and where its boundary lies, with two explicit exclusions that implicitly route the agent elsewhere: 'It counts; it does not design a structure. No prices.' No sibling is named directly, so the routing to create_drawing or check_quote is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_drawingExport a drawing as DXF, SVG or IFC (CAD and BIM files)ARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| house | No | The House Estimator's form: the house drawn as the estimator draws it. | |
| level | No | One level by its id or name; left out, every level with something on its plan. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| layout | No | 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. | |
| shapes | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| formats | No | dxf, svg, ifc (openBIM IFC4: one file for the whole drawing, every level, with quantity sets), or several; left out, dxf and svg. | |
| variant | No | With template: one of its two "what changes if" variants, by id; a wrong one is refused with the template's own list. | |
| commands | No | 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 | No | A Construction Canvas document (schema 1 to the canvas's current), opened and checked by the canvas's own opener. | |
| template | No | 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 | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description usefully adds fidelity behavior ("as the canvas's own download writes them"), the DXF CQ-* layer convention, SVG being one plan per level in millimetres, IFC4 quantity sets, and the large-file fallback ("a file too large to return is rebuilt from the drawing's link"). Meaningful behavioral context beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the verb and resource; nearly every clause earns its place by adding a distinct output detail. It is slightly run-on with multiple semicolon-joined ideas, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with full schema coverage, an output schema, and rich annotations, the description supplies the extra output-format and fallback context an agent needs. The main gap is routing advice among the many sibling tools, which keeps it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 12 parameters are already documented in the schema, which is the baseline for a 3. The description restates the format families (dxf/svg/ifc) and input sources but adds no syntax or constraints beyond what the schema already carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Exports a Construction Canvas drawing") and enumerates the accepted drawing sources (template, shapes, layout, commands, house figures, document) plus the three output formats, so its job is unambiguous. It stops short of naming how it differs from siblings like create_project_file_from_drawing, but the format-level detail is distinctive.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what it produces but never states when to reach for it over alternatives (e.g. create_project_file_from_drawing or open_in_site_link). The list of input sources implies what can be passed, but there are no conditions, prerequisites, or exclusions to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchRead one page as textBRead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A page id, such as calculator:concrete-calculator, takeoff:concrete-slab or diagnosis:drain-gurgles. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | Yes | |
| text | Yes | |
| title | Yes | |
| metadata | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description's added content is essentially return-value shape, which is already carried by the existing output schema, so it contributes little behavioral context beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that states the return and its constituent parts, with no wasted preamble. The trailing colon list is slightly long but each item is informative rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover safety — but in a 27-sibling toolset the definition omits which page types this generic fetch is for versus the specialized getters. For a tool whose main risk is misrouting, that gap keeps it at minimum viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'id' parameter is richly documented with example values in the schema itself. The description's 'identified by its id' restates that without adding format or validation meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb ('Returns the full text') and an unambiguous resource ('one Craft Quantities page, identified by its id'), and even sketches the content shape (what it works out, inputs/measurements with units, opening values, sources). It does not, however, differentiate itself from page-type-specific siblings like get_calculator, get_takeoff, or get_sources, whose overlap is left unaddressed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance. With 27 siblings, several of which (get_calculator, get_takeoff, get_sources) appear to retrieve the same underlying page data in a narrower form, an agent gets no rule for choosing 'fetch' over them. Usage is only implied by the generic name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fit_panelFit a worktop, shelf or panel to walls that are not squareCRead-onlyIdempotentInspect
The true shape of a worktop, shelf or panel between walls that are not square: front and back lengths, setbacks, diagonals and the blank with scribe and bow, then the blank and any other parts nested on stock: part ids, grain, cut order, offcuts and edge banding. Geometry only.
| Name | Required | Description | Default |
|---|---|---|---|
| bow | No | The back wall's greatest departure from straight. Left out, none. | |
| gap | No | Left clear at each wall end. Left out, the kind's usual. | |
| kerf | No | The saw's kerf. Left out, 3 mm (1/8 in). | |
| kind | No | worktop (the default): worktop lengths. shelf: shelf boards. board: full sheets of plywood or board. | |
| mode | No | guillotine (the default): every cut edge to edge, for a panel or track saw. free: also layouts needing plunge cuts (CNC). | |
| span | Yes | Wall to wall (or to the free end), along the back wall, or along the front line with measuredAt front. | |
| trim | No | Cut off every board edge before nesting. Left out, the kind's own (10 mm on a full sheet). | |
| count | No | How many of the fitted piece. Left out, 1. | |
| depth | No | The finished depth, front edge to back wall. Left out, the kind's usual. | |
| grain | No | Hold the grain or decor along the run (the default). | |
| label | No | ||
| parts | No | Other parts nested on the same boards (a carcass's sides and shelves). | |
| sheet | No | ||
| stock | No | An index into the kind's stock sizes for the market (listed in the answer's stockOffered). Left out, the size that buys least. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| scribe | No | Left on every edge that meets a wall, to scribe off in place. Left out, the kind's usual. | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| leftEnd | No | open: a free end, cut square. | |
| backWall | No | Is there a wall along the back? Left out, yes. | |
| rightEnd | No | ||
| bandFront | No | Band the front edge of the fitted piece. | |
| leftAngle | No | The room's inside angle between the back wall and the left wall, degrees; 90 square. Left out, 90. | |
| minOffcut | No | An offcut is listed for reuse when it is at least this big either way. | |
| inputUnits | No | 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. | |
| measuredAt | No | ||
| rightAngle | No | ||
| bandAllowance | No | Tape added to every banded edge for trimming flush. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so safety is covered. The description adds genuine value by disclosing the shape of the answer (part ids, grain, cut order, offcuts, edge banding) and by scoping it with 'Geometry only', which tells the agent this does not price or quote. It stops short of disclosing defaults, unit behavior, or what the nesting step does when parts do not fit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is compact and front-loads the core purpose, but it is one long run-on sentence built from colon chains, and 'the blank' is repeated in both halves ('the blank with scribe and bow, then the blank and any other parts nested'). A tighter two-sentence split between measurement and nesting would read better.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a 27-parameter tool with nested objects, eight enums and defaults layered on defaults. An output schema exists so return values need no explanation, but the description never explains the measurement model (span, measuredAt, leftAngle/rightAngle) or when to reach for this versus fit_worktop_run, leaving an agent to reconstruct the whole workflow from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 81%, so the schema already carries most parameter meaning and the baseline would be 3. The description still adds semantics the schema does not: it frames scribe and bow as inputs that shape the blank, and ties grain, offcuts and edge banding to the nesting output, which helps the agent understand which parameters feed which part of the answer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (worktop, shelf or panel between walls that are not square) and enumerates the outputs, which makes the purpose inferable, but it is a noun-phrase fragment with no verb and it never distinguishes itself from near-identical siblings like fit_worktop_run or scribe_template. An agent can guess what it produces but not why it should pick this one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use, when-not-to-use, or alternatives guidance anywhere. With fit_worktop_run, scribe_template and optimise_cuts in the sibling list, the absence of any routing sentence is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fit_worktop_runWorktop run round corners: pieces, joints and lengthsBRead-onlyIdempotentInspect
A worktop along several wall faces, as the Construction Canvas cuts it: each piece's true shape at the room's real angles, butt or mitre joints at corners, long straights joined, the front run and free ends, and the blanks nested on worktop lengths with the cut order and banding. Not sized.
| Name | Required | Description | Default |
|---|---|---|---|
| bow | No | The back wall's greatest departure from straight. Left out, none. | |
| gap | No | Left clear at each wall end. Left out, the kind's usual. | |
| kerf | No | The saw's kerf. Left out, 3 mm (1/8 in). | |
| depth | No | The finished depth, front edge to back wall. Left out, the kind's usual. | |
| faces | Yes | The wall faces the run follows, in order, each with its length along the wall. | |
| grain | No | Hold the grain or decor along the run (the default). | |
| start | No | ||
| stock | No | An index into the kind's stock sizes for the market (listed in the answer's stockOffered). Left out, the size that buys least. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| finish | No | ||
| scribe | No | Left on every edge that meets a wall, to scribe off in place. Left out, the kind's usual. | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| corners | No | Between face i and face i + 1 (one fewer than the faces): inside or outside, the room's inside angle, and how the pieces meet. | |
| jointAt | No | Where a straight longer than the stock is joined, along its back from its start. Left out, an even split. | |
| bandFront | No | Band the front edge of the fitted piece. | |
| inputUnits | No | 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. | |
| bandAllowance | No | Tape added to every banded edge for trimming flush. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, non-destructive, closed-world computation, so the description is not burdened with safety disclosure. The description adds some behavioral context by stating that the tool models the Construction Canvas cut, handles joints and nesting, and is 'Not sized.' However, it does not clarify what 'Not sized' implies operationally or how defaults are applied across the many parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that front-loads the core purpose and lists the outputs efficiently. It has minimal waste, though the long sentence and ambiguous 'Not sized' tail slightly reduce clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 17 parameters, nested objects, and an output schema, so the return values need not be explained. Still, the description is thin for such a complex tool: it does not explain how to structure faces/corners or clarify the meaning of 'Not sized' in relation to the inputs. It is adequate given the rich schema but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 88%, so parameter semantics are largely handled by the schema. The description adds only high-level references to joints, banding, cut order, and the 'Not sized' constraint, without enriching the meaning of key parameters like faces, corners, start, finish, or stock. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (a worktop run along several wall faces) and enumerates what the tool produces: true shapes, butt/mitre joints, joined straights, front run, free ends, nested blanks with cut order and banding. It is clearly more than a restatement of the name. It does not, however, differentiate the tool from plausible siblings such as plan_room_trim, miter_chart, or fit_panel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives. The phrase 'Not sized' is the only usage-oriented hint, and it is ambiguous rather than a clear exclusion or prerequisite. An agent must infer the applicable scenario entirely from the name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_benchmarkGet the Construction Quantities BenchmarkARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which page of the benchmark, from 1: each page holds the items of a few calculators, in slug order. 1 when left out. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| calculator | No | One calculator's items only, by its slug, such as concrete-calculator. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructiveness, so safety is covered. The description adds meaningful context beyond that: the dataset is CC BY 4.0, it is built from the site's calculator test vectors, and it returns a download link and citation guidance. It does not, however, disclose pagination bounds or item counts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main purpose is front-loaded in the first clause, followed by item contents and the paging/citation note. It is dense but every element (units, tolerance, citation, download link) earns its place; the trailing fragment is slightly abrupt but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers content, paging granularity, unit systems, licensing, and citation. The only minor gap is the absence of guidance on tool choice versus similar read tools, which is not strictly required for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents page, detail, and calculator, including defaults and the slug pattern. The description reinforces the page-vs-calculator scoping but adds no format or syntax detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns items of') and a precisely named resource (the Construction Quantities Benchmark), then enumerates exactly what each item contains (inputs, prompt, expected answer, tolerance, worked steps). This distinguishes it clearly from siblings like get_calculator, get_example, and get_sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the two usage modes ('A page of calculators at a time or one calculator's items'), which maps to the page vs calculator parameters, but it never states when to prefer this tool over related siblings such as get_calculator or get_example, nor any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calculatorGet one calculator's input fieldsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The calculator's slug, such as concrete-calculator. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context not in annotations: it lists exactly what is returned (units in metric and US, version, page, citation) and asserts it performs no computation, clarifying it is a pure lookup.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence front-loads the core action and ends with the differentiator 'It computes nothing'. Every clause is substantive, though the field enumeration is somewhat list-heavy given an output schema already exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return-field enumeration is arguably redundant, but nothing an agent needs to call the tool correctly is missing: slug identification, the detail-mode trade-off, and the no-computation caveat are all present. Only the explicit sibling routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the slug pattern/example and the detail enum (full vs summary token trade-off) are fully documented in the schema. The description confirms slug-based identification but adds no syntax or format meaning beyond what the schema already provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Returns the input fields of one calculator') and enumerates the returned content. Critically, 'It computes nothing' cleanly distinguishes it from the sibling 'calculate', so an agent can separate the two without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'It computes nothing' implies the agent should not use this to compute and should look elsewhere (e.g., calculate), giving clear context. However, it never explicitly names the alternative tool or states the positive 'use this when you need field metadata' condition, so routing is inferred rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exampleGet one worked exampleARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | A worked example's slug, such as bathroom-gutted-and-retiled. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered without the description. The description adds a content outline rather than behavior — it says nothing about failure modes for an unknown slug, which is the one behavioral detail an agent would want.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the key identifier front-loaded ahead of the content list. The trailing enumeration is slightly long, especially since an output schema already exists to describe the return shape, but nothing is padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety and an output schema covering the return shape, the description only needs to place the tool, which it does. The residual gap is sibling disambiguation against run_example and any note on unknown-slug behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both the slug pattern/example and the full/summary enum with its token trade-off. The description only echoes that the example is identified by slug and never mentions the detail parameter, so it adds nothing over the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — "Returns one worked construction estimate from the site, identified by its slug" — and enumerates the payload (measurements, ordered steps, calculator per step, pinned figure, waste). It does not, however, distinguish itself from the close sibling run_example, which an agent could plausibly confuse with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent infers "use this to read one stored example by slug." There is no explicit when-to-use, no exclusion, and no pointer to run_example or get_calculator, which is the main ambiguity in this sibling cluster.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_illustrationTopic illustration (SVG) of a guide, comparison or pageARead-onlyIdempotentInspect
Returns the topic illustration a page of the site carries: the SVG's address, its subject in words and its licence. One per guide, comparison, diagnosis, example, category, material and solve-backwards question; a shared plate for the glossary, methods, policies, standards and tools.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | The page's slug; left out, the family's own plate. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| family | Yes | The kind of page the drawing belongs to. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real behavioural context beyond that: cardinality (one illustration per guide/comparison/diagnosis etc.) and the fact that glossary, methods, policies, standards and tools share a single plate rather than having per-page art. It stops short of saying what happens when a page has no illustration assigned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the return payload before the per-family cardinality rule; no filler. The compressed phrases 'shared plate' and 'solve-backwards question' cost a little clarity for the token saving but stay readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema and 100%-covered input schema, the description carries little structural burden, and it still supplies the family/cardinality rule an agent needs to pick parameters correctly. Only the empty-result case is unaddressed, which is a minor gap for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds genuine meaning: it maps the family enum values to their cardinality, explaining that the shared-plate families return the same drawing regardless of slug. That clarifies the interaction between the two parameters in a way the schema does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first clause names a specific verb and resource — 'Returns the topic illustration a page of the site carries' — and enumerates the payload (SVG address, subject, licence). It is distinguishable from mutation siblings like create_drawing or export_drawing, though it never names the read/retrieval alternatives (fetch, open_in_site_link) it sits beside.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'the topic illustration a page ... carries' suggests calling it when you need the artwork for a given page. There is no explicit when-to-use, when-not-to-use, or reference to a sibling for the same need, so the agent must infer the selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_plannerGet the planner's fields for one kind of spaceBRead-onlyIdempotentInspect
Returns the room planner's fields for one kind of space: its figures, surfaces and finish ids, scope questions and rows, with their ids.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | 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 | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety and side-effect profile is fully covered without the description. The description adds a content inventory of the returned fields, which is mildly useful, but says nothing about failure modes for an invalid kind or about the detail-mode tradeoff already in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the verb and resource, with no filler or restated title. The trailing list of returned artifacts is dense but every clause carries content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full parameter descriptions, and complete annotations, most structural gaps are already filled elsewhere. The remaining gap is routing: nothing explains the relationship between this tool and the plan_room/plan_project siblings, which is the one thing an agent still needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters carry enum descriptions, so the schema does the heavy lifting. The description only echoes "one kind of space" and does not add format or selection guidance beyond the enum values already documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ("Returns") plus a concrete resource ("the room planner's fields for one kind of space") and enumerates the payload contents (figures, surfaces, finish ids, scope questions, rows). It is clear on its own, but it never distinguishes itself from similarly-named siblings such as plan_room, plan_project, or get_calculator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no alternative tool is named. An agent reading this cannot tell why it would call get_planner rather than plan_room or plan_project, which is a real risk given the overlapping planning vocabulary in the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sourcesSources and citation for a calculationARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The calculator's slug, such as concrete-calculator. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds a genuine behavioral guarantee beyond that: the tool returns only sources the calculator actually cites, which tells the agent the result is a faithful subset rather than an enriched bibliography. It says nothing about size, pagination, or failures, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with a concrete question that frames the purpose before the payload list. The rhetorical opener is a small stylistic cost rather than filler, and the closing fidelity clause earns its place as a scope constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the shape of the returned sources and citations need not be restated, and annotations carry the safety profile. The description covers what is returned and its fidelity constraint; only the prerequisite that the slug must reference an existing calculator is left implicit, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both slug and the full/summary detail enum are documented in the schema itself with defaults and meaning. The description adds no parameter-level information (the citation-format list describes output, not input), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns a calculator's sources as it cites them') plus the exact payload: codes/standards, standards pages, and citation formats (plain, APA, Harvard, BibTeX). This clearly separates it from get_calculator, get_example, and the create_* siblings, which deal with the calculation or its output rather than its provenance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The leading question ('Where does a figure come from, and how is it cited?') implies the provenance/citation use case, and 'It adds no source the calculator does not cite' sets an expectation of scope. However, it never states when to prefer this over get_calculator or how to reach it, so the usage trigger is inferred rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_takeoffGet one takeoff's measurementsBRead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| takeoff | Yes | A takeoff id, such as concrete-slab. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and a closed world, so the safety profile is fully covered structurally. The description adds useful shape about what is returned (units, opening figures, build-up choices, calculators, exclusions), but says nothing about sizing, pagination or how it behaves for an unknown id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the identifier and the return contents front-loaded; every clause carries information and there is no filler. It is slightly long for one sentence but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety and an output schema covering the return shape, the description only needs to frame the lookup, which it does. Missing is any linkage to the execution-side sibling run_takeoff, which would help an agent pick correctly between the two.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (takeoff id and the full/summary detail toggle) are already documented in the schema; baseline 3 applies. The description reinforces the id lookup but never mentions the detail parameter, so it adds no meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns the measurements one whole-job takeoff needs, identified by its id') and enumerates what the payload contains, so the agent knows exactly what it gets. It does not, however, distinguish itself from the sibling run_takeoff or create_project_file_from_takeoffs, which is the main gap at this level.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use statement, no prerequisites, and no mention of alternatives such as run_takeoff (which presumably executes a takeoff) or create_project_file_from_takeoffs. The agent must infer from the name alone when this is the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_quoteTurn my quote into an estimateBRead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| quote | Yes | The quote's text, one item to a line, with its prices. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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 | No | The quote's currency symbol, where the quote does not show it. | |
| supplier | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior: it self-checks its arithmetic and that prices are the reader's own figures, not site-derived. It does not address failure modes for unparseable quotes or input limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, with the core action front-loaded and the price-provenance caveat second. Slightly loose phrasing ('the reader has, prices and all') costs a little, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. For a read-only, deterministic conversion tool the description covers the action, the arithmetic check, and the provenance of figures; only error/limit behavior is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: quote, detail, market and currency carry descriptions, while name and supplier are undocumented in both schema and description. The line about prices being the reader's own figures loosely ties to the currency parameter, but the description otherwise adds no parameter semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: turning a supplier's or builder's quote into a My Project file/estimate, with an explicit analogy to the site's 'Quote to Estimate'. It is clear what the tool does, though it never names or distinguishes itself from near siblings like check_quote or create_project_file_from_takeoffs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies you call it when a reader has a quote in hand, but gives no when-to-use criteria, prerequisites, or explicit routing against alternatives such as check_quote (which presumably validates rather than converts). No exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
layout_reinforcementRebar layout drawing and bar counts for a slab or footingARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mats | No | One mat, or two (top and bottom) laid out alike. | |
| cover | Yes | The cover to the bars on plan, as the engineer gives it. | |
| width | Yes | Along y, with its unit. | |
| chairs | No | Count the bar supports too, from the supplier's support spacing. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| length | Yes | Along x, with its unit. | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| barSize | Yes | As the engineer gives it: #4, 15M, N12, H12, T12 or 12 mm. | |
| element | No | A slab, or a pad or strip footing, as a rectangle on plan. | slab |
| formats | No | The drawing's files: svg, dxf or both (the default). | |
| spacing | No | The spacing both ways, as the engineer gives it. | |
| widthwise | No | The bars running along the width (spaced along the length): a spacing of their own, or a count. | |
| inputUnits | No | 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 | No | The lap-splice allowance on the total; left out, the Rebar Calculator's own default. | |
| lengthwise | No | The bars running along the length (spaced across the width): a spacing of their own, or a count. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds real behavioural context beyond that: two drawing formats produced, weight reported only conditionally ('where the site's calculator carries the size'), lap defaulting to the calculator's own value, and the explicit scope limit that it performs no design or code checking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and scope, followed by an efficient output enumeration and a one-line boundary statement. The single long sentence listing outputs is dense but every item earns its place; no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is fully described, so the description does not need to explain returns or parameters. Given the tool's complexity it covers scope, outputs and the design/quantity boundary well; the only omission is any hint about default resolution between the redundant spacing vs lengthwise/widthwise count inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 15 parameters, including nested lengthwise/widthwise/chairs objects and five enums, so the schema already carries the semantics. The description only loosely gestures at the inputs (bar size, spacing, cover, 'bars each way', lap) without adding format or edge-case detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('lays out reinforcing bars in a rectangular slab or footing') and enumerates the concrete outputs: bars each way, bar lengths, total length with lap, stock sticks, weight, SVG and DXF. The closing boundary ('a quantity layout, not a design: it does not size structure or check a code') cleanly separates it from calculate/design-oriented siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear exclusion ('not a design... does not size structure or check a code'), which tells the agent when this tool is the wrong choice. However, it never names the alternative to use instead (e.g. calculate or create_drawing), so routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
level_quotesLevel two to six quotes for one job, line by lineARead-onlyIdempotentInspect
Levels two to six contractors' quotes for one job against the job's own lines: per line, whether each includes it (its quantity against the job's range, both systems), leaves it out, excludes it or offers an alternative; what each adds; questions to ask. Money is taken out: no total, no ranking.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes | The job the quotes are for: a quote check (bathroom-quote, plastering-quote, concrete-slab-quote …) or a takeoff id that has one. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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. | |
| quotes | Yes | Two to six quotes for the same job. Money in them is taken out before reading. | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| selection | No | 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. | |
| inputUnits | No | 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 | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish a safe, read-only, idempotent, closed-world operation. The description adds meaningful behavioral context beyond that: money is stripped out, no total or ranking is produced, and the output covers inclusion status, additions, and follow-up questions. It does not describe return format or pagination, but the output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the main action before listing per-line details. The sentence is dense with semicolons but every clause contributes to understanding the comparison output.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with eight parameters, nested objects, a full output schema, and annotations, the description covers the core behavior and the important money-removal caveat. It is somewhat thin on when to choose this over sibling tools, but the structured fields fill in the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters thoroughly. The description adds little beyond what the schema provides, beyond reinforcing 'both systems' and the two-to-six quote scope. Baseline 3 is appropriate when the schema carries parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Levels... quotes') and resource ('contractors' quotes for one job against the job's own lines'), and it details the per-line dimensions compared. It does not explicitly distinguish itself from siblings such as check_quote or compare_on_job, so it stays short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context implies this is for comparing two to six quotes for a single job line by line, and the schema enforces the quote count. However, there is no explicit when-to-use guidance, no exclusions, and no mention of alternatives like check_quote or compare_on_job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_canvas_linkOpen a job or worked example on the Construction CanvasARead-onlyIdempotentInspect
Draws a whole-job takeoff or a worked example at the figures given as a Construction Canvas drawing and returns the link that opens it; the drawing rides in the link's fragment, so nothing is uploaded. Says what the drawing cannot carry. For quantities, not a construction drawing.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| inputs | No | One step's own input, keyed "<step index>.<input id>" ("3.wastePercent"), each with its unit where it has one. | |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| example | No | Or a worked example the canvas draws, such as attached-deck-built. | |
| figures | No | The job's own figures by id (a deck's length, a room's height), each length or area with its unit; a count as a number. They follow down every step that reads them. | |
| takeoff | No | A takeoff the canvas draws, such as concrete-slab, stud-wall or asphalt-shingle-roof. | |
| selection | No | 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. | |
| inputUnits | No | 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 | No | 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. | |
| includeDocument | No | Also return the canvas document itself (JSON). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: the drawing is encoded in the URL fragment so nothing is uploaded and no server state is created, which explains the readOnly/idempotent profile. However, 'Says what the drawing cannot carry' is an unresolved fragment that gestures at limitations without stating any.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and return value are front-loaded, which is good, but the semicolon-chained clauses are over-compressed and one clause is a dangling fragment ('Says what the drawing cannot carry'), costing clarity rather than saving space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateless link-builder with 11 fully documented parameters, an output schema, and complete safety annotations, the description covers the non-obvious essentials: nothing is uploaded and the link is self-contained. Missing only a hint about link longevity or shareability.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 11 parameters is already documented in the schema. The description only gestures at 'the figures given' without clarifying how figures, measurements, selection, and inputs relate; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and outcome: it draws a whole-job takeoff or worked example as a Canvas drawing and returns the link that opens it. The closing clause 'For quantities, not a construction drawing' draws a line against drawing-oriented siblings like create_drawing and export_drawing, though it never names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives one implicit routing rule (use this when you want a shareable rendering of quantities rather than a real construction drawing), but never says when to prefer this over open_in_site_link, run_takeoff, or get_takeoff, which all concern the same takeoff data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_job_sheetOne-page job sheet for the vanARead-onlyIdempotentInspect
The one-page job sheet a takeoff page prints for the van: the job's picture as SVG, key dimensions in metric and imperial, the build-up, each line going in with what to buy, labour hours by trade, and the link reopening the page on these figures. Words and figures for the PDF; no prices.
| Name | Required | Description | Default |
|---|---|---|---|
| paper | No | The sheet's paper; the market's when left out. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| takeoff | Yes | The takeoff's id, such as concrete-slab or stud-wall. | |
| leaveOut | No | Rows the reader leaves out of the job: still worked and shown, not put in the project or counted in labour. | |
| selection | No | 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. | |
| inputUnits | No | 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 | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds one genuine behavioural fact beyond that – 'no prices' in the output – but most of the rest restates what the output schema already documents, so the marginal value is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence, front-loaded with the purpose and then listing contents in a sensible order; the closing 'no prices' constraint lands last where it is easy to catch. Some phrasing ('the van', 'the build-up') is idiomatic at the cost of precision, but there is no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema, rich annotations and 100% schema coverage, the description needs only to frame what the tool is for and it does so thoroughly, including the business constraint on prices. The only mild gap is that the relationship to the takeoff-running tools (must it exist first?) is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including enums and nested selection/measurements is already documented structurally; baseline 3 applies. The description's only parameter-adjacent remark is that dimensions appear in metric and imperial, which lightly echoes the 'system' parameter without adding syntax or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb-phrase and resource: it produces the one-page job sheet for a takeoff, and enumerates what that sheet contains (SVG picture, dimensions in both unit systems, build-up, buy lines, labour hours, reopening link). That is enough to separate it from siblings like get_takeoff or run_takeoff, but it never names those alternatives, so differentiation is inferential rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'the one-page job sheet a takeoff page prints for the van' – an agent can infer this is the printable/field-handout output step after a takeoff exists. There is no explicit when-to-use, no prerequisite stated (does the takeoff need to be run first?), and no alternative tool named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_documentsFind the building code for a kind of workARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | Yes | 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 | No | The work, in words: "kitchen wiring", "stair handrails", "gas boiler flue". | |
| calculator | No | Or a calculator's slug: the subjects its own sources name. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, closed-world, non-destructive), so the bar is lower. The description still adds real behavioral context beyond them: it discloses that the tool will not tell which edition is in force, because adoption is local, and that the answer instead names the deciding authority.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the core function stated first and the limitation second. Every clause carries information and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover safety. The description supplies purpose, scope and the key expectation gap (no edition resolution), giving an agent enough to call it correctly; only explicit sibling routing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters including the detail enum and the market/subject/calculator formats. The description only loosely maps to 'one kind of work' (subject) and 'one market' without adding syntax or edge-case guidance for detail or calculator, making 3 the correct baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Finds'), an exact resource ('which family of building codes or standards governs one kind of work') and a precise scope ('one market', with the market options enumerated). It is clearly distinguishable from siblings like get_calculator or get_sources, though it never names or contrasts a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Context is implied by the 'one kind of work in one market' scoping and the explicit limitation that it does not resolve the edition in force, but there is no statement of when to prefer this over alternatives such as search, fetch, or get_sources. The caveat 'adoption is local, and the answer names who decides' tells the agent what to expect rather than when to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
measure_sketchMeasure a plan, sketch or photo from its pointsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| shapes | Yes | The outlines and lines read off the image, in its pixels. | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| reference | Yes | ONE known size in the same image: a figured dimension, or an object of known size by its four corners. | |
| inputUnits | No | 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 | No | How far any point may be off, in pixels: it sets the band. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description then adds real behavioral context: results come in both metric and US units with an uncertainty band, closure and crossing checks, plus a canvas link, and it flags that no image is ingested.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence opening with the verb, with no filler. It is dense — parenthetical units, reference types and output features packed into one clause chain — but every element carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter nested tool with an output schema, the description supplies the essential mental model: what is measured, what inputs it expects, that a reference is mandatory, and that no image is passed. The remaining gap is routing guidance against sibling measurement tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including the reference object, pixelError, detail and system. The description only restates the conceptual contract (points plus one known reference), adding no syntax or format detail beyond the schema — the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a precise verb+resource+scope: it measures areas, perimeters and lengths from pixel points plus one known reference, and it explicitly notes it receives no image. That last clause cleanly separates it from image-consuming siblings like run_takeoff or create_project_file_from_plan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the agent can infer it should call this when it already has point coordinates and a reference scale, and the 'It receives no image' clause rules out image-input workflows. There is no explicit when-to-use, no when-not, and no named alternative among the many measure/takeoff siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
miter_chartMitre saw angle chart: corners from 80° to 150°ARead-onlyIdempotentInspect
The mitre saw chart for trim corners: per corner angle the mitre each piece takes, the outside corner read through the room, the gap a 45° cut leaves on 18 mm and 3/4 in trim and where it opens, crown laid flat (38/52 and 45/45) mitre and bevel, and the handing table. Any corners on request.
| Name | Required | Description | Default |
|---|---|---|---|
| angles | No | The corners θ to chart, degrees. Left out, the site's chart: 80° to 100° in half degrees, then 120°, 135° and 150°. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| handing | No | Include the handing table (which way each piece swings and tilts at a square corner). Left out, yes. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so safety and side-effect behavior are covered. The description adds that the answer comes in both unit systems and that handing is included by default, which is modest value beyond the structured fields. It does not discuss output format, limits, or how the chart differs behaviorally from a computed result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in a single dense sentence, and each clause maps to a concrete chart section rather than filler. It is somewhat run-on and jargon-heavy, but it is appropriately sized for a chart tool with several output sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, rich annotations, and 100% schema coverage, the description's job is mainly to convey what the chart contains, which it does thoroughly. The one notable gap is routing guidance against close siblings like trim_corner. Otherwise an agent has enough to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents angles, detail, system, and handing with defaults and enums. The description reinforces the default chart range and mentions handing, but adds no syntax or format detail beyond what the schema provides. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (the mitre saw chart for trim corners) and enumerates what it contains: mitre per piece, outside-corner reading, gap on 18 mm and 3/4 in trim, crown laid flat, and the handing table. An agent can tell this is a reference/chart tool rather than a single-corner calculator. It does not explicitly distinguish itself from siblings such as trim_corner or calculate, so it falls short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'Any corners on request' suggests the angles parameter drives a custom chart, and the tool is clearly for trim mitre reference. There is no explicit statement of when to use this versus trim_corner, calculate, or get_calculator, and no exclusions. This is minimum viable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_in_site_linkLink to the calculator page with these figuresARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The calculator's slug, such as concrete-calculator. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| inputs | No | 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. | |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| inputUnits | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds the useful fact that the output is a link embodying the caller's figures and unit system, but does not mention failure behavior (e.g. unknown input ids) or any limits, so it adds modest value over the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the return value and scoped by the site and the filled-in figures. It is dense but not padded; only the trailing 'so a person can see or change the working' is arguably redundant with the annotation set.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return shape need not be described, and 100% schema coverage handles all six parameters including nested objects. For a read-only link-builder the description covers purpose and audience adequately, though it never explains how this tool relates to the calculate/run_example siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with detailed per-parameter docs (slug pattern, detail enum, inputs shape, market, system, inputUnits). The description only echoes 'figures filled in and their unit system,' adding nothing the schema does not already say in more detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and result ('Returns a link that opens a construction calculator's page on craftquantities.com') plus what the link carries (figures and unit system). It distinguishes itself from siblings like calculate by emphasizing the human-facing artifact ('so a person can see or change the working'), but it never names an alternative tool explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The trailing clause implies when to use it — when a person needs to view or edit the working on the page rather than receive a computed answer. There is no explicit when-not guidance and no named alternative (e.g. calculate) for the compute-only case, so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optimise_cutsOptimise a cut list: stock lengths and sheet layoutsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kerf | No | 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 | Yes | linear: lengths cut from stock lengths (studs, plates, joists, rafters, bars, trim, boards). sheet: rectangles nested on sheets (plasterboard or drywall, plywood, OSB, tiles). | |
| mode | No | sheet: guillotine (the default), every cut edge to edge for a panel or track saw, with the cuts in order; free, also layouts needing plunge cuts (CNC). | |
| trim | No | sheet: cut off every sheet edge before nesting (a factory edge that is not clean). Left out, none. | |
| stock | No | 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 | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| pieces | Yes | The cut list: up to 200 lines and 3000 pieces (1500 for sheets) in all. | |
| rotate | No | 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 | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| material | No | 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 | No | linear: the shortest offcut worth keeping; shorter ones count as waste. sheet: the smallest offcut (either way round) listed for reuse; left out, 300 mm (12 in) square. | |
| inputUnits | No | 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. | |
| bandAllowance | No | sheet: tape added to every banded edge for trimming flush. Left out, none. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, non-destructive, closed-world computation, so the description is free to spend its words on domain behaviour — it discloses the deliverables (stock or sheets to buy, a per-bar/per-sheet cutting plan, real waste, a lower bound) and confines itself to quantities. It does not mention the input caps (200 lines / 3000 pieces) or how defaults are resolved, but those live in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the verb and the two modes, then the deliverable, then the scope limit. The parenthetical material lists earn their space by making the linear/sheet split concrete, and nothing is repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter optimisation engine with full annotation coverage and an output schema, the description supplies what remains needed: what both modes mean, what comes back, and what the tool deliberately does not do. Input limits and defaulting rules are adequately handled by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 14 parameters, including defaults, unit handling and enum meanings, so the baseline of 3 applies. The description reinforces the semantics of the stock/sheets/pieces inputs in merchant language but adds no format or behaviour detail the schema does not already carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (optimises) and resource (a cut list), then names both operating modes — linear lengths cut from merchant stock versus rectangles nested on sheets — with concrete material examples for each. The closing scoping line ("quantities only: no prices, no structural design") further separates it from pricing or structural siblings such as check_quote or layout_reinforcement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context is given for choosing between the two modes, and the description explicitly excludes pricing and structural design, which is a genuine scope boundary. It never names an alternative sibling (fit_panel, layout_reinforcement, miter_chart) or says when to reach for those instead, leaving that routing to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_programmeBuild programme (construction schedule) from labour hoursARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| crew | No | People in each trade's crew, unless named in crews. | |
| file | No | 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 | No | The project's name, for the files. | |
| crews | No | People in a trade's crew, by trade id (carpentry, drywall, electrical, roofing …). | |
| token | No | A project state token (cqp1.…) from a project-file answer or an update: the project whose lines are put in order. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| daysOff | No | Dates not worked (holidays, a shutdown), YYYY-MM-DD. | |
| drawing | No | 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. | |
| takeoffs | No | Whole-job takeoffs, each an id and its measurements, as a project file takes them. | |
| workDays | No | The days of the week worked, 1 Monday to 7 Sunday. | |
| startDate | No | 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 | No | Working hours in a crew's day. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds real value beyond that by disclosing the returned deliverables (totals, CSV, an iCalendar file only when a start date is given) and the explicit modelling exclusions. It does not discuss failure modes or error handling, so it falls just short of the top band.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then output, inputs and exclusions in a compact block with essentially no filler. It is dense, jargon-heavy and slightly run-on (multiple clauses stacked per sentence), which mildly reduces scannability but does not cost useful content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with nested objects and zero required inputs, the description covers the purpose, accepted input sources, deliverables and modelling boundaries, and an output schema exists so return values need not be re-explained. Missing only explicit guidance on choosing among the competing input sources (token vs file vs takeoffs vs drawing).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 14 parameters (including nested drawing/takeoffs shapes) carry their own documentation and the baseline is 3. The description adds only soft framing (hours distributed "over the crew and working day given") rather than syntax or defaults not already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb ("Builds") plus a precise resource ("a construction programme … from a project's labour hours"), with the produced artifact spelled out (tasks by trade, stage and level, ordered by the usual sequence of work). An agent can distinguish it from plan_project, plan_room and the create_project_file_* siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the accepted input sources ("a project state token, a My Project file, takeoffs or a drawing") and states scope limits ("Weather, inspections and lead times are not modelled. No prices."), which indicates when the tool applies. It stops short of explicitly routing the agent against a named sibling or stating when-not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_projectPlan the materials for several roomsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| roof | No | ||
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| spaces | Yes | The spaces, in order, each one planned space. | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| inputUnits | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), so the description only needs to add what they don't. It does: it enumerates the returned artifacts (each space's rows, every line together, labour hours, the plan) and, more usefully, states a hard boundary — "Quantities only; it does not size structure" — which tells an agent what the tool will not do.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences that front-load the verb and resource before the output and boundary clauses. Dense phrasing ("each space's rows, every line together") is slightly opaque but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and 80% of parameters are covered by the schema. The description supplies the purpose and the quantities-only boundary appropriate to a complex nested-input tool. The main residual gap is the relationship to plan_room and whether anything is persisted, though readOnlyHint answers the latter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so parameters such as detail, system, inputUnits and the roof sub-fields are already documented in the schema. The description only adds that the roof is optional, which is already implied by the schema's non-required roof property. Baseline 3 applies when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Plans"), the resource (several spaces tied together as one project in the room planner), and the scope of what it produces (rows, lines, labour hours, the plan). The plural "several spaces together" implicitly distinguishes it from the singular plan_room sibling, but it never names that sibling, so the differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "Plans several spaces together ... as one project" implies the multi-space use case versus single-space planning, and "with an optional roof over them" hints at when the roof block applies. However, there is no explicit when-to-use, when-not-to-use, or routing to alternatives such as plan_room, so usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_roomPlan the materials for one room or spaceARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | 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 | No | ||
| doors | No | ||
| scope | No | Scope question name → answer value, by the planner's ids. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| inputs | No | Branch id → { calculator input id: value in its base unit }. | |
| intent | No | A trade, or everything. | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| figures | Yes | 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 …). | |
| windows | No | ||
| finishes | No | Surface role → finish id, by the planner's ids. | |
| leaveOut | No | Branch ids to leave out. | |
| inputUnits | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and non-open-world, so the safety profile is covered. The description adds value beyond that by spelling out the return contents and asserting a hard scope boundary: 'Quantities only; it does not size structure,' which tells the agent what this tool will not produce.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and immediately followed by the output contract and the scope caveat. No filler and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no further elaboration, and annotations cover the safety profile. The description supplies the scope limit and output summary; only fine-grained guidance on the 13 parameters is thin, and the schema largely covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 77% and 13 parameters are documented in the schema itself. The description only gestures at the input dimensions ('its size, openings and the finishes chosen'), loosely mapping to figures, doors/windows and finishes, without adding format, unit or id-semantics detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Plans) and resource (one space such as a room or bathroom) and describes the output shape in detail (materials list rows with quantity, remaining needs, unbuilt items and reasons, and labour hours). The scope is narrow enough to separate it from the project-level sibling plan_project without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'one space' framing implies when to use it versus a whole-project planner, but no alternative is named and there are no explicit when/when-not conditions or prerequisites. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_room_trimRoom trim plan: every piece, its ends and the stockARead-onlyIdempotentInspect
Plans trim round a room, piece by piece, from its corners, door openings and built-ins (or a drawn room): each piece in fitting order with its long and short point lengths, each end's cope, mitre, butt or scarf with its saw settings, the cut list and the trim lengths to buy.
| Name | Required | Description | Default |
|---|---|---|---|
| saw | No | The saw profile the room plan's settings are read on (as the plan on the page): a mitre saw that tilts both ways (the default), one that tilts left only, or a mitre box with 90° at square. | |
| kerf | No | The saw's kerf. Left out, 3 mm (1/8 in). | |
| room | No | With drawing: the room's id (R1 …). Left out, the drawing's only room. | |
| trim | No | Left out, skirting. | |
| depth | No | The trim's depth across the joint (skirting thickness, crown projection). Left out, 18 mm (3/4 in) or 75 mm (3 in) for crown. | |
| start | No | The wall fitted first (index). Left out, 0. | |
| stock | No | The stock lengths on offer, with units. Left out, the market's usual trim lengths. | |
| studs | No | ||
| walls | No | The walls in order round the room, up to 40, each with its length along the wall face (corner to corner). | |
| casing | No | The door casing's width a skirting butts to beside a door. Left out, none (it butts to the opening's edge). | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| method | No | How the piece goes on the saw: skirting and casing upright (against the fence) or flat (on the table); crown nested (upside down against the fence) or flat. Left out, the trim's usual one. | |
| spring | No | Crown only: its spring angle from the wall, degrees (38 for 38/52, 45 for 45/45). Left out, 38. | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| buildUp | No | Plaster built up in the corners. Left out, none. | |
| corners | No | corners[i] is at the end of walls[i], where it meets the next wall (one per wall; the last closes the room). | |
| drawing | No | In place of walls and corners: a Construction Canvas drawing in any form the drawing tool takes ({ document }, { commands }, { template }, { house }, { shapes }, { layout }); the room's inside faces, corners and doors are read from it as the canvas's Trim plan reads them. | |
| direction | No | cw (the default): facing each wall from the room, working left to right. ccw: the canvas's order. | |
| minOffcut | No | Offcuts at least this long are kept. | |
| inputUnits | No | 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. | |
| insideJoint | No | Inside corners coped (the default) or mitred. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior. The description adds substantial behavioral detail beyond that: fitting order, long and short point lengths, end treatments with saw settings, cut list, and trim lengths to buy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence, with the colon cleanly separating purpose from output details. It is dense but has little filler; splitting it could improve readability, but it is appropriately sized for a 21-parameter planning tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, rich annotations, and 95% schema description coverage, the description is complete at the high level an agent needs. It covers the main input modes and outputs, though it does not explicitly state the walls-plus-corners versus drawing input choice or defaults, which the schema handles.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 95%, so the schema already carries nearly all parameter meaning. The description adds only high-level input modes such as corners, openings, built-ins, and drawn rooms, without adding defaults, unit behavior, or syntax beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: plans trim round a room piece by piece from corners, openings, built-ins, or a drawing. The scope and output list distinguish it from a single-corner tool or saw chart, even though it does not name siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear planning context, especially for whole-room trim from walls or a drawn room. However, it never says when to choose this over trim_corner, miter_chart, optimise_cuts, or plan_room, so usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
print_templateFull-size print template as SVG and DXFARead-onlyIdempotentInspect
The full-size template a calculator page prints: a stair stringer or step gauge, rafter cuts, a cone or frustum pattern, an arch's centring or voussoirs, an anchor bolt setting jig or plate, a curved plate; its lines as SVG and DXF, its checks and omissions, and how it tiles on paper.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Which of the family's two templates: stringer gauge or whole; rafter cuts or whole; cone whole or half; arch centring or voussoirs; bolts setting or plate; plate segment or whole. Left out, the first. | |
| paper | No | Left out, A4 for metric and Letter for imperial. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| fields | No | The template's own figures by id (a stringer's board depth and tread thickness, a cone's lap …), with units; left out, the page's defaults for the system (or the calculator's own figure where the page opens on it). The answer lists them. | |
| inputs | No | The calculator's own inputs by id, with their units, as its page takes them; left out, the values its page opens on. | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| formats | No | The drawings to return. Left out, both. | |
| overlap | No | Between adjacent sheets. Left out, 10 mm. | |
| rollWidth | No | With paper roll: the roll's width. | |
| calculator | Yes | The calculator whose page offers the template: a stair stringer and step gauge, a rafter, a cone or frustum pattern, a curved wall's plate, an anchor bolt setting board or plate, an arch's centring or voussoirs. | |
| inputUnits | No | 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. | |
| orientation | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, covering the safety profile. The description adds that the output includes lines as SVG and DXF, checks and omissions, and paper tiling behaviour, which is useful beyond annotations, but it does not describe error behavior, performance, or how the template is generated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that immediately identifies the resource. It is somewhat list-heavy and repeats template types that also appear in the calculator and kind schema descriptions, but it remains appropriately sized and does not contain wasted framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema and rich annotations, the description does not need to explain return values or safety properties. It sufficiently covers scope, output formats, checks/omissions, and paper tiling for a 12-parameter read-only generation tool, though it could be more complete on when to choose it over related drawing tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 92%, so most parameter semantics are already documented in the schema. The description adds little parameter-level detail beyond mentioning SVG/DXF lines and tiling on paper, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource — the full-size printable template produced from a calculator page — and lists example template families (stair stringer, rafter cuts, cone pattern, arch centring, anchor bolt jig, curved plate). It does not explicitly distinguish itself from sibling drawing tools such as create_drawing or export_drawing, so sibling differentiation is absent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'the full-size template a calculator page prints', suggesting it is used after or alongside calculator results. However, there is no explicit when-to-use guidance, no when-not-to-use guidance, and no named alternatives among the many drawing/template siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_idFind a page by its permanent id or old linkARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | A permanent id (cq-c0412), a current or earlier slug, or a craftquantities.com address. | |
| kind | No | Only pages of this kind. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds genuinely new behavior: ids are assigned once and survive renames/moves, and a removed page names its replacement. It stops short of stating failure behavior for an unresolvable or ambiguous ref.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and its accepted inputs, followed by the persistence and replacement semantics. No filler, no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed, yet the description still previews them. For a three-parameter, fully-documented, read-only lookup with a closed-world annotation, nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented in the schema, including the ref formats and the summary/full detail tradeoff. The description largely restates those accepted ref forms rather than adding syntax, precedence, or ambiguity-handling rules. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (resolves) and a specific resource (a Craft Quantities page identified by permanent id, slug, or address), then enumerates what comes back: kind, current slug, slug history, page link, permanent /id/ link. This is clearly distinguishable from siblings like fetch, search, get_calculator, and open_in_site_link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Acceptable input forms are spelled out (permanent id such as cq-c0412, current or earlier slug, or a craftquantities.com address), which implies when the tool applies. However, it never names an alternative or states when not to use it — e.g., when search or fetch would be the better route for a bare query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_exampleRe-check a worked example's figuresARead-onlyIdempotentInspect
Re-runs every pinned step of a worked construction estimate now, in both unit systems, and returns whether each still meets the published figure.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | A worked example's slug, such as bathroom-gutted-and-retiled. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so safety is covered. The description adds genuinely new behavioral context: it runs every pinned step (not a selected subset), in both unit systems, and yields a per-step pass/fail against the published figure. It does not mention runtime cost or failure behavior, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the action and ends with the returned outcome. Every clause carries information; nothing is redundant with the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the safety profile, so what remains is scoping — which the description supplies (all pinned steps, both unit systems). Only the absence of any failure/error behavior or cost expectation for a full re-run keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both slug and the detail enum are already documented with format and default. The description adds only the indirect signal that no unit or step-selection parameter exists ('both unit systems', 'every pinned step'); it does not clarify the detail modes. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb plus resource: 'Re-runs every pinned step of a worked construction estimate' and states the output ('returns whether each still meets the published figure'). This clearly separates it from retrieval siblings like get_example and from run_takeoff, which operate on takeoffs rather than pinned example steps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb 'Re-runs ... now' — you call it to verify a stored example's figures rather than to fetch one — but the description never states when to prefer it over get_example, nor any prerequisites (e.g. the example must exist or be pinned). Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_example_liveRe-run a worked example with changed figuresARead-onlyIdempotentInspect
Re-runs a worked example with the job's figures changed: each change follows down every step that reads it, each step beside its published figure with the difference, both unit systems, the project lines with offered hours, and a link reopening it. A modelled job; no prices.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| inputs | No | One step's own input, keyed "<step index>.<input id>" ("3.wastePercent"), each with its unit where it has one. | |
| example | Yes | A worked example's slug, such as attached-deck-built. | |
| figures | No | The job's own figures by id (a deck's length, a room's height), each length or area with its unit; a count as a number. They follow down every step that reads them. | |
| inputUnits | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed world), and the description adds real context beyond them: changes propagate down every step that reads a figure, results appear beside published figures with a difference, both unit systems are shown, and it is 'a modelled job; no prices.' The no-pricing caveat is exactly the kind of semantic qualifier annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no wasted preamble — the verb and the differentiator lead. It is a dense run-on though, packing five output facets into a comma chain, which costs a little readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description needn't explain return shape, and with full annotation coverage the safety story is told. The remaining decisive gap is sibling routing: run_example sits directly adjacent in the tool list and the description never disambiguates the two.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents detail, inputs, figures, example and inputUnits thoroughly. The description restates the propagation behaviour of figures ('follows down every step that reads it') but adds no new syntax, format, or keying guidance beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — re-running a worked example — and adds the differentiator 'with the job's figures changed'. That implicitly separates it from the sibling run_example, but the sibling is never named, so an agent must infer the boundary from the word 'changed' alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the phrase 'with the job's figures changed'; there is no explicit statement of when to prefer this over run_example (which presumably runs the example as published). No prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_guide_chainRun a guide's "Try the calculation" with your figuresARead-onlyIdempotentInspect
Runs a how-to guide's "Try the calculation" block on the figures given: each step's calculator in the guide's order, what to buy with waste and order quantities, both unit systems, person-hours, and the guide's link opening the block on these figures. No prices; nothing sized.
| Name | Required | Description | Default |
|---|---|---|---|
| guide | Yes | A guide's slug whose page has a "Try the calculation" block, such as how-to-board-a-loft-over-insulation. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| inputUnits | No | 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 | No | Measurement id → value, each length, area or volume with its unit; counts as numbers. Any left out opens at the guide's own figure. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile needs no restating. The description adds genuine context beyond that: what the computation yields (per-step calculators run in the guide's order, waste and order quantities, person-hours, both unit systems). Scoring opportunistically, it also sets an explicit scope boundary with "No prices; nothing sized," which prevents the agent from treating the result as a quote or a sized design.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the verb and resource, no preamble. The long enumeration of answer components is dense but each item earns its place by telling the agent what the response will contain, and the terse "No prices; nothing sized" fragment carries its weight as a scope limit.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the description need only orient the agent — which it does, including the unit-system behavior and the explicit exclusion of pricing and sizing. The one gap is the lack of any statement about prerequisites for the guide slug (i.e., the page must actually have a "Try the calculation" block), which is only implied by the schema's pattern description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters, including the measurements map and its unit rules, are already well documented. The description's parameter-adjacent content ("on the figures given," "both unit systems," the guide's link opening on these figures) largely restates what the schema and its enum descriptions already say, so it adds little semantic leverage. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: it runs a how-to guide's "Try the calculation" block with the caller's figures, and it enumerates what comes back (buy list with waste and order quantities, both unit systems, person-hours, a page link). It does not, however, distinguish itself from close siblings like run_example, run_example_live, or calculate, so the agent must infer the boundary between running a guide's block and running a calculator's worked example.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the framing — you invoke it when you want a named guide's built-in calculation evaluated on your own numbers — and the closing scope note "No prices; nothing sized" tells the agent this is not the tool for costing or sizing. But there is no explicit when-to-use statement, no named alternative for the pricing/sizing case, and no guidance on when run_example_live would be the better choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_takeoffMaterials list for a whole job (takeoff)ARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| takeoff | Yes | A takeoff id, such as concrete-slab. | |
| leaveOut | No | Rows the reader leaves out of the job: still worked and shown, not put in the project or counted in labour. | |
| selection | No | 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. | |
| allowances | No | 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). | |
| inputUnits | No | 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 | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a read-only, idempotent, non-destructive, closed-world call, so the safety profile is covered. The description adds real behavioral context beyond them: labour hours are reported (not a price), excluded items are still shown, output returns both metric and US units plus a citation and page link, and it explicitly does not size structure. It stops short of noting determinism or latency characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the opening clause and every phrase carries content. The single long, comma-and-parenthetical-heavy sentence is dense though readable, with slight overload in the output enumeration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter computational tool with an output schema and full annotations, the description supplies purpose, scope boundary, and a summary of what is returned, which is sufficient. Remaining specifics (unit rules, selection semantics, market effects) are adequately delegated to the rich schema descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents detail, market, system, inputUnits, selection, allowances and measurements thoroughly. The description echoes 'from the measurements given' and 'waste allowances' but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (works/runs a takeoff) and resource (one whole-job takeoff by id producing a materials list), with concrete examples (slab, deck) and a scope boundary ('It does not size structure'). It does not name the sibling it is distinct from (e.g. get_takeoff vs create_project_file_from_takeoffs), so differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: run this to turn measurements into a job materials list. The exclusion 'does not size structure' hints at scope, but the description never says when to choose this over get_takeoff, calculate, or create_project_file_from_takeoffs, nor what prerequisites exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scribe_templateScribe template: the scribe line full size, SVG and DXFARead-onlyIdempotentInspect
Turns gaps measured off a straight line into a scribe line for an uneven surface: the widest and narrowest gap, the width to start from, the strip to cut away, the line as full-size SVG and DXF, and its print layout on A4, Letter or a roll. A pattern, not a fit.
| Name | Required | Description | Default |
|---|---|---|---|
| paper | No | The paper the full-size template is tiled on. Left out, A4 for metric and Letter for imperial. | |
| shape | No | ||
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| formats | No | The drawings to return. Left out, both. | |
| overlap | No | Between adjacent sheets. Left out, the tiler's own. | |
| readings | No | The gaps measured from a straight reference line to the wall: up to 200 stations, each where it is along the line and the gap there. | |
| allowance | No | Board left beyond the widest gap. Left out, 10 mm (3/8 in). | |
| rollWidth | No | With paper roll: the roll's width. | |
| inputUnits | No | 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. | |
| orientation | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world). The description adds behavior the annotations don't: it produces printable full-size drawings in SVG/DXF tiled onto paper, and the 'A pattern, not a fit' caveat warns against treating the output as a fitted result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence that leads with the transformation and then lists outputs; the enumeration is dense but every clause maps to a real capability. No filler and no repetition of structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with nested objects, the description covers the core transformation, output formats, and paper layout, and an output schema exists so return values needn't be explained. It omits how the optional 'shape' object relates to 'readings' (two alternative ways to describe the wall), and gives no guidance on inputUnits or rollWidth usage, which is a meaningful gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 82% schema description coverage, the schema already documents paper, formats, readings, allowance, rollWidth, etc. The description's phrases ('widest and narrowest gap', 'the width to start from', 'the strip to cut away') loosely map to readings/allowance but add no syntax, defaults, or guidance on the alternate shape-vs-readings input routes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource — turning measured gaps into a scribe line — and enumerates the concrete outputs (widest/narrowest gap, start width, cut strip, full-size SVG and DXF, print layout). It never names a sibling tool, so the 5-level sibling-differentiation bar isn't met, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied ('gaps measured off a straight line', 'for an uneven surface') and 'A pattern, not a fit' is a useful disambiguation from fitting tools like fit_panel and fit_worktop_run. However, there is no explicit when-to-use/when-not statement and no mention of alternatives such as print_template or create_drawing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch the construction calculators and pagesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kinds | No | Only these kinds of result; every kind when left out. | |
| limit | No | ||
| query | Yes | What to find, such as "concrete slab" or "skirting board". |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, non-open-world behavior, so the safety profile is covered. The description adds genuinely useful scope beyond that: the find-vs-compute boundary clarifying this tool never performs calculations, plus a summary of returned fields. Ranking/ordering behavior is not disclosed, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action front-loaded, an illustrative example, and a decisive scope statement. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With rich annotations and an output schema, the description needn't explain safety or returns, and it largely doesn't. The remaining gap is routing among the many retrieval siblings (get_calculator, get_example, fetch), which the description never addresses, so it is adequate but not fully complete for this tool family.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: query and kinds are self-documented, and limit is self-explanatory via default/min/max. The description adds only example query phrasings ('concrete slab' style), which the schema already covers, so it does not meaningfully extend parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (searches) and resource (the site's construction pages), with concrete example queries like 'how much concrete or tile a job needs'. It does not name or contrast with retrieval siblings such as get_calculator, get_example, or fetch, so an agent must infer the boundary itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'It finds; it computes nothing' implies a discovery-then-retrieve workflow, hinting that this precedes calculate or the get_* tools. However no alternative is named and no condition for choosing search over get_calculator/get_example/fetch is stated, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_backwardsHow far a material goesBRead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| have | Yes | 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 | No | A Solve Backwards page's slug, such as wall-paint, drywall-sheets, bricks, concrete-bags, ready-mix-concrete. | |
| query | No | Or what the reader has, in words ("sheets of drywall", "bags of concrete"), when the slug is not known. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| system | No | 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 | No | Optional: another calculator input, with its unit (a slab's thickness "4 in", coats 3). The inputs the page grows cannot be set. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, non-destructive, closed-world), so the bar is lower. The description adds some behavioral context — waste is deducted, the result mirrors the site's Solve Backwards page — but says nothing about response shape or how conflicting page/query inputs are resolved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, but the middle clause ('the size of slab, room, deck or wall that is, as the site's Solve Backwards page works it, waste taken off') is grammatically tangled and forces re-reading. The single sentence is short but not cleanly structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema description coverage, the description need not explain return values. Adding the waste-deduction behavior and the non-sizing boundary makes it largely sufficient; only the sibling-routing gap leaves anything an agent might misjudge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with 6 params, so the schema already documents 'have', 'page', 'query', 'detail', 'system', and 'settings' in detail. The description's '40 bags of concrete / 24 gallons of paint' examples echo the schema's own examples without adding format or unit syntax beyond them, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific inverse-calculation purpose with concrete examples ('40 bags of concrete', '24 gallons of paint') and names the output (area covered, size of slab/room/deck/wall). It partially differentiates from siblings via the scope boundary 'It does not size structure', but never names the forward-looking alternative like 'calculate'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The exclusion 'It does not size structure' implies when not to use it, and the material examples imply when it applies. However, there is no explicit routing guidance against the many sibling estimators (calculate, estimate_house, plan_room, plan_project), so the agent must infer the selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stair_flightStair layout: straight, turned, concrete or steelARead-onlyIdempotentInspect
Lays out a flight as built: risers, goings, pitch, 2R+G, the floor opening for a headroom, the stringer as cut, timber and fixings (straight, landing or winders), or concrete and bars, or steel mass; both systems, limits read against a named code, a canvas link. Not sized.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | straight: one timber flight; turned: an L or U on a landing or winders; concrete: a cast flight; steel: steel stringers with treads. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| inputs | No | The stair page's inputs by id (totalRise, targetRiser, going, buildingCode …), each length with its unit; any left out opens at the page's own figure. | |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| inputUnits | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's job is to add behavior, and it does: results are checked against a named code's limits, the answer is returned in both unit systems, and a canvas link comes back. It does not address what happens when inputs are invalid or out of code, but the extra behavioral facts exceed what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loads the verb, but it is compressed into a single semicolon-chained run of noun phrases rather than structured sentences, so the deliverable list blurs together. Nothing is wasted in length, but the density costs readability and the final "Not sized" is easy to miss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, and the nested `inputs` object is fully documented in the schema. What is missing is the relationship to adjacent tools (`calculate`, `solve_backwards`, `make_canvas_link`) and any note on which code names `buildingCode` accepts. Adequate but with clear gaps for a six-parameter, nested-input tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every enum already explains itself (kind, detail, market, system, inputUnits, inputs), so the schema carries the parameter burden. The description echoes a few of those ideas ("both systems", code limits) but adds no syntax or format detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb+resource are specific ("Lays out a flight as built") and the description enumerates the concrete outputs: risers, goings, pitch, 2R+G, floor opening, stringer, timber/fixings or concrete/bars or steel. "Not sized" draws a boundary against a sizing tool, which helps distinguish it from `calculate`-style siblings. It loses a point because the phrasing is telegraphic ("steel mass", "2R+G", "as cut") and no sibling is named directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only routing signal is the trailing "Not sized", which implies you should look elsewhere if you want a stair sized rather than laid out. There is no explicit when-to-use statement, no mention of prerequisites (e.g. must have totalRise), and no named alternative such as `calculate` or `solve_backwards`. Usage is inferable from the domain but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
translate_termTranslate or match a trade word between marketsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | The market to say it in. | |
| from | No | The market whose word it is, where known. | |
| term | Yes | 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 | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, read-only, idempotent operation, so the safety burden is covered. The description adds genuinely useful behavioral detail beyond that: it returns each market's word, a closeness rating, false-friend warnings, unit-trap conversions, and a document family, and it discloses that brand names, plurals and misspellings are matched — none of which the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence front-loads the core purpose and then enumerates the returned facets, so nothing is buried. It is a touch overpacked with examples and unit-trap detail, but every clause contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety and an output schema covering the return shape, the description only needs to frame scope and behavior, which it does thoroughly (markets covered, matching tolerance, unit traps, document family). Nothing essential to calling it correctly is missing, though explicit sibling routing would make it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's example terms ('plasterboard', 'gyprock', 'a yard of concrete') loosely illustrate the term parameter, but it adds no syntax, format, or constraint meaning beyond what the schema already documents for from/to/detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (translate/says) and resource (a building-trade word) and illustrates it with concrete examples (plasterboard/drywall, skirting/baseboard), making the tool's function unmistakable. It implicitly separates itself from convert_units by focusing on words rather than quantities, but never names a sibling, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the examples and the 'such as' framing, so an agent can infer when the tool applies. However, there is no explicit when-to-use/when-not guidance and no pointer to alternatives like convert_units for pure unit conversions, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trim_cornerCorner trim on your saw: mitre, bevel, stops and the gapARead-onlyIdempotentInspect
Cuts one corner of skirting, casing or crown molding on a named saw: per piece the mitre and bevel as its dials read, the stop each sits on, how the piece lies, which side to keep, whether the saw can make it; cope or mitre, and the gap a 45° cut leaves. No sizing.
| Name | Required | Description | Default |
|---|---|---|---|
| saw | No | The saw from the site's library (each with its scale, its stops and its capacity); custom with customSaw. Left out, the 12-in double-bevel slider (DWS779 figures). | |
| trim | Yes | skirting (baseboard), casing (architrave, a frame corner) or crown (cornice). | |
| depth | No | The depth the joint runs across in the plane of the turn: a skirting's thickness, a casing's face width, a crown's projection. Left out: 18 mm, 70 mm or 75 mm (3/4, 2 3/4 or 3 in). | |
| corner | No | The corner as measured. For casing, the frame corner (90 for a square opening); its kind is ignored. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| height | No | Skirting only: its height, for the saw's upright capacity. Left out, 120 mm (4 3/4 in). | |
| method | No | How the piece goes on the saw: skirting and casing upright (against the fence) or flat (on the table); crown nested (upside down against the fence) or flat. Left out, the trim's usual one. | |
| spring | No | Crown only: its spring angle from the wall, degrees (38 for 38/52, 45 for 45/45). Left out, 38. | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| buildUp | No | Plaster or compound built up in the corner (it changes the angle the trim meets). Left out, none. | |
| feather | No | The distance that build-up is feathered over along each wall. Left out, 150 mm (6 in). | |
| customSaw | No | With saw custom: the saw's own limits. | |
| inputUnits | No | 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. | |
| throughRoom | No | In place of corner: the angle read through the room (under 180 inside, over 180 outside), as the miter-angle calculator takes it. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive and closed-world, so the description is free to add what the annotations can't: that the model refuses work outside its scope ('No sizing'), that the answer is returned in both unit systems, and that a summary detail mode exists to save tokens. No auth, rate-limit or persistence behavior is mentioned, but a pure calculator likely has none.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence, front-loaded with the verb and resource, with the exclusion pushed to the end for emphasis. The semicolon chain of outputs is compact, though the list of returned fields is packed tightly enough to need a second read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 14 parameters, full schema coverage, an output schema and strong annotations, the description only needs to frame the job and scope, which it does. It could say more about the returned feasibility/capacity verdict, but the output schema carries that detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the per-field descriptions are already detailed with defaults and units, so the description adds little parameter-level meaning. It does frame the answer content ('cope or mitre, and the gap a 45° cut leaves'), but no syntax or unit behavior is explained beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (cuts) and resource (one corner of skirting/casing/crown on a named saw) and enumerates what comes back: mitre/bevel dial readings, stop, piece orientation, keep side, feasibility, cope-vs-mitre, gap. The closing 'No sizing' also marks it off from sizing/planning siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies the use case (a single corner on a specified saw) and excludes sizing work, but never names an alternative such as miter_chart or plan_room_trim, nor states when to prefer those. Usage has to be inferred from the purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_projectChange a project held in a state tokenARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | true: the updated My Project file as well. | |
| token | Yes | A project state token from a project-file answer or an earlier update. | |
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| operations | No | The changes, applied in order (0 to 20); none returns the project as the token holds it. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive) the description explains the token model ('compressed, not encrypted; nothing is stored') and the rebuild behavior ('Rebuilds every line'), which reconciles the apparent mutation wording with readOnlyHint=true. It also discloses output contents and a limitation ('No prices'), all of which the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and supported operations are front-loaded, followed by return contents, the storage model, and a scope caveat ('No prices'). The sentences are dense but each earns its place; the opening sentence is long yet functional.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be spelled out, and annotations cover the safety profile; the description still adds the token-not-stored model and rebuild semantics. Given the tool's complexity, the definition is close to complete, leaving only explicit alternative-routing unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the operations enum is documented in detail, so the schema already carries the parameter meaning. The description's list of change types loosely maps to the operations array but adds no syntax or format detail beyond what the schema provides, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Changes a My Project project carried in a state token') and then enumerates the concrete mutation kinds it supports (rooms, dimensions, takeoffs, roof pitch, rename). It is clearly distinct from the create_project_file_* siblings because it operates on an existing token rather than building a new file, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage by stating the token's origin ('from a project file answer or an earlier update'), which tells the agent it needs a token in hand first. However, there is no explicit when-to-use/when-not guidance and no routing to an alternative tool for a similar task, so usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_proposalClient proposal from a project, unpriced unless rates givenARead-onlyIdempotentInspect
Writes the client proposal My Project prints: scope by line or trade division, quantities in metric and imperial, assumptions, exclusions, terms, payment stages and the signature block. From a token, a file, calculators, takeoffs or a drawing. "Not priced" unless the reader's own rates are given.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | A My Project file (the backup a project-file answer returns, or one the reader exported): its active project's lines, with any hours and rates typed on them. | |
| name | No | The project's name on the document. | |
| intro | No | A covering note in the contractor's words. | |
| rates | No | The reader's own unit rates (the site holds no price), by line id or calculator slug: a number, or { low, high }. A line's own rate in a file stays unless its id is named here. | |
| terms | No | ||
| token | No | A project state token (cqp1.…) from a project-file answer or an update. | |
| client | No | ||
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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 | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| drawing | No | A Construction Canvas drawing (a template, a house form, shapes, drawing commands or a canvas document), as a project file takes it. | |
| currency | No | The label the reader's rates are in ("$", "£", "lei"); the market's when left out. A label only: no currency is converted. | |
| takeoffs | No | Whole-job takeoffs, each an id and its measurements, as a project file takes them. | |
| reference | No | ||
| exclusions | No | ||
| preparedBy | No | ||
| validUntil | No | The date the proposal is valid until, as it is to print. | |
| calculators | No | Calculator lines, each a slug and its inputs, as a project file takes them. | |
| companyName | No | The contractor's name for the letterhead; blank prints none. | |
| includeNotes | No | ||
| showQuantities | No | ||
| groupByDivision | No | Group the scope by MasterFormat division. | |
| paymentSchedule | No | Stages of payment as the reader sets them; none is suggested. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, and closed-world behavior. The description adds meaningful traits: what sections are included and that the proposal is 'Not priced' unless the reader's own rates are given. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the action and output contents, with no filler. The pricing caveat is placed at the end where it is most likely to be read as a qualifier.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 23-parameter tool with nested objects and an output schema, the description gives enough to understand the tool's purpose, sections produced, input sources, and pricing behavior. The output schema covers return values, though explicit selection guidance versus siblings remains missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 23 parameters and 70% schema description coverage, the description touches key concepts like trade division grouping, metric/imperial units, exclusions, terms, payment stages, and the five input sources. It does not explain many parameter names or formats (e.g., market, currency, detail, includeNotes), so it adds some value but does not fully compensate for the remaining schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Writes the client proposal') and enumerates the contents (scope, quantities, assumptions, exclusions, terms, payment stages, signature block), so an agent knows it generates a proposal. It does not explicitly differentiate from siblings like write_variation or make_job_sheet, so sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not guidance and no alternatives are named. The input-source list ('From a token, a file, calculators, takeoffs or a drawing') implies contexts, but an agent must infer when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_variationVariation (change order) between two versions of a projectARead-onlyIdempotentInspect
Writes the variation (change order) between an agreed and a proposed version of a project: each line added, removed or changed, its quantity in metric and imperial, the labour hours, and the signed document as My Project prints it. Money only from the reader's own rates; with none, unpriced.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The project's name on the document. | |
| after | Yes | The proposed version, given the same ways. | |
| rates | No | The reader's own unit rates (the site holds no price), by line id or calculator slug: a number, or { low, high }. A line's own rate in a file stays unless its id is named here. | |
| before | Yes | The agreed version: one of token, file, calculators, takeoffs or drawing. | |
| client | No | ||
| detail | No | full (the default): the whole answer. summary: the result lines, the citation line and the page only — fewer tokens to read. | full |
| market | No | 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. | |
| number | No | The variation's number (V-0003). | |
| reason | No | Why the job changed, in the reader's words. | |
| system | No | The unit system inputs left out open in, and the one the page link opens in. The answer comes in both. | metric |
| currency | No | The label the reader's rates are in ("$", "£", "lei"); the market's when left out. A label only: no currency is converted. | |
| preparedBy | No | ||
| paymentTerms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, idempotent and non-destructive. The description adds substantive behavior beyond that: it reports each added, removed or changed line, both unit systems, labour hours, and a signed document; money is computed only from the caller's rates and remains unpriced when rates are absent. The word 'Writes' could sound mutating, but the signed-document phrasing frames it as document generation rather than a persisted write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and comparison, followed by the output and pricing caveat. There is no filler and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter nested tool with an output schema and read-only annotations, the description gives enough to know it produces a variation document and how pricing works. The main omission is explicit routing guidance versus related sibling tools; otherwise the schema carries parameter detail and the output schema carries return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 77%, so the schema already documents most parameters, including before/after and rates. The description adds the key mapping that before/after are the agreed and proposed versions and that rates drive money or leave it unpriced, but it does not cover the document metadata parameters such as number, reason, preparedBy, paymentTerms or detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource—writes a variation/change order—and identifies the two inputs as an agreed and a proposed version. It enumerates the output contents (added/removed/changed lines, metric and imperial quantities, labour hours, signed document), so an agent can tell this is a version-delta document, though it does not explicitly distinguish itself from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for comparing an agreed version with a proposed one, giving an implicit context for use. It does not explicitly say when to choose it over siblings such as write_proposal or compare_on_job, nor when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
20 tool updates
- Added
compare_on_job - Changed
create_drawing1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "assumptions": { - "items": { - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "citation": { - "properties": { - "accessDate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "author": { - "type": "string" - }, - "formats": { - "properties": { - "apa": { - "type": "string" - }, - "bibtex": { - "type": "string" - }, - "harvard": { - "type": "string" - }, - "plain": { - "type": "string" - } - }, - "required": [ - "plain", - "apa", - "harvard", - "bibtex" - ], - "type": "object" - }, - "sourcesChecked": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "url": { - "type": "string" - }, - "version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "author", - "title", - "url", - "formats", - "accessDate" - ], - "type": "object" - }, - "counts": { - "required": [ - "walls", - "openings", - "levels" - ], - "type": "object" - }, - "document": { - "required": [ - "schema", - "units", - "counters", - "levels", - "types", - "entities", - "assumed", - "updatedAt" - ], - "type": "object" - }, - "drawingLink": { - "type": "string" - }, - "engine": { - "type": "object" - }, - "file": { - "properties": { - "content": { - "properties": { - "exportedAt": { - "type": "string" - }, - "magic": { - "const": "craftquantities.backup" - }, - "stores": { - "type": "object" - }, - "v": { - "type": "integer" - } - }, - "required": [ - "magic", - "v", - "exportedAt", - "stores" - ], - "type": "object" - }, - "filename": { - "type": "string" - }, - "mediaType": { - "const": "application/json" - } - }, - "required": [ - "filename", - "mediaType", - "content" - ], - "type": "object" - }, - "from": { - "enum": [ - "house", - "commands", - "document", - "shapes", - "template", - "layout" - ] - }, - "house": { - "type": "object" - }, - "howToOpen": { - "type": "string" - }, - "labour": { - "required": [ - "rows", - "totalHours", - "programme", - "likelyDays", - "note" - ], - "type": "object" - }, - "layout": { - "description": "The rooms as laid out (both unit systems), the walls drawn, every figure snapped or room moved, and the closure check.", - "required": [ - "grid", - "rooms", - "walls", - "adjustments", - "checks" - ], - "type": "object" - }, - "licence": { - "properties": { - "attribution": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "name", - "url", - "attribution" - ], - "type": "object" - }, - "lines": { - "items": { - "required": [ - "label", - "quantity", - "unit", - "zone" - ], - "type": "object" - }, - "type": "array" - }, - "links": { - "properties": { - "canvas": { - "type": "string" - }, - "drawing": { - "anyOf": [ - { - "description": "Opens this drawing on the canvas as a new project's: the drawing rides in the fragment, so nothing is uploaded. Null when the drawing is too large for a link.", - "type": "string" - }, - { - "type": "null" - } - ] - }, - "estimator": { - "type": "string" - }, - "template": { - "description": "The template's page, when the drawing is a template's: cite it beside the drawing's link.", - "type": "string" - } - }, - "required": [ - "canvas", - "drawing" - ], - "type": "object" - }, - "notice": { - "type": "string" - }, - "objects": { - "items": { - "required": [ - "key", - "label", - "quantity" - ], - "type": "object" - }, - "type": "array" - }, - "omitted": { - "type": "array" - }, - "plans": { - "type": "array" - }, - "rows": { - "items": { - "properties": { - "calculator": { - "required": [ - "slug", - "title" - ], - "type": "object" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "note": { - "type": "string" - }, - "order": { - "required": [ - "quantity", - "unit" - ], - "type": "object" - }, - "otherSystem": { - "anyOf": [ - { - "required": [ - "quantity", - "unit" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "quantity": { - "type": "number" - }, - "section": { - "type": "string" - }, - "unit": { - "type": "string" - }, - "where": { - "type": "string" - } - }, - "required": [ - "key", - "section", - "label", - "where", - "quantity", - "unit", - "otherSystem", - "calculator" - ], - "type": "object" - }, - "type": "array" - }, - "shapeNotes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "shapes": { - "items": { - "required": [ - "shape", - "ref", - "made", - "figures" - ], - "type": "object" - }, - "type": "array" - }, - "sources": { - "type": "array" - }, - "system": { - "enum": [ - "metric", - "imperial" - ] - }, - "template": { - "description": "The template it was drawn from: its page, the variant drawn (null: as the page shows it) and its variants.", - "required": [ - "slug", - "name", - "page", - "variant", - "variants" - ], - "type": "object" - } - }, - "required": [ - "engine", - "system", - "from", - "document", - "counts", - "rows", - "objects", - "lines", - "assumptions", - "omitted", - "plans", - "labour", - "sources", - "file", - "links", - "howToOpen", - "citation", - "licence", - "notice" - ], - "type": "object" - }, - { - "properties": { - "citation": { - "description": "The one citation line, built from the answer's own data.", - "type": "string" - }, - "detail": { - "const": "summary" - }, - "lines": { - "description": "The result lines, as the report's table gives them.", - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "more": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notes": { - "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", - "items": { - "type": "string" - }, - "type": "array" - }, - "open": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "detail", - "tool", - "title", - "lines", - "notes", - "citation", - "url", - "open", - "more" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "assumptions": { + "items": { + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "citation": { + "properties": { + "accessDate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "author": { + "type": "string" + }, + "formats": { + "properties": { + "apa": { + "type": "string" + }, + "bibtex": { + "type": "string" + }, + "harvard": { + "type": "string" + }, + "plain": { + "type": "string" + } + }, + "required": [ + "plain", + "apa", + "harvard", + "bibtex" + ], + "type": "object" + }, + "sourcesChecked": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "author", + "title", + "url", + "formats", + "accessDate" + ], + "type": "object" + }, + "counts": { + "required": [ + "walls", + "openings", + "levels" + ], + "type": "object" + }, + "document": { + "required": [ + "schema", + "units", + "counters", + "levels", + "types", + "entities", + "assumed", + "updatedAt" + ], + "type": "object" + }, + "drawingLink": { + "type": "string" + }, + "engine": { + "type": "object" + }, + "file": { + "properties": { + "content": { + "properties": { + "exportedAt": { + "type": "string" + }, + "magic": { + "const": "craftquantities.backup" + }, + "stores": { + "type": "object" + }, + "v": { + "type": "integer" + } + }, + "required": [ + "magic", + "v", + "exportedAt", + "stores" + ], + "type": "object" + }, + "filename": { + "type": "string" + }, + "mediaType": { + "const": "application/json" + } + }, + "required": [ + "filename", + "mediaType", + "content" + ], + "type": "object" + }, + "from": { + "enum": [ + "house", + "commands", + "document", + "shapes", + "template", + "layout" + ] + }, + "house": { + "type": "object" + }, + "howToOpen": { + "type": "string" + }, + "labour": { + "required": [ + "rows", + "totalHours", + "programme", + "likelyDays", + "note" + ], + "type": "object" + }, + "layout": { + "description": "The rooms as laid out (both unit systems), the walls drawn, every figure snapped or room moved, and the closure check.", + "required": [ + "grid", + "rooms", + "walls", + "adjustments", + "checks" + ], + "type": "object" + }, + "licence": { + "properties": { + "attribution": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "url", + "attribution" + ], + "type": "object" + }, + "lines": { + "items": { + "required": [ + "label", + "quantity", + "unit", + "zone" + ], + "type": "object" + }, + "type": "array" + }, + "links": { + "properties": { + "canvas": { + "type": "string" + }, + "drawing": { + "anyOf": [ + { + "description": "Opens this drawing on the canvas as a new project's: the drawing rides in the fragment, so nothing is uploaded. Null when the drawing is too large for a link.", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "estimator": { + "type": "string" + }, + "template": { + "description": "The template's page, when the drawing is a template's: cite it beside the drawing's link.", + "type": "string" + } + }, + "required": [ + "canvas", + "drawing" + ], + "type": "object" + }, + "notice": { + "type": "string" + }, + "objects": { + "items": { + "required": [ + "key", + "label", + "quantity" + ], + "type": "object" + }, + "type": "array" + }, + "omitted": { + "type": "array" + }, + "plans": { + "type": "array" + }, + "rows": { + "items": { + "properties": { + "calculator": { + "required": [ + "slug", + "title" + ], + "type": "object" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "order": { + "required": [ + "quantity", + "unit" + ], + "type": "object" + }, + "otherSystem": { + "anyOf": [ + { + "required": [ + "quantity", + "unit" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "quantity": { + "type": "number" + }, + "section": { + "type": "string" + }, + "unit": { + "type": "string" + }, + "where": { + "type": "string" + } + }, + "required": [ + "key", + "section", + "label", + "where", + "quantity", + "unit", + "otherSystem", + "calculator" + ], + "type": "object" + }, + "type": "array" + }, + "shapeNotes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "shapes": { + "items": { + "required": [ + "shape", + "ref", + "made", + "figures" + ], + "type": "object" + }, + "type": "array" + }, + "sources": { + "type": "array" + }, + "system": { + "enum": [ + "metric", + "imperial" + ] + }, + "template": { + "description": "The template it was drawn from: its page, the variant drawn (null: as the page shows it) and its variants.", + "required": [ + "slug", + "name", + "page", + "variant", + "variants" + ], + "type": "object" + }, + "worktops": { + "description": "The drawing's worktops as the canvas's dock lists them: each fitted piece's true lengths, the worktop lengths to buy and the edge banding, in both unit systems.", + "items": { + "properties": { + "detail": { + "type": "string" + }, + "figure": { + "type": "string" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + } + }, + "required": [ + "key", + "label", + "figure" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "engine", + "system", + "from", + "document", + "counts", + "rows", + "objects", + "lines", + "assumptions", + "omitted", + "plans", + "labour", + "sources", + "file", + "links", + "howToOpen", + "citation", + "licence", + "notice" + ], + "type": "object" + }, + { + "properties": { + "citation": { + "description": "The one citation line, built from the answer's own data.", + "type": "string" + }, + "detail": { + "const": "summary" + }, + "lines": { + "description": "The result lines, as the report's table gives them.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "more": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notes": { + "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", + "items": { + "type": "string" + }, + "type": "array" + }, + "open": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "detail", + "tool", + "title", + "lines", + "notes", + "citation", + "url", + "open", + "more" + ], + "type": "object" + } +]
- Added
estimate_hours - Added
fit_panel - Added
fit_worktop_run - Added
get_illustration - Added
level_quotes - Added
make_canvas_link - Added
make_job_sheet - Added
miter_chart - Changed
optimise_cuts7 fields changed- added
Input schema / properties / bandAllowanceAdded value: +{ + "description": "sheet: tape added to every banded edge for trimming flush. Left out, none.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] +} - changed
Input schema / properties / minOffcut / descriptionPrevious value: -"linear: the shortest offcut worth keeping; shorter ones count as waste."New value: +"linear: the shortest offcut worth keeping; shorter ones count as waste. sheet: the smallest offcut (either way round) listed for reuse; left out, 300 mm (12 in) square." - added
Input schema / properties / modeAdded value: +{ + "description": "sheet: guillotine (the default), every cut edge to edge for a panel or track saw, with the cuts in order; free, also layouts needing plunge cuts (CNC).", + "enum": [ + "guillotine", + "free" + ] +} - added
Input schema / properties / pieces / items / properties / bandAdded value: +{ + "additionalProperties": false, + "description": "sheet: how many of the piece's long and short edges are edge-banded (0, 1 or 2 each).", + "properties": { + "long": { + "maximum": 2, + "minimum": 0, + "type": "integer" + }, + "short": { + "maximum": 2, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" +} - changed
Input schema / properties / pieces / items / properties / rotate / descriptionPrevious value: -"sheet: whether this piece may turn a quarter; left out, as the request says."New value: +"sheet: whether this piece may turn a quarter; left out, as the request says. false holds its grain along its height." - added
Input schema / properties / trimAdded value: +{ + "description": "sheet: cut off every sheet edge before nesting (a factory edge that is not clean). Left out, none.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] +} - changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "bought": { - "anyOf": [ - { - "properties": { - "ft": { - "type": "number" - }, - "m": { - "type": "number" - }, - "text": { - "description": "In the system asked for, then the other.", - "type": "string" - } - }, - "required": [ - "m", - "ft", - "text" - ], - "type": "object" - }, - { - "properties": { - "ft2": { - "type": "number" - }, - "m2": { - "type": "number" - }, - "text": { - "type": "string" - } - }, - "required": [ - "m2", - "ft2", - "text" - ], - "type": "object" - } - ] - }, - "bound": { - "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).", - "required": [ - "wastePercent" - ], - "type": "object" - }, - "buy": { - "description": "What to buy: each stock length or the sheet size, and how many.", - "items": { - "properties": { - "count": { - "type": "integer" - }, - "sheet": { - "type": "object" - }, - "stock": { - "properties": { - "ft": { - "type": "number" - }, - "m": { - "type": "number" - }, - "text": { - "description": "In the system asked for, then the other.", - "type": "string" - } - }, - "required": [ - "m", - "ft", - "text" - ], - "type": "object" - }, - "text": { - "type": "string" - } - }, - "required": [ - "count", - "text" - ], - "type": "object" - }, - "type": "array" - }, - "citation": { - "properties": { - "accessDate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "author": { - "type": "string" - }, - "formats": { - "properties": { - "apa": { - "type": "string" - }, - "bibtex": { - "type": "string" - }, - "harvard": { - "type": "string" - }, - "plain": { - "type": "string" - } - }, - "required": [ - "plain", - "apa", - "harvard", - "bibtex" - ], - "type": "object" - }, - "sourcesChecked": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "url": { - "type": "string" - }, - "version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "author", - "title", - "url", - "formats", - "accessDate" - ], - "type": "object" - }, - "engine": { - "type": "object" - }, - "gapPercent": { - "description": "How far this plan is above the bound, percent.", - "type": "number" - }, - "given": { - "description": "What the plan was worked from, in both systems: the stock lengths or sheet sizes, the kerf, the minimum offcut, whether pieces turn.", - "type": "object" - }, - "joinedRuns": { - "type": "integer" - }, - "kind": { - "enum": [ - "linear", - "sheet" - ] - }, - "licence": { - "properties": { - "attribution": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "name", - "url", - "attribution" - ], - "type": "object" - }, - "links": { - "properties": { - "page": { - "type": "string" - } - }, - "required": [ - "page" - ], - "type": "object" - }, - "material": { - "type": "string" - }, - "method": { - "items": { - "type": "string" - }, - "type": "array" - }, - "notDesign": { - "type": "string" - }, - "notice": { - "type": "string" - }, - "patterns": { - "description": "Each way a bar or sheet is cut, with how many are cut that way; up to 150, most used first.", - "items": { - "anyOf": [ - { - "properties": { - "cuts": { - "items": { - "properties": { - "joined": { - "type": "boolean" - }, - "label": { - "type": "string" - }, - "length": { - "properties": { - "ft": { - "type": "number" - }, - "m": { - "type": "number" - }, - "text": { - "description": "In the system asked for, then the other.", - "type": "string" - } - }, - "required": [ - "m", - "ft", - "text" - ], - "type": "object" - } - }, - "required": [ - "length" - ], - "type": "object" - }, - "type": "array" - }, - "keep": { - "type": "boolean" - }, - "offcut": { - "properties": { - "ft": { - "type": "number" - }, - "m": { - "type": "number" - }, - "text": { - "description": "In the system asked for, then the other.", - "type": "string" - } - }, - "required": [ - "m", - "ft", - "text" - ], - "type": "object" - }, - "stock": { - "properties": { - "ft": { - "type": "number" - }, - "m": { - "type": "number" - }, - "text": { - "description": "In the system asked for, then the other.", - "type": "string" - } - }, - "required": [ - "m", - "ft", - "text" - ], - "type": "object" - }, - "times": { - "type": "integer" - } - }, - "required": [ - "times", - "stock", - "cuts", - "offcut", - "keep" - ], - "type": "object" - }, - { - "properties": { - "largestOffcut": { - "type": "object" - }, - "placed": { - "items": { - "properties": { - "height": { - "properties": { - "ft": { - "type": "number" - }, - "m": { - "type": "number" - }, - "text": { - "description": "In the system asked for, then the other.", - "type": "string" - } - }, - "required": [ - "m", - "ft", - "text" - ], - "type": "object" - }, - "label": { - "type": "string" - }, - "rotated": { - "type": "boolean" - }, - "width": { - "properties": { - "ft": { - "type": "number" - }, - "m": { - "type": "number" - }, - "text": { - "description": "In the system asked for, then the other.", - "type": "string" - } - }, - "required": [ - "m", - "ft", - "text" - ], - "type": "object" - }, - "x": { - "properties": { - "ft": { - "type": "number" - }, - "m": { - "type": "number" - }, - "text": { - "description": "In the system asked for, then the other.", - "type": "string" - } - }, - "required": [ - "m", - "ft", - "text" - ], - "type": "object" - }, - "y": { - "properties": { - "ft": { - "type": "number" - }, - "m": { - "type": "number" - }, - "text": { - "description": "In the system asked for, then the other.", - "type": "string" - } - }, - "required": [ - "m", - "ft", - "text" - ], - "type": "object" - } - }, - "required": [ - "x", - "y", - "width", - "height", - "rotated" - ], - "type": "object" - }, - "type": "array" - }, - "times": { - "type": "integer" - } - }, - "required": [ - "times", - "placed" - ], - "type": "object" - } - ] - }, - "type": "array" - }, - "patternsTotal": { - "type": "integer" - }, - "pieces": { - "type": "integer" - }, - "proven": { - "description": "True when no plan buys less: the exact branch and bound finished, or the plan meets the bound.", - "type": "boolean" - }, - "required": { - "anyOf": [ - { - "properties": { - "ft": { - "type": "number" - }, - "m": { - "type": "number" - }, - "text": { - "description": "In the system asked for, then the other.", - "type": "string" - } - }, - "required": [ - "m", - "ft", - "text" - ], - "type": "object" - }, - { - "properties": { - "ft2": { - "type": "number" - }, - "m2": { - "type": "number" - }, - "text": { - "type": "string" - } - }, - "required": [ - "m2", - "ft2", - "text" - ], - "type": "object" - } - ] - }, - "steps": { - "description": "Search steps spent (bounded).", - "type": "integer" - }, - "system": { - "enum": [ - "metric", - "imperial" - ] - }, - "tooLong": { - "description": "Pieces no stock length or sheet takes, listed rather than split.", - "items": { - "type": "object" - }, - "type": "array" - }, - "waste": { - "properties": { - "excludingKeptOffcutsPercent": { - "type": "number" - }, - "keptOffcut": { - "properties": { - "ft": { - "type": "number" - }, - "m": { - "type": "number" - }, - "text": { - "description": "In the system asked for, then the other.", - "type": "string" - } - }, - "required": [ - "m", - "ft", - "text" - ], - "type": "object" - }, - "percent": { - "type": "number" - } - }, - "required": [ - "percent" - ], - "type": "object" - } - }, - "required": [ - "engine", - "system", - "kind", - "material", - "given", - "buy", - "waste", - "bound", - "proven", - "patterns", - "patternsTotal", - "notDesign", - "method", - "citation", - "licence", - "notice", - "links" - ], - "type": "object" - }, - { - "properties": { - "citation": { - "description": "The one citation line, built from the answer's own data.", - "type": "string" - }, - "detail": { - "const": "summary" - }, - "lines": { - "description": "The result lines, as the report's table gives them.", - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "more": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notes": { - "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", - "items": { - "type": "string" - }, - "type": "array" - }, - "open": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "detail", - "tool", - "title", - "lines", - "notes", - "citation", - "url", - "open", - "more" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "banding": { + "description": "sheet: edge banding per row of the list and the total, with any allowance.", + "type": "object" + }, + "bought": { + "anyOf": [ + { + "properties": { + "ft": { + "type": "number" + }, + "m": { + "type": "number" + }, + "text": { + "description": "In the system asked for, then the other.", + "type": "string" + } + }, + "required": [ + "m", + "ft", + "text" + ], + "type": "object" + }, + { + "properties": { + "ft2": { + "type": "number" + }, + "m2": { + "type": "number" + }, + "text": { + "type": "string" + } + }, + "required": [ + "m2", + "ft2", + "text" + ], + "type": "object" + } + ] + }, + "bound": { + "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).", + "required": [ + "wastePercent" + ], + "type": "object" + }, + "buy": { + "description": "What to buy: each stock length or the sheet size, and how many.", + "items": { + "properties": { + "count": { + "type": "integer" + }, + "sheet": { + "type": "object" + }, + "stock": { + "properties": { + "ft": { + "type": "number" + }, + "m": { + "type": "number" + }, + "text": { + "description": "In the system asked for, then the other.", + "type": "string" + } + }, + "required": [ + "m", + "ft", + "text" + ], + "type": "object" + }, + "text": { + "type": "string" + } + }, + "required": [ + "count", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "citation": { + "properties": { + "accessDate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "author": { + "type": "string" + }, + "formats": { + "properties": { + "apa": { + "type": "string" + }, + "bibtex": { + "type": "string" + }, + "harvard": { + "type": "string" + }, + "plain": { + "type": "string" + } + }, + "required": [ + "plain", + "apa", + "harvard", + "bibtex" + ], + "type": "object" + }, + "sourcesChecked": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "author", + "title", + "url", + "formats", + "accessDate" + ], + "type": "object" + }, + "engine": { + "type": "object" + }, + "gapPercent": { + "description": "How far this plan is above the bound, percent.", + "type": "number" + }, + "given": { + "description": "What the plan was worked from, in both systems: the stock lengths or sheet sizes, the kerf, the minimum offcut, whether pieces turn.", + "type": "object" + }, + "joinedRuns": { + "type": "integer" + }, + "kind": { + "enum": [ + "linear", + "sheet" + ] + }, + "licence": { + "properties": { + "attribution": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "url", + "attribution" + ], + "type": "object" + }, + "links": { + "properties": { + "page": { + "type": "string" + } + }, + "required": [ + "page" + ], + "type": "object" + }, + "material": { + "type": "string" + }, + "method": { + "items": { + "type": "string" + }, + "type": "array" + }, + "notDesign": { + "type": "string" + }, + "notice": { + "type": "string" + }, + "patterns": { + "description": "Each way a bar or sheet is cut, with how many are cut that way; up to 150, most used first.", + "items": { + "anyOf": [ + { + "properties": { + "cuts": { + "items": { + "properties": { + "joined": { + "type": "boolean" + }, + "label": { + "type": "string" + }, + "length": { + "properties": { + "ft": { + "type": "number" + }, + "m": { + "type": "number" + }, + "text": { + "description": "In the system asked for, then the other.", + "type": "string" + } + }, + "required": [ + "m", + "ft", + "text" + ], + "type": "object" + } + }, + "required": [ + "length" + ], + "type": "object" + }, + "type": "array" + }, + "keep": { + "type": "boolean" + }, + "offcut": { + "properties": { + "ft": { + "type": "number" + }, + "m": { + "type": "number" + }, + "text": { + "description": "In the system asked for, then the other.", + "type": "string" + } + }, + "required": [ + "m", + "ft", + "text" + ], + "type": "object" + }, + "stock": { + "properties": { + "ft": { + "type": "number" + }, + "m": { + "type": "number" + }, + "text": { + "description": "In the system asked for, then the other.", + "type": "string" + } + }, + "required": [ + "m", + "ft", + "text" + ], + "type": "object" + }, + "times": { + "type": "integer" + } + }, + "required": [ + "times", + "stock", + "cuts", + "offcut", + "keep" + ], + "type": "object" + }, + { + "properties": { + "cuts": { + "description": "The saw cuts in the order to make them (edge trim, rips, cross cuts), on a guillotine layout.", + "items": { + "properties": { + "from": { + "type": "object" + }, + "kind": { + "enum": [ + "trim", + "rip", + "cross" + ] + }, + "length": { + "properties": { + "ft": { + "type": "number" + }, + "m": { + "type": "number" + }, + "text": { + "description": "In the system asked for, then the other.", + "type": "string" + } + }, + "required": [ + "m", + "ft", + "text" + ], + "type": "object" + }, + "order": { + "type": "integer" + }, + "to": { + "type": "object" + } + }, + "required": [ + "order", + "kind" + ], + "type": "object" + }, + "type": "array" + }, + "guillotine": { + "type": "boolean" + }, + "largestOffcut": { + "type": "object" + }, + "offcuts": { + "description": "Rectangles left whole at or above the minimum size, largest first.", + "items": { + "type": "object" + }, + "type": "array" + }, + "placed": { + "items": { + "properties": { + "grainLocked": { + "type": "boolean" + }, + "height": { + "properties": { + "ft": { + "type": "number" + }, + "m": { + "type": "number" + }, + "text": { + "description": "In the system asked for, then the other.", + "type": "string" + } + }, + "required": [ + "m", + "ft", + "text" + ], + "type": "object" + }, + "id": { + "description": "The part's id to write on it: the row's letter and its number (A1, A2, B1 …).", + "type": "string" + }, + "label": { + "type": "string" + }, + "rotated": { + "type": "boolean" + }, + "width": { + "properties": { + "ft": { + "type": "number" + }, + "m": { + "type": "number" + }, + "text": { + "description": "In the system asked for, then the other.", + "type": "string" + } + }, + "required": [ + "m", + "ft", + "text" + ], + "type": "object" + }, + "x": { + "properties": { + "ft": { + "type": "number" + }, + "m": { + "type": "number" + }, + "text": { + "description": "In the system asked for, then the other.", + "type": "string" + } + }, + "required": [ + "m", + "ft", + "text" + ], + "type": "object" + }, + "y": { + "properties": { + "ft": { + "type": "number" + }, + "m": { + "type": "number" + }, + "text": { + "description": "In the system asked for, then the other.", + "type": "string" + } + }, + "required": [ + "m", + "ft", + "text" + ], + "type": "object" + } + }, + "required": [ + "x", + "y", + "width", + "height", + "rotated" + ], + "type": "object" + }, + "type": "array" + }, + "times": { + "type": "integer" + } + }, + "required": [ + "times", + "placed" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "patternsTotal": { + "type": "integer" + }, + "pieces": { + "type": "integer" + }, + "proven": { + "description": "True when no plan buys less: the exact branch and bound finished, or the plan meets the bound.", + "type": "boolean" + }, + "required": { + "anyOf": [ + { + "properties": { + "ft": { + "type": "number" + }, + "m": { + "type": "number" + }, + "text": { + "description": "In the system asked for, then the other.", + "type": "string" + } + }, + "required": [ + "m", + "ft", + "text" + ], + "type": "object" + }, + { + "properties": { + "ft2": { + "type": "number" + }, + "m2": { + "type": "number" + }, + "text": { + "type": "string" + } + }, + "required": [ + "m2", + "ft2", + "text" + ], + "type": "object" + } + ] + }, + "steps": { + "description": "Search steps spent (bounded).", + "type": "integer" + }, + "system": { + "enum": [ + "metric", + "imperial" + ] + }, + "tooLong": { + "description": "Pieces no stock length or sheet takes, listed rather than split.", + "items": { + "type": "object" + }, + "type": "array" + }, + "waste": { + "properties": { + "excludingKeptOffcutsPercent": { + "type": "number" + }, + "keptOffcut": { + "properties": { + "ft": { + "type": "number" + }, + "m": { + "type": "number" + }, + "text": { + "description": "In the system asked for, then the other.", + "type": "string" + } + }, + "required": [ + "m", + "ft", + "text" + ], + "type": "object" + }, + "percent": { + "type": "number" + } + }, + "required": [ + "percent" + ], + "type": "object" + }, + "yieldPercent": { + "description": "sheet: the pieces' area over the area bought, percent.", + "type": "number" + } + }, + "required": [ + "engine", + "system", + "kind", + "material", + "given", + "buy", + "waste", + "bound", + "proven", + "patterns", + "patternsTotal", + "notDesign", + "method", + "citation", + "licence", + "notice", + "links" + ], + "type": "object" + }, + { + "properties": { + "citation": { + "description": "The one citation line, built from the answer's own data.", + "type": "string" + }, + "detail": { + "const": "summary" + }, + "lines": { + "description": "The result lines, as the report's table gives them.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "more": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notes": { + "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", + "items": { + "type": "string" + }, + "type": "array" + }, + "open": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "detail", + "tool", + "title", + "lines", + "notes", + "citation", + "url", + "open", + "more" + ], + "type": "object" + } +]
- Added
plan_room_trim - Added
print_template - Added
run_example_live - Added
run_guide_chain - Added
scribe_template - Added
stair_flight - Added
trim_corner - Added
write_proposal - Added
write_variation
19 tool updates
- Changed
calculate2 fields changed- added
Input schema / properties / explainAdded value: +{ + "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.", + "type": "boolean" +} - changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "calculator": { - "properties": { - "category": { - "type": "string" - }, - "description": { - "type": "string" - }, - "json": { - "description": "The calculator's static API document, with its test vectors.", - "type": "string" - }, - "lastVerified": { - "description": "The date the calculator's sources were last checked.", - "type": "string" - }, - "slug": { - "type": "string" - }, - "title": { - "type": "string" - }, - "url": { - "description": "The calculator's page on craftquantities.com.", - "type": "string" - }, - "version": { - "description": "The calculator's own version; a result names the calculator that produced it.", - "type": "string" - } - }, - "required": [ - "slug", - "title", - "category", - "version", - "lastVerified", - "url", - "json" - ], - "type": "object" - }, - "citation": { - "properties": { - "accessDate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "author": { - "type": "string" - }, - "formats": { - "properties": { - "apa": { - "type": "string" - }, - "bibtex": { - "type": "string" - }, - "harvard": { - "type": "string" - }, - "plain": { - "type": "string" - } - }, - "required": [ - "plain", - "apa", - "harvard", - "bibtex" - ], - "type": "object" - }, - "sourcesChecked": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "url": { - "type": "string" - }, - "version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "author", - "title", - "url", - "formats", - "accessDate" - ], - "type": "object" - }, - "engine": { - "properties": { - "api": { - "type": "string" - }, - "name": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "name", - "version", - "api" - ], - "type": "object" - }, - "inputs": { - "description": "Every input the calculation ran on, and where each came from.", - "items": { - "properties": { - "baseUnit": { - "type": "string" - }, - "dimension": { - "type": "string" - }, - "id": { - "type": "string" - }, - "imperial": { - "properties": { - "unit": { - "type": "string" - }, - "value": { - "type": "number" - } - }, - "required": [ - "value", - "unit" - ], - "type": "object" - }, - "label": { - "type": "string" - }, - "metric": { - "properties": { - "unit": { - "type": "string" - }, - "value": { - "type": "number" - } - }, - "required": [ - "value", - "unit" - ], - "type": "object" - }, - "option": { - "type": "string" - }, - "read": { - "type": "string" - }, - "source": { - "enum": [ - "caller", - "default" - ] - }, - "type": { - "enum": [ - "number", - "select" - ] - }, - "value": { - "type": [ - "number", - "string" - ] - } - }, - "required": [ - "id", - "label", - "type", - "value", - "source" - ], - "type": "object" - }, - "type": "array" - }, - "licence": { - "properties": { - "attribution": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "name", - "url", - "attribution" - ], - "type": "object" - }, - "links": { - "properties": { - "open": { - "description": "Opens the page on these inputs.", - "type": "string" - }, - "page": { - "type": "string" - } - }, - "required": [ - "page", - "open" - ], - "type": "object" - }, - "market": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notice": { - "type": "string" - }, - "result": { - "properties": { - "imperial": { - "properties": { - "allowance": { - "anyOf": [ - { - "properties": { - "base": { - "type": "number" - }, - "label": { - "type": "string" - }, - "percent": { - "type": "number" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "breakdown": { - "items": { - "properties": { - "label": { - "type": "string" - }, - "printed": { - "type": "string" - }, - "unit": { - "type": "string" - }, - "value": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "label", - "value", - "unit", - "printed" - ], - "type": "object" - }, - "type": "array" - }, - "canonical": { - "description": "The figure in the calculator's own unit, before the display adapter: what its test vectors pin.", - "properties": { - "unit": { - "type": "string" - }, - "value": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "value", - "unit" - ], - "type": "object" - }, - "confidence": { - "enum": [ - "high", - "medium", - "low" - ] - }, - "confidenceNote": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "isComparison": { - "description": "The figure is set against a limit. It is not an approval.", - "type": "boolean" - }, - "limitations": { - "items": { - "type": "string" - }, - "type": "array" - }, - "printed": { - "anyOf": [ - { - "description": "The headline exactly as the page prints it.", - "type": "string" - }, - { - "type": "null" - } - ] - }, - "unit": { - "type": "string" - }, - "value": { - "anyOf": [ - { - "description": "The headline in this system; null where a rate it needs is not given.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "withheld": { - "anyOf": [ - { - "properties": { - "missingRates": { - "items": { - "properties": { - "input": { - "type": "string" - }, - "label": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "value", - "unit", - "printed", - "breakdown", - "confidence", - "isComparison", - "canonical" - ], - "type": "object" - }, - "label": { - "type": "string" - }, - "metric": { - "properties": { - "allowance": { - "anyOf": [ - { - "properties": { - "base": { - "type": "number" - }, - "label": { - "type": "string" - }, - "percent": { - "type": "number" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "breakdown": { - "items": { - "properties": { - "label": { - "type": "string" - }, - "printed": { - "type": "string" - }, - "unit": { - "type": "string" - }, - "value": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "label", - "value", - "unit", - "printed" - ], - "type": "object" - }, - "type": "array" - }, - "canonical": { - "description": "The figure in the calculator's own unit, before the display adapter: what its test vectors pin.", - "properties": { - "unit": { - "type": "string" - }, - "value": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "value", - "unit" - ], - "type": "object" - }, - "confidence": { - "enum": [ - "high", - "medium", - "low" - ] - }, - "confidenceNote": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "isComparison": { - "description": "The figure is set against a limit. It is not an approval.", - "type": "boolean" - }, - "limitations": { - "items": { - "type": "string" - }, - "type": "array" - }, - "printed": { - "anyOf": [ - { - "description": "The headline exactly as the page prints it.", - "type": "string" - }, - { - "type": "null" - } - ] - }, - "unit": { - "type": "string" - }, - "value": { - "anyOf": [ - { - "description": "The headline in this system; null where a rate it needs is not given.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "withheld": { - "anyOf": [ - { - "properties": { - "missingRates": { - "items": { - "properties": { - "input": { - "type": "string" - }, - "label": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "value", - "unit", - "printed", - "breakdown", - "confidence", - "isComparison", - "canonical" - ], - "type": "object" - } - }, - "required": [ - "label", - "metric", - "imperial" - ], - "type": "object" - }, - "sources": { - "items": { - "properties": { - "label": { - "description": "The source as the calculator cites it.", - "type": "string" - }, - "references": { - "items": { - "properties": { - "body": { - "type": "string" - }, - "document": { - "type": "string" - }, - "edition": { - "type": "string" - }, - "kind": { - "enum": [ - "code", - "standard" - ] - }, - "section": { - "type": "string" - } - }, - "required": [ - "kind", - "document" - ], - "type": "object" - }, - "type": "array" - }, - "url": { - "description": "Only where the calculator gives one; none is invented.", - "type": "string" - } - }, - "required": [ - "label" - ], - "type": "object" - }, - "type": "array" - }, - "system": { - "enum": [ - "metric", - "imperial" - ] - } - }, - "required": [ - "engine", - "calculator", - "system", - "inputs", - "result", - "sources", - "citation", - "links", - "licence", - "notice" - ], - "type": "object" - }, - { - "properties": { - "citation": { - "description": "The one citation line, built from the answer's own data.", - "type": "string" - }, - "detail": { - "const": "summary" - }, - "lines": { - "description": "The result lines, as the report's table gives them.", - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "more": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notes": { - "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", - "items": { - "type": "string" - }, - "type": "array" - }, - "open": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "detail", - "tool", - "title", - "lines", - "notes", - "citation", - "url", - "open", - "more" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "calculator": { + "properties": { + "category": { + "type": "string" + }, + "description": { + "type": "string" + }, + "json": { + "description": "The calculator's static API document, with its test vectors.", + "type": "string" + }, + "lastVerified": { + "description": "The date the calculator's sources were last checked.", + "type": "string" + }, + "slug": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "description": "The calculator's page on craftquantities.com.", + "type": "string" + }, + "version": { + "description": "The calculator's own version; a result names the calculator that produced it.", + "type": "string" + } + }, + "required": [ + "slug", + "title", + "category", + "version", + "lastVerified", + "url", + "json" + ], + "type": "object" + }, + "citation": { + "properties": { + "accessDate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "author": { + "type": "string" + }, + "formats": { + "properties": { + "apa": { + "type": "string" + }, + "bibtex": { + "type": "string" + }, + "harvard": { + "type": "string" + }, + "plain": { + "type": "string" + } + }, + "required": [ + "plain", + "apa", + "harvard", + "bibtex" + ], + "type": "object" + }, + "sourcesChecked": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "author", + "title", + "url", + "formats", + "accessDate" + ], + "type": "object" + }, + "engine": { + "properties": { + "api": { + "type": "string" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "name", + "version", + "api" + ], + "type": "object" + }, + "explain": { + "description": "Only when explain is true. Each figure is the calculator's own; no step is a formula written for the engine.", + "properties": { + "about": { + "type": "string" + }, + "coverage": { + "description": "result-only: the calculator reports no figures between its inputs and its result.", + "enum": [ + "intermediates", + "result-only" + ] + }, + "final": { + "description": "The figures the answer returns, copied from it.", + "properties": { + "imperial": { + "properties": { + "printed": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "unit": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "value", + "unit", + "printed" + ], + "type": "object" + }, + "metric": { + "properties": { + "printed": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "unit": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "value", + "unit", + "printed" + ], + "type": "object" + } + }, + "required": [ + "metric", + "imperial" + ], + "type": "object" + }, + "limits": { + "description": "What the trace does not show, and why.", + "items": { + "type": "string" + }, + "type": "array" + }, + "steps": { + "items": { + "properties": { + "imperial": { + "properties": { + "unit": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "value", + "unit" + ], + "type": "object" + }, + "kind": { + "enum": [ + "input", + "intermediate", + "result", + "allowance", + "range", + "rates", + "display" + ] + }, + "label": { + "type": "string" + }, + "metric": { + "properties": { + "unit": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "value", + "unit" + ], + "type": "object" + }, + "movedBy": { + "description": "Input ids whose change moved this figure, measured by running compute again.", + "items": { + "type": "string" + }, + "type": "array" + }, + "n": { + "type": "integer" + }, + "source": { + "enum": [ + "caller", + "default" + ] + }, + "system": { + "enum": [ + "metric", + "imperial", + "both" + ] + }, + "text": { + "description": "The step in words.", + "type": "string" + }, + "unit": { + "description": "The calculator's own (base) unit for the value.", + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "n", + "kind", + "system", + "label", + "text" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "about", + "coverage", + "steps", + "final", + "limits" + ], + "type": "object" + }, + "inputs": { + "description": "Every input the calculation ran on, and where each came from.", + "items": { + "properties": { + "baseUnit": { + "type": "string" + }, + "dimension": { + "type": "string" + }, + "id": { + "type": "string" + }, + "imperial": { + "properties": { + "unit": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value", + "unit" + ], + "type": "object" + }, + "label": { + "type": "string" + }, + "metric": { + "properties": { + "unit": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value", + "unit" + ], + "type": "object" + }, + "option": { + "type": "string" + }, + "read": { + "type": "string" + }, + "source": { + "enum": [ + "caller", + "default" + ] + }, + "type": { + "enum": [ + "number", + "select" + ] + }, + "value": { + "type": [ + "number", + "string" + ] + } + }, + "required": [ + "id", + "label", + "type", + "value", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "licence": { + "properties": { + "attribution": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "url", + "attribution" + ], + "type": "object" + }, + "links": { + "properties": { + "open": { + "description": "Opens the page on these inputs.", + "type": "string" + }, + "page": { + "type": "string" + } + }, + "required": [ + "page", + "open" + ], + "type": "object" + }, + "market": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notice": { + "type": "string" + }, + "result": { + "properties": { + "imperial": { + "properties": { + "allowance": { + "anyOf": [ + { + "properties": { + "base": { + "type": "number" + }, + "label": { + "type": "string" + }, + "percent": { + "type": "number" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "breakdown": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "printed": { + "type": "string" + }, + "unit": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "label", + "value", + "unit", + "printed" + ], + "type": "object" + }, + "type": "array" + }, + "canonical": { + "description": "The figure in the calculator's own unit, before the display adapter: what its test vectors pin.", + "properties": { + "unit": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "value", + "unit" + ], + "type": "object" + }, + "confidence": { + "enum": [ + "high", + "medium", + "low" + ] + }, + "confidenceNote": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "isComparison": { + "description": "The figure is set against a limit. It is not an approval.", + "type": "boolean" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "printed": { + "anyOf": [ + { + "description": "The headline exactly as the page prints it.", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "unit": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "description": "The headline in this system; null where a rate it needs is not given.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "withheld": { + "anyOf": [ + { + "properties": { + "missingRates": { + "items": { + "properties": { + "input": { + "type": "string" + }, + "label": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "value", + "unit", + "printed", + "breakdown", + "confidence", + "isComparison", + "canonical" + ], + "type": "object" + }, + "label": { + "type": "string" + }, + "metric": { + "properties": { + "allowance": { + "anyOf": [ + { + "properties": { + "base": { + "type": "number" + }, + "label": { + "type": "string" + }, + "percent": { + "type": "number" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "breakdown": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "printed": { + "type": "string" + }, + "unit": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "label", + "value", + "unit", + "printed" + ], + "type": "object" + }, + "type": "array" + }, + "canonical": { + "description": "The figure in the calculator's own unit, before the display adapter: what its test vectors pin.", + "properties": { + "unit": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "value", + "unit" + ], + "type": "object" + }, + "confidence": { + "enum": [ + "high", + "medium", + "low" + ] + }, + "confidenceNote": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "isComparison": { + "description": "The figure is set against a limit. It is not an approval.", + "type": "boolean" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "printed": { + "anyOf": [ + { + "description": "The headline exactly as the page prints it.", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "unit": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "description": "The headline in this system; null where a rate it needs is not given.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "withheld": { + "anyOf": [ + { + "properties": { + "missingRates": { + "items": { + "properties": { + "input": { + "type": "string" + }, + "label": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "value", + "unit", + "printed", + "breakdown", + "confidence", + "isComparison", + "canonical" + ], + "type": "object" + } + }, + "required": [ + "label", + "metric", + "imperial" + ], + "type": "object" + }, + "sources": { + "items": { + "properties": { + "label": { + "description": "The source as the calculator cites it.", + "type": "string" + }, + "references": { + "items": { + "properties": { + "body": { + "type": "string" + }, + "document": { + "type": "string" + }, + "edition": { + "type": "string" + }, + "kind": { + "enum": [ + "code", + "standard" + ] + }, + "section": { + "type": "string" + } + }, + "required": [ + "kind", + "document" + ], + "type": "object" + }, + "type": "array" + }, + "url": { + "description": "Only where the calculator gives one; none is invented.", + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" + }, + "system": { + "enum": [ + "metric", + "imperial" + ] + } + }, + "required": [ + "engine", + "calculator", + "system", + "inputs", + "result", + "sources", + "citation", + "links", + "licence", + "notice" + ], + "type": "object" + }, + { + "properties": { + "citation": { + "description": "The one citation line, built from the answer's own data.", + "type": "string" + }, + "detail": { + "const": "summary" + }, + "lines": { + "description": "The result lines, as the report's table gives them.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "more": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notes": { + "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", + "items": { + "type": "string" + }, + "type": "array" + }, + "open": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "detail", + "tool", + "title", + "lines", + "notes", + "citation", + "url", + "open", + "more" + ], + "type": "object" + } +]
- Added
calculate_batch - Added
classify_items - Changed
create_drawing4 fields changed- added
Input schema / properties / layoutAdded value: +{ + "additionalProperties": false, + "description": "Rooms by name, size and which room each stands against, laid out on a grid: shared walls drawn once as partitions, every snap or move reported, and each room checked to close.", + "properties": { + "doors": { + "description": "Each between two rooms, or in a room's side (an outside door where that side is an exterior wall).", + "items": { + "additionalProperties": false, + "properties": { + "between": { + "description": "A door only: the two rooms it joins, on the wall they share.", + "items": { + "maxLength": 60, + "type": "string" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "offset": { + "description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "room": { + "description": "The room it is in, by name.", + "maxLength": 60, + "type": "string" + }, + "side": { + "description": "The side of that room.", + "enum": [ + "south", + "east", + "north", + "west" + ] + }, + "width": { + "description": "The opening's width; left out, the canvas's default.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + } + }, + "type": "object" + }, + "maxItems": 60, + "type": "array" + }, + "grid": { + "description": "The grid every figure is snapped to (default 10 mm, or 1/2 in in US units). Each snap that changed a figure is reported.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "rooms": { + "items": { + "additionalProperties": false, + "properties": { + "against": { + "additionalProperties": false, + "description": "Beside a side of an earlier room, sharing that wall.", + "properties": { + "align": { + "description": "Along that side: flush with its west or south end (start, the default), centred, or flush with the other end.", + "enum": [ + "start", + "centre", + "end" + ] + }, + "offset": { + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "room": { + "maxLength": 60, + "type": "string" + }, + "side": { + "enum": [ + "south", + "east", + "north", + "west" + ] + } + }, + "required": [ + "room", + "side" + ], + "type": "object" + }, + "at": { + "additionalProperties": false, + "description": "Its south-west corner. The first room without at or against is at the origin.", + "properties": { + "x": { + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "y": { + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "depth": { + "description": "Along y (north), wall centre to wall centre.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "name": { + "description": "Unique in the layout; openings and later rooms refer to it.", + "maxLength": 60, + "minLength": 1, + "type": "string" + }, + "width": { + "description": "Along x (east), wall centre to wall centre.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + } + }, + "required": [ + "name", + "width", + "depth" + ], + "type": "object" + }, + "maxItems": 30, + "minItems": 1, + "type": "array" + }, + "windows": { + "description": "Each in a room's side, on an exterior wall.", + "items": { + "additionalProperties": false, + "properties": { + "between": { + "description": "A door only: the two rooms it joins, on the wall they share.", + "items": { + "maxLength": 60, + "type": "string" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "offset": { + "description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "room": { + "description": "The room it is in, by name.", + "maxLength": 60, + "type": "string" + }, + "side": { + "description": "The side of that room.", + "enum": [ + "south", + "east", + "north", + "west" + ] + }, + "width": { + "description": "The opening's width; left out, the canvas's default.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + } + }, + "type": "object" + }, + "maxItems": 60, + "type": "array" + } + }, + "required": [ + "rooms" + ], + "type": "object" +} - added
Input schema / properties / templateAdded value: +{ + "description": "A Construction Canvas template's slug (the template index lists them: single-room, deck, two-car-garage …): the drawing its page shows, in the reader's system, with a link that opens it.", + "pattern": "^[a-z0-9-]{1,60}$", + "type": "string" +} - added
Input schema / properties / variantAdded value: +{ + "description": "With template: one of its two \"what changes if\" variants, by id; a wrong one is refused with the template's own list.", + "pattern": "^[a-z0-9-]{1,40}$", + "type": "string" +} - changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "assumptions": { - "items": { - "required": [ - "field", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "citation": { - "properties": { - "accessDate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "author": { - "type": "string" - }, - "formats": { - "properties": { - "apa": { - "type": "string" - }, - "bibtex": { - "type": "string" - }, - "harvard": { - "type": "string" - }, - "plain": { - "type": "string" - } - }, - "required": [ - "plain", - "apa", - "harvard", - "bibtex" - ], - "type": "object" - }, - "sourcesChecked": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "url": { - "type": "string" - }, - "version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "author", - "title", - "url", - "formats", - "accessDate" - ], - "type": "object" - }, - "counts": { - "required": [ - "walls", - "openings", - "levels" - ], - "type": "object" - }, - "document": { - "required": [ - "schema", - "units", - "counters", - "levels", - "types", - "entities", - "assumed", - "updatedAt" - ], - "type": "object" - }, - "drawingLink": { - "type": "string" - }, - "engine": { - "type": "object" - }, - "file": { - "properties": { - "content": { - "properties": { - "exportedAt": { - "type": "string" - }, - "magic": { - "const": "craftquantities.backup" - }, - "stores": { - "type": "object" - }, - "v": { - "type": "integer" - } - }, - "required": [ - "magic", - "v", - "exportedAt", - "stores" - ], - "type": "object" - }, - "filename": { - "type": "string" - }, - "mediaType": { - "const": "application/json" - } - }, - "required": [ - "filename", - "mediaType", - "content" - ], - "type": "object" - }, - "from": { - "enum": [ - "house", - "commands", - "document", - "shapes" - ] - }, - "house": { - "type": "object" - }, - "howToOpen": { - "type": "string" - }, - "labour": { - "required": [ - "rows", - "totalHours", - "programme", - "likelyDays", - "note" - ], - "type": "object" - }, - "licence": { - "properties": { - "attribution": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "name", - "url", - "attribution" - ], - "type": "object" - }, - "lines": { - "items": { - "required": [ - "label", - "quantity", - "unit", - "zone" - ], - "type": "object" - }, - "type": "array" - }, - "links": { - "properties": { - "canvas": { - "type": "string" - }, - "drawing": { - "anyOf": [ - { - "description": "Opens this drawing on the canvas as a new project's: the drawing rides in the fragment, so nothing is uploaded. Null when the drawing is too large for a link.", - "type": "string" - }, - { - "type": "null" - } - ] - }, - "estimator": { - "type": "string" - } - }, - "required": [ - "canvas", - "drawing" - ], - "type": "object" - }, - "notice": { - "type": "string" - }, - "objects": { - "items": { - "required": [ - "key", - "label", - "quantity" - ], - "type": "object" - }, - "type": "array" - }, - "omitted": { - "type": "array" - }, - "plans": { - "type": "array" - }, - "rows": { - "items": { - "properties": { - "calculator": { - "required": [ - "slug", - "title" - ], - "type": "object" - }, - "key": { - "type": "string" - }, - "label": { - "type": "string" - }, - "note": { - "type": "string" - }, - "order": { - "required": [ - "quantity", - "unit" - ], - "type": "object" - }, - "otherSystem": { - "anyOf": [ - { - "required": [ - "quantity", - "unit" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "quantity": { - "type": "number" - }, - "section": { - "type": "string" - }, - "unit": { - "type": "string" - }, - "where": { - "type": "string" - } - }, - "required": [ - "key", - "section", - "label", - "where", - "quantity", - "unit", - "otherSystem", - "calculator" - ], - "type": "object" - }, - "type": "array" - }, - "shapeNotes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "shapes": { - "items": { - "required": [ - "shape", - "ref", - "made", - "figures" - ], - "type": "object" - }, - "type": "array" - }, - "sources": { - "type": "array" - }, - "system": { - "enum": [ - "metric", - "imperial" - ] - } - }, - "required": [ - "engine", - "system", - "from", - "document", - "counts", - "rows", - "objects", - "lines", - "assumptions", - "omitted", - "plans", - "labour", - "sources", - "file", - "links", - "howToOpen", - "citation", - "licence", - "notice" - ], - "type": "object" - }, - { - "properties": { - "citation": { - "description": "The one citation line, built from the answer's own data.", - "type": "string" - }, - "detail": { - "const": "summary" - }, - "lines": { - "description": "The result lines, as the report's table gives them.", - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "more": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notes": { - "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", - "items": { - "type": "string" - }, - "type": "array" - }, - "open": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "detail", - "tool", - "title", - "lines", - "notes", - "citation", - "url", - "open", - "more" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "assumptions": { + "items": { + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "citation": { + "properties": { + "accessDate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "author": { + "type": "string" + }, + "formats": { + "properties": { + "apa": { + "type": "string" + }, + "bibtex": { + "type": "string" + }, + "harvard": { + "type": "string" + }, + "plain": { + "type": "string" + } + }, + "required": [ + "plain", + "apa", + "harvard", + "bibtex" + ], + "type": "object" + }, + "sourcesChecked": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "author", + "title", + "url", + "formats", + "accessDate" + ], + "type": "object" + }, + "counts": { + "required": [ + "walls", + "openings", + "levels" + ], + "type": "object" + }, + "document": { + "required": [ + "schema", + "units", + "counters", + "levels", + "types", + "entities", + "assumed", + "updatedAt" + ], + "type": "object" + }, + "drawingLink": { + "type": "string" + }, + "engine": { + "type": "object" + }, + "file": { + "properties": { + "content": { + "properties": { + "exportedAt": { + "type": "string" + }, + "magic": { + "const": "craftquantities.backup" + }, + "stores": { + "type": "object" + }, + "v": { + "type": "integer" + } + }, + "required": [ + "magic", + "v", + "exportedAt", + "stores" + ], + "type": "object" + }, + "filename": { + "type": "string" + }, + "mediaType": { + "const": "application/json" + } + }, + "required": [ + "filename", + "mediaType", + "content" + ], + "type": "object" + }, + "from": { + "enum": [ + "house", + "commands", + "document", + "shapes", + "template", + "layout" + ] + }, + "house": { + "type": "object" + }, + "howToOpen": { + "type": "string" + }, + "labour": { + "required": [ + "rows", + "totalHours", + "programme", + "likelyDays", + "note" + ], + "type": "object" + }, + "layout": { + "description": "The rooms as laid out (both unit systems), the walls drawn, every figure snapped or room moved, and the closure check.", + "required": [ + "grid", + "rooms", + "walls", + "adjustments", + "checks" + ], + "type": "object" + }, + "licence": { + "properties": { + "attribution": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "url", + "attribution" + ], + "type": "object" + }, + "lines": { + "items": { + "required": [ + "label", + "quantity", + "unit", + "zone" + ], + "type": "object" + }, + "type": "array" + }, + "links": { + "properties": { + "canvas": { + "type": "string" + }, + "drawing": { + "anyOf": [ + { + "description": "Opens this drawing on the canvas as a new project's: the drawing rides in the fragment, so nothing is uploaded. Null when the drawing is too large for a link.", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "estimator": { + "type": "string" + }, + "template": { + "description": "The template's page, when the drawing is a template's: cite it beside the drawing's link.", + "type": "string" + } + }, + "required": [ + "canvas", + "drawing" + ], + "type": "object" + }, + "notice": { + "type": "string" + }, + "objects": { + "items": { + "required": [ + "key", + "label", + "quantity" + ], + "type": "object" + }, + "type": "array" + }, + "omitted": { + "type": "array" + }, + "plans": { + "type": "array" + }, + "rows": { + "items": { + "properties": { + "calculator": { + "required": [ + "slug", + "title" + ], + "type": "object" + }, + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "order": { + "required": [ + "quantity", + "unit" + ], + "type": "object" + }, + "otherSystem": { + "anyOf": [ + { + "required": [ + "quantity", + "unit" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "quantity": { + "type": "number" + }, + "section": { + "type": "string" + }, + "unit": { + "type": "string" + }, + "where": { + "type": "string" + } + }, + "required": [ + "key", + "section", + "label", + "where", + "quantity", + "unit", + "otherSystem", + "calculator" + ], + "type": "object" + }, + "type": "array" + }, + "shapeNotes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "shapes": { + "items": { + "required": [ + "shape", + "ref", + "made", + "figures" + ], + "type": "object" + }, + "type": "array" + }, + "sources": { + "type": "array" + }, + "system": { + "enum": [ + "metric", + "imperial" + ] + }, + "template": { + "description": "The template it was drawn from: its page, the variant drawn (null: as the page shows it) and its variants.", + "required": [ + "slug", + "name", + "page", + "variant", + "variants" + ], + "type": "object" + } + }, + "required": [ + "engine", + "system", + "from", + "document", + "counts", + "rows", + "objects", + "lines", + "assumptions", + "omitted", + "plans", + "labour", + "sources", + "file", + "links", + "howToOpen", + "citation", + "licence", + "notice" + ], + "type": "object" + }, + { + "properties": { + "citation": { + "description": "The one citation line, built from the answer's own data.", + "type": "string" + }, + "detail": { + "const": "summary" + }, + "lines": { + "description": "The result lines, as the report's table gives them.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "more": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notes": { + "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", + "items": { + "type": "string" + }, + "type": "array" + }, + "open": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "detail", + "tool", + "title", + "lines", + "notes", + "citation", + "url", + "open", + "more" + ], + "type": "object" + } +]
- Changed
create_project_file_from_calculations1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "drawing": { - "properties": { - "carried": { - "type": "boolean" - }, - "note": { - "type": "string" - } - }, - "required": [ - "carried" - ], - "type": "object" - }, - "engine": { - "type": "object" - }, - "file": { - "properties": { - "content": { - "properties": { - "exportedAt": { - "type": "string" - }, - "magic": { - "const": "craftquantities.backup" - }, - "stores": { - "type": "object" - }, - "v": { - "type": "integer" - } - }, - "required": [ - "magic", - "v", - "exportedAt", - "stores" - ], - "type": "object" - }, - "filename": { - "type": "string" - }, - "mediaType": { - "const": "application/json" - } - }, - "required": [ - "filename", - "mediaType", - "content" - ], - "type": "object" - }, - "howToImport": { - "type": "string" - }, - "licence": { - "properties": { - "attribution": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "name", - "url", - "attribution" - ], - "type": "object" - }, - "notice": { - "type": "string" - }, - "project": { - "properties": { - "lines": { - "items": { - "required": [ - "label", - "quantity", - "unit", - "from" - ], - "type": "object" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "system": { - "enum": [ - "metric", - "imperial" - ] - } - }, - "required": [ - "name", - "system", - "lines" - ], - "type": "object" - } - }, - "required": [ - "engine", - "file", - "project", - "howToImport", - "licence", - "notice" - ], - "type": "object" - }, - { - "properties": { - "citation": { - "description": "The one citation line, built from the answer's own data.", - "type": "string" - }, - "detail": { - "const": "summary" - }, - "lines": { - "description": "The result lines, as the report's table gives them.", - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "more": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notes": { - "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", - "items": { - "type": "string" - }, - "type": "array" - }, - "open": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "detail", - "tool", - "title", - "lines", - "notes", - "citation", - "url", - "open", - "more" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "drawing": { + "properties": { + "carried": { + "type": "boolean" + }, + "note": { + "type": "string" + } + }, + "required": [ + "carried" + ], + "type": "object" + }, + "engine": { + "type": "object" + }, + "file": { + "properties": { + "content": { + "properties": { + "exportedAt": { + "type": "string" + }, + "magic": { + "const": "craftquantities.backup" + }, + "stores": { + "type": "object" + }, + "v": { + "type": "integer" + } + }, + "required": [ + "magic", + "v", + "exportedAt", + "stores" + ], + "type": "object" + }, + "filename": { + "type": "string" + }, + "mediaType": { + "const": "application/json" + } + }, + "required": [ + "filename", + "mediaType", + "content" + ], + "type": "object" + }, + "howToImport": { + "type": "string" + }, + "licence": { + "properties": { + "attribution": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "url", + "attribution" + ], + "type": "object" + }, + "notice": { + "type": "string" + }, + "project": { + "properties": { + "lines": { + "items": { + "required": [ + "label", + "quantity", + "unit", + "from" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "system": { + "enum": [ + "metric", + "imperial" + ] + } + }, + "required": [ + "name", + "system", + "lines" + ], + "type": "object" + }, + "state": { + "properties": { + "characters": { + "type": "integer" + }, + "format": { + "description": "The token's format and version.", + "type": "string" + }, + "link": { + "description": "Opens the project on the site from the token, carried in the address fragment, which a browser does not send to any server.", + "type": "string" + }, + "note": { + "type": "string" + }, + "token": { + "anyOf": [ + { + "description": "The project's inputs, deflated and base64url-encoded with a format version and a CRC-32 check (cqp1.…). Compact, not encrypted: anyone who has it can read it.", + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "token", + "format", + "note" + ], + "type": "object" + } + }, + "required": [ + "engine", + "file", + "project", + "howToImport", + "licence", + "notice" + ], + "type": "object" + }, + { + "properties": { + "citation": { + "description": "The one citation line, built from the answer's own data.", + "type": "string" + }, + "detail": { + "const": "summary" + }, + "lines": { + "description": "The result lines, as the report's table gives them.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "more": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notes": { + "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", + "items": { + "type": "string" + }, + "type": "array" + }, + "open": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "detail", + "tool", + "title", + "lines", + "notes", + "citation", + "url", + "open", + "more" + ], + "type": "object" + } +]
- Changed
create_project_file_from_drawing4 fields changed- added
Input schema / properties / drawing / properties / layoutAdded value: +{ + "additionalProperties": false, + "description": "Rooms by name, size and which room each stands against, laid out on a grid: shared walls drawn once as partitions, every snap or move reported, and each room checked to close.", + "properties": { + "doors": { + "description": "Each between two rooms, or in a room's side (an outside door where that side is an exterior wall).", + "items": { + "additionalProperties": false, + "properties": { + "between": { + "description": "A door only: the two rooms it joins, on the wall they share.", + "items": { + "maxLength": 60, + "type": "string" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "offset": { + "description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "room": { + "description": "The room it is in, by name.", + "maxLength": 60, + "type": "string" + }, + "side": { + "description": "The side of that room.", + "enum": [ + "south", + "east", + "north", + "west" + ] + }, + "width": { + "description": "The opening's width; left out, the canvas's default.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + } + }, + "type": "object" + }, + "maxItems": 60, + "type": "array" + }, + "grid": { + "description": "The grid every figure is snapped to (default 10 mm, or 1/2 in in US units). Each snap that changed a figure is reported.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "rooms": { + "items": { + "additionalProperties": false, + "properties": { + "against": { + "additionalProperties": false, + "description": "Beside a side of an earlier room, sharing that wall.", + "properties": { + "align": { + "description": "Along that side: flush with its west or south end (start, the default), centred, or flush with the other end.", + "enum": [ + "start", + "centre", + "end" + ] + }, + "offset": { + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "room": { + "maxLength": 60, + "type": "string" + }, + "side": { + "enum": [ + "south", + "east", + "north", + "west" + ] + } + }, + "required": [ + "room", + "side" + ], + "type": "object" + }, + "at": { + "additionalProperties": false, + "description": "Its south-west corner. The first room without at or against is at the origin.", + "properties": { + "x": { + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "y": { + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "depth": { + "description": "Along y (north), wall centre to wall centre.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "name": { + "description": "Unique in the layout; openings and later rooms refer to it.", + "maxLength": 60, + "minLength": 1, + "type": "string" + }, + "width": { + "description": "Along x (east), wall centre to wall centre.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + } + }, + "required": [ + "name", + "width", + "depth" + ], + "type": "object" + }, + "maxItems": 30, + "minItems": 1, + "type": "array" + }, + "windows": { + "description": "Each in a room's side, on an exterior wall.", + "items": { + "additionalProperties": false, + "properties": { + "between": { + "description": "A door only: the two rooms it joins, on the wall they share.", + "items": { + "maxLength": 60, + "type": "string" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "offset": { + "description": "Its centre along the side from the side's start (walls counter-clockwise from the south-west corner); left out, the middle.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "room": { + "description": "The room it is in, by name.", + "maxLength": 60, + "type": "string" + }, + "side": { + "description": "The side of that room.", + "enum": [ + "south", + "east", + "north", + "west" + ] + }, + "width": { + "description": "The opening's width; left out, the canvas's default.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 200, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unit": { + "maxLength": 40, + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + } + }, + "type": "object" + }, + "maxItems": 60, + "type": "array" + } + }, + "required": [ + "rooms" + ], + "type": "object" +} - added
Input schema / properties / drawing / properties / templateAdded value: +{ + "description": "A Construction Canvas template's slug (the template index lists them: single-room, deck, two-car-garage …): the drawing its page shows, in the reader's system, with a link that opens it.", + "pattern": "^[a-z0-9-]{1,60}$", + "type": "string" +} - added
Input schema / properties / drawing / properties / variantAdded value: +{ + "description": "With template: one of its two \"what changes if\" variants, by id; a wrong one is refused with the template's own list.", + "pattern": "^[a-z0-9-]{1,40}$", + "type": "string" +} - changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "drawing": { - "properties": { - "carried": { - "type": "boolean" - }, - "note": { - "type": "string" - } - }, - "required": [ - "carried" - ], - "type": "object" - }, - "engine": { - "type": "object" - }, - "file": { - "properties": { - "content": { - "properties": { - "exportedAt": { - "type": "string" - }, - "magic": { - "const": "craftquantities.backup" - }, - "stores": { - "type": "object" - }, - "v": { - "type": "integer" - } - }, - "required": [ - "magic", - "v", - "exportedAt", - "stores" - ], - "type": "object" - }, - "filename": { - "type": "string" - }, - "mediaType": { - "const": "application/json" - } - }, - "required": [ - "filename", - "mediaType", - "content" - ], - "type": "object" - }, - "howToImport": { - "type": "string" - }, - "licence": { - "properties": { - "attribution": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "name", - "url", - "attribution" - ], - "type": "object" - }, - "notice": { - "type": "string" - }, - "project": { - "properties": { - "lines": { - "items": { - "required": [ - "label", - "quantity", - "unit", - "from" - ], - "type": "object" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "system": { - "enum": [ - "metric", - "imperial" - ] - } - }, - "required": [ - "name", - "system", - "lines" - ], - "type": "object" - } - }, - "required": [ - "engine", - "file", - "project", - "howToImport", - "licence", - "notice" - ], - "type": "object" - }, - { - "properties": { - "citation": { - "description": "The one citation line, built from the answer's own data.", - "type": "string" - }, - "detail": { - "const": "summary" - }, - "lines": { - "description": "The result lines, as the report's table gives them.", - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "more": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notes": { - "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", - "items": { - "type": "string" - }, - "type": "array" - }, - "open": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "detail", - "tool", - "title", - "lines", - "notes", - "citation", - "url", - "open", - "more" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "drawing": { + "properties": { + "carried": { + "type": "boolean" + }, + "note": { + "type": "string" + } + }, + "required": [ + "carried" + ], + "type": "object" + }, + "engine": { + "type": "object" + }, + "file": { + "properties": { + "content": { + "properties": { + "exportedAt": { + "type": "string" + }, + "magic": { + "const": "craftquantities.backup" + }, + "stores": { + "type": "object" + }, + "v": { + "type": "integer" + } + }, + "required": [ + "magic", + "v", + "exportedAt", + "stores" + ], + "type": "object" + }, + "filename": { + "type": "string" + }, + "mediaType": { + "const": "application/json" + } + }, + "required": [ + "filename", + "mediaType", + "content" + ], + "type": "object" + }, + "howToImport": { + "type": "string" + }, + "licence": { + "properties": { + "attribution": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "url", + "attribution" + ], + "type": "object" + }, + "notice": { + "type": "string" + }, + "project": { + "properties": { + "lines": { + "items": { + "required": [ + "label", + "quantity", + "unit", + "from" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "system": { + "enum": [ + "metric", + "imperial" + ] + } + }, + "required": [ + "name", + "system", + "lines" + ], + "type": "object" + }, + "state": { + "properties": { + "characters": { + "type": "integer" + }, + "format": { + "description": "The token's format and version.", + "type": "string" + }, + "link": { + "description": "Opens the project on the site from the token, carried in the address fragment, which a browser does not send to any server.", + "type": "string" + }, + "note": { + "type": "string" + }, + "token": { + "anyOf": [ + { + "description": "The project's inputs, deflated and base64url-encoded with a format version and a CRC-32 check (cqp1.…). Compact, not encrypted: anyone who has it can read it.", + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "token", + "format", + "note" + ], + "type": "object" + } + }, + "required": [ + "engine", + "file", + "project", + "howToImport", + "licence", + "notice" + ], + "type": "object" + }, + { + "properties": { + "citation": { + "description": "The one citation line, built from the answer's own data.", + "type": "string" + }, + "detail": { + "const": "summary" + }, + "lines": { + "description": "The result lines, as the report's table gives them.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "more": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notes": { + "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", + "items": { + "type": "string" + }, + "type": "array" + }, + "open": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "detail", + "tool", + "title", + "lines", + "notes", + "citation", + "url", + "open", + "more" + ], + "type": "object" + } +]
- Changed
create_project_file_from_house1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "drawing": { - "properties": { - "carried": { - "type": "boolean" - }, - "note": { - "type": "string" - } - }, - "required": [ - "carried" - ], - "type": "object" - }, - "engine": { - "type": "object" - }, - "file": { - "properties": { - "content": { - "properties": { - "exportedAt": { - "type": "string" - }, - "magic": { - "const": "craftquantities.backup" - }, - "stores": { - "type": "object" - }, - "v": { - "type": "integer" - } - }, - "required": [ - "magic", - "v", - "exportedAt", - "stores" - ], - "type": "object" - }, - "filename": { - "type": "string" - }, - "mediaType": { - "const": "application/json" - } - }, - "required": [ - "filename", - "mediaType", - "content" - ], - "type": "object" - }, - "howToImport": { - "type": "string" - }, - "licence": { - "properties": { - "attribution": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "name", - "url", - "attribution" - ], - "type": "object" - }, - "notice": { - "type": "string" - }, - "project": { - "properties": { - "lines": { - "items": { - "required": [ - "label", - "quantity", - "unit", - "from" - ], - "type": "object" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "system": { - "enum": [ - "metric", - "imperial" - ] - } - }, - "required": [ - "name", - "system", - "lines" - ], - "type": "object" - } - }, - "required": [ - "engine", - "file", - "project", - "howToImport", - "licence", - "notice" - ], - "type": "object" - }, - { - "properties": { - "citation": { - "description": "The one citation line, built from the answer's own data.", - "type": "string" - }, - "detail": { - "const": "summary" - }, - "lines": { - "description": "The result lines, as the report's table gives them.", - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "more": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notes": { - "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", - "items": { - "type": "string" - }, - "type": "array" - }, - "open": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "detail", - "tool", - "title", - "lines", - "notes", - "citation", - "url", - "open", - "more" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "drawing": { + "properties": { + "carried": { + "type": "boolean" + }, + "note": { + "type": "string" + } + }, + "required": [ + "carried" + ], + "type": "object" + }, + "engine": { + "type": "object" + }, + "file": { + "properties": { + "content": { + "properties": { + "exportedAt": { + "type": "string" + }, + "magic": { + "const": "craftquantities.backup" + }, + "stores": { + "type": "object" + }, + "v": { + "type": "integer" + } + }, + "required": [ + "magic", + "v", + "exportedAt", + "stores" + ], + "type": "object" + }, + "filename": { + "type": "string" + }, + "mediaType": { + "const": "application/json" + } + }, + "required": [ + "filename", + "mediaType", + "content" + ], + "type": "object" + }, + "howToImport": { + "type": "string" + }, + "licence": { + "properties": { + "attribution": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "url", + "attribution" + ], + "type": "object" + }, + "notice": { + "type": "string" + }, + "project": { + "properties": { + "lines": { + "items": { + "required": [ + "label", + "quantity", + "unit", + "from" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "system": { + "enum": [ + "metric", + "imperial" + ] + } + }, + "required": [ + "name", + "system", + "lines" + ], + "type": "object" + }, + "state": { + "properties": { + "characters": { + "type": "integer" + }, + "format": { + "description": "The token's format and version.", + "type": "string" + }, + "link": { + "description": "Opens the project on the site from the token, carried in the address fragment, which a browser does not send to any server.", + "type": "string" + }, + "note": { + "type": "string" + }, + "token": { + "anyOf": [ + { + "description": "The project's inputs, deflated and base64url-encoded with a format version and a CRC-32 check (cqp1.…). Compact, not encrypted: anyone who has it can read it.", + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "token", + "format", + "note" + ], + "type": "object" + } + }, + "required": [ + "engine", + "file", + "project", + "howToImport", + "licence", + "notice" + ], + "type": "object" + }, + { + "properties": { + "citation": { + "description": "The one citation line, built from the answer's own data.", + "type": "string" + }, + "detail": { + "const": "summary" + }, + "lines": { + "description": "The result lines, as the report's table gives them.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "more": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notes": { + "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", + "items": { + "type": "string" + }, + "type": "array" + }, + "open": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "detail", + "tool", + "title", + "lines", + "notes", + "citation", + "url", + "open", + "more" + ], + "type": "object" + } +]
- Changed
create_project_file_from_plan1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "drawing": { - "properties": { - "carried": { - "type": "boolean" - }, - "note": { - "type": "string" - } - }, - "required": [ - "carried" - ], - "type": "object" - }, - "engine": { - "type": "object" - }, - "file": { - "properties": { - "content": { - "properties": { - "exportedAt": { - "type": "string" - }, - "magic": { - "const": "craftquantities.backup" - }, - "stores": { - "type": "object" - }, - "v": { - "type": "integer" - } - }, - "required": [ - "magic", - "v", - "exportedAt", - "stores" - ], - "type": "object" - }, - "filename": { - "type": "string" - }, - "mediaType": { - "const": "application/json" - } - }, - "required": [ - "filename", - "mediaType", - "content" - ], - "type": "object" - }, - "howToImport": { - "type": "string" - }, - "licence": { - "properties": { - "attribution": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "name", - "url", - "attribution" - ], - "type": "object" - }, - "notice": { - "type": "string" - }, - "project": { - "properties": { - "lines": { - "items": { - "required": [ - "label", - "quantity", - "unit", - "from" - ], - "type": "object" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "system": { - "enum": [ - "metric", - "imperial" - ] - } - }, - "required": [ - "name", - "system", - "lines" - ], - "type": "object" - } - }, - "required": [ - "engine", - "file", - "project", - "howToImport", - "licence", - "notice" - ], - "type": "object" - }, - { - "properties": { - "citation": { - "description": "The one citation line, built from the answer's own data.", - "type": "string" - }, - "detail": { - "const": "summary" - }, - "lines": { - "description": "The result lines, as the report's table gives them.", - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "more": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notes": { - "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", - "items": { - "type": "string" - }, - "type": "array" - }, - "open": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "detail", - "tool", - "title", - "lines", - "notes", - "citation", - "url", - "open", - "more" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "drawing": { + "properties": { + "carried": { + "type": "boolean" + }, + "note": { + "type": "string" + } + }, + "required": [ + "carried" + ], + "type": "object" + }, + "engine": { + "type": "object" + }, + "file": { + "properties": { + "content": { + "properties": { + "exportedAt": { + "type": "string" + }, + "magic": { + "const": "craftquantities.backup" + }, + "stores": { + "type": "object" + }, + "v": { + "type": "integer" + } + }, + "required": [ + "magic", + "v", + "exportedAt", + "stores" + ], + "type": "object" + }, + "filename": { + "type": "string" + }, + "mediaType": { + "const": "application/json" + } + }, + "required": [ + "filename", + "mediaType", + "content" + ], + "type": "object" + }, + "howToImport": { + "type": "string" + }, + "licence": { + "properties": { + "attribution": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "url", + "attribution" + ], + "type": "object" + }, + "notice": { + "type": "string" + }, + "project": { + "properties": { + "lines": { + "items": { + "required": [ + "label", + "quantity", + "unit", + "from" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "system": { + "enum": [ + "metric", + "imperial" + ] + } + }, + "required": [ + "name", + "system", + "lines" + ], + "type": "object" + }, + "state": { + "properties": { + "characters": { + "type": "integer" + }, + "format": { + "description": "The token's format and version.", + "type": "string" + }, + "link": { + "description": "Opens the project on the site from the token, carried in the address fragment, which a browser does not send to any server.", + "type": "string" + }, + "note": { + "type": "string" + }, + "token": { + "anyOf": [ + { + "description": "The project's inputs, deflated and base64url-encoded with a format version and a CRC-32 check (cqp1.…). Compact, not encrypted: anyone who has it can read it.", + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "token", + "format", + "note" + ], + "type": "object" + } + }, + "required": [ + "engine", + "file", + "project", + "howToImport", + "licence", + "notice" + ], + "type": "object" + }, + { + "properties": { + "citation": { + "description": "The one citation line, built from the answer's own data.", + "type": "string" + }, + "detail": { + "const": "summary" + }, + "lines": { + "description": "The result lines, as the report's table gives them.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "more": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notes": { + "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", + "items": { + "type": "string" + }, + "type": "array" + }, + "open": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "detail", + "tool", + "title", + "lines", + "notes", + "citation", + "url", + "open", + "more" + ], + "type": "object" + } +]
- Changed
create_project_file_from_takeoffs1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "drawing": { - "properties": { - "carried": { - "type": "boolean" - }, - "note": { - "type": "string" - } - }, - "required": [ - "carried" - ], - "type": "object" - }, - "engine": { - "type": "object" - }, - "file": { - "properties": { - "content": { - "properties": { - "exportedAt": { - "type": "string" - }, - "magic": { - "const": "craftquantities.backup" - }, - "stores": { - "type": "object" - }, - "v": { - "type": "integer" - } - }, - "required": [ - "magic", - "v", - "exportedAt", - "stores" - ], - "type": "object" - }, - "filename": { - "type": "string" - }, - "mediaType": { - "const": "application/json" - } - }, - "required": [ - "filename", - "mediaType", - "content" - ], - "type": "object" - }, - "howToImport": { - "type": "string" - }, - "licence": { - "properties": { - "attribution": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "name", - "url", - "attribution" - ], - "type": "object" - }, - "notice": { - "type": "string" - }, - "project": { - "properties": { - "lines": { - "items": { - "required": [ - "label", - "quantity", - "unit", - "from" - ], - "type": "object" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "system": { - "enum": [ - "metric", - "imperial" - ] - } - }, - "required": [ - "name", - "system", - "lines" - ], - "type": "object" - } - }, - "required": [ - "engine", - "file", - "project", - "howToImport", - "licence", - "notice" - ], - "type": "object" - }, - { - "properties": { - "citation": { - "description": "The one citation line, built from the answer's own data.", - "type": "string" - }, - "detail": { - "const": "summary" - }, - "lines": { - "description": "The result lines, as the report's table gives them.", - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "more": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notes": { - "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", - "items": { - "type": "string" - }, - "type": "array" - }, - "open": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "detail", - "tool", - "title", - "lines", - "notes", - "citation", - "url", - "open", - "more" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "drawing": { + "properties": { + "carried": { + "type": "boolean" + }, + "note": { + "type": "string" + } + }, + "required": [ + "carried" + ], + "type": "object" + }, + "engine": { + "type": "object" + }, + "file": { + "properties": { + "content": { + "properties": { + "exportedAt": { + "type": "string" + }, + "magic": { + "const": "craftquantities.backup" + }, + "stores": { + "type": "object" + }, + "v": { + "type": "integer" + } + }, + "required": [ + "magic", + "v", + "exportedAt", + "stores" + ], + "type": "object" + }, + "filename": { + "type": "string" + }, + "mediaType": { + "const": "application/json" + } + }, + "required": [ + "filename", + "mediaType", + "content" + ], + "type": "object" + }, + "howToImport": { + "type": "string" + }, + "licence": { + "properties": { + "attribution": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "url", + "attribution" + ], + "type": "object" + }, + "notice": { + "type": "string" + }, + "project": { + "properties": { + "lines": { + "items": { + "required": [ + "label", + "quantity", + "unit", + "from" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "system": { + "enum": [ + "metric", + "imperial" + ] + } + }, + "required": [ + "name", + "system", + "lines" + ], + "type": "object" + }, + "state": { + "properties": { + "characters": { + "type": "integer" + }, + "format": { + "description": "The token's format and version.", + "type": "string" + }, + "link": { + "description": "Opens the project on the site from the token, carried in the address fragment, which a browser does not send to any server.", + "type": "string" + }, + "note": { + "type": "string" + }, + "token": { + "anyOf": [ + { + "description": "The project's inputs, deflated and base64url-encoded with a format version and a CRC-32 check (cqp1.…). Compact, not encrypted: anyone who has it can read it.", + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "token", + "format", + "note" + ], + "type": "object" + } + }, + "required": [ + "engine", + "file", + "project", + "howToImport", + "licence", + "notice" + ], + "type": "object" + }, + { + "properties": { + "citation": { + "description": "The one citation line, built from the answer's own data.", + "type": "string" + }, + "detail": { + "const": "summary" + }, + "lines": { + "description": "The result lines, as the report's table gives them.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "more": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notes": { + "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", + "items": { + "type": "string" + }, + "type": "array" + }, + "open": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "detail", + "tool", + "title", + "lines", + "notes", + "citation", + "url", + "open", + "more" + ], + "type": "object" + } +]
- Changed
create_supplier_quote_request1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "csv": { - "required": [ - "filename", - "mediaType", - "content" - ], - "type": "object" - }, - "currency": { - "type": "string" - }, - "dropped": { - "type": "integer" - }, - "engine": { - "type": "object" - }, - "file": { - "required": [ - "filename", - "mediaType", - "content" - ], - "type": "object" - }, - "howToImport": { - "type": "string" - }, - "howToSend": { - "type": "string" - }, - "licence": { - "properties": { - "attribution": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "name", - "url", - "attribution" - ], - "type": "object" - }, - "link": { - "description": "The site's request link: the merchant opens it, prices it in their own browser and sends a reply link back.", - "type": "string" - }, - "links": { - "required": [ - "rfq", - "project" - ], - "type": "object" - }, - "markdown": { - "description": "The request, to paste into a message.", - "type": "string" - }, - "notice": { - "type": "string" - }, - "project": { - "type": "string" - }, - "requestFile": { - "required": [ - "filename", - "mediaType", - "content" - ], - "type": "object" - }, - "rows": { - "items": { - "properties": { - "label": { - "type": "string" - }, - "packName": { - "type": "string" - }, - "packSize": { - "type": "number" - }, - "packs": { - "type": "number" - }, - "quantity": { - "type": "number" - }, - "unit": { - "type": "string" - } - }, - "required": [ - "label", - "quantity", - "unit" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "engine", - "project", - "currency", - "rows", - "markdown", - "csv", - "link", - "howToSend", - "requestFile", - "file", - "howToImport", - "links", - "licence", - "notice" - ], - "type": "object" - }, - { - "properties": { - "citation": { - "description": "The one citation line, built from the answer's own data.", - "type": "string" - }, - "detail": { - "const": "summary" - }, - "lines": { - "description": "The result lines, as the report's table gives them.", - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "more": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notes": { - "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", - "items": { - "type": "string" - }, - "type": "array" - }, - "open": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "detail", - "tool", - "title", - "lines", - "notes", - "citation", - "url", - "open", - "more" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "csv": { + "required": [ + "filename", + "mediaType", + "content" + ], + "type": "object" + }, + "currency": { + "type": "string" + }, + "dropped": { + "type": "integer" + }, + "engine": { + "type": "object" + }, + "file": { + "required": [ + "filename", + "mediaType", + "content" + ], + "type": "object" + }, + "howToImport": { + "type": "string" + }, + "howToSend": { + "type": "string" + }, + "licence": { + "properties": { + "attribution": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "url", + "attribution" + ], + "type": "object" + }, + "link": { + "description": "The site's request link: the merchant opens it, prices it in their own browser and sends a reply link back.", + "type": "string" + }, + "links": { + "required": [ + "rfq", + "project" + ], + "type": "object" + }, + "markdown": { + "description": "The request, to paste into a message.", + "type": "string" + }, + "notice": { + "type": "string" + }, + "project": { + "type": "string" + }, + "requestFile": { + "properties": { + "schema": { + "description": "The open JSON Schema the request file follows, for a supplier's own software.", + "type": "string" + } + }, + "required": [ + "filename", + "mediaType", + "content" + ], + "type": "object" + }, + "rows": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "packName": { + "type": "string" + }, + "packSize": { + "type": "number" + }, + "packs": { + "type": "number" + }, + "quantity": { + "type": "number" + }, + "unit": { + "type": "string" + } + }, + "required": [ + "label", + "quantity", + "unit" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "engine", + "project", + "currency", + "rows", + "markdown", + "csv", + "link", + "howToSend", + "requestFile", + "file", + "howToImport", + "links", + "licence", + "notice" + ], + "type": "object" + }, + { + "properties": { + "citation": { + "description": "The one citation line, built from the answer's own data.", + "type": "string" + }, + "detail": { + "const": "summary" + }, + "lines": { + "description": "The result lines, as the report's table gives them.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "more": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notes": { + "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", + "items": { + "type": "string" + }, + "type": "array" + }, + "open": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "detail", + "tool", + "title", + "lines", + "notes", + "citation", + "url", + "open", + "more" + ], + "type": "object" + } +]
- Added
export_drawing - Added
get_benchmark - Added
layout_reinforcement - Added
measure_sketch - Added
optimise_cuts - Added
plan_programme - Added
resolve_id - Changed
translate_term2 fields changed- changed
Input schema / properties / term / descriptionPrevious value: -"A trade word or phrase as one market says it: \"plasterboard\", \"casing\", \"skirting\", \"eavestrough\"."New value: +"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\"." - changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "citation": { - "properties": { - "accessDate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "author": { - "type": "string" - }, - "formats": { - "properties": { - "apa": { - "type": "string" - }, - "bibtex": { - "type": "string" - }, - "harvard": { - "type": "string" - }, - "plain": { - "type": "string" - } - }, - "required": [ - "plain", - "apa", - "harvard", - "bibtex" - ], - "type": "object" - }, - "sourcesChecked": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "url": { - "type": "string" - }, - "version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "author", - "title", - "url", - "formats", - "accessDate" - ], - "type": "object" - }, - "concepts": { - "items": { - "properties": { - "calculators": { - "type": "array" - }, - "concept": { - "type": "string" - }, - "confusions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "definition": { - "type": "string" - }, - "matchedAs": { - "items": { - "required": [ - "market", - "as" - ], - "type": "object" - }, - "type": "array" - }, - "names": { - "items": { - "properties": { - "alsoCalled": { - "items": { - "type": "string" - }, - "type": "array" - }, - "exactness": { - "enum": [ - "identical", - "close", - "false-friend", - "absent" - ] - }, - "market": { - "type": "string" - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "term": { - "type": "string" - } - }, - "required": [ - "market", - "term", - "alsoCalled", - "exactness", - "note" - ], - "type": "object" - }, - "type": "array" - }, - "slug": { - "type": "string" - }, - "translation": { - "type": "object" - }, - "url": { - "type": "string" - }, - "warnings": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "slug", - "concept", - "url", - "definition", - "matchedAs", - "names", - "warnings", - "calculators", - "confusions" - ], - "type": "object" - }, - "type": "array" - }, - "engine": { - "type": "object" - }, - "from": { - "type": "string" - }, - "licence": { - "properties": { - "attribution": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "name", - "url", - "attribution" - ], - "type": "object" - }, - "links": { - "required": [ - "glossary" - ], - "type": "object" - }, - "matchedBy": { - "enum": [ - "term", - "search" - ] - }, - "none": { - "type": "string" - }, - "note": { - "type": "string" - }, - "term": { - "type": "string" - }, - "to": { - "type": "string" - } - }, - "required": [ - "engine", - "term", - "matchedBy", - "concepts", - "links", - "citation", - "licence" - ], - "type": "object" - }, - { - "properties": { - "citation": { - "description": "The one citation line, built from the answer's own data.", - "type": "string" - }, - "detail": { - "const": "summary" - }, - "lines": { - "description": "The result lines, as the report's table gives them.", - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "more": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notes": { - "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", - "items": { - "type": "string" - }, - "type": "array" - }, - "open": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "detail", - "tool", - "title", - "lines", - "notes", - "citation", - "url", - "open", - "more" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "citation": { + "properties": { + "accessDate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "author": { + "type": "string" + }, + "formats": { + "properties": { + "apa": { + "type": "string" + }, + "bibtex": { + "type": "string" + }, + "harvard": { + "type": "string" + }, + "plain": { + "type": "string" + } + }, + "required": [ + "plain", + "apa", + "harvard", + "bibtex" + ], + "type": "object" + }, + "sourcesChecked": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "author", + "title", + "url", + "formats", + "accessDate" + ], + "type": "object" + }, + "concepts": { + "items": { + "properties": { + "calculators": { + "type": "array" + }, + "concept": { + "type": "string" + }, + "confusions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "definition": { + "type": "string" + }, + "matchedAs": { + "items": { + "required": [ + "market", + "as" + ], + "type": "object" + }, + "type": "array" + }, + "names": { + "items": { + "properties": { + "alsoCalled": { + "items": { + "type": "string" + }, + "type": "array" + }, + "exactness": { + "enum": [ + "identical", + "close", + "false-friend", + "absent" + ] + }, + "market": { + "type": "string" + }, + "note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "term": { + "type": "string" + } + }, + "required": [ + "market", + "term", + "alsoCalled", + "exactness", + "note" + ], + "type": "object" + }, + "type": "array" + }, + "slug": { + "type": "string" + }, + "translation": { + "type": "object" + }, + "url": { + "type": "string" + }, + "warnings": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "slug", + "concept", + "url", + "definition", + "matchedAs", + "names", + "warnings", + "calculators", + "confusions" + ], + "type": "object" + }, + "type": "array" + }, + "documents": { + "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.", + "properties": { + "adoption": { + "type": "string" + }, + "decidedBy": { + "type": "string" + }, + "for": { + "description": "The calculator whose sources, or the document the glossary names for the concept, the subject was read from.", + "type": "string" + }, + "market": { + "type": "string" + }, + "page": { + "type": "string" + }, + "place": { + "type": "string" + }, + "subjects": { + "items": { + "properties": { + "documents": { + "items": { + "type": "string" + }, + "type": "array" + }, + "subject": { + "type": "string" + } + }, + "required": [ + "subject", + "documents" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "market", + "place", + "subjects", + "adoption", + "decidedBy", + "page" + ], + "type": "object" + }, + "engine": { + "type": "object" + }, + "from": { + "type": "string" + }, + "licence": { + "properties": { + "attribution": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "url", + "attribution" + ], + "type": "object" + }, + "links": { + "required": [ + "glossary" + ], + "type": "object" + }, + "matched": { + "items": { + "properties": { + "as": { + "enum": [ + "term", + "also called" + ] + }, + "concept": { + "type": "string" + }, + "market": { + "type": "string" + }, + "name": { + "description": "The glossary's own name that matched.", + "type": "string" + } + }, + "required": [ + "concept", + "name", + "market", + "as" + ], + "type": "object" + }, + "type": "array" + }, + "matchedBy": { + "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.", + "enum": [ + "term", + "variant", + "within", + "fuzzy", + "search" + ] + }, + "none": { + "type": "string" + }, + "note": { + "type": "string" + }, + "readAs": { + "type": "string" + }, + "term": { + "type": "string" + }, + "to": { + "type": "string" + }, + "unitSystems": { + "description": "Each named market's primary measurement system, as the site's market registry holds it.", + "items": { + "properties": { + "market": { + "type": "string" + }, + "system": { + "enum": [ + "metric", + "imperial" + ] + } + }, + "required": [ + "market", + "system" + ], + "type": "object" + }, + "type": "array" + }, + "unitTraps": { + "items": { + "properties": { + "bags": { + "items": { + "properties": { + "calculator": { + "type": "object" + }, + "imperial": { + "items": { + "type": "string" + }, + "type": "array" + }, + "input": { + "type": "string" + }, + "metric": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "calculator", + "input", + "metric", + "imperial" + ], + "type": "object" + }, + "type": "array" + }, + "conversions": { + "items": { + "properties": { + "by": { + "description": "The engine's unit conversion that gave the result.", + "type": "string" + }, + "definition": { + "description": "The defining relation, where one side is not a unit of the conversion table.", + "type": "string" + }, + "factor": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "from": { + "type": "string" + }, + "result": { + "type": "number" + }, + "to": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value", + "from", + "to", + "result", + "by" + ], + "type": "object" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "markets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "page": { + "type": "string" + }, + "says": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "id", + "title", + "says", + "markets", + "conversions", + "page" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "engine", + "term", + "matchedBy", + "concepts", + "links", + "citation", + "licence" + ], + "type": "object" + }, + { + "properties": { + "citation": { + "description": "The one citation line, built from the answer's own data.", + "type": "string" + }, + "detail": { + "const": "summary" + }, + "lines": { + "description": "The result lines, as the report's table gives them.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "more": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notes": { + "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", + "items": { + "type": "string" + }, + "type": "array" + }, + "open": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "detail", + "tool", + "title", + "lines", + "notes", + "citation", + "url", + "open", + "more" + ], + "type": "object" + } +]
- Added
update_project
13 tool updates
- Removed
build_project_file - Changed
calculate2 fields changed- changed
Input schema / properties / inputs / descriptionPrevious value: -"Input id → value. 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."New value: +"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." - changed
Input schema / properties / slug / descriptionPrevious value: -"A calculator slug, such as concrete-calculator."New value: +"The calculator's slug, such as concrete-calculator."
- Added
create_project_file_from_calculations - Added
create_project_file_from_drawing - Added
create_project_file_from_house - Added
create_project_file_from_plan - Added
create_project_file_from_takeoffs - Added
create_supplier_quote_request - Changed
get_calculator2 fields changed- changed
Input schema / properties / slug / descriptionPrevious value: -"A calculator slug, such as concrete-calculator."New value: +"The calculator's slug, such as concrete-calculator." - changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "calculator": { - "properties": { - "category": { - "type": "string" - }, - "description": { - "type": "string" - }, - "json": { - "description": "The calculator's static API document, with its test vectors.", - "type": "string" - }, - "lastVerified": { - "description": "The date the calculator's sources were last checked.", - "type": "string" - }, - "slug": { - "type": "string" - }, - "title": { - "type": "string" - }, - "url": { - "description": "The calculator's page on craftquantities.com.", - "type": "string" - }, - "version": { - "description": "The calculator's own version; a result names the calculator that produced it.", - "type": "string" - } - }, - "required": [ - "slug", - "title", - "category", - "version", - "lastVerified", - "url", - "json" - ], - "type": "object" - }, - "changelog": { - "items": { - "properties": { - "change": { - "type": "string" - }, - "date": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - }, - "citation": { - "properties": { - "accessDate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "author": { - "type": "string" - }, - "formats": { - "properties": { - "apa": { - "type": "string" - }, - "bibtex": { - "type": "string" - }, - "harvard": { - "type": "string" - }, - "plain": { - "type": "string" - } - }, - "required": [ - "plain", - "apa", - "harvard", - "bibtex" - ], - "type": "object" - }, - "sourcesChecked": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "url": { - "type": "string" - }, - "version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "author", - "title", - "url", - "formats", - "accessDate" - ], - "type": "object" - }, - "inputs": { - "items": { - "properties": { - "acceptedUnits": { - "items": { - "type": "string" - }, - "type": "array" - }, - "baseUnit": { - "type": "string" - }, - "dimension": { - "type": "string" - }, - "help": { - "type": "string" - }, - "id": { - "type": "string" - }, - "label": { - "type": "string" - }, - "money": { - "enum": [ - "rate", - "amount" - ] - }, - "opening": { - "required": [ - "metric", - "imperial" - ], - "type": "object" - }, - "options": { - "items": { - "properties": { - "label": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "required": [ - "value", - "label" - ], - "type": "object" - }, - "type": "array" - }, - "range": { - "properties": { - "max": { - "type": "number" - }, - "min": { - "type": "number" - } - }, - "type": "object" - }, - "type": { - "enum": [ - "number", - "select" - ] - } - }, - "required": [ - "id", - "label", - "type", - "help", - "opening" - ], - "type": "object" - }, - "type": "array" - }, - "licence": { - "properties": { - "attribution": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "name", - "url", - "attribution" - ], - "type": "object" - }, - "related": { - "items": { - "type": "string" - }, - "type": "array" - }, - "sources": { - "items": { - "properties": { - "label": { - "description": "The source as the calculator cites it.", - "type": "string" - }, - "references": { - "items": { - "properties": { - "body": { - "type": "string" - }, - "document": { - "type": "string" - }, - "edition": { - "type": "string" - }, - "kind": { - "enum": [ - "code", - "standard" - ] - }, - "section": { - "type": "string" - } - }, - "required": [ - "kind", - "document" - ], - "type": "object" - }, - "type": "array" - }, - "url": { - "description": "Only where the calculator gives one; none is invented.", - "type": "string" - } - }, - "required": [ - "label" - ], - "type": "object" - }, - "type": "array" - }, - "standards": { - "items": { - "properties": { - "page": { - "type": "string" - }, - "publisher": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "title", - "page" - ], - "type": "object" - }, - "type": "array" - }, - "testCases": { - "type": "integer" - } - }, - "required": [ - "calculator", - "inputs", - "sources", - "standards", - "citation", - "licence" - ], - "type": "object" - }, - { - "properties": { - "citation": { - "description": "The one citation line, built from the answer's own data.", - "type": "string" - }, - "detail": { - "const": "summary" - }, - "lines": { - "description": "The result lines, as the report's table gives them.", - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "more": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "notes": { - "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", - "items": { - "type": "string" - }, - "type": "array" - }, - "open": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "title": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "detail", - "tool", - "title", - "lines", - "notes", - "citation", - "url", - "open", - "more" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "calculator": { + "properties": { + "category": { + "type": "string" + }, + "description": { + "type": "string" + }, + "json": { + "description": "The calculator's static API document, with its test vectors.", + "type": "string" + }, + "lastVerified": { + "description": "The date the calculator's sources were last checked.", + "type": "string" + }, + "slug": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "description": "The calculator's page on craftquantities.com.", + "type": "string" + }, + "version": { + "description": "The calculator's own version; a result names the calculator that produced it.", + "type": "string" + } + }, + "required": [ + "slug", + "title", + "category", + "version", + "lastVerified", + "url", + "json" + ], + "type": "object" + }, + "changelog": { + "items": { + "properties": { + "change": { + "type": "string" + }, + "date": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "citation": { + "properties": { + "accessDate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "author": { + "type": "string" + }, + "formats": { + "properties": { + "apa": { + "type": "string" + }, + "bibtex": { + "type": "string" + }, + "harvard": { + "type": "string" + }, + "plain": { + "type": "string" + } + }, + "required": [ + "plain", + "apa", + "harvard", + "bibtex" + ], + "type": "object" + }, + "sourcesChecked": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "author", + "title", + "url", + "formats", + "accessDate" + ], + "type": "object" + }, + "inputs": { + "items": { + "properties": { + "acceptedUnits": { + "items": { + "type": "string" + }, + "type": "array" + }, + "baseUnit": { + "type": "string" + }, + "dimension": { + "type": "string" + }, + "help": { + "type": "string" + }, + "id": { + "type": "string" + }, + "label": { + "type": "string" + }, + "money": { + "enum": [ + "rate", + "amount" + ] + }, + "opening": { + "required": [ + "metric", + "imperial" + ], + "type": "object" + }, + "options": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value", + "label" + ], + "type": "object" + }, + "type": "array" + }, + "range": { + "properties": { + "max": { + "type": "number" + }, + "min": { + "type": "number" + } + }, + "type": "object" + }, + "type": { + "enum": [ + "number", + "select" + ] + } + }, + "required": [ + "id", + "label", + "type", + "help", + "opening" + ], + "type": "object" + }, + "type": "array" + }, + "licence": { + "properties": { + "attribution": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "url", + "attribution" + ], + "type": "object" + }, + "related": { + "items": { + "type": "string" + }, + "type": "array" + }, + "testCases": { + "type": "integer" + } + }, + "required": [ + "calculator", + "inputs", + "citation", + "licence" + ], + "type": "object" + }, + { + "properties": { + "citation": { + "description": "The one citation line, built from the answer's own data.", + "type": "string" + }, + "detail": { + "const": "summary" + }, + "lines": { + "description": "The result lines, as the report's table gives them.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "more": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "notes": { + "description": "What a professional must decide, when to call one, a false-friend warning, that adoption is local: kept in every summary.", + "items": { + "type": "string" + }, + "type": "array" + }, + "open": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "detail", + "tool", + "title", + "lines", + "notes", + "citation", + "url", + "open", + "more" + ], + "type": "object" + } +]
- Changed
get_sources1 field changed- changed
Input schema / properties / slug / descriptionPrevious value: -"A calculator slug, such as concrete-calculator."New value: +"The calculator's slug, such as concrete-calculator."
- Changed
open_in_site_link2 fields changed- changed
Input schema / properties / inputs / descriptionPrevious value: -"Input id → value. 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."New value: +"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." - changed
Input schema / properties / slug / descriptionPrevious value: -"A calculator slug, such as concrete-calculator."New value: +"The calculator's slug, such as concrete-calculator."
- Changed
search1 field changed- removed
Output schema / properties / nextRemoved value: -{ - "description": "Where the best result is a calculator: its slug, the inputs it takes and the values its page opens on.", - "properties": { - "how": { - "type": "string" - }, - "inputs": { - "items": { - "required": [ - "id", - "label", - "metric", - "imperial" - ], - "type": "object" - }, - "type": "array" - }, - "slug": { - "type": "string" - }, - "title": { - "type": "string" - }, - "tool": { - "const": "calculate" - } - }, - "required": [ - "tool", - "slug", - "title", - "inputs", - "how" - ], - "type": "object" -}
- Removed
supplier_request
24 tool updates
- First observed
build_project_file - First observed
calculate - First observed
check_quote - First observed
convert_units - First observed
create_drawing - First observed
diagnose_symptom - First observed
estimate_house - First observed
fetch - First observed
get_calculator - First observed
get_example - First observed
get_planner - First observed
get_sources - First observed
get_takeoff - First observed
import_quote - First observed
market_documents - First observed
open_in_site_link - First observed
plan_project - First observed
plan_room - First observed
run_example - First observed
run_takeoff - First observed
search - First observed
solve_backwards - First observed
supplier_request - First observed
translate_term
Related MCP Connectors
Auditable construction takeoffs with locked waste and conservative purchase rounding.
Plans flooring, trim and wallpaper orders from computed cut layouts. Free, read-only, no account.
Construction takeoff and estimating for AI agents. Measure a drawing PDF, export a priced estimate.
AI takeoff for construction: turn PDF blueprints into structured, traceable quantities.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceRuns 15 construction takeoff calculators — concrete, rebar, gravel, fill dirt, sand, topsoil, asphalt, lumber, roofing, fence, duct and paver base — directly from an MCP client, alongside a tool that lists them and a searchable table of source-cited estimating constants. Each call is computed by the bundled TakeoffMetric engine and returns structured quantities, order amounts, costs, warnings and assumptions.42 npm-
- FlicenseNot gradedqualityDmaintenanceProvides construction cost estimation tools using data from a public Google Sheet for items like concrete, framing, and electrical. It allows users to search items, filter by category, and calculate total project costs including labor and material expenses.-
- AlicenseAqualityBmaintenanceEnables construction teams to create local projects, record sourced field evidence, run deterministic quantity calculations, and draft daily logs, estimates, and change orders with visible assumptions and human approval gates. Keeps all data local and portable with no external side effects.10Apache 2.0

RoofMeasure MCPofficial
AlicenseAqualityBmaintenanceProvides free EagleView-style satellite roof measurements and modular Xactimate-style estimating from Google Solar API data, enabling contractors to generate reports and estimates from any address.3MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.