Skip to main content
Glama
paintbrushv

plat-costmodel

by paintbrushv

plat-costmodel

Multifamily renovation cost estimation engine for Plat — a domain-expert real estate intelligence agent.

What It Does

  • Per-unit cost estimation with line-item breakdowns (flooring, kitchen, bath, paint, appliances, fixtures, contingency)

  • Scope of Work (SOW) generation — contractor-ready documents from property profile

  • Contractor bid evaluation — flags inflated line items, vague lump sums, unrealistic timelines

  • ROI gating — 15% minimum threshold check on all renovation plans

  • Risk flagging — age-based warnings (galvanized pipe, asbestos, foundation concerns)

  • Budget vs. actual tracking — Yardi Voyager integration for model calibration

Related MCP server: Property MCP Server

Architecture

MCP tool server callable by Plat's orchestration layer. CLI-first interface.

Plat (agent) ──MCP──▶ plat-costmodel (tool server)
                            ├── estimate    — per-unit cost range
                            ├── sow         — scope of work generation
                            ├── evaluate    — contractor bid evaluation
                            ├── roi         — ROI threshold check
                            └── ingest      — Yardi CSV import

Two Scope Levels

Scope

Cost Range

Description

Light

$3K-$5K/unit

Paint, clean, patch, hardware, carpet

Standard Value-Add

$12K-$18K/unit

Full kitchen/bath update, LVP, appliances, fixtures

Gut renos excluded — don't pencil at Class C rents.

Cost Model Inputs

  • Unit square footage (<700 small, 700-950 medium, 950+ large)

  • Finish tier (basic vs. upgraded)

  • Number of bedrooms/bathrooms

  • Property year built (drives risk flags)

  • Property class (B or C)

  • Market (Dallas, Birmingham — more later)

Data Sources

  • Brain dump knowledge — Day 1 baseline from operator experience

  • Yardi Voyager CSV exports — historical actuals tagged to unit numbers

  • RSMeans benchmarks — industry reference data (future)

  • Cross-user pooled data — anonymous Glassdoor-style model (SaaS future)

v0.1 packaging candidate

The standalone MCP adapter uses MCP 2.3–2.x. Install the [server] extra and run plat-costmodel-mcp (stdio).

CI builds wheel/source archives, tests a fresh wheel environment, and validates runtime/package versions. A release tag must match pyproject.toml, use an unused PyPI version, and pass the full CI workflow before the tested artifacts can be uploaded. Candidate versions are not published by this change.

Available Tools

11 tools
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%)

ParametersJSON Schema
NameRequiredDescriptionDefault
threshold_pctNo
total_cost_highYes
target_monthly_rentYes
current_monthly_rentYes

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations the description carries the full burden, and it does disclose meaningful behavior: it uses the HIGH (conservative) cost estimate, the exact ROI formula, and the 15% default threshold. It does not disclose the return shape (pass/fail boolean vs numeric ROI) or any edge-case behavior.

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?

Front-loaded with the purpose, then the formula and default, then the argument list. Slightly duplicative in restating parameter names, but each sentence carries useful information.

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

Completeness3/5

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

For a no-annotation, no-output-schema tool with 4 parameters, the description covers inputs and computation logic well but never states what the tool returns (a boolean clearing the threshold, the ROI value, etc.), which an agent needs to interpret the result.

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 description coverage is 0%, so the description must compensate, and it does: each of the four parameters is annotated with its meaning (high-end cost estimate, current rent, target rent, minimum ROI percentage), and the formula clarifies how they interact.

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?

States a specific verb and resource ('check whether a renovation plan clears the minimum ROI threshold') and adds the formula and default threshold, so an agent knows exactly what is computed. It does not name or differentiate itself from sibling estimation tools, so it falls short of a 5.

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

Usage Guidelines3/5

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

Usage is only implied: the description makes clear it is a threshold check on a renovation plan, but gives no explicit when-to-use versus the many estimate_* siblings, and no prerequisites or exclusions.

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
marketNo
unit_idNo
bedroomsYes
bathroomsYes
unit_sqftYes
year_builtNo
finish_tierNobasic
scope_levelNostandard_value_add
property_classNo

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses internal behaviors that affect the output (sqft drives size category thresholds, bathrooms act as a cost multiplier, year_built triggers risk flags), but says nothing about permissions, determinism, failure modes, or the shape of the returned line-item breakdown beyond naming it.

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?

