Skip to main content
Glama

set_pricing

Price estimate condition lines by unit — material on order quantity, labor on measured quantity — plus supporting-material rows. Clears to unentered or sets explicit $0 per line.

Instructions

Price one condition for the estimate — the canvas Estimate panel's rows. A condition has one estimate line per quantity kind it carries (its area, LF and EA — see estimate_summary); the first is its MAIN line. unit is what the main line is bought in (SF, SY, LF, EA). line picks WHICH line material and labor price: leave it out (or pass the main line's unit) for the main line; pass "LF", "EA" or "SF" (a second area line prices in SF) to price that other line — one call per line. material and labor are $ per that line's unit: material is priced on the ORDER quantity (waste applied — SY is the waste-adjusted SY), labor on the MEASURED quantity (no waste); EA carries no waste on either. materials prices the condition's supporting-material rows (from edit_materials) per THEIR unit (bag, pail, roll) — quantities are already whole packages. null clears a price back to "not entered"; 0 is an explicit $0 (owner-furnished material, labor-only scope). A bordered linear run's derived second line (its LF when the border SF is the main line, or the reverse) is OPTIONAL: it shows and can be priced, but left empty it is carried in the main line, never missing. Every price comes from the estimator or a document they gave you — never invent, estimate or 'typical' one; a price nobody entered stays unentered and estimate_summary names it. The reply carries the line this call priced (line) and all of the condition's lines (lines), with a note naming any line still unpriced. Rides export_takeoff into the app; undo_last reverses the call.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "condition": "<condition>"
    },
    "name": "set_pricing"
  }
}

Input Schema

NameRequiredDescriptionDefault
lineNoWhich line material / labor price: omitted or the main line's unit = the main line; LF / EA / SF = the condition's other line of that kind (stored in pricing.by_unit)
unitNoThe MAIN line's pricing unit (default: what was measured — area, then length, then count)
laborNoLabor $ per unit, on the measured quantity; null clears
materialNoMaterial $ per unit, on the order quantity; null clears
conditionYesFinish tag of an existing condition, e.g. 'CPT-1'
materialsNoPrices for the condition's supporting-material rows

Output Schema

