Skip to main content
Glama

Homesage.ai MCP

Preview Property Search

preview_property_search
Read-only

What it returns

A free preview of a property-database search: count (how many properties match the filters) and cost (the credits the full search would charge). This call never charges credits.

This is the mandatory safety step before run_property_search. The charged search costs 1 credit per matching property, so a broad filter set can cost thousands of credits. Always preview here, tell the user the count and cost, and get an explicit yes before running the paid search.

When to use it

  • ALWAYS before run_property_search, to size and price the result set.

  • To tighten filters (narrow the location, add a price band / condition / ROI floor) until the count and cost fit the user's budget.

  • To confirm a search returns anything before spending.

Required filters

Every search needs a location (a city, county, or ZIP — NEVER a whole state: state-wide queries time out, this free preview included), a property_status, AND at least one investment filter (price range, property type, condition, investment-potential grade, ROI range, …). The investment-filter rule keeps results pertinent and cost-effective. It can be waived with allow_location_only=true, but a location-only search in a dense metro can match thousands of properties — check the cost first.

Pricing

Free — 0 credits. Only run_property_search charges.

Errors

Status

Meaning

400

Required filters missing — the missing array names them (location, property_status, and/or investment_lens).

401

Authentication failed.

402

No active subscription.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "location": "<location>",
      "property_status": "<property_status>"
    },
    "name": "preview_property_search"
  }
}

Input Schema