The one-line purpose is front-loaded, followed by a clean arg list where each entry earns its place. It is slightly long, but the length is justified by nine undocumented parameters rather than padding.

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 nine-parameter tool with no annotations and no output schema, the description covers the input surface thoroughly. The remaining gap is decision support: it does not help an agent choose this tool over the many similarly named sibling estimators, nor does it describe the returned breakdown's contents.

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?

Schema description coverage is 0%, so the description must compensate entirely, and it does: every one of the nine parameters is documented with added meaning, including size-category thresholds, the bathroom multiplier, cost ranges per scope_level, and concrete finish_tier examples. The schema alone provides only bare titles, so this is genuinely additive.

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?

States a specific verb and resource: 'Estimate per-unit renovation cost with line-item breakdown.' The 'per-unit' qualifier meaningfully scopes it against the sibling estimate_full_property. However, it never distinguishes itself from close siblings like estimate_scope or estimate_from_deal, so an agent has no basis for choosing among them.

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

Usage Guidelines3/5

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

Usage is only implied: 'per-unit' suggests this is the single-unit variant versus a full-property or deal-level estimate. There is no explicit when-to-use/when-not statement and no named alternative, leaving routing among the ten sibling estimators to inference.

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
deal_dictYes
scenarios_listYes

TDQS

C2.7/5.0
Behavior3/5

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

With no annotations supplied, the description must carry the full behavioral burden, and it partially does: it discloses error behavior ('problem dict' with error_type on the not_implemented guard) and the index-aligned return contract. It never states whether the operation mutates state or what permissions/inputs it needs, leaving the safety profile unaddressed.

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 transformation is front-loaded in the first sentence, which is good, but the trailing 'slice B PR 3' release note adds noise an agent cannot use. Size is otherwise reasonable.

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

Completeness3/5

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

Because there is no output schema, the description usefully spells out the {estimates, renovation_programs} return shape and the index-aligned mapping. It is still incomplete on the input side (opaque deal_dict) and on side effects, so it is adequate but not fully self-contained.

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

Parameters2/5

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

Schema description coverage is 0% for both parameters, and the description only gestures at 'deal + scenarios' and index alignment with scenarios_list. deal_dict is an opaque additionalProperties object whose relevant fields are never explained, so the description does not compensate for the schema gap.

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

Purpose3/5

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

The description names a concrete pipeline (deal + scenarios → per-scenario ScopeRequests → estimates → renovation_program dicts), which is more specific than a bare restatement of the name. However, it leans on internal jargon ('slice B PR 3', 'project back') and never distinguishes itself from siblings like estimate, estimate_scope, or estimate_full_property, so an agent cannot easily route between them.

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

Usage Guidelines2/5

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

There is no explicit when-to-use or when-not-to-use guidance and no named alternative among the many sibling estimators. The only contextual remark ('Per-type dispatch lands in slice B PR 3') is a development roadmap note, not actionable usage direction.

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
unitsYes
marketNo
year_builtNo
property_idYes
total_unitsYes
exterior_itemsNo
property_classNo

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the full behavioral burden, and it is silent on side effects, whether anything is persisted or registered, determinism, auth requirements, or cost/latency. The only behavioral hint is the exterior_items default ('default: all'), which is input semantics rather than tool behavior.

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?

One front-loaded sentence gives the purpose, then a tight Args list; no filler, no repetition of the name, and every line carries information the agent needs to construct the call.

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

Completeness3/5

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

For a 7-parameter computational tool with no annotations and no output schema, the input side is well covered but the output side is entirely absent — the agent is not told the shape of the returned estimate, whether it is per-unit and per-exterior-category, or in what currency/units. Usage context relative to the many sibling estimators is also missing.

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 description coverage is 0%, and the description compensates well: it names every parameter and adds meaning absent from the schema, including the nested unit keys (unit_id, sqft, bedrooms, bathrooms, scope_level, finish_tier) and enumerations the schema lacks ('B' or 'C', 'dallas' or 'birmingham', the seven exterior categories). It stops short of defining allowed values for scope_level/finish_tier or the units of sqft.

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?

