Skip to main content
Glama

Tektolo Rental Property

Settle a security deposit after move-out

deposit_settlement_settle
Read-onlyIdempotent

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. Deterministic and source-cited: the same input gives the same result.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
cityNoCity, for a city overlay where covered (e.g. 'Chicago'). Optional.
as_ofNoToday's date (YYYY-MM-DD) for the deadline status. Defaults to today (UTC); send it for repeatable results.
auditNoAlso return the run record and input/result hashes (an audit trail). Default false.
stateYesUS state, 2-letter code (e.g. 'CA'); a state name also works.
returnedNoWhat 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.
furnishedNoThe unit is rented furnished (California before AB 12: 3 months; Kansas: 1.5 months; Delaware: no cap).
deductionsNoWhat 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.
move_in_onNoTenancy start (YYYY-MM-DD). Used for interest and, when an item's age is unknown, for depreciation.
vacated_onYesDay the tenant moved out and returned possession (YYYY-MM-DD).
client_refsNoYour own reference ids (e.g. unit_id, job_id). Echoed back, never used.
deposit_usdYesSecurity deposit held, dollars.
lease_end_onNoDay 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).
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.
tenancy_typeNowritten_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.
documentationNoWhat documentation you have; leave a field out when unknown.
building_unitsNoUnits in the building. Some interest rules depend on it (NY 6+, IL 25+).
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.
owner_occupiedNoThe landlord lives in the building (ME, NH, NJ and Chicago exempt small owner-occupied buildings; with building_units).
small_landlordNoCalifornia 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.
pet_deposit_usdNoThe 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).
monthly_rent_usdNoMonthly rent, for the deposit cap check.
prepaid_rent_usdNoRent 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.
tenancy_ended_onNoWhen 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).
tenant_abandonedNoThe 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_neededNoDamage exceeds the deposit and needs a third-party contractor, and you said so in writing in time (Virginia, West Virginia: 15 more days).
lease_return_daysNoReturn period the lease sets, in days, where the statute lets a lease set one (Colorado up to 60, Idaho up to 30, Maine shorter).
lease_term_monthsNoTerm 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.
statement_sent_onNoDay 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.
demand_received_onNoDay you received the tenant's demand for the deposit (YYYY-MM-DD; written in Oklahoma, by first-class mail in Maryland 8-203(h)). Arizona, Kansas, Oklahoma, South Carolina and Mississippi start the clock on it.
tenant_age_60_plusNoA 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.
tenant_age_62_plusNoThe tenant is 62 or older (Connecticut: a one-month cap).
new_tenant_rent_usdNoMonthly rent the new tenant pays (with new_tenant_moved_in_on): the rent received for overlapping days is credited against rent claimed for them.
third_party_managedNoA third party manages the unit or collects rent for a fee.
claim_notice_sent_onNoDay 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.
deposit_collected_onNoDay 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.
landlord_units_ownedNoRental units the landlord owns in all (Arkansas 5 or fewer, Georgia 10 or fewer, with third_party_managed, may be exempt).
interest_paid_throughNoInterest 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.
interest_rate_percentNoAnnual 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.
new_tenant_moved_in_onNoDay 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).
rent_ordinance_coveredNoThe 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.
tenant_gave_proper_noticeNoA termination notice that meets the statute was given (Alaska: 14 days instead of 30 when nothing is deducted for damage).
lease_signed_or_renewed_onNoDay 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.
nonstandard_provision_signedNoWisconsin: the tenant signed a separate NONSTANDARD RENTAL PROVISIONS document covering the charge (ATCP 134.06(3)(b)); false makes such charges 'no'.
forwarding_address_received_onNoDay 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_addressNoFalse 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.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
runNo
linksNo
resultYes
signatureNo
input_hashNo
client_refsNo
result_hashNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed11 schema fields changed
    • changedInput schema / $defs / Deduction / properties / description / description
      Previous value: -"Your own short note (e.g. 'bedroom carpet, pet stains'). Never stored, hashed or returned; the statement uses the category."New value: +"What was damaged or owed and the repair or charge (e.g. 'bedroom carpet: pet stains, two areas patched'). Printed under the line on the itemized statement you download (HTML or PDF); never stored, logged or hashed, and not in the result."
    • addedInput schema / $defs / Deduction / properties / good_faith_estimate
      Added value: +{
      +  "description": "The amount is a good-faith estimate: the repair cannot reasonably be finished within the return period, or the vendor's bills have not arrived (California 1950.5(h)(3)). The receipts then follow within 14 days of the repair or the documents.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / demand_received_on / description
      Previous value: -"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 value: +"Day you received the tenant's demand for the deposit (YYYY-MM-DD; written in Oklahoma, by first-class mail in Maryland 8-203(h)). Arizona, Kansas, Oklahoma, South Carolina and Mississippi start the clock on it."
    • 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 / Deadline / properties / reverted_after
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "date",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedOutput schema / $defs / Provenance / properties / rules_as_of
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "date",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • 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"
      +}
    • changedOutput schema / $defs / TimelyCheck / properties / status / enum
      Previous value: -[
      -  "on_time",
      -  "late",
      -  "not_yet_due",
      -  "overdue",
      -  "not_started",
      -  "none_in_statute"
      -]New value: +[
      +  "on_time",
      +  "late",
      +  "not_yet_due",
      +  "overdue",
      +  "not_started",
      +  "none_in_statute",
      +  "reverted"
      +]
    • addedOutput schema / properties / signature
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/ResultSignature"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
  2. First observed

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, non-destructive, closed-world behavior, so the description only needs to add beyond that. It does: determinism and source-citation ('the same input gives the same result'), plus a preview of what is produced (deadline status, per-deduction allow/deny with depreciation, interest owed, penalty exposure, draft itemized statement, citation per rule). It does not mention failure modes such as a ruleset-version mismatch, which live only in the schema.

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 a compact inputs clause, an outputs clause, exclusions, and a determinism tag. It is dense and earns most of its length, though the inputs/outputs recap partially duplicates what the 100%-covered schema already states.

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 45-parameter tool with nested objects, an output schema, and full annotation coverage, the description supplies the needed framing: scope, jurisdictional limits, output shape, and determinism. The remaining detail (per-field statutory nuance, ruleset pinning behavior) is fully carried by the schema, so nothing an agent needs to call it 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 every parameter already carries authoritative documentation, including statutory citations and defaults. The description only recaps the required trio plus a grouped list of optional inputs, adding framing but no semantics the schema lacks; baseline 3 applies.

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?

Opens with a specific verb and resource: settling a US residential security deposit after move-out under state statute and city ordinance, with the jurisdictional scope made explicit ('50 states and DC'). The 'Not for' list (legal advice, demand letters, repair cost estimates, pet deposits, non-US rentals) usefully walls off adjacent territory, though it never names a sibling tool, so an agent must still infer the split from deposit_settlement_rules and the property_turnover_* family.

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

Usage Guidelines4/5

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

Gives clear context for invocation (post-move-out deposit settlement, US only) and a concrete exclusion list that tells the agent what this tool is not for. It stops short of naming an alternative tool for the excluded cases, so the 'use X instead' half of the guidance 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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources