Skip to main content
Glama

Seattle cost estimate

get_estimate
Read-onlyIdempotent

Calculate a Seattle-area cost estimate. Returns a planning range, point cost, material/labor split, days, and itemized line items.

Material IDs: get_material_options returns exact IDs; a close match (lvp, composite, cedar) also resolves, and an ambiguous one returns the valid list.

Required fields by projectType — ? = optional, (mat) = material ID:

interior-painting: rooms(Array<{id,name,length(ft),width(ft),height(6-30),paintCeiling(bool),paintTrim(bool),doorCount,windowCount,surfaceCondition(new-drywall|good-condition|poor-condition),trimComplexity(baseboards-only|simple-trim|complex-trim),wallTexture(smooth|light-texture|heavy-texture),roomEmpty(bool)}>) | paintQuality(mat) | paintFinish(flat|eggshell|satin|semi-gloss|gloss) | includesPrimer(bool) | majorColorChange(bool) exterior-painting: wallArea(sqft) | trimArea(sqft) | doorCount | paintQuality(mat) | surfacePrepLevel(minimal|moderate|extensive) | includesPrimer(bool) | stories(1-3) | colorChange(bool) flooring: rooms(Array<{id,name,length(ft),width(ft)}>) | flooringMaterial(mat: standard-lvp-flooring,engineered-hardwood-oak,ceramic-tile-12x24) | includesUnderlayment(bool) | underlaymentType?(mat) | includesBaseboard(bool) | baseboardType?(mat) | baseboardLinearFeet? | includesRemoval(bool) | removalType?(carpet|tile|hardwood) | includesSubfloorPrep(bool) | transitionCount deck: deckType(new|existing) | dimensions({length,width,height(ft off ground)}) | deckingMaterial(mat: pressure-treated-decking,composite-decking-basic) | framingMaterial(mat: pressure-treated-framing-2x6) | includesRailing(bool) | railingMaterial?(mat) | railingLinearFeet? | includesStairs(bool) | stairSteps?(0-20) | deckShape(rectangle|l-shape|angled-corners|multi-level) | skirtingType(none|lattice|matching-board) windows: windows(Array<{id,windowType(double-hung|casement|slider|bay),width(inches 12-120),height(inches 12-120),quantity}>) | qualityLevel(standard|premium|luxury) | includesTrimWork(bool) | trimMaterial?(mat) | includesRemoval(bool) | energyEfficient(bool) siding: wallArea(sqft) | sidingMaterial(mat) | includesInsulation(bool) | insulationType?(string) | homeHeight(single-story|two-story|three-story) | includesRemoval(bool) | existingSidingType?(string) | trimLinearFeet(number) | soffit(bool) | soffitLinearFeet?(number) fence: linearFeet | fenceMaterial(mat) | height(ft, 3-8) | gateCount(0-10) | gateWidth?(ft) | style?(e.g. privacy,picket) | includesRemoval(bool) | terrain(flat|sloped|mixed) | concreteFootings(bool) landscaping: yardArea(sqft, 100–50000) | includesIrrigation(bool) | irrigationType?(string) | irrigationZones?(1–20) | includesSod(bool) | sodSquareFeet(REQUIRED when includesSod, no default) | includesMulch(bool) | mulchSquareFeet?(defaults to yardArea) | includesSitePrep(bool) | plants?(Array<{id,plantType,quantity,size(small|medium|large)}>) | hardscapeFeatures?(Array<{id,featureType,squareFeet,material}>) kitchen: kitchenSize(sqft, 40-600) | scope(cosmetic|standard|full-gut) | cabinets(keep|reface|prefab|semi-custom|custom) | countertop(keep|laminate|butcher-block|quartz|granite|marble) | appliances(keep|budget|mid-range|premium) | flooring(keep|lvp|tile|hardwood) | backsplash?(bool) | plumbingRelocation?(bool) | electricalUpgrade?(bool) | island?(bool) | lighting?(bool) bathroom: bathroomType(half-bath|full-bath|primary-bath|accessible) | bathroomSize(sqft, 20-300) | scope(cosmetic|standard|full-gut) | showerTub(keep|tub-to-shower|walk-in-shower|tub-replacement|freestanding-tub) | vanity(keep|budget|mid-range|premium) | tileWork(none|floor-only|floor-and-shower|full-tile) | heatedFloors?(bool) | newLighting?(bool) | ventilation?(bool) | plumbingRelocation?(bool) basement: basementSize(sqft, 150-3000) | scope(open-rec-room|standard-finish|full-suite) | ceilingHeight(under-7ft|7-to-8ft|over-8ft) | moistureCondition(dry|minor-dampness|active-water) | egress(has-egress|needs-egress|not-required) | bathroom(none|half-bath|full-bath) | kitchenette(none|wet-bar|full-kitchenette) | bedroomCount(0-3) | flooring(lvp|carpet|polished-concrete|tile) | insulation(existing|walls-only|walls-and-ceiling) | hvac(extend-existing|mini-split|none-needed) | electricalSubpanel?(bool) | homeAgePre1978?(bool) adu: type(dadu|aadu|basement-conversion|garage-conversion) | sizeSqft(200-1200; DADU cap 1,000sf) | finishTier(builder|standard|premium) | foundation?(slab|crawl|stem-wall, default crawl; moves the total) | sitework?(minimal|standard|heavy) | utilityRunFeet?(0-500) | treeRemovalCount?(0-10) | preApprovedPlan?(bool) | homeAgePre1978?(bool) ada: projectScope(single-room|whole-home|bathroom-specific) | modifications({grabBars?,walkInShower?,widerDoorways?,ramp?,nonSlipFlooring?,leverHandles?,raisedToilet?,rollUnderSink?,accessibleCounters?,stairLift?} all bool) | currentCondition(minor|moderate|major) | homeStories?(1-3) | doorwayCount?(0-20) | rampLengthFeet?(0-60) | flooringSquareFeet?(0-5000)

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
projectYesProject input fields — see tool description for required fields per projectType.
projectTypeYesThe type of project

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
excludesYesScope NOT priced here. Relay alongside any figure.
laborCostYes
lineItemsNo
totalCostYesPoint figure. Relay estimateRange instead — a single number reads as a quote.
permitCostNoPresent on basement and adu, where permit cost is inside totalCost.
attributionYes
projectTypeYes
materialCostYes
pricingBasisNo
calculatorUrlYes
estimateRangeNoPlanning range for Seattle-area work. This is what to relay, with its qualifier attached.
contingencyCostNoPresent on basement and adu. When set, a contingency is ALREADY in totalCost — do not add another.
getAccurateQuoteYes
timeEstimateDaysNo
contingencyGuidanceYes

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed3 schema fields changed
    • changedInput schema / properties / projectType / enum
      Previous value: -[
      -  "interior-painting",
      -  "deck",
      -  "exterior-painting",
      -  "flooring",
      -  "windows",
      -  "siding",
      -  "fence",
      -  "landscaping",
      -  "kitchen",
      -  "bathroom",
      -  "ada"
      -]New value: +[
      +  "interior-painting",
      +  "exterior-painting",
      +  "flooring",
      +  "deck",
      +  "windows",
      +  "siding",
      +  "fence",
      +  "landscaping",
      +  "kitchen",
      +  "bathroom",
      +  "basement",
      +  "adu",
      +  "ada"
      +]
    • addedOutput schema / properties / contingencyCost
      Added value: +{
      +  "description": "Present on basement and adu. When set, a contingency is ALREADY in totalCost — do not add another.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / permitCost
      Added value: +{
      +  "description": "Present on basement and adu, where permit cost is inside totalCost.",
      +  "type": "number"
      +}
  2. Changed6 schema fields changed
    • removedOutput schema / properties / attribution / properties / contractorLicense
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / attribution / properties / note
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / attribution / properties / organization
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / attribution / properties / retrievedFrom
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / attribution / properties / url
      Removed value: -{
      -  "type": "string"
      -}
    • changedOutput schema / properties / attribution / required
      Previous value: -[
      -  "organization",
      -  "contractorLicense",
      -  "url",
      -  "sourceUrl",
      -  "citeAs",
      -  "retrievedFrom",
      -  "note"
      -]New value: +[
      +  "sourceUrl",
      +  "citeAs"
      +]
  3. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": true,
      +  "properties": {
      +    "attribution": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "citeAs": {
      +          "description": "Ready-made citation line. Use verbatim.",
      +          "type": "string"
      +        },
      +        "contractorLicense": {
      +          "type": "string"
      +        },
      +        "note": {
      +          "type": "string"
      +        },
      +        "organization": {
      +          "type": "string"
      +        },
      +        "primarySource": {
      +          "description": "Present when Kolmo verified but does not author the fact — cite both.",
      +          "type": "string"
      +        },
      +        "retrievedFrom": {
      +          "type": "string"
      +        },
      +        "sourceUrl": {
      +          "description": "The specific page these facts render on. Link this, not the site root.",
      +          "type": "string"
      +        },
      +        "url": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "organization",
      +        "contractorLicense",
      +        "url",
      +        "sourceUrl",
      +        "citeAs",
      +        "retrievedFrom",
      +        "note"
      +      ],
      +      "type": "object"
      +    },
      +    "calculatorUrl": {
      +      "type": "string"
      +    },
      +    "contingencyGuidance": {
      +      "type": "string"
      +    },
      +    "estimateRange": {
      +      "description": "Planning range for Seattle-area work. This is what to relay, with its qualifier attached."
      +    },
      +    "excludes": {
      +      "description": "Scope NOT priced here. Relay alongside any figure.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "getAccurateQuote": {
      +      "type": "string"
      +    },
      +    "laborCost": {
      +      "type": "number"
      +    },
      +    "lineItems": {},
      +    "materialCost": {
      +      "type": "number"
      +    },
      +    "pricingBasis": {},
      +    "projectType": {
      +      "type": "string"
      +    },
      +    "timeEstimateDays": {},
      +    "totalCost": {
      +      "description": "Point figure. Relay estimateRange instead — a single number reads as a quote.",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "projectType",
      +    "totalCost",
      +    "materialCost",
      +    "laborCost",
      +    "contingencyGuidance",
      +    "excludes",
      +    "calculatorUrl",
      +    "getAccurateQuote",
      +    "attribution"
      +  ],
      +  "type": "object"
      +}
  4. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readonly/idempotent annotations, the description discloses the tool's resolution behavior for material IDs: exact IDs work, close matches resolve, and ambiguous ones return the valid list. It also documents defaults, constraints, and required/optional fields per project type, giving substantial behavioral context.

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

