Skip to main content
Glama

takeoff_summary

Compute per-condition and grand totals for floor, wall, border, and area takeoffs, with and without waste, using the same rules as the report. Use it to get quantity numbers, not annotated drawings.

Instructions

Per-condition totals (floor/wall/border SF, LF, EA, SY, with and without waste) plus grand totals — the Report's numbers, computed by the same rules. Numbers only: the deliverable that SHOWS the work on the drawings is export_marked_pdf. Coordinates are image px at render scale 2.0: PDF pt × 2, origin top-left, y down (the browser canvas's native space). Sheet payloads carry dims in both px and pt.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "takeoff_summary"
  }
}

Input Schema

NameRequiredDescriptionDefault

No arguments

Output Schema

NameRequiredDescriptionDefault
totalsYes
proposalsNoThe proposal ledger (#365): per batch, how many shapes are still pending, how many the estimator accepted, whether it was withdrawn, and which batch new commits attach to (current). Present only when a proposal exists
conditionsYes
shared_floor_sfYesScope collision (#366): floor claimed by more than one shape across the whole takeoff, counted once per cell (Σ areas − union), in SF through each sheet's scale. Has to read 0 before a total means anything — scope_duplicates names the pairs
scale_unconfirmedNoSheets whose scale is agent-set and no human has confirmed — these totals stand on an unverified scale; verify against a stated dimension or confirm in the canvas
shared_floor_unmeasuredNoFloor shapes the collision check could not measure (unscaled sheet, degenerate ring) — left OUT of shared_floor_sf rather than counted as zero; present only when any
proposed_condition_editsNoPending condition-edit diffs (#365) beside the current knobs. The rows above are the CURRENT values — nothing changes until the estimator accepts. Present only when any are pending

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed25 schema fields changedv0.1.31
    • changedOutput schema / properties / conditions / items / additionalProperties
      Previous value: -trueNew value: +{}
    • addedOutput schema / properties / conditions / items / properties / shape_count / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / conditions / items / properties / shape_count / minimum
      Added value: +-9007199254740991
    • addedOutput schema / properties / proposals / items / properties / accepted / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / proposals / items / properties / accepted / minimum
      Added value: +-9007199254740991
    • addedOutput schema / properties / proposals / items / properties / pending / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / proposals / items / properties / pending / minimum
      Added value: +-9007199254740991
    • changedOutput schema / properties / proposed_condition_edits / items / properties / current / additionalProperties
      Previous value: -trueNew value: +{}
    • changedOutput schema / properties / proposed_condition_edits / items / properties / current / properties / roll_setup / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "properties": {},
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {},
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / proposed_condition_edits / items / properties / proposed / additionalProperties
      Previous value: -trueNew value: +{}
    • removedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / drop_ft / $ref
      Removed value: -"#/properties/proposed_condition_edits/items/properties/current/properties/drop_ft"
    • addedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / drop_ft / type
      Added value: +"number"
    • removedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / finish_tag / $ref
      Removed value: -"#/properties/proposed_condition_edits/items/properties/current/properties/finish_tag"
    • addedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / finish_tag / type
      Added value: +"string"
    • removedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / height_ft / $ref
      Removed value: -"#/properties/proposed_condition_edits/items/properties/current/properties/height_ft"
    • addedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / height_ft / type
      Added value: +"number"
    • removedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / multiplier / $ref
      Removed value: -"#/properties/proposed_condition_edits/items/properties/current/properties/multiplier"
    • addedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / multiplier / type
      Added value: +"number"
    • removedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / rise_ft / $ref
      Removed value: -"#/properties/proposed_condition_edits/items/properties/current/properties/rise_ft"
    • addedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / rise_ft / type
      Added value: +"number"
    • removedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / roll_setup / $ref
      Removed value: -"#/properties/proposed_condition_edits/items/properties/current/properties/roll_setup"
    • addedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / roll_setup / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {},
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / waste_pct / $ref
      Removed value: -"#/properties/proposed_condition_edits/items/properties/current/properties/waste_pct"
    • addedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / waste_pct / type
      Added value: +"number"
    • changedOutput schema / properties / totals / additionalProperties
      Previous value: -trueNew value: +{}
  2. Changed4 schema fields changedv0.1.25
    • addedOutput schema / properties / proposed_condition_edits / items / properties / current / properties / drop_ft
      Added value: +{
      +  "type": "number"
      +}
    • addedOutput schema / properties / proposed_condition_edits / items / properties / current / properties / rise_ft
      Added value: +{
      +  "type": "number"
      +}
    • addedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / drop_ft
      Added value: +{
      +  "$ref": "#/properties/proposed_condition_edits/items/properties/current/properties/drop_ft"
      +}
    • addedOutput schema / properties / proposed_condition_edits / items / properties / proposed / properties / rise_ft
      Added value: +{
      +  "$ref": "#/properties/proposed_condition_edits/items/properties/current/properties/rise_ft"
      +}
  3. Changed5 schema fields changedv0.1.21
    • addedOutput schema / properties / proposals
      Added value: +{
      +  "description": "The proposal ledger (#365): per batch, how many shapes are still pending, how many the estimator accepted, whether it was withdrawn, and which batch new commits attach to (current). Present only when a proposal exists",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "accepted": {
      +        "description": "Shapes from the batch the estimator already accepted — ink, outside every agent verb",
      +        "type": "integer"
      +      },
      +      "current": {
      +        "const": true,
      +        "description": "New agent commits attach to this batch",
      +        "type": "boolean"
      +      },
      +      "label": {
      +        "type": "string"
      +      },
      +      "pending": {
      +        "description": "Shapes attached to the batch and not yet affirmed by a human",
      +        "type": "integer"
      +      },
      +      "proposal_id": {
      +        "type": "string"
      +      },
      +      "rationale": {
      +        "type": "string"
      +      },
      +      "withdrawn": {
      +        "const": true,
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "proposal_id",
      +      "label",
      +      "rationale",
      +      "pending",
      +      "accepted"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / proposed_condition_edits
      Added value: +{
      +  "description": "Pending condition-edit diffs (#365) beside the current knobs. The rows above are the CURRENT values — nothing changes until the estimator accepts. Present only when any are pending",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "condition": {
      +        "type": "string"
      +      },
      +      "condition_id": {
      +        "type": "string"
      +      },
      +      "current": {
      +        "additionalProperties": true,
      +        "description": "The condition's knobs as they stand — what every total above is computed from",
      +        "properties": {
      +          "finish_tag": {
      +            "type": "string"
      +          },
      +          "height_ft": {
      +            "type": "number"
      +          },
      +          "multiplier": {
      +            "type": "number"
      +          },
      +          "roll_setup": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": true,
      +                "properties": {},
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "waste_pct": {
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "proposal_id": {
      +        "type": "string"
      +      },
      +      "proposed": {
      +        "additionalProperties": true,
      +        "description": "Only the fields that would change",
      +        "properties": {
      +          "finish_tag": {
      +            "$ref": "#/properties/proposed_condition_edits/items/properties/current/properties/finish_tag"
      +          },
      +          "height_ft": {
      +            "$ref": "#/properties/proposed_condition_edits/items/properties/current/properties/height_ft"
      +          },
      +          "multiplier": {
      +            "$ref": "#/properties/proposed_condition_edits/items/properties/current/properties/multiplier"
      +          },
      +          "roll_setup": {
      +            "$ref": "#/properties/proposed_condition_edits/items/properties/current/properties/roll_setup"
      +          },
      +          "waste_pct": {
      +            "$ref": "#/properties/proposed_condition_edits/items/properties/current/properties/waste_pct"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "proposed_at": {
      +        "type": "string"
      +      },
      +      "rationale": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "proposal_id",
      +      "condition",
      +      "condition_id",
      +      "current",
      +      "proposed",
      +      "rationale",
      +      "proposed_at"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / shared_floor_sf
      Added value: +{
      +  "description": "Scope collision (#366): floor claimed by more than one shape across the whole takeoff, counted once per cell (Σ areas − union), in SF through each sheet's scale. Has to read 0 before a total means anything — scope_duplicates names the pairs",
      +  "type": "number"
      +}
    • addedOutput schema / properties / shared_floor_unmeasured
      Added value: +{
      +  "description": "Floor shapes the collision check could not measure (unscaled sheet, degenerate ring) — left OUT of shared_floor_sf rather than counted as zero; present only when any",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "reason": {
      +        "type": "string"
      +      },
      +      "shape_id": {
      +        "type": "string"
      +      },
      +      "sheet_id": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "shape_id",
      +      "sheet_id",
      +      "reason"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "conditions",
      -  "totals"
      -]New value: +[
      +  "conditions",
      +  "totals",
      +  "shared_floor_sf"
      +]
  4. Changed1 schema field changedv0.1.16
    • addedOutput schema / properties / scale_unconfirmed
      Added value: +{
      +  "description": "Sheets whose scale is agent-set and no human has confirmed — these totals stand on an unverified scale; verify against a stated dimension or confirm in the canvas",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  5. Addedv0.1.5
  6. Removedv0.1.4
  7. Addedv0.1.2
  8. Removedv0.1.1
  9. First observed

TDQS

A3.9/5.0
Behavior4/5

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

No annotations are supplied, so the description carries the full burden, and it does disclose real behavior: the numbers are computed by the same rules as the Report, the output is data-only with no drawing annotation, and the payload uses image pixels at render scale 2.0 with a top-left origin and y-axis pointing down. It does not explicitly state that the call is side-effect free, which would matter given the missing readOnlyHint, but the zero-parameter signature and the 'numbers only' framing make the read-only nature evident.

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

Conciseness3/5

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

The purpose is front-loaded and the export_marked_pdf contrast lands early, which is good structure. However, the coordinate paragraph (px at render scale 2.0, PDF pt × 2, origin top-left, y down, sheet payloads carrying both units) is irrelevant to a tool that accepts no coordinates and appears to be carried over from a measuring or drawing tool. That paragraph is roughly 40% of the text and does not earn its place here.

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

Completeness4/5

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

For a zero-parameter read that returns an output schema, the definition is complete enough to call correctly: the agent knows what totals come back, in which units, and where to go for the visual deliverable. The irrelevant coordinate passage is noise rather than a gap, so it does not undermine completeness but does suggest the description was not tailored to this signature.

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

Parameters4/5

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

The input schema is an empty object with zero parameters, so there is nothing for the description to disambiguate. The baseline for a parameterless tool is 4, and the description correctly does not invent parameter guidance it cannot support.

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

Purpose4/5

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

The description states concretely what is returned: per-condition totals in floor/wall/border SF, LF, EA, SY, with and without waste, plus grand totals, and ties them to 'the Report's numbers.' It also distinguishes itself from export_marked_pdf by declaring itself 'numbers only.' It stops short of a 5 because the core is a noun phrase rather than a verb-led statement and the related siblings export_takeoff, export_report, and estimate_summary go unmentioned.

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

Usage Guidelines4/5

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

There is one explicit routing rule: for the deliverable that shows the work on the drawings, use export_marked_pdf instead. That gives the agent a clear alternative plus the condition selecting it, which is more than most definitions offer. The remaining export and estimate siblings are not differentiated, and there is no statement of when this tool should be skipped.

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