Skip to main content
Glama

Search properties

spur_search_properties
Read-only

Search live listings (Zillow data) in Spur with plain English and/or structured filters, including event filters. Results show as cards and a map.

Uses 1 property-search credit per call from the user's Spur plan, or 2 credits when the search makes more than 3 ZHomes calls (e.g. several event types, tax/sale-history events, or description-based filters). To check how a sentence will be interpreted before spending a credit, call spur_parse_search_query first.

Examples:

  • "3 bed houses under $2,500/mo in Austin owned 10+ years" -> location="Austin, TX", listing_status="forRent", home_type="singleFamily", min_beds=3, max_price=2500, min_ownership_years=10

  • "duplexes for sale in 78704 built before 1980 with absentee owners" -> location="78704", listing_status="forSale", home_type="multiFamily", max_year_built=1979, only_absentee=true

  • "new pre-foreclosures or price drops of 10%+ in Dallas this week" -> location="Dallas, TX", events=["preforeclosure","price_drop"], event_within_days=7, event_min_change_pct=10

  • "motivated sellers in Houston: stale, back on market, or fired their agent" -> location="Houston, TX", events=["stale_listing","back_on_market","agent_to_fsbo"]

Events (pass in events; a listing matches when ANY selected event fired, and is tagged with each):

  • Listing lifecycle: new_listing, coming_soon, coming_soon_active, price_drop, price_increase, pending, sold, back_on_market, delisted (automations only), open_house, rental_listed, rent_change, move_in_moved_up

  • Distress & motivation: preforeclosure, foreclosure, auction, bank_owned, distress_escalated, fsbo, agent_to_fsbo, stale_listing, new_construction

  • Valuation & tax: tax_assessment_posted, assessed_value_jump, tax_paid_dropped (weak), sale_recorded, zestimate_moved, equity_gap, price_below_assessed Direct events (price_drop, pending, sold, preforeclosure, fsbo, new_listing, …) work on the first search. Change events (price_increase, back_on_market, distress_escalated, agent_to_fsbo, rent_change, zestimate_moved, …) compare against what Spur saw on an earlier search of the same area, so the first search only records a baseline. Motivated-seller research usually combines price_drop, back_on_market, stale_listing, agent_to_fsbo and the distress stages.

Structured filters always win over what Spur infers from query; use query for qualitative intent (condition, style, "brick", "needs work") that only listing descriptions can match. Unset filters are left to the query.

Follow up with spur_save_properties to save listings the user likes (pass the cards' listing objects), or spur_create_search_automation to run the same filters on a schedule.

Input Schema

NameRequiredDescriptionDefault
limitNoMaximum results to show
queryNoFree-text intent; Spur's AI turns it into filters and re-ranks by description
viewsNoOnly listings with any of these view types
eventsNoOnly listings where any of these events happened; see the tool description
max_ageNoAt most this many years since built
max_zipNoHighest ZIP code in a numeric ZIP range (with min_zip)
min_ageNoYears since built
min_zipNoLowest ZIP code in a numeric ZIP range (with max_zip); prefer zip_list for specific ZIPs
has_poolNotrue = only listings with a pool
has_viewNotrue = only listings with any view (use views on live search for a specific kind)
keywordsNoComma-separated listing keywords, e.g. "pool, granite"
locationNoCity and state ("Dallas, TX") or ZIP code
max_bedsNoMaximum bedrooms
max_sqftNoMaximum living area in square feet
min_bedsNoMinimum bedrooms
min_sqftNoMinimum living area in square feet
zip_listNoKeep only these ZIPs; set location to the city that contains them
home_typeNoZillow home type code
max_bathsNoMaximum bathrooms
max_priceNoMaximum price (monthly rent for rentals), USD
min_bathsNoMinimum bathrooms (half baths count as 0.5)
min_priceNoMinimum price (monthly rent for rentals), USD
center_latNoRadius search centre (with center_lng and radius_miles)
center_lngNoRadius search centre longitude (with center_lat and radius_miles)
has_garageNotrue = only listings with a garage
min_equityNoEstimated equity in USD (Zestimate or price minus assessed value; rough)
days_postedNoOnly listings posted within this many days
has_3d_tourNotrue = only listings with a 3D virtual tour
only_vacantNoLikely vacant (heuristic: description keywords + long days on market)
listing_typeNoSeller / listing kind; for catching NEW entries into a distress stage prefer events
max_lot_sizeNoSquare feet
min_lot_sizeNoSquare feet (1 acre = 43,560)
radius_milesNoKeep only listings within this many miles of center_lat / center_lng
is_waterfrontNotrue = only waterfront listings
neighborhoodsNoNeighborhood / area names matched against address and description
only_absenteeNoAbsentee-owned (owner mails elsewhere)
has_open_houseNotrue = only listings with an upcoming open house
listing_statusNoDefaults to forRent when omitted and the query doesn't imply one
max_year_builtNoBuilt in or before this year
min_year_builtNoBuilt in or after this year
ownership_typeNobusiness = LLC / corp / trust owners (heuristic)
is_single_storyNotrue = only single-story homes
event_stale_daysNoDays on market that counts as stale (default 90)
is_price_reducedNotrue = only listings whose asking price has been cut
event_within_daysNoLookback window for events, in days (default 7)
max_days_on_marketNoListed at most this many days
min_days_on_marketNoListed at least this many days (higher suggests a motivated seller)
max_ownership_yearsNoOwner has held the property at most this long
min_ownership_yearsNoOwner has held the property at least this long
event_min_change_pctNoMinimum % move for price / rent / Zestimate / assessment events
has_air_conditioningNotrue = only listings with air conditioning
only_pre_foreclosureNoDistressed / pre-foreclosure (heuristic, includes description keywords)
event_min_equity_gap_pctNoMinimum % Zestimate above last sale price for equity_gap (default 30)

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Well beyond annotations: the credit cost model (1 credit, 2 when >3 ZHomes calls), the ANY-match semantics for events, and the crucial distinction between direct events (work on first search) and change events (need a prior baseline search of the same area) that would otherwise produce silently empty results. Annotations cover the safety profile; the description covers economics and statefulness.

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 and cost, then examples, then the event taxonomy. It is long, but with 53 parameters and 29 event enum values most sections earn their place; the grouped event lists and the direct-vs-change note are load-bearing rather than filler.

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?

Given 53 optional parameters, no output schema, and existing annotations, this is close to complete: it covers cost, precedence, event timing pitfalls, and the natural next steps. Minor gaps remain — output shape is only described as 'cards and a map' with no note on result paging or how the `limit` cap interacts with the map view.

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 100%, so the baseline is 3; the description still adds real meaning by mapping natural-language sentences to concrete parameter values and explaining the event taxonomy (direct vs change, baseline behavior) that the bare enum cannot convey. It does not, however, document most of the 53 individual filters' semantics or defaults (e.g. ownership, equity, lot size), leaving those to the schema.

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?

A specific verb plus resource plus data source: 'Search live listings (Zillow data) in Spur with plain English and/or structured filters, including event filters.' It also distinguishes itself from the closest siblings by naming spur_parse_search_query, spur_save_properties, and spur_create_search_automation for their respective roles.

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?

Explicit routing: call spur_parse_search_query first to check interpretation before spending a credit, follow up with spur_save_properties to save liked listings, or spur_create_search_automation for scheduled runs. It also states a clear precedence rule — structured filters win over `query`, and `query` is reserved for qualitative intent that only descriptions can match.

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