Skip to main content
Glama
paintbrushv

plat-costmodel

by paintbrushv

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
estimateA

Estimate per-unit renovation cost with line-item breakdown.

Args: unit_sqft: Unit square footage (drives size category: <700 small, 700-950 medium, 950+ large) bedrooms: Number of bedrooms bathrooms: Number of bathrooms (bathroom costs multiply by this) scope_level: "light" ($3K-$5K) or "standard_value_add" ($12K-$18K) finish_tier: "basic" or "upgraded" (granite, backsplash, stainless) year_built: Property year built (triggers risk flags) property_class: "B" or "C" market: "dallas" or "birmingham" unit_id: Optional unit identifier

estimate_full_propertyB

Property-level estimate rolling up unit costs + exterior CapEx.

Args: property_id: Property identifier total_units: Total units at the property units: List of unit dicts with keys: unit_id, sqft, bedrooms, bathrooms, scope_level, finish_tier year_built: Property year built property_class: "B" or "C" market: "dallas" or "birmingham" exterior_items: Exterior CapEx categories to include (default: all). Options: roof, parking, hvac, siding_paint, fencing_gates, landscaping, signage_lighting

estimate_property_from_modelA

Property-level estimate using the Property entity model.

Accepts a single property dict containing all property context and unit mix. This is the preferred API for Plat — replaces loose kwargs.

Args: property_data: Dict with keys: - property_id (str, required) - total_units (int, required) - unit_mix (list of dicts with: sqft, bedrooms, bathrooms, scope_level, finish_tier, count) - year_built (int, optional) - property_class ("B" or "C", optional) - market (str, optional) - building_type (str, optional) - exterior_items (list of str, optional)

check_renovation_roiA

Check whether a renovation plan clears the minimum ROI threshold.

Uses the HIGH cost estimate (conservative). Formula: (annual_rent_lift / total_cost_high) * 100. Default threshold is 15%.

Args: total_cost_high: High-end total renovation cost estimate current_monthly_rent: Current monthly rent target_monthly_rent: Expected post-renovation monthly rent threshold_pct: Minimum ROI percentage (default 15%)

generate_scope_of_workB

Generate a detailed scope of work (SOW) for contractor bidding.

Produces a contractor-ready document with material specs, quantities, and quality standards.

Args: unit_sqft: Unit square footage bedrooms: Number of bedrooms bathrooms: Number of bathrooms scope_level: "light" or "standard_value_add" finish_tier: "basic" or "upgraded" property_address: Property street address unit_id: Unit number/identifier

evaluate_contractor_bidB

Evaluate a contractor bid against the internal cost estimate.

Flags: inflated line items (30%+ above benchmark), vague lump sums, unrealistic timelines.

Args: contractor_name: Name of the contractor bid_line_items: List of dicts with "description" and "amount" keys bid_total: Total bid amount timeline_days: Proposed timeline in days (None if not specified) unit_sqft: Unit square footage for generating comparison estimate bedrooms: Number of bedrooms bathrooms: Number of bathrooms scope_level: "light" or "standard_value_add" finish_tier: "basic" or "upgraded" year_built: Property year built

prepare_renovation_program_toolA

Estimate unit cost, validate ROI, and produce underwriting-ready renovation program input.

Runs the full pipeline: estimate → ROI gate → bridge dict matching the multifamily-underwriting deal schema's renovation_program shape.

Returns a dict with:

  • renovation_program: ready to splice into the deal JSON

  • roi_result: full ROI gate result for audit trail

  • ready_to_underwrite: True if ROI gate passed

If the ROI gate fails, returns the result with ready_to_underwrite=False and the roi_result containing path_to_pass guidance.

Args: unit_sqft: Unit square footage (drives size category) bedrooms: Number of bedrooms bathrooms: Number of bathrooms current_monthly_rent: Current monthly rent target_monthly_rent: Expected post-renovation monthly rent start_month: Renovation start month ("YYYY-MM") monthly_pace: Units renovated per month scope_level: "light" or "standard_value_add" finish_tier: "basic" or "upgraded" year_built: Property year built (triggers risk flags) property_class: "B" or "C" market: "dallas" or "birmingham" unit_id: Optional unit identifier downtime_days: Vacancy days per unit during renovation (default 21) threshold_pct: Minimum ROI percentage (default 15%)

register_propertyB

Idempotent property registration.

Accepts a Property-shaped dict (and optional inline floor_plans). Mints property_id if missing or returns the existing row when external_alias matches.

Inline floor_plans are deduped by (sqft, bedrooms, bathrooms): an existing match is reused, otherwise a new FloorPlan is created. This means calling register_property twice with the same alias and a NEW floor plan in the payload correctly creates the new floor plan on the second call (the previous behavior silently dropped it).

estimate_scopeC

Canonical entry point: estimate a ScopeRequest, persist (request, estimate).

Returns the ScopeEstimate as a dict, or a ValidationProblem dict on error.

estimate_from_dealC

Project deal + scenarios → per-scenario ScopeRequest(s), estimate each, project back to renovation_program dicts.

Returns {estimates, renovation_programs} index-aligned with scenarios_list. estimates[i] is a ScopeEstimate dict on success or a problem dict (error_type-bearing) when the scenario hits the not_implemented guard. Per-type dispatch lands in slice B PR 3.

get_property_historyB

Return all (scope_request, scope_estimate, actual_outcome) triples for a property as a list of dicts. Empty list if property has no history.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

B3.3/5.0

Scored across 11 tools

Disambiguation3/5

Six tools revolve around estimation (estimate, estimate_scope, estimate_full_property, estimate_property_from_model, estimate_from_deal, prepare_renovation_program_tool), and the property-level pair (estimate_full_property vs estimate_property_from_model) is especially easy to confuse since one is merely the 'preferred' wrapper of the other. Descriptions do clarify levels (per-unit vs property vs deal vs pipeline), so an agent can usually recover, but boundaries are fuzzy.

Naming Consistency4/5

Nearly all tools follow a clean verb_noun snake_case pattern (check_renovation_roi, estimate_full_property, generate_scope_of_work, evaluate_contractor_bid, register_property, get_property_history). Minor deviations are the bare 'estimate' and the odd '_tool' suffix in prepare_renovation_program_tool, but these are isolated.

Tool Count4/5

11 tools is well within a healthy range for a cost-modeling server covering estimation, ROI, SOW, bid review, registration, and history. The only concern is slight redundancy in the estimation cluster, which nudges it below a perfect score.

Completeness4/5

The surface covers the core lifecycle: property registration, per-unit and property-level estimation, ROI gating, scope-of-work generation, contractor bid evaluation, deal-scenario projection, and history retrieval. Gaps are minor—no update/delete or list/get property operations, and no standalone exterior-only estimate—but agents can work around these.

Maintenance

ActivityMaintained
ResponsivenessNo issues