States a specific verb and resource: 'Property-level estimate rolling up unit costs + exterior CapEx.' It is clear what is produced, but it never distinguishes itself from near-identical siblings such as estimate_property_from_model, estimate_scope, or estimate_from_deal, so an agent cannot route confidently among them from the description alone.

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

Usage Guidelines2/5

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

There is no when-to-use, when-not-to-use, or alternative-tool guidance anywhere in the text. The Args block documents inputs but leaves the agent to infer the scenario (whole-property renovation budgeting) and gives no hint about when this beats estimate_property_from_model or estimate_scope.

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

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
property_dataYes

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It documents the input shape thoroughly but says nothing about what the tool returns, whether it has side effects, authentication needs, cost, determinism, or error behavior for an estimation/compute operation.

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?

The description is front-loaded with the tool's identity and then uses a structured Args block. The length is justified by the zero-coverage nested schema, though the opening sentence could be tightened slightly.

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

Completeness3/5

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

Given a complex nested input and no output schema, the description adequately covers the request shape but omits any description of the response or failure modes. For an estimation tool with multiple sibling alternatives, this leaves a meaningful gap.

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?

Schema description coverage is 0% and the sole parameter is an untyped nested object, so the description is the only source of parameter meaning. It fully enumerates required and optional keys, their types, and the structure of unit_mix, which is exactly what an agent needs to construct a valid call.

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?

States a specific verb (estimate) and resource (property-level estimate) plus the underlying model (Property entity model). It signals preference over loose kwargs but does not differentiate itself from siblings like estimate_full_property or estimate_from_deal, so an agent still needs schema inspection to choose among the estimation tools.

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

Usage Guidelines3/5

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

The phrase 'preferred API for Plat — replaces loose kwargs' gives an implied usage cue, but there is no explicit when-to-use/when-not guidance or named alternative. The agent must infer that this is the modern entry point over unspecified older calls.

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

estimate_scopeC

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
scope_request_dictYes

TDQS

C2.7/5.0
Behavior3/5

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

With no annotations, the description carries full burden, and it does disclose two useful traits: it persists (request, estimate), revealing a write side effect, and it names the error return shape (ValidationProblem dict). It omits auth requirements, idempotency/upsert semantics, and what 'persist' means for repeated calls.

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?

Two short sentences, front-loaded with the primary action and side effect, then the return contract. No filler; it is terse rather than padded, though the terseness comes at the cost of omitted detail.

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

Completeness2/5

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

No output schema and no annotations, so the description must do more work than it does. It does name the return values, which partially compensates for the missing output schema, but the nested, undescribed request object remains a black box, which is the critical gap for a tool whose only input is that object.

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

Parameters2/5

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

There is a single parameter at 0% schema description coverage, and it is an open object with additionalProperties=true, so the schema conveys nothing about its contents. The description names 'ScopeRequest' but supplies no field, type, or example, leaving the agent unable to construct a valid argument.

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

Purpose3/5

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

States a verb ('estimate') and a domain resource ('ScopeRequest') and claims to be the 'Canonical entry point', which hints at precedence. However, 'ScopeRequest' is never defined and the description does not distinguish this tool from the many sibling estimates (estimate, estimate_full_property, estimate_property_from_model, estimate_from_deal), so an agent cannot confidently pick it.

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

Usage Guidelines2/5

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

'Canonical entry point' is the only routing hint, but there is no explicit statement of when to use this versus estimate, estimate_from_deal, or estimate_property_from_model, nor any prerequisite or exclusion. No when-not guidance at all.

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
bedroomsYes
bathroomsYes
bid_totalYes
unit_sqftYes
year_builtNo
finish_tierNobasic
scope_levelNostandard_value_add
timeline_daysYes
bid_line_itemsYes
contractor_nameYes

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses detection thresholds (30%+ above benchmark, vague lump sums, unrealistic timelines), which is genuine behavioral context. However it says nothing about permissions, reversibility, or what the evaluation returns, leaving an agent partially informed about a 10-parameter tool.

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 and flag summary are front-loaded and efficient. The Args block, however, largely restates parameter names already in the schema, adding only the enum values and the bid_line_items shape. It is defensible but partly redundant padding.

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