Conciseness5/5

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

The description is long, but its length is warranted by 13 distinct project types, each with unique required fields. It is well structured with clear headings, consistent notation for optional fields, and useful front-loaded summary sentences about outputs and material ID behavior.

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 tool with nested objects and complex per-type schemas, the description is thorough: it covers outputs, material ID resolution, field constraints, defaults, and project-specific inputs. The presence of an output schema also reduces the need to describe return values in more detail.

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

Parameters5/5

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

The schema only defines projectType and a generic 'project' object with no field detail. The description compensates massively by enumerating all project-specific fields, their types, units, ranges, enum options, optional markers, conditions on requiredness, and defaults. This is essential semantic content the schema does not provide.

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?

The description opens with 'Calculate a Seattle-area cost estimate' and enumerates the specific outputs returned: planning range, point cost, material/labor split, days, and itemized line items. This clearly identifies both the action and resource, and distinguishes it from sibling tools like estimate_permit_fee or get_material_options.

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?

The description makes clear this is the tool for Seattle-area cost estimates, and it also points to get_material_options as the source of exact material IDs. It gives detailed per-projectType invocation requirements, though it does not explicitly state when not to use it or name alternatives for different estimate types.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A3.8/5.0
Disambiguation2/5

Several permit-related tools have overlapping boundaries: answer_permit_question, check_permit_requirements, and get_permit_rule_details all return timeline/fee/submittal information and can answer 'do I need a permit' style questions. get_material_catalog and get_material_options also target similar material-selection needs. The descriptions help, but an agent could easily select the wrong tool in the permit cluster.

Naming Consistency5/5

All 36 tools follow a consistent snake_case verb_noun pattern, with get_ for single-item lookups and list_ for collection queries. There are no camelCase or mixed-style exceptions, so the naming is predictable and scannable.

Tool Count2/5

36 tools is well above the 25+ threshold and feels heavy even for a multi-domain construction assistant. Several retrieval tools overlap (list_services/list_projects/list_blog_posts vs search_content, get_material_catalog vs get_material_options), suggesting consolidation opportunities.

Completeness4/5

The permit workflow is well covered from parcel lookup through requirements, fees, submittals, and data freshness, and the prospect journey has services, estimates, financing, weather, reviews, and contact submission. Minor gaps exist, such as no active permit-status lookup and no way to create/update content, but these are outside the apparent read-only/lead-gen scope.