Skip to main content
Glama

Tektolo Rental Property

Quick turnover estimate (start here)

property_turnover_quick_estimate
Read-onlyIdempotent

Estimates what it costs to turn over a US rental unit after move-out; the first tool for a turnover estimate. Inputs: a 5-digit ZIP, bedrooms, bathrooms and the issues in plain English (e.g. "stained carpet in both bedrooms"), which may come from the user's photos; optional unit type, size, year built. Returns a priced make-ready estimate: repair tasks by trade with low/expected/high costs for the ZIP's labor market, must/should/could priorities, refer-outs to licensed professionals, assumptions, and links to the web tool and downloads. Same engine as property_turnover_scope. Not for: diagnosing hazards, legal advice on deposits, remodel bids, properties outside the US. Deterministic and source-cited: the same input gives the same result.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
zipYesThe user's 5-digit US ZIP code. If it is missing or not exactly 5 digits, ask the user; never guess, pad or correct it.
auditNoAlso return the run record and input/result hashes (an audit trail). Default false.
sq_ftNoInterior sq ft.
carpetNoIs there wall-to-wall carpet?
detailNosummary (default, small) or full (every line).summary
issuesNoWhat was found in plain English, e.g. ['stained carpet in both bedrooms', 'nail holes everywhere', 'oven is filthy']. Read like pasted notes: an entry may hold several conditions ('carpet stained, nail holes'; one finding each); a room before or after the condition sets the location ('Bedroom 2 carpet torn', 'mold in bathroom'); a written count sets the quantity ('3 blinds broken'); an entry saying there is no work ('no mold', 'leak fixed by tenant') is reported as not billed.
profileNominimum (rent-ready basics) | standard | premium (higher finish).standard
bedroomsYes0 for a studio.
bathroomsYesHalf baths count as 0.5.
unit_typeNoSingle-family homes and townhomes get house-sized defaults (floor area, locks).apartment
price_tierNobulk_contract (portfolio contract prices) | pm_vendor (default: a property manager buying turns from local vendors) | retail_one_off (an owner hiring one contractor).pm_vendor
year_builtNoDrives lead-paint (pre-1978) handling.
client_refsNoYour own reference ids (e.g. unit_id, job_id). Echoed back, never used.
serve_pinnedNoOptional, with expect_ruleset. True asks us to answer under the ruleset version you named even when the rules have changed since, from that version's signed bundle; the result says so in served_from_bundle. We refuse a version older than 12 months, one a later correction or law change replaced for your state, or one we have no bundle for. Default false: the call fails whenever the rules have changed.
expect_rulesetNoOptional. The ruleset version you built against, as results carry it in provenance.ruleset_version (e.g. 'sd-2026.11.14'), or its sha256: hash. If the rules have changed since, the call fails (nothing computed, nothing charged) and says what is in force now, so you upgrade on your own schedule. Leave it out to answer under the current rules.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
runNo
linksNo
resultYes
signatureNo
input_hashNo
client_refsNo
result_hashNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • addedInput schema / properties / expect_ruleset
      Added value: +{
      +  "description": "Optional. The ruleset version you built against, as results carry it in provenance.ruleset_version (e.g. 'sd-2026.11.14'), or its sha256: hash. If the rules have changed since, the call fails (nothing computed, nothing charged) and says what is in force now, so you upgrade on your own schedule. Leave it out to answer under the current rules.",
      +  "type": "string"
      +}
    • addedInput schema / properties / serve_pinned
      Added value: +{
      +  "default": false,
      +  "description": "Optional, with expect_ruleset. True asks us to answer under the ruleset version you named even when the rules have changed since, from that version's signed bundle; the result says so in served_from_bundle. We refuse a version older than 12 months, one a later correction or law change replaced for your state, or one we have no bundle for. Default false: the call fails whenever the rules have changed.",
      +  "type": "boolean"
      +}
    • addedOutput schema / $defs / ResultSignature
      Added value: +{
      +  "properties": {
      +    "jws": {
      +      "type": "string"
      +    },
      +    "payload": {
      +      "$ref": "#/$defs/ResultSignaturePayload"
      +    },
      +    "verify_code": {
      +      "type": "string"
      +    },
      +    "verify_url": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "jws",
      +    "payload",
      +    "verify_code",
      +    "verify_url"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / $defs / ResultSignaturePayload
      Added value: +{
      +  "properties": {
      +    "capability": {
      +      "type": "string"
      +    },
      +    "engine_version": {
      +      "type": "string"
      +    },
      +    "issued_at": {
      +      "type": "string"
      +    },
      +    "kid": {
      +      "type": "string"
      +    },
      +    "operation": {
      +      "type": "string"
      +    },
      +    "result_hash": {
      +      "type": "string"
      +    },
      +    "ruleset_hash": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "ruleset_version": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "v": {
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "v",
      +    "kid",
      +    "capability",
      +    "operation",
      +    "ruleset_version",
      +    "ruleset_hash",
      +    "engine_version",
      +    "result_hash",
      +    "issued_at"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / signature
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/ResultSignature"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
  2. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint true, destructiveHint false and openWorldHint false, so safety is covered. The description adds genuinely useful behavior beyond that: deterministic with source citations, the composition of the priced result (trades, low/expected/high, priorities, refer-outs), and that inputs may originate from user photos. It does not restate the safety profile, which is the right call.

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 purpose, then returns, then relationship to the sibling engine, then exclusions. It is dense but every clause carries information; the only cost is a long single-paragraph run of semicolon-separated ideas.

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 15-parameter tool with an output schema, the description covers what it returns, when to pick it over the sibling, the engine relationship, and the domain boundaries. Return-value detail is legitimately delegated to the output schema, so nothing an agent needs to call correctly is missing.

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 description coverage is 100%, so the schema already carries per-parameter meaning (ZIP rules, issues parsing, profile, price_tier, ruleset pinning). The description only restates the input list at a high level and adds the 'plain English, maybe from photos' framing for issues, which is marginal over the schema. Baseline 3 is appropriate.

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?

Specific verb+resource ('Estimates what it costs to turn over a US rental unit after move-out') and it explicitly positions itself as the entry point. It distinguishes itself from siblings by naming property_turnover_scope ('Same engine as...') and by listing what it is not for, so an agent can route without opening a schema.

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

Usage Guidelines5/5

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

Says to start here ('the first tool for a turnover estimate'), names the alternative engine, and gives explicit exclusions: diagnosing hazards, legal advice on deposits, remodel bids, non-US properties. Both the when-to-use and when-not-to-use conditions are stated.

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.

Resources