Completeness3/5

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

For a 10-parameter tool with no output schema and no annotations, the description covers inputs acceptably but never describes the shape of the returned evaluation or the flag output. Given the absence of an output schema, more detail on what an agent receives back would be expected.

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 description coverage is 0% and enums are absent from the schema, so the description does real work: it explains bid_line_items expects dicts with 'description' and 'amount', notes timeline_days is None when unspecified, and supplies the enum values for scope_level ('light'/'standard_value_add') and finish_tier ('basic'/'upgraded'). These are essential details not present in the structured schema.

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?

States a specific verb and resource: 'Evaluate a contractor bid against the internal cost estimate.' An agent can immediately tell this assesses a bid rather than producing an estimate, which is what most siblings do. It stops short of naming a sibling to route against, so it lands at 4 rather than 5.

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

Usage Guidelines2/5

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

The description never says when to reach for this tool versus alternatives like estimate_scope or check_renovation_roi, nor does it state prerequisites (e.g. whether an internal estimate must already exist). The flag criteria hint at intended use but no explicit selection guidance is given.

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
unit_idNo
bedroomsYes
bathroomsYes
unit_sqftYes
finish_tierNobasic
scope_levelNostandard_value_add
property_addressNo

TDQS

B3.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It usefully discloses what is produced ('material specs, quantities, and quality standards'), but says nothing about side effects, whether the document is persisted, authentication needs, or cost — notable gaps for an unannotated generation tool.

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?

Front-loads the verb and output in two tight sentences, then lists args compactly. No redundancy, though the arg annotations are terse and could be slightly more informative.

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

Completeness3/5

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

With no output schema and no annotations, the description does describe the return document's content and fills the enum gap. However, it omits persistence/side-effect behavior and sibling differentiation, leaving meaningful gaps for a 7-parameter unannotated tool.

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?

With 0% schema description coverage and no enums declared in the schema, the description compensates by enumerating the allowed values for scope_level ('light' or 'standard_value_add') and finish_tier ('basic' or 'upgraded'), which the schema omits entirely. The remaining params largely restate titles, keeping it short of a 5.

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?

States a specific verb+resource ('Generate a detailed scope of work (SOW)') and clarifies the audience and output ('contractor-ready document'). An agent can distinguish it from estimate-style siblings, but the description never explicitly contrasts it with close siblings like estimate_scope or evaluate_contractor_bid.

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

Usage Guidelines2/5

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

The phrase 'for contractor bidding' hints at a scenario but provides no when-to-use vs when-not guidance and names no alternative tool. With siblings such as estimate_scope and evaluate_contractor_bid, the agent gets no help choosing between them.

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
property_idYes

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose the return shape (list of dicts of triples) and the empty-list edge case, which is genuinely useful behavioral detail, but it says nothing about permissions, whether the history is ordered/complete, or pagination for a read tool with no annotation coverage.

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?

Two tight sentences with zero filler, front-loading the return contract and then the edge case. The tuple notation is dense but compact and informative.

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?

With no output schema and no annotations, the description does the important work of describing the return structure and the empty case. What remains missing is ordering/recency semantics and any usage context relative to the estimate siblings.

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

Parameters3/5

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

Schema coverage is 0% and the single parameter property_id is undocumented in the schema. The description implies scoping 'for a property' but never names or explains property_id's format, so it only marginally compensates for the coverage gap; with just one obvious parameter, this is acceptable but thin.

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?

States a specific verb ('Return') and resource ('property history') and even names the exact tuple structure returned. It does not explicitly contrast with siblings like estimate_scope or generate_scope_of_work, but the resource is distinct enough that confusion is unlikely.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus the many estimate/scope siblings, nor any prerequisite or context for calling it. The agent must infer usage entirely from the name.

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

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%)