NameRequiredDescriptionDefault
lineYesThe line this call priced (the main line unless `line` named another), after the write; null while it has no committed quantity of that kind
noteNo
linesYesEvery estimate line of the condition, main first
pricingYesThe condition's prices after this write; an absent field is not entered
conditionYes
condition_idYes
material_pricesYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed11 schema fields changedv0.1.31
    • removedInput schema / additionalProperties
      Removed value: -false
    • addedInput schema / properties / line
      Added value: +{
      +  "description": "Which line material / labor price: omitted or the main line's unit = the main line; LF / EA / SF = the condition's other line of that kind (stored in pricing.by_unit)",
      +  "enum": [
      +    "SF",
      +    "SY",
      +    "LF",
      +    "EA"
      +  ],
      +  "type": "string"
      +}
    • removedInput schema / properties / materials / items / additionalProperties
      Removed value: -false
    • changedInput schema / properties / unit / description
      Previous value: -"Pricing unit (default: what was measured — area, then length, then count)"New value: +"The MAIN line's pricing unit (default: what was measured — area, then length, then count)"
    • changedOutput schema / properties / line / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "properties": {
      -      "finish_tag": {
      -        "type": "string"
      -      },
      -      "id": {
      -        "type": "string"
      -      },
      -      "labor_cost": {
      -        "type": "number"
      -      },
      -      "labor_qty": {
      -        "description": "Measured quantity in the unit — no waste",
      -        "type": "number"
      -      },
      -      "labor_rate": {
      -        "description": "$ per unit; null = never entered",
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "material_cost": {
      -        "type": "number"
      -      },
      -      "material_qty": {
      -        "description": "Order quantity in the unit — waste applied (EA never carries waste)",
      -        "type": "number"
      -      },
      -      "material_rate": {
      -        "description": "$ per unit; null = never entered",
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "materials": {
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "cost": {
      -              "type": "number"
      -            },
      -            "name": {
      -              "type": "string"
      -            },
      -            "price": {
      -              "type": [
      -                "number",
      -                "null"
      -              ]
      -            },
      -            "priced": {
      -              "type": "boolean"
      -            },
      -            "qty": {
      -              "type": "number"
      -            },
      -            "unit": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "unit",
      -            "qty",
      -            "price",
      -            "cost",
      -            "priced"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "materials_cost": {
      -        "type": "number"
      -      },
      -      "missing": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "status": {
      -        "enum": [
      -          "priced",
      -          "partial",
      -          "unpriced"
      -        ],
      -        "type": "string"
      -      },
      -      "total": {
      -        "type": "number"
      -      },
      -      "unit": {
      -        "enum": [
      -          "SF",
      -          "SY",
      -          "LF",
      -          "EA"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "id",
      -      "finish_tag",
      -      "unit",
      -      "material_qty",
      -      "labor_qty",
      -      "material_rate",
      -      "labor_rate",
      -      "material_cost",
      -      "labor_cost",
      -      "materials",
      -      "materials_cost",
      -      "total",
      -      "status",
      -      "missing"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "finish_tag": {
      +        "type": "string"
      +      },
      +      "id": {
      +        "type": "string"
      +      },
      +      "key": {
      +        "description": "\"<condition id>:<unit>\" — one line per quantity kind the condition carries",
      +        "type": "string"
      +      },
      +      "labor_cost": {
      +        "type": "number"
      +      },
      +      "labor_qty": {
      +        "description": "Measured quantity in the unit — no waste",
      +        "type": "number"
      +      },
      +      "labor_rate": {
      +        "description": "$ per unit; null = never entered",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "main": {
      +        "description": "The condition's first line: priced by pricing.unit / material / labor and carrying its assembly items; the others price from pricing.by_unit[unit]",
      +        "type": "boolean"
      +      },
      +      "material_cost": {
      +        "type": "number"
      +      },
      +      "material_qty": {
      +        "description": "Order quantity in the unit — waste applied (EA never carries waste)",
      +        "type": "number"
      +      },
      +      "material_rate": {
      +        "description": "$ per unit; null = never entered",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "materials": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "cost": {
      +              "type": "number"
      +            },
      +            "name": {
      +              "type": "string"
      +            },
      +            "price": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "priced": {
      +              "type": "boolean"
      +            },
      +            "qty": {
      +              "type": "number"
      +            },
      +            "unit": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "unit",
      +            "qty",
      +            "price",
      +            "cost",
      +            "priced"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "materials_cost": {
      +        "type": "number"
      +      },
      +      "missing": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "optional": {
      +        "description": "A bordered linear run's derived line: priceable, but an empty rate is carried in the main line, never missing",
      +        "type": "boolean"
      +      },
      +      "status": {
      +        "description": "optional = an optional line nobody priced (not in unpriced)",
      +        "enum": [
      +          "priced",
      +          "partial",
      +          "unpriced",
      +          "optional"
      +        ],
      +        "type": "string"
      +      },
      +      "total": {
      +        "type": "number"
      +      },
      +      "unit": {
      +        "enum": [
      +          "SF",
      +          "SY",
      +          "LF",
      +          "EA"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "finish_tag",
      +      "unit",
      +      "material_qty",
      +      "labor_qty",
      +      "material_rate",
      +      "labor_rate",
      +      "material_cost",
      +      "labor_cost",
      +      "materials",
      +      "materials_cost",
      +      "total",
      +      "status",
      +      "missing"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / line / description
      Previous value: -"The condition's estimate line after this write; null while it has no committed shapes"New value: +"The line this call priced (the main line unless `line` named another), after the write; null while it has no committed quantity of that kind"
    • addedOutput schema / properties / lines
      Added value: +{
      +  "description": "Every estimate line of the condition, main first",
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "finish_tag": {
      +        "type": "string"
      +      },
      +      "id": {
      +        "type": "string"
      +      },
      +      "key": {
      +        "description": "\"<condition id>:<unit>\" — one line per quantity kind the condition carries",
      +        "type": "string"
      +      },
      +      "labor_cost": {
      +        "type": "number"
      +      },
      +      "labor_qty": {
      +        "description": "Measured quantity in the unit — no waste",
      +        "type": "number"
      +      },
      +      "labor_rate": {
      +        "description": "$ per unit; null = never entered",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "main": {
      +        "description": "The condition's first line: priced by pricing.unit / material / labor and carrying its assembly items; the others price from pricing.by_unit[unit]",
      +        "type": "boolean"
      +      },
      +      "material_cost": {
      +        "type": "number"
      +      },
      +      "material_qty": {
      +        "description": "Order quantity in the unit — waste applied (EA never carries waste)",
      +        "type": "number"
      +      },
      +      "material_rate": {
      +        "description": "$ per unit; null = never entered",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "materials": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "cost": {
      +              "type": "number"
      +            },
      +            "name": {
      +              "type": "string"
      +            },
      +            "price": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "priced": {
      +              "type": "boolean"
      +            },
      +            "qty": {
      +              "type": "number"
      +            },
      +            "unit": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "unit",
      +            "qty",
      +            "price",
      +            "cost",
      +            "priced"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "materials_cost": {
      +        "type": "number"
      +      },
      +      "missing": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "optional": {
      +        "description": "A bordered linear run's derived line: priceable, but an empty rate is carried in the main line, never missing",
      +        "type": "boolean"
      +      },
      +      "status": {
      +        "description": "optional = an optional line nobody priced (not in unpriced)",
      +        "enum": [
      +          "priced",
      +          "partial",
      +          "unpriced",
      +          "optional"
      +        ],
      +        "type": "string"
      +      },
      +      "total": {
      +        "type": "number"
      +      },
      +      "unit": {
      +        "enum": [
      +          "SF",
      +          "SY",
      +          "LF",
      +          "EA"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "finish_tag",
      +      "unit",
      +      "material_qty",
      +      "labor_qty",
      +      "material_rate",
      +      "labor_rate",
      +      "material_cost",
      +      "labor_cost",
      +      "materials",
      +      "materials_cost",
      +      "total",
      +      "status",
      +      "missing"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / material_prices / items / additionalProperties
      Previous value: -trueNew value: +{}
    • changedOutput schema / properties / pricing / additionalProperties
      Previous value: -trueNew value: +{}
    • addedOutput schema / properties / pricing / properties / by_unit
      Added value: +{
      +  "additionalProperties": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "labor": {
      +        "type": "number"
      +      },
      +      "material": {
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "description": "The other lines' rates, keyed by their unit",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "condition",
      -  "condition_id",
      -  "pricing",
      -  "material_prices",
      -  "line"
      -]New value: +[
      +  "condition",
      +  "condition_id",
      +  "pricing",
      +  "material_prices",
      +  "line",
      +  "lines"
      +]
  2. Addedv0.1.29

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full load and does it well: null clears vs 0 is explicit $0, material prices the order quantity (waste applied) while labor prices the measured quantity, optional derived border lines are carried in the main line, and undo_last reverses the call. It also describes the reply (line, lines, unpriced note).

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

Conciseness4/5

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

Purpose is front-loaded and nearly every clause carries domain information, but it is a single dense paragraph mixing pricing semantics, sourcing policy, return shape, and undo — internal structure or shorter phrasing would improve scanability.

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

Completeness5/5

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

For a 6-parameter mutation with no annotations, the description covers pricing semantics, waste behavior, clearing semantics, optional derived lines, the sourcing rule, the response contents, and the undo path. An agent has everything needed to call it correctly.

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?

Schema coverage is already 100%, yet the description adds real meaning: it explains the unit-vs-line relationship (unit defines the main line's buying unit; line picks which stored line gets priced), the waste asymmetry between material and labor, and that materials quantities are whole packages priced per row unit. Some overlap with schema text ('null clears', 'per the row's own unit') keeps it from a 5.

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

Purpose5/5

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

Opens with a specific verb+resource and scope: 'Price one condition for the estimate — the canvas Estimate panel's rows.' It immediately distinguishes itself from neighbors by pointing to estimate_summary for line structure and edit_materials for supporting-material rows.

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?

Gives concrete selection rules (omit line or pass the main line's unit for the main line; pass LF/EA/SF to price another line; one call per line) and a prerequisite pointer to edit_materials. It states a strong sourcing constraint ('never invent'), but never names a sibling this tool should not be used in place of.

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