NameRequiredDescriptionDefault
toNoSold-search only: latest sold date (ISO-8601, `YYYY-MM-DD`).
domNoDays-on-market ceiling (for-sale only): only listings listed within the last N days.
fromNoSold-search only: earliest sold date (ISO-8601, `YYYY-MM-DD`).
auctionNoWhich catalogue to search. OMIT it to search MLS listings — the default, which hides auction-only homes. `off_mls` = only off-MLS auction homes: foreclosure and bank-owned auctions on Auction.com, Xome and Hubzu with no MLS listing. The two are separate searches, exactly as the Homesage portal's market switch is (MLS = omitted, Off-MLS = `off_mls`): an MLS listing's ROI, Spread, LP/ARV and grade are worked out at its list price, and an off-MLS home's at its expected winning bid (the price such homes typically sell for at auction, or the published bid when higher). Never merge, rank or compare the two in one list; if the user wants both, run one search for each and present two lists. Off-MLS homes are live auctions: send `property_status=active` with them, and use `auction_within_days` rather than `dom`, since no auction site publishes a listing date. On an off-MLS auction home the other filters read its auction numbers: `price_min`/`price_max` read the published bid (the current bid, else the opening bid) and a home with no published bid drops out of them; `roi_min`/`roi_max` read the ROI at the expected winning bid; `investment_potential_grades` and `investment_potential_min` read its auction Investment Potential score (that ROI, held to 0-100); `lpfp_min`/`lpfp_max` read LP/ARV at the expected winning bid; `gap_min`/`gap_max` read the spread at the expected winning bid over the published bid, so a home with no published bid drops out of them. `cap_rate_min`/`cap_rate_max` and `cash_on_cash_min`/`cash_on_cash_max` read its cap rate and cash-on-cash at its max bid (the yield if you win the auction at the max bid, paying cash), and a home with no max bid or no rent drops out of them. `property_condition` and `pfs_min`/`pfs_max` EXCLUDE off-MLS auction homes, so combining either with `auction=off_mls` returns no results: they have no seller-motivation score, and the condition filter reads the listing's condition column, which is empty on them. An off-MLS home whose auction listing has inside photos is graded from them, and its row says so in its `auction` block (`condition`, with `condition_basis: "inside_photos"` and `condition_photos`, the number of photos); every other one has `condition: null` and `condition_basis: "assumed"`.
gap_maxNoMaximum Value Gap percentage.
gap_minNoMinimum Value Gap as a PERCENTAGE (`15` = 15%): the spread between the full-potential value and the list price, relative to the list price. FOR-SALE ONLY: sold listings carry no value for it, so combining this with `property_status=sold` returns no results.
pfs_maxNoMaximum Seller Motivation Score (1–100).
pfs_minNoMinimum Seller Motivation Score — the Price Flexibility Score, 1–100: how much negotiating room the asking price has, higher = more flexible. FOR-SALE ONLY: sold listings carry no value for it, so combining this with `property_status=sold` returns no results.
roi_maxNoMaximum projected ROI percentage.
roi_minNoMinimum projected ROI, as a percentage (e.g. `15` = 15%).
locationYesA JSON-encoded array of one or more area objects. City: `{"type":"city","city":"Austin","state_code":"TX"}`; county: `{"type":"county","county":"Travis County","state_code":"TX"}`; ZIP: `{"type":"postal_code","zip_code":"78704","state_code":"TX"}`. State-wide scope is not supported — a state-level area times out instead of returning. When the user asks about a whole state or a huge metro, pick the specific city, county, or ZIP that best serves their goal (or run a few targeted searches) yourself; never surface a 'narrow your area' error to the user. Several area objects in one array are searched together, so a multi-ZIP or multi-city search is one preview and one charged call.
lpfp_maxNoMaximum LP/ARV percentage (`85` = listed at no more than 85% of full potential).
lpfp_minNoMinimum LP/ARV — the list price as a PERCENTAGE of the property's full-potential (after-repair) value, 1–100, lower is better (`80` = listed at 80% of full potential). FOR-SALE ONLY: sold listings carry no value for it, so combining this with `property_status=sold` returns no results.
price_maxNoMaximum price in USD.
price_minNoMinimum price in USD (list price for for-sale, sold price for sold).
sale_typeNoPipe-delimited auction sale types. One or more of: `foreclosure` (trustee and foreclosure sales), `bank_owned` (REO — the lender already owns the home), `other` (short sales, private sellers, and sales of unknown type). Use with `auction=off_mls`.
cap_rate_maxNoMaximum capitalisation rate as a percentage. Use a negative value (e.g. `-1`) to search for cash-flow-negative properties.
cap_rate_minNoMinimum capitalisation rate as a PERCENTAGE (`6.5` = 6.5%), computed at all-cash, 20% down, 4.5%, 30-year assumptions. Negative values are valid and meaningful: a property with high HOA or tax costs genuinely returns a negative cap rate. Only properties with a verified rent carry this metric — about 35% of for-sale listings — and the rest are absent from the results rather than treated as zero. FOR-SALE ONLY: sold listings never carry it, so combining this with `property_status=sold` returns no results.
property_typeNoPipe-delimited property types. One or more of: `detached|townhouse|apartment|multi family|other`.
also_at_auctionNoSet `true` to keep only MLS listings that are ALSO up for auction on Auction.com, Xome or Hubzu — for example a bank listing a repossessed home with an agent while auctioning it at the same time. A filter on the MLS search: use it with `auction` omitted.
property_statusYesListing status to search. `active`/`pending` search live for-sale listings; `sold` searches historical sales (enables the `from`/`to` date range); `any` = active + pending.
cash_on_cash_maxNoMaximum cash-on-cash return as a percentage.
cash_on_cash_minNoMinimum cash-on-cash return as a PERCENTAGE (`4` = 4%), at the same default assumptions as `cap_rate_min`. Negative values are valid. Only properties with a verified rent carry this metric — about 35% of for-sale listings — and the rest are absent from the results rather than treated as zero. FOR-SALE ONLY: sold listings never carry it, so combining this with `property_status=sold` returns no results.
monthly_rent_maxNoMaximum estimated monthly rent in whole USD.
monthly_rent_minNoMinimum estimated monthly rent in whole USD. Properties with no rent estimate are excluded.
rent_to_price_maxNoMaximum monthly rent as a ratio of price (`0.02` = 2%/mo).
rent_to_price_minNoMinimum monthly rent as a RATIO of price — `0.007` is 0.7%/mo, not 0.7. Note the contrast with `cap_rate_min` and `cash_on_cash_min` below, which are percentages.
property_conditionNoPipe-delimited condition grades (Homesage.ai ML-derived). One or more of: `excellent|good|outdated|very poor|poor|unlivable`.
published_bid_onlyNoSet `true` to leave out auction homes whose opening bid is not published yet (it keeps only homes with a price above zero). Use with `auction=off_mls`.
allow_location_onlyNoSet `true` to waive the investment-filter requirement and search by location + status alone. Use with care — location-only searches can match thousands of properties. Location and status remain required.
auction_within_daysNoAuction-date window: only homes whose next auction falls between today and today + N days — `7`, `30` or `90`. A home with no upcoming auction date does not match. Use with `auction=off_mls`.
investment_potential_minNoMinimum Investment Potential score (0–100), for-sale only. Ignored when `investment_potential_grades` is also sent — the grades win — so send one or the other.
investment_potential_gradesNoPipe-delimited investment-potential grades (for-sale only). Codes: `excel` (ROI ≥ 35%), `high` (25–35%), `med` (15–25%), `low` (5–15%), `noPot` (< 5%).

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, it discloses the key behavioral facts an agent could not infer: the call never charges credits, the paid sibling costs 1 credit per matching property, broad filters can cost thousands, state-wide queries time out, and it maps 400/401/402 error statuses to meanings.

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?

Headings front-load returns, when-to-use, required filters, pricing and errors, so the agent can skim. There is minor redundancy – 'never charges credits' appears at the top and again in the Pricing section – but no padding.

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?

Given 33 parameters and an existing output schema, the description covers the things structure cannot: cost model, the free-versus-charged split, the required-filter contract, the state-wide timeout, and error handling. Nothing an agent needs in order to call it safely is 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 coverage is 100%, so the schema already carries per-parameter detail; the description adds cross-parameter rules the schema cannot express – the mandatory location + property_status + investment-filter triad, the allow_location_only waiver, and the prohibition on state-wide locations. It stops short of adding much per-parameter meaning of its own, but the required-filter logic is genuine value.

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?

The description opens with a specific verb and resource – a free preview that returns 'count' and 'cost' – and immediately distinguishes itself from run_property_search, the charged sibling. An agent knows exactly what the tool produces without reading the 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?

It states explicit when-to-use rules: ALWAYS before run_property_search, to tighten filters until count and cost fit budget, and to confirm a search returns anything. The alternative (run_property_search) is named with the condition that selects each.

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