| homes_search_propertiesA | Search homes.com listings by free-text location (city, ZIP, neighborhood). Optionally filter by property_type (single_family/condo/townhouse/land/mobile/multi_family), listing_type (for_sale/sold/for_rent/open_houses/new_construction), and sort (newest). Slugifies the location into homes.com's URL routing (e.g. 'Atlanta, GA' + condo + for_sale → /atlanta-ga/condos-for-sale/). Parses the embedded Schema.org JSON-LD to return each listing's address, price, beds/baths, sqft, primary photo, listing agent + brokerage, and the homes.com property URL. KNOWN CAP: homes.com server-renders ~40 listings per page; the response carries truncated: true + total_estimated when the market has more. To enumerate a busy market, price-band or sub-area your search until each segment fits under the cap. Read-only; safe to call repeatedly. |
| homes_get_propertyA | Fetch a property's full homes.com record. Pass url — the full property detail URL (e.g. from a homes_search_properties result's url field). Parses the page's Schema.org JSON-LD plus DOM-side sections to return address, lat/lng, beds/baths, sqft, year built, price, status, listing agent + brokerage, highlights, estimated monthly payment, total views, Matterport tour URL, floorplan URLs, schools, HOA fee, lot_size_sqft plus the derived lot_size_acres (round(lot_size_sqft / 43560, 2); both null — never 0 — for condos and listings with no lot), parking, heating/cooling, MLS ID/source, and date posted/modified. Also returns extracted_features (lake_front, hot_tub, basement, furnished, dock, community) derived server-side from the listing description so callers don't have to keyword-parse marketing prose. Pass include_price_history: true to inline the same data homes_get_property_history returns (listing_events, ownership_events, lien_events, events_normalized) under price_history. Pass include_tax_history: true to inline homes_get_tax_history records under tax_history. Both are off by default; opting in costs nothing extra over the dedicated tools (same page fetch). The raw description is omitted by default; pass include_description: true to opt back in. Read-only; safe to call repeatedly. |
| homes_calculate_mortgageA | Local-only mortgage payment calculator. Returns a full PITI breakdown (principal + interest, property tax, insurance, HOA, PMI) and total interest over the life of the loan. No network call. Provide either down_payment OR down_payment_percent; defaults to 20%. Property tax can be given as property_tax_annual or property_tax_rate (% of home price). PMI applies automatically when LTV > 80% and pmi_rate is provided. |
| homes_compare_propertiesA | Fetch 2 or more homes.com properties and align their facts side-by-side. Each target supplies a url — the full homes.com property URL (e.g. from a homes_search_properties result's url field). Returns the full per-property record (with server-side extracted_features, hoa_monthly_usd, days_on_market, price_drop_*, lot_size_sqft + the derived lot_size_acres, and portal_url_hyperlink). Per-target errors are captured per-row — one bad target will not fail the whole call. Calls are concurrent. The raw description is omitted by default; pass include_description: true to keep the marketing prose. The cross-row summary table duplicates per-property fields (~30% of response weight); it is OPT-IN via include_summary: true. |
| homes_calculate_affordabilityA | Solve for the maximum home price you can afford under the standard 28/36 DTI rule. Inputs: monthly income, recurring monthly debts (car/student loans), down payment, interest rate, optional property-tax rate / insurance / HOA / loan term. Output: max home price, binding constraint (front-end vs back-end), and the PITI breakdown at that price. Identical math to zillow-mcp and redfin-mcp. No network — pure local math. |
| homes_get_property_photosA | The full photo gallery for a homes.com listing. homes.com's JSON-LD only exposes one primary image, so this tool scrapes every tag on the property detail page and filters to the homes.com CDN. Pass url — the full homes.com property URL or path (e.g. from a homes_search_properties result's url field). Returns { property_id, url, count, photos: [{ url, position, alt? }] }. Read-only; safe to call repeatedly. |
| homes_healthcheckA | Round-trips a small public homes.com URL (/robots.txt) through the fetchproxy bridge and returns diagnostics: the bridge's role (host/peer/null), port, version, the elapsed round-trip time, and a plain-English hint that distinguishes 'bridge never came up' from 'extension not connected' from 'real homes.com-side problem'. Call this when a real homes.com tool times out and you want to know which hop failed. Read-only, no auth required. |
| homes_get_property_historyA | DEPRECATED — prefer homes_get_history (combined timelines + tax) or homes_get_property({ url, include_price_history: true }). Same data, fewer round trips. Will be removed in a future major version. Three timelines for a homes.com property in one call: listing_events, ownership_events, lien_events. Also returns events_normalized mapped onto the cross-MCP enum. |
| homes_get_tax_historyA | DEPRECATED — prefer homes_get_history (combined timelines + tax) or homes_get_property({ url, include_tax_history: true }). Same data, fewer round trips; note that homes_get_history returns the tax array as tax_records (not records). Will be removed in a future major version. Year-by-year property-tax records: tax paid, total assessed value, land/improvement split. |
| homes_get_historyA | Combined history endpoint — replaces homes_get_property_history + homes_get_tax_history with a single fetch. Returns { property_id, url, listing_events, ownership_events, lien_events, events_normalized, tax_records }. Pass url — the full property detail URL. Series are [] when the listing doesn't carry that section. Cross-MCP-normalized events_normalized carries the same enum across siblings (Listed/PriceChange/Pending/Contingent/Sold/Withdrawn/Relisted/Delisted). Read-only; safe to call repeatedly. |
| homes_get_nearby_listingsA | Scrape the nearby-links section of a homes.com detail page (the tabbed list of <ul id="nb-Property"> near the bottom of the page) and return the nearby active listings. Pass url (the property whose neighborhood to inspect). By default returns the For Sale tab; pass include_rentals: true to also include the Rentals tab. Optional limit caps the count. Returns { property_id, url, count, listings: [{ property_id, url, address?, tab }] }. Note: the nearby section is a curated cross-link list, not a comparable-sales set — only URL + address are exposed (no price/beds/baths/sqft/photo). To enrich a row, call homes_get_property on its url. Read-only; safe to call repeatedly. |
| homes_get_market_reportA | Fetch homes.com's recently-sold listings for a city/ZIP/neighborhood and derive a market summary: count, median sale price, and average $/sqft across the sample. Pass location — free-text (e.g. 'Brooklyn, NY', '30311'). Returns { region, slug, sold_summary, sample_sold }. Note: homes.com's sold page typically returns ~40 recent listings — this is a sample-based summary, not an exhaustive market index. Read-only. |
| homes_get_saved_homesA | The signed-in user's saved (favorited) homes on homes.com. Scrapes /customer/dashboard/favorites/. Returns { count, homes: [{ property_id, url, address?, price?, beds?, baths?, sqft?, status? }] }. REQUIRES the user to be signed into homes.com in their browser tab — if not, the request throws SessionNotAuthenticatedError. Card fields (price/beds/baths/sqft) are best-effort DOM scrapes — they may be missing on some card variants; treat absence as 'not surfaced on the saved-homes card', not 'no value'. Call homes_get_property(url) per row when you need the canonical record. Read-only; safe to call repeatedly. |
| homes_get_saved_searchesA | The signed-in user's saved searches on homes.com. Scrapes /customer/dashboard/saved-searches/. Returns { count, searches: [{ name?, url, filters? }] }. REQUIRES the user to be signed into homes.com in their browser tab — if not, the request throws SessionNotAuthenticatedError. name and filters are DOM-scraped from the saved-search card; absence means homes.com didn't render them, not that the search has none. Read-only; safe to call repeatedly. |
| homes_estimate_rent_vs_buyA | Project the cumulative cost of buying a home versus renting a comparable place over N years. Accounts for down payment, closing costs, monthly PITI, maintenance (~1%/yr default), appreciation (~3%/yr default), rent growth (~3%/yr default), and the opportunity cost of the down payment (renter invests it at investment_return_rate, default 6%/yr). Returns year-by-year cumulative costs, break-even year, and the net difference at horizon. No network — pure local math. Same math contract as zillow_estimate_rent_vs_buy. NOTE: caller must supply monthly_rent — homes.com does not publish rental estimates anywhere on its consumer site (no rent_zestimate analogue, no comparable-rentals endpoint). For a rent estimate to plug in here, use zillow_get_property (its rent_zestimate field) or redfin_get_comparable_rentals. |
| homes_get_by_addressA | Resolve a US street address to its canonical homes.com property URL + opaque property hash. Pass address (street), city, state, and optional zip. Walks three rungs: first the structured smartsearch typeahead (POST /routes/res/consumer/smartsearch/autocomplete/ — the primary rung, the same address-suggest API homes.com's search box fires, returning the real /property/// URL directly), then a slug-routed page (parsing the embedded Schema.org JSON-LD — both the CollectionPage search-results shape and the single-RealEstateListing detail redirect), and finally a city/zip search page with street-token fuzzy match. Every candidate is verified against the input with a whole-token street match (plus a unit guard so a multi-unit building resolves to the exact unit, not a neighbour). Optional price_min / price_max (USD) bound ONLY the city/zip search-fallback rung — when an address is ambiguous or the typeahead misses and you know the listing's rough price, this narrows the area search (homes.com ?price-min=/?price-max= filter) so the fuzzy matcher picks from fewer, more-relevant candidates; omit for unchanged unbounded behaviour. Returns { url, property_hash, street_address, matched_via, resolved: true } on success — matched_via is 'typeahead' for the structured-API hit, 'slug' for a direct routing hit, 'search_fallback' for the search-page fuzzy match — or { resolved: false, error: 'no listing found' } when homes.com has no match (so the higher-level unified canonical-URL lookup can degrade gracefully). KNOWN FAILURE MODE: rural addresses and very-new construction can still miss because homes.com hasn't indexed them yet. Compare the returned street_address against your input to confirm. For larger batches (≥ 3 addresses), prefer homes_resolve_addresses. Read-only; safe to call repeatedly. |
| homes_register_sessionA | Register (or refresh) an authenticated Homes session keyed by signed-in account identity. Re-registering the same account_identity updates the existing session rather than creating a duplicate. Returns the session_id to use when routing per-tool calls. The first registered session becomes the default active_session_id. Pass mark_active: true to make the newly-registered session active in the same call. |
| homes_set_active_sessionA | Switch which registered session subsequent tool calls route through by default. Pass a session_id previously returned by homes_register_session. Tools that accept an explicit session_id parameter override this default per-call. |
| homes_get_session_contextA | Return the full set of registered sessions plus the current active_session_id. When no sessions are registered, sessions is empty and active_session_id is null. |
| homes_bulk_getA | Fetch up to 200 homes.com properties in one call and return their structured records. Pass urls: string[]. Results are ordered to match the input array and per-row errors are captured (one bad URL won't fail the whole call). Each row carries a status (ok / error / pending). Mirrors homes_get_property per-row, including extracted_features, hoa_fee, highlights, schools, lot_size_sqft + the derived lot_size_acres (null — never 0 — for condos / no-lot listings), and all standard listing fields. The raw description is omitted by default; opt back in via include_description: true. The whole call is bounded by an overall hard deadline: a single slow/hung URL never wedges the server — when the deadline is reached any unsettled row is returned with status: "pending" and a pending count so you can re-run just those URLs. Use this instead of looping homes_compare_properties (which caps at 8 + emits a redundant summary table) when you just want the records. Read-only; safe to call repeatedly. |
| homes_resolve_addressesA | Resolve up to 100 street addresses to canonical homes.com property URLs + opaque property hashes in one call. Pass addresses: [{ address, city, state, zip? }, ...]. Fans out to the same rungs homes_get_by_address runs (structured smartsearch typeahead → slug → city/zip search fallback), verifying each candidate with the same whole-token street + unit match. Per-row outcomes parallel homes_get_by_address (with property_hash renamed to property_id here so the field name lines up with homes_bulk_get): { resolved: true, url, property_id, street_address, matched_via } on success — matched_via is 'typeahead', 'slug', or 'search_fallback' — { resolved: false, error } otherwise; one bad row won't fail the whole call. Results preserve input order. Use this instead of looping homes_get_by_address for any batch ≥ 3. Read-only; safe to call repeatedly. |