{"name":"com.tektolo/rental-property","slug":"tektolo-rental-property","title":"Tektolo Rental Property","description":"Rental property tools for agents: turnover cost estimates and security deposit rules by US state.","url":"https://mcp.market/server/tektolo-rental-property","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"security","tags":["security"],"presence":{"score":23,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-10-11T16:39:28.000Z","license":"MIT-0"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T08:30:52.934Z","last_ok_at":"2026-11-04T08:30:52.934Z","latency_ms":658},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/tektolo/skills","website":"https://tektolo.com/","version":"0.1.0","remotes":[{"type":"streamable-http","url":"https://tektolo.com/mcp/rental-property"}],"packages":[],"tools":[{"name":"deposit_settlement_rules","description":"Looks up the security deposit rules (deposits only) for one US state, with a covered city's deposit ordinance (Chicago, San Francisco, Berkeley, Los Angeles, Seattle, Portland, Minneapolis, Saint Paul). Inputs: state (two-letter code); optional city. Returns the deposit return deadline and what starts it, itemization and documentation duties, allowed deductions and depreciation, deposit interest, penalties, the deposit cap and recent changes, with citations. Not for: settling a specific move-out (deposit_settlement_settle does that), evictions, unpaid-rent collection, rent increases or rent control, lease renewal or notice periods, legal advice.\nDeterministic and source-cited: the same input gives the same result.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"state":{"type":"string"},"city":{"maxLength":80,"type":"string","description":"Optional city for its overlay (e.g. 'Chicago')."},"audit":{"default":false,"description":"Also return the run record and input/result hashes (an audit trail). Default false.","type":"boolean"}},"required":["state"],"examples":[{"state":"IL","city":"Chicago"}]}},{"name":"deposit_settlement_settle","description":"Settles a US residential security deposit after move-out under the state's statute (50 states and DC) and a covered city's ordinance. Inputs: state, deposit_usd, vacated_on; optional city, monthly_rent_usd, move_in_on, deductions (category, amount, item age, whether the tenant caused it), the dates that start a state's clock, and as_of. Returns the return deadline and its status, each deduction allowed or not (with depreciation), interest owed, refund due, penalty exposure, a draft itemized statement and a citation for every rule. Not for: legal advice, tenant demand letters, repair cost estimates, pet deposits, rentals outside the US.\nDeterministic and source-cited: the same input gives the same result.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"client_refs":{"additionalProperties":{"type":"string"},"type":"object","description":"Your own reference ids (e.g. unit_id, job_id). Echoed back, never used."},"state":{"type":"string"},"city":{"maxLength":80,"type":"string","description":"City, for a city overlay where covered (e.g. 'Chicago'). Optional."},"deposit_usd":{"anyOf":[{"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}]},"monthly_rent_usd":{"description":"Monthly rent, for the deposit cap check.","anyOf":[{"maximum":10000000,"minimum":0,"type":"number"},{"pattern":"^\\$?[0-9][0-9,]*(\\.[0-9]+)?$","type":"string"}]},"building_units":{"maximum":100000,"minimum":1,"type":"integer","description":"Units in the building. Some interest rules depend on it (NY 6+, IL 25+)."},"move_in_on":{"format":"date","type":"string","description":"Tenancy start (YYYY-MM-DD). Used for interest and, when an item's age is unknown, for depreciation."},"tenancy_ended_on":{"format":"date","type":"string","description":"When the tenancy actually ended (YYYY-MM-DD): the lease's end, or an earlier termination or accepted surrender. Deadlines that run from the end of the tenancy use it. For a tenant who left before the lease was due to end, send the scheduled end as lease_end_on (older callers sent it here, which still works: the deadline is then counted from it, with the move-out date as an earlier alternative where the facts point to one)."},"lease_end_on":{"format":"date","type":"string","description":"Day the lease was scheduled to end (YYYY-MM-DD), when it differs from when the tenancy actually ended (a broken lease). Lost rent and lease-break charges run to it; deadlines do not (they follow tenancy_ended_on, else the move-out, with the scheduled end as a later alternative)."},"vacated_on":{"format":"date","type":"string"},"forwarding_address_received_on":{"format":"date","type":"string","description":"Day you received the tenant's written forwarding address (YYYY-MM-DD). Several states start or hold the clock on it (Texas, Connecticut, Iowa, Minnesota)."},"tenant_gave_forwarding_address":{"type":"boolean","description":"False when the tenant never gave a forwarding address in writing (not just 'not yet known'). Illinois, Pennsylvania, Ohio, Delaware, South Carolina and New Hampshire then relieve the landlord of the penalty. Implied true by forwarding_address_received_on."},"demand_received_on":{"format":"date","type":"string","description":"Day you received the tenant's written demand for the deposit (YYYY-MM-DD). Arizona, Kansas, Oklahoma, South Carolina and Mississippi start the clock on it."},"new_tenant_moved_in_on":{"format":"date","type":"string","description":"Day a new tenant moved in, if the unit was re-rented (YYYY-MM-DD). West Virginia and Wisconsin can end the period earlier; rent claimed for days from it on is not recoverable (re-rent mitigation)."},"new_tenant_rent_usd":{"description":"Monthly rent the new tenant pays (with new_tenant_moved_in_on): the rent received for overlapping days is credited against rent claimed for them.","anyOf":[{"maximum":10000000,"minimum":0,"type":"number"},{"pattern":"^\\$?[0-9][0-9,]*(\\.[0-9]+)?$","type":"string"}]},"statement_sent_on":{"format":"date","type":"string","description":"Day you sent (or delivered) the itemized statement (YYYY-MM-DD). With it the statement is judged on time or late; documentation.itemized_statement alone cannot tell."},"claim_notice_sent_on":{"format":"date","type":"string","description":"Day you sent the written notice of intent to impose a claim on the deposit (YYYY-MM-DD). Florida (due within 30 days of termination) and the District of Columbia (within 45 days): the balance is due 30 days after it; a late notice does not count."},"lease_return_days":{"maximum":365,"minimum":0,"type":"integer","description":"Return period the lease sets, in days, where the statute lets a lease set one (Colorado up to 60, Idaho up to 30, Maine shorter)."},"tenant_gave_proper_notice":{"type":"boolean","description":"A termination notice that meets the statute was given (Alaska: 14 days instead of 30 when nothing is deducted for damage)."},"interest_paid_through":{"format":"date","type":"string","description":"Interest already paid or credited to the tenant up to this day (annual-payment rules: San Francisco, Los Angeles, Berkeley, Connecticut, Massachusetts, ...): interest is counted from it."},"nonstandard_provision_signed":{"type":"boolean","description":"Wisconsin: the tenant signed a separate NONSTANDARD RENTAL PROVISIONS document covering the charge (ATCP 134.06(3)(b)); false makes such charges 'no'."},"pet_deposit_usd":{"description":"The part of deposit_usd that is a pet deposit (outside the cap in Missouri, Alabama, North Dakota and Saint Paul; allowed on top of it up to one month in Hawaii and Alaska, half a month in Kansas, a quarter in Nebraska).","anyOf":[{"maximum":10000000,"minimum":0,"type":"number"},{"pattern":"^\\$?[0-9][0-9,]*(\\.[0-9]+)?$","type":"string"}]},"tenant_age_62_plus":{"type":"boolean","description":"The tenant is 62 or older (Connecticut: a one-month cap)."},"tenant_age_60_plus":{"type":"boolean","description":"A person 60 or older occupies the unit (New Hampshire 540-A:5, I: the owner-occupied exemption does not reach the unit). tenant_age_62_plus true implies it."},"small_landlord":{"type":"boolean","description":"California AB 12 small landlord (a natural person or an LLC of natural persons owning at most two properties with at most four units; not for a service member): a two-month cap."},"owner_occupied":{"type":"boolean","description":"The landlord lives in the building (ME, NH, NJ and Chicago exempt small owner-occupied buildings; with building_units)."},"landlord_units_owned":{"minimum":0,"type":"integer","description":"Rental units the landlord owns in all (Arkansas 5 or fewer, Georgia 10 or fewer, with third_party_managed, may be exempt)."},"third_party_managed":{"type":"boolean","description":"A third party manages the unit or collects rent for a fee."},"prepaid_rent_usd":{"description":"Rent paid in advance beyond the first month, held besides deposit_usd. Counts toward the cap in AK, AZ, CA, CT, MD, MI and NY; earns interest in CT, MA (last month's rent), MD and Chicago; in Minneapolis it lowers the deposit cap to half a month.","anyOf":[{"maximum":10000000,"minimum":0,"type":"number"},{"pattern":"^\\$?[0-9][0-9,]*(\\.[0-9]+)?$","type":"string"}]},"tenancy_type":{"enum":["written_lease","at_will"],"type":"string","description":"written_lease or at_will (Maine 6033(2): a written agreement's period, at most 30 days, or 21 days for a tenancy at will; Massachusetts 15B(4): at will, 30 days after the move-out, a written lease, 30 days after its end). Left out with a move-out before tenancy_ended_on: the earlier (at-will) date leads and the other is listed."},"tenant_abandoned":{"type":"boolean","description":"The tenant abandoned the unit or was evicted (Maryland 8-203(h): the clock runs from the tenant's written demand; Washington 59.18.280: from when the landlord learns of it; Louisiana 9:3251(C): the one-month rule does not apply). Left out: inferred from tenant_gave_proper_notice: false; with a move-out before tenancy_ended_on the earlier abandonment clock leads and the other date is listed."},"contractor_needed":{"type":"boolean","description":"Damage exceeds the deposit and needs a third-party contractor, and you said so in writing in time (Virginia, West Virginia: 15 more days)."},"deposit_collected_on":{"format":"date","type":"string","description":"Day the deposit was collected (YYYY-MM-DD); defaults to move_in_on. California (AB 12, from 2024-07-01) and Colorado caps depend on it."},"lease_signed_or_renewed_on":{"format":"date","type":"string","description":"Day the current lease was signed or last renewed (YYYY-MM-DD). Georgia (2024-07-01) and Maryland (2024-10-01) caps apply to leases from then; defaults to move_in_on, with a warning that a later renewal may bring the new cap."},"lease_term_months":{"maximum":600,"minimum":0,"type":"integer","description":"Term of the lease in months (0 for month-to-month). Delaware's cap applies to leases of a year or more, New Mexico's to shorter ones."},"furnished":{"type":"boolean","description":"The unit is rented furnished (California before AB 12: 3 months; Kansas: 1.5 months; Delaware: no cap)."},"rent_ordinance_covered":{"type":"boolean","description":"The unit is covered by the city's rent ordinance (Los Angeles RSO, Berkeley Rent Ordinance). Their deposit interest is owed only then; unknown: the amount is shown beside the refund, not in it."},"interest_rate_percent":{"description":"Annual rate the deposit account paid, where the law sets interest at the bank's rate (New Jersey, North Dakota, New Hampshire, New York, Pennsylvania, Portland), or caps it (Massachusetts: 5% or the bank's lesser rate). Without it bank-rate interest is unknown. Illinois 765 ILCS 715 uses IDFPR's published rate instead.","anyOf":[{"maximum":25,"minimum":0,"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}]},"deductions":{"description":"What you intend to deduct (or, for a tenant, what the landlord listed). An explicit empty list means nothing is deducted (it decides the shorter no-deduction periods, e.g. Montana 10 days, Alaska 14); leave it out when that is not known yet.","items":{"$ref":"#/$defs/Deduction"},"maxItems":50,"type":"array"},"returned":{"$ref":"#/$defs/Returned","description":"What the landlord has returned so far and when. With it, timeliness says whether the refund and the itemized statement were on time and how many days late."},"documentation":{"$ref":"#/$defs/Documentation","description":"What documentation you have; leave a field out when unknown."},"as_of":{"description":"Today's date (YYYY-MM-DD) for the deadline status. Defaults to today (UTC); send it for repeatable results.","format":"date","type":"string"},"audit":{"default":false,"description":"Also return the run record and input/result hashes (an audit trail). Default false.","type":"boolean"}},"required":["state","deposit_usd","vacated_on"],"$defs":{"Deduction":{"additionalProperties":false,"properties":{"category":{"description":"One of: unpaid_rent, unpaid_utilities, cleaning, carpet, flooring, paint, blinds_window_coverings, appliance, fixture_or_hardware, wall_or_door_repair, key_or_lock, late_fees, lease_break_fee, moving_and_storage, reletting_costs (advertising or a broker to re-rent after an early move-out), trash_and_abandoned_items (removing trash or belongings left behind), other_damage, other. Carpet cleaning is cleaning (with cleaning_kind), not carpet.","enum":["unpaid_rent","unpaid_utilities","cleaning","carpet","flooring","paint","blinds_window_coverings","appliance","fixture_or_hardware","wall_or_door_repair","key_or_lock","late_fees","lease_break_fee","moving_and_storage","reletting_costs","trash_and_abandoned_items","other_damage","other"],"type":"string"},"description":{"maxLength":200,"type":"string","description":"Your own short note (e.g. 'bedroom carpet, pet stains'). Never stored, hashed or returned; the statement uses the category."},"amount_usd":{"anyOf":[{"maximum":10000000,"minimum":0,"type":"number"},{"pattern":"^\\$?[0-9][0-9,]*(\\.[0-9]+)?$","type":"string"}],"description":"Amount you intend to deduct, in dollars (rounded to cents)."},"item_installed_on":{"format":"date","type":"string","description":"When the item (carpet, paint, appliance...) was installed or last replaced (YYYY-MM-DD). Give this or item_age_years, not both."},"item_age_years":{"description":"Age of the item in years at move-out (e.g. 4.5).","anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}]},"useful_life_years":{"description":"Override the useful life used for depreciation (years).","anyOf":[{"exclusiveMinimum":0,"maximum":100,"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}]},"caused_by_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"False when the condition is normal wear and tear (never deductible); null when it is disputed or unknown (a tenant checking a landlord's list): the line is then 'depends', with the amount the rule would allow if it is damage."},"has_receipt":{"type":"boolean","description":"You have a receipt, invoice or estimate for this line."},"has_photos":{"type":"boolean","description":"You have photos of this damage."},"utility_kind":{"enum":["water","sewer","electric","gas","heat","trash","internet","other"],"type":"string","description":"unpaid_utilities only: which utility. Some states allow only some (Massachusetts: water); without it such a line is 'depends'."},"late_payments":{"maximum":600,"minimum":1,"type":"integer","description":"late_fees only: how many late payments (or months, where the cap is per month) the fee covers. A statutory cap is per late payment; without this, more than one cap is 'depends'."},"work_kind":{"enum":["repair","replace","cleaning"],"type":"string","description":"repair (restores the item: never depreciated), replace (a new item: prorated by the old one's remaining life where the rule does), or cleaning (e.g. carpet cleaning: judged as a cleaning line)."},"rent_through":{"format":"date","type":"string","description":"unpaid_rent only: the last day the rent charged covers. With new_tenant_moved_in_on it decides how much of the rent overlaps the new tenancy (not recoverable: the landlord cannot collect rent twice for the same days)."},"cleaning_kind":{"enum":["beyond_wear","routine","unknown"],"type":"string","description":"cleaning only: beyond_wear (the unit was left dirtier than normal use; cleaning to restore its move-in condition), routine (ordinary cleaning after normal use, which most states treat as normal wear) or unknown. Where the statute does not name cleaning, an unknown kind is 'depends'."}},"required":["category","amount_usd"],"type":"object"},"Documentation":{"additionalProperties":false,"properties":{"itemized_statement":{"type":"boolean","description":"You will send (or sent) an itemized statement."},"receipts":{"type":"boolean","description":"You have receipts or invoices for the repairs and cleaning."},"photos_move_in":{"type":"boolean","description":"Dated move-in photos."},"photos_move_out":{"type":"boolean","description":"Dated move-out photos."},"photos_after_repair":{"type":"boolean","description":"Photos after repairs."},"cleaning_notice":{"type":"boolean","description":"You gave the tenant written notice of the cleaning needed and time to do it before charging for cleaning (Montana 70-25-201(3): 24 hours)."},"move_in_condition_statement":{"type":"boolean","description":"You gave the tenant a written move-in condition statement or checklist (Montana 70-25-206, Washington 59.18.260; listed as a duty in Georgia 44-7-33(a), Kentucky 383.580(2), Michigan 554.608 and Virginia 55.1-1214)."},"move_out_list":{"type":"boolean","description":"You inspected the unit and made the move-out damage list in time (Georgia 44-7-33(b): within 3 business days)."}},"type":"object"},"Returned":{"additionalProperties":false,"description":"What the landlord has returned so far: lets the result say whether the refund and the\nitemized statement came on time (``timeliness``).","properties":{"what":{"description":"nothing: nothing returned yet; full_refund: the whole deposit; partial_refund: part of it, with no itemized statement; itemized_statement: an itemized statement of deductions (with any refund the same day).","enum":["nothing","full_refund","partial_refund","itemized_statement"],"type":"string"},"on":{"format":"date","type":"string","description":"Day it was sent or delivered (YYYY-MM-DD); required unless what is nothing. Statutes count the day the landlord mails or delivers it; a postmark is the best evidence."},"amount_usd":{"description":"Amount refunded, dollars (partial_refund or itemized_statement).","anyOf":[{"maximum":10000000,"minimum":0,"type":"number"},{"pattern":"^\\$?[0-9][0-9,]*(\\.[0-9]+)?$","type":"string"}]},"method":{"enum":["check","electronic","other"],"type":"string","description":"How the money went back: check, electronic (direct deposit or electronic transfer) or other. Some statutes key on it (Michigan 554.609(3): an electronic balance may follow the notice by 10 days; California 1950.5 as amended by AB 414: electronic return when the deposit or rent was paid electronically)."}},"required":["what"],"type":"object"}},"examples":[{"state":"CA","deposit_usd":"2000","monthly_rent_usd":"2000","move_in_on":"2023-06-01","vacated_on":"2026-09-30","deductions":[{"category":"cleaning","amount_usd":"150"},{"category":"carpet","amount_usd":"1200","item_age_years":5}],"as_of":"2026-10-09"}]}},{"name":"property_turnover_issue_codes","description":"Searches the standard taxonomy of rental-unit turnover issues (component.issue codes such as carpet.pet_urine). Inputs, all optional: query (keywords), area (e.g. flooring), limit (default 8). With no arguments it lists the taxonomy areas and the first codes. Returns matching codes with names and areas, and the total match count. Codes are optional: the turnover estimate tools also accept plain descriptions. Not for: cost estimates, legal or security-deposit questions, work other than rental turnover.\nDeterministic and source-cited: the same input gives the same result.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"client_refs":{"additionalProperties":{"type":"string"},"type":"object","description":"Your own reference ids (e.g. unit_id, job_id). Echoed back, never used."},"query":{"maxLength":200,"type":"string","description":"Keywords to match against codes, names and aliases, e.g. 'pet stain carpet'."},"area":{"type":"string","description":"Optional taxonomy area filter, e.g. 'flooring' or 'walls' (not a room). Call with no arguments to list every area in `areas`."},"limit":{"default":8,"maximum":200,"minimum":1,"type":"integer"},"include_aliases":{"default":false,"description":"Also return each code's aliases (larger result).","type":"boolean"},"audit":{"default":false,"description":"Also return the run record and input/result hashes (an audit trail). Default false.","type":"boolean"}}}},{"name":"property_turnover_quick_estimate","description":"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\"); 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.\nDeterministic and source-cited: the same input gives the same result.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"client_refs":{"additionalProperties":{"type":"string"},"type":"object","description":"Your own reference ids (e.g. unit_id, job_id). Echoed back, never used."},"zip":{"type":"string"},"bedrooms":{"type":"integer"},"bathrooms":{"anyOf":[{"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}]},"issues":{"description":"What 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.","items":{"type":"string"},"maxItems":100,"type":"array"},"unit_type":{"$ref":"#/$defs/UnitType","default":"apartment"},"sq_ft":{"maximum":20000,"minimum":150,"type":"integer","description":"Interior sq ft."},"year_built":{"maximum":2100,"minimum":1700,"type":"integer"},"carpet":{"type":"boolean","description":"Is there wall-to-wall carpet?"},"profile":{"$ref":"#/$defs/Profile","default":"standard"},"price_tier":{"$ref":"#/$defs/PriceTier","default":"pm_vendor"},"detail":{"default":"summary","description":"summary (default, small) or full (every line).","enum":["summary","full"],"type":"string"},"audit":{"default":false,"description":"Also return the run record and input/result hashes (an audit trail). Default false.","type":"boolean"}},"required":["zip","bedrooms","bathrooms"],"$defs":{"PriceTier":{"description":"Purchasing channel. Library prices are pm_vendor (a PM buying turns from a local vendor).","enum":["bulk_contract","pm_vendor","retail_one_off"],"type":"string"},"Profile":{"enum":["minimum","standard","premium"],"type":"string"},"UnitType":{"enum":["apartment","single_family","townhome","condo","duplex","manufactured"],"type":"string"}},"examples":[{"zip":"43215","bedrooms":2,"bathrooms":1,"issues":["stained carpet in both bedrooms","nail holes everywhere","oven is filthy"]}]}},{"name":"property_turnover_scope","description":"Turns move-out inspection findings for a US rental unit into a priced make-ready scope. For a first estimate use property_turnover_quick_estimate; use this one for rate cards, owner decisions or measured quantities. Inputs: property (ZIP, bedrooms, bathrooms; optional unit type, size, year built) and findings (a description or issue code, with location, extent and quantity); optional rate_card, decisions and detail. Returns tasks by trade with low/expected/high costs for the ZIP, priorities, vendor scopes, refer-outs to licensed professionals, assumptions, unknowns and download links. Not for: diagnosing hazards, legal advice on deposits, remodel bids, properties outside the US.\nDeterministic and source-cited: the same input gives the same result.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"client_refs":{"additionalProperties":{"type":"string"},"type":"object","description":"Your own reference ids (e.g. unit_id, job_id). Echoed back, never used."},"property":{"$ref":"#/$defs/PropertyProfile"},"findings":{"items":{"$ref":"#/$defs/Finding"},"maxItems":200,"type":"array"},"standards":{"$ref":"#/$defs/Standards"},"rate_card":{"items":{"$ref":"#/$defs/RateCardEntry"},"maxItems":300,"type":"array"},"trade_vendors":{"additionalProperties":{"$ref":"#/$defs/Vendor"},"propertyNames":{"$ref":"#/$defs/Trade"},"type":"object"},"constraints":{"$ref":"#/$defs/Constraints"},"tax_rate":{"description":"Applied to all lines, e.g. 0.07.","anyOf":[{"maximum":0.2,"minimum":0,"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}]},"decisions":{"items":{"$ref":"#/$defs/Decision"},"maxItems":500,"type":"array"},"retain":{"default":true,"description":"Optional (contract 0.5.0). false: keep none of this request's text. By default the finding descriptions are kept with contact details and access codes removed, to improve matching; the estimate is the same either way.","type":"boolean"},"detail":{"default":"summary","description":"summary: totals, trade scopes, every line tied to a finding (capped at 40) plus the largest must-fix/refer-out lines, a one-line note on the routine lines left out, notes, and only findings needing attention (small). full: every line, finding and source.","enum":["summary","full"],"type":"string"},"audit":{"default":false,"description":"Also return the run record and input/result hashes (an audit trail). Default false.","type":"boolean"}},"required":["property"],"$defs":{"Area":{"enum":["whole_unit","kitchen","living_room","dining_room","bedroom","bathroom","hallway","entry","laundry","closet","garage","patio_balcony","exterior","yard","other"],"type":"string"},"Constraints":{"additionalProperties":false,"properties":{"target_ready_date":{"format":"date","type":"string"},"occupied":{"default":false,"description":"Work happens while occupied.","type":"boolean"},"access_notes":{"maxLength":500,"type":"string"}},"type":"object"},"Decision":{"additionalProperties":false,"description":"Owner decision. Re-run the same request with decisions to get the approved scope.","properties":{"line_id":{"type":"string"},"finding_id":{"type":"string"},"action":{"enum":["approve","decline","defer"],"type":"string"},"note":{"maxLength":300,"type":"string"}},"required":["action"],"type":"object"},"Extent":{"enum":["spot","partial","full"],"type":"string"},"Extraction":{"additionalProperties":false,"description":"How a finding was produced, when software read it from free text (contract 0.4.0).\n\nSet by the web tool when its AI reader (Azure OpenAI) turned a person's own words into this\nfinding. The engine reports such a finding as ``resolution: \"ai\"`` with ``needs_review``\nand flags its lines; it never changes how the finding is priced.","properties":{"method":{"const":"ai","description":"'ai': read by a language model from free text.","type":"string"},"model":{"description":"The model that read it, e.g. 'gpt-5-nano 2025-08-07'.","maxLength":80,"pattern":"^[A-Za-z0-9._:() -]+$","type":"string"},"confidence":{"anyOf":[{"maximum":1,"minimum":0,"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}],"description":"The reader's confidence, 0 to 1."}},"required":["method","model","confidence"],"type":"object"},"Finding":{"additionalProperties":false,"description":"One observed condition. Give a taxonomy `code` if you know it, else a `description`.","properties":{"id":{"maxLength":40,"pattern":"^[A-Za-z0-9_.:-]+$","type":"string","description":"Your id for this finding; defaults to f1, f2, ... in order."},"location":{"$ref":"#/$defs/Location","description":"Object {\"area\": \"bedroom\", \"label\": \"Bedroom 2\"}, or a plain string such as \"Bedroom 2\" or \"kitchen\" (mapped to an area; other text becomes the label)."},"code":{"maxLength":80,"type":"string","description":"Optional. Only a code returned by property_turnover_issue_codes (e.g. 'walls.nail_holes'); otherwise leave it out and use description."},"description":{"maxLength":300,"type":"string","description":"Plain description if no code, e.g. 'dog urine stains in bedroom carpet'."},"extent":{"$ref":"#/$defs/Extent","description":"spot | partial | full; defaults per issue."},"quantity":{"$ref":"#/$defs/Quantity","description":"Measured amount, e.g. 120 sq_ft. Derived when omitted."},"notes":{"maxLength":1000,"type":"string"},"extraction":{"$ref":"#/$defs/Extraction","description":"Leave out. Set by the web tool for findings its AI reader produced from free text; they come back as resolution 'ai' with needs_review."}},"type":"object"},"FloorCoverings":{"additionalProperties":false,"description":"What is on the floors. Drives the carpet-cleaning baseline and whole-unit carpet sizes.","properties":{"carpet_present":{"type":"boolean","description":"Is there wall-to-wall carpet? Omit if unknown: carpet findings then imply carpet; with no carpet findings, whole-unit carpet cleaning is left out and listed as unknown."},"carpet_sq_ft":{"maximum":20000,"minimum":0,"type":"integer","description":"Carpeted floor area. Omit to assume 60% of the unit floor area."}},"type":"object"},"Location":{"additionalProperties":false,"description":"Where the finding is. Also accepted as a plain string (\"Bedroom 2\", \"kitchen\").","properties":{"area":{"$ref":"#/$defs/Area","default":"whole_unit"},"label":{"maxLength":60,"type":"string","description":"e.g. 'Bedroom 2'."}},"type":"object"},"PriceTier":{"description":"Purchasing channel. Library prices are pm_vendor (a PM buying turns from a local vendor).","enum":["bulk_contract","pm_vendor","retail_one_off"],"type":"string"},"Profile":{"enum":["minimum","standard","premium"],"type":"string"},"PropertyProfile":{"additionalProperties":false,"properties":{"zip":{"description":"5-digit US ZIP code (no street address).","pattern":"^\\d{5}$","type":"string"},"unit_type":{"$ref":"#/$defs/UnitType","default":"apartment","description":"Single-family homes and townhomes get house-sized defaults (floor area, locks)."},"bedrooms":{"description":"0 for a studio.","maximum":12,"minimum":0,"type":"integer"},"bathrooms":{"anyOf":[{"maximum":12,"minimum":0,"multipleOf":0.5,"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}],"description":"Half baths count as 0.5."},"sq_ft":{"maximum":20000,"minimum":150,"type":"integer","description":"Interior sq ft."},"year_built":{"maximum":2100,"minimum":1700,"type":"integer","description":"Drives lead-paint (pre-1978) handling."},"floor_coverings":{"$ref":"#/$defs/FloorCoverings"}},"required":["zip","bedrooms","bathrooms"],"type":"object"},"Quantity":{"additionalProperties":false,"properties":{"value":{"anyOf":[{"exclusiveMinimum":0,"maximum":100000,"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}]},"uom":{"$ref":"#/$defs/Uom"}},"required":["value","uom"],"type":"object"},"RateCardEntry":{"additionalProperties":false,"description":"Your own price. Examples: {\"trade\": \"handyman\", \"unit_price\": 65, \"uom\": \"hour\"} (an\nhourly labor rate for that trade); {\"trade\": \"painter\", \"min_charge\": 150} (visit minimum);\n{\"task_id\": \"carpet.clean\", \"unit_price\": 0.2, \"uom\": \"sq_ft\"} (task_id from a result line).\nA task_id entry beats a trade entry; both beat the library. The result lists what was\napplied and what was ignored (rate_card_applied / rate_card_ignored).","properties":{"task_id":{"type":"string","description":"A task_id from a result line, e.g. 'carpet.clean'."},"trade":{"$ref":"#/$defs/Trade"},"unit_price":{"description":"USD per uom. On a trade entry, uom 'hour' is an hourly labor rate (replaces the labor part of that trade's prices); another uom prices that trade's tasks in it.","anyOf":[{"minimum":0,"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}]},"uom":{"$ref":"#/$defs/Uom","description":"Unit your price is quoted in. Required with a trade unit_price. If it differs from a task's uom, the entry is not applied to that task (see rate_card_ignored)."},"min_charge":{"description":"USD per trade visit.","anyOf":[{"minimum":0,"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}]},"trip_charge":{"description":"USD per trade visit.","anyOf":[{"minimum":0,"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}]}},"type":"object"},"Standards":{"additionalProperties":false,"properties":{"profile":{"$ref":"#/$defs/Profile","default":"standard","description":"minimum (rent-ready basics) | standard | premium (higher finish)."},"overrides":{"$ref":"#/$defs/StandardsOverrides"},"price_tier":{"$ref":"#/$defs/PriceTier","default":"pm_vendor","description":"bulk_contract (portfolio contract prices) | pm_vendor (default: a property manager buying turns from local vendors) | retail_one_off (an owner hiring one contractor)."}},"type":"object"},"StandardsOverrides":{"additionalProperties":false,"properties":{"paint_policy":{"enum":["touch_up","full_if_needed","always_full"],"type":"string"},"carpet_policy":{"enum":["clean","replace_if_damaged","always_replace"],"type":"string"},"cleaning_policy":{"enum":["standard","deep"],"type":"string"},"always_rekey":{"type":"boolean"},"markup_pct":{"description":"Management markup applied to every line, %.","anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}]}},"type":"object"},"Trade":{"enum":["hauling","handyman","drywall","painter","flooring","carpet_cleaning","cleaning","appliance","plumber","electrician","hvac","locksmith","pest_control","landscaping","window_glass","environmental","structural"],"type":"string"},"UnitType":{"enum":["apartment","single_family","townhome","condo","duplex","manufactured"],"type":"string"},"Uom":{"enum":["each","sq_ft","sq_ft_floor","sq_yd","linear_ft","room","unit","bedroom","bathroom","hour","cu_yd","visit"],"type":"string"},"Vendor":{"additionalProperties":false,"properties":{"name":{"maxLength":120,"type":"string"},"contact":{"maxLength":200,"type":"string"}},"required":["name"],"type":"object"}},"examples":[{"property":{"zip":"43215","bedrooms":2,"bathrooms":1},"findings":[{"location":"Bedroom 2","description":"pet urine in carpet"},{"description":"3 blinds broken","quantity":{"value":3,"uom":"each"}}]}]}}],"scan":{"score":92,"grade":"A","scanned_at":"2026-10-12T16:02:30.012Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-12T16:02:30.015Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 491ms"]},"poisoning":{"score":15,"max":15,"notes":["5 tool descriptions checked"]},"auth":{"score":10,"max":15,"notes":["open endpoint, read-only tools"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":9,"max":10,"notes":["registry namespace matches repository owner","website matches verified namespace"]}},"findings":[],"inputs":{"probes":[{"url":"https://tektolo.com/mcp/rental-property","reachable":true,"authRequired":false,"latencyMs":491,"serverInfo":{"name":"Tektolo","version":"0.1.0"}}],"packages":[],"repo":{"found":true,"owner":"tektolo","repo":"skills","archived":false,"pushedAt":"2026-10-11T16:39:28Z","stars":0,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/340291483?v=4","ownerCreatedAt":"2026-10-09T19:10:25Z","license":"MIT-0"},"icon":{"url":"https://tektolo.com/static/brand/icon-512.png","source":"registry","width":512,"height":512},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":"MIT-0","lastPushAt":"2026-10-11T16:39:28.000Z","score":23}}}},"grade_history":[],"reviews":[]}