ParametersJSON Schema
NameRequiredDescriptionDefault
marketNo
unit_idNo
bedroomsYes
bathroomsYes
unit_sqftYes
year_builtNo
finish_tierNobasic
scope_levelNostandard_value_add
start_monthYes
monthly_paceYes
downtime_daysNo
threshold_pctNo
property_classNo
target_monthly_rentYes
current_monthly_rentYes

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it discloses the exact return structure (renovation_program, roi_result, ready_to_underwrite) and the failure behavior including the path_to_pass guidance in roi_result. It stops short of stating side effects or auth/compute-only nature, but failure-mode and output disclosure is genuinely informative.

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, followed by a compact pipeline summary, a bulleted return block, the ROI-failure behavior, and an args list. Slightly long but every section adds distinct value; the only minor redundancy is restating the pipeline flow in prose after the purpose line.

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 15-parameter tool with no output schema and no annotations, the description is substantively complete: it covers purpose, returns, failure path, and most argument semantics. Remaining gaps (no side-effect safety statement, no note on whether it writes files) are minor given the compute-style pipeline it describes.

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 description coverage is 0%, so the description must compensate, and it largely does: it explains that unit_sqft drives the size category, gives the 'YYYY-MM' format for start_month, enumerates valid values for scope_level, finish_tier, property_class and market, notes year_built triggers risk flags, and gives defaults for downtime_days and threshold_pct. The few undocumented params (bedrooms, rent figures) are self-evident, though this stops short of a full 5.

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?

States specific verbs and resources: estimates unit cost, validates ROI, and produces an underwriting-ready renovation program. The three-stage pipeline (estimate → ROI gate → bridge dict) is concrete. However, it never names or contrasts with siblings like check_renovation_roi or estimate_scope, so an agent must infer this is the composite wrapper rather than the single-purpose tools.

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

Usage Guidelines3/5

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

The phrase 'Runs the full pipeline' implies this is the end-to-end option versus the granular siblings, but there is no explicit when-to-use or when-not-to-use guidance. The ROI-failure branch is described, but the choice against check_renovation_roi + estimate_scope is left to inference.

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

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
property_dataYes

TDQS

B3.4/5.0
Behavior4/5

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

With zero annotations, the description carries the full burden and does it well: it discloses idempotency, the identity key (external_alias), the property_id minting, the FloorPlan dedup key, and the create-on-miss side effect, plus a behavior-change note about previously dropped floor plans. Missing only auth/permission requirements and a fuller return description, which the absent output schema would otherwise require.

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?

Front-loads the single most important fact ('Idempotent property registration') and keeps supporting detail tight. The trailing sentence recounting 'the previous behavior silently dropped it' reads as changelog rather than call guidance, costing a bit of economy.

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

Completeness3/5

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

For a write tool with no annotations, no output schema, and an opaque nested parameter, the description covers behavior and idempotency well but leaves gaps: the structure of the Property dict, required fields, and error/failure behavior are not addressed. It is adequate but not fully self-sufficient.

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

Parameters3/5

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

Schema coverage is 0% for a single nested property_data object (additionalProperties=true), so the schema is effectively opaque. The description compensates by naming the payload shape ('Property-shaped dict') and the optional inline floor_plans key, but it never enumerates the required Property fields or the floor_plan fields, so an agent still can't construct a valid payload from the definition alone.

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?

States a specific verb+resource ('property registration') and immediately qualifies it as idempotent, plus names the concrete effects (mints property_id, dedupes floor_plans). No sibling is a registration/write tool, so differentiation is not the binding constraint here, but the description never explicitly contrasts with the estimation siblings.

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

Usage Guidelines2/5

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

There is no explicit when-to-use or when-not guidance and no alternative tool is named. The idempotency and dedup explanation implies repeat-call behavior but leaves the agent to infer when registration (vs. estimation) is the right call.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.1.1
    • First observedcheck_renovation_roi
    • First observedestimate
    • First observedestimate_from_deal
    • First observedestimate_full_property
    • First observedestimate_property_from_model
    • First observedestimate_scope
    • First observedevaluate_contractor_bid
    • First observedgenerate_scope_of_work
    • First observedget_property_history
    • First observedprepare_renovation_program_tool
    • First observedregister_property

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

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to prepare floor plans for Ritn3D and interpret 3D outputs by providing tools for validation, complexity estimation, pricing, and failure analysis.
    9
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to operate property management systems via natural language, covering repair orders, owner info, payments, notices, and inspections. Features a full agentic workflow with human-in-the-loop and observability.
    MIT