Estimating a Construction Job With Agent Tools

· 3 min read · Trades · WingMan Protocol

An LLM asked to "estimate a concrete pour" cold will produce a plausible-sounding number and get the math wrong in some non-obvious way — a unit conversion slipped, a waste factor forgotten, cubic feet where it meant cubic yards. That's not a knock on the model; it's just not what language models are for. WingMan's trades calculators exist because this category of problem — deterministic, unit-sensitive, the kind of thing a contractor checks with a tape measure and a calculator app, not a guess — needs a real engine behind the answer, not a better prompt.

Sizing the pour

concrete takes a shape (slab, column, or tube — required) plus the relevant dimensions: length, width, thickness_in for a slab. It returns cubic yards needed and, if you pass price_per_yard, the ready-mix cost.

{"jsonrpc":"2.0","id":1,"method":"tools/call",
 "params":{"name":"concrete",
   "arguments":{"shape":"slab","length":30,"width":24,"thickness_in":4,"waste_factor":0.05}}}

rebar runs on the same footprint (length, width required) and lays out the grid — bar spacing, lap percentage, and cost per linear foot if you supply a price.

Rolling it into a bid — where this stops being a calculator and starts being a workflow

Two numbers alone aren't a bid. bid-estimator takes material_cost, labor_hours, labor_rate, plus optional equipment_cost, subcontractor_cost, overhead_pct, contingency_pct, and margin_pct, and returns a marked-up total. Manually, that means running concrete, reading off the cost, and re-typing it as bid-estimator's material_cost input — an easy place to introduce a transcription error, or to forget to re-run the bid after changing the slab dimensions.

The concrete-pour-estimator template exists specifically to remove that seam: it runs concrete → rebar → bid-estimator as one chain, with the bid's material_cost argument mapped directly to the concrete step's values.estimated_cost_usd output — not re-entered, the actual number. Change the slab's length or thickness once and every downstream number, including the final marked-up bid, updates with it.

{"shape":"slab","length":30,"width":24,"thickness_in":4,
 "labor_hours":24,"labor_rate":55,"margin_pct":15}
POST that to /agents/templates/concrete-pour-estimator/run and get back all three steps' results in one response.

renovation-cost-plus is the sibling template for the cost-plus side of the same job: the concrete take-off feeds markup, and the marked-up price feeds sales-tax — a different threading of the same underlying pour cost toward "what do I actually invoice the client."

Framing a wall and ordering the lumber

The framing side has its own four-tool chain, wired as frame-and-order-lumber: framing (required: total_wall_lf, wall_height) sizes stud count and header requirements for a wall run; floor-joist (required: span, room_width) sizes the joist layout for the floor it sits on; board-feet (required: thickness_in, width_in, length_ft) converts a lumber dimension and quantity into board feet and cost — and here the joist step's output count becomes the board-feet step's quantity input, so the lumber order actually reflects how many joists the span calculation says you need, not a guess. bill-of-materials closes the loop, aggregating every line item with waste and tax percentages into one takeoff total.

Pricing the labor honestly

Materials aren't the whole bid. labor-burden (required: base_wage) rolls FUTA, health insurance, workers' comp, and PTO into a true fully-loaded hourly cost — the number that should actually go into bid-estimator's labor_rate, not the raw wage, if the bid is going to hold up against what the crew actually costs to run.

Why chain these instead of calling them separately

Nothing here is unreachable one call at a time — every one of these tools works standalone via POST /tools/<name> or the MCP tools/call method, and each has its own page at /mcp/tools/<slug>/ with the full schema and a live try-it form. The templates exist because a real bid is rarely one calculation; it's several, and the number that matters is the last one, built honestly on the ones before it. Run /agents/templates/concrete-pour-estimator/run or /agents/templates/frame-and-order-lumber/run directly, or use them as the reference for wiring the same chain yourself against a job whose shape doesn't fit either template exactly.

tradesconstructioncalculatorsagent-templates

Tools used in this post