redfin-mcp
MCP server for Redfin — natural-language access to listings, property records, market reports, and your saved homes/searches. Routes through your signed-in redfin.com tab via the fetchproxy browser extension, so AWS WAF / DataDome see a real browser session instead of a Node process.
⚠️ Redfin does not publish a public consumer API. This server uses the same private
/stingray/...endpoints the redfin.com web app calls, dispatched through your own signed-in browser tab via the ContextMint Bridge extension. Use at your own discretion.
Setup
1. Install redfin-mcp
.mcp.json (project) or ~/.claude/mcp.json (global):
{
"mcpServers": {
"redfin": {
"command": "npx",
"args": ["-y", "redfin-mcp"]
}
}
}
2. Install the ContextMint Bridge extension (one-time, shared across all fetchproxy-based MCPs)
Get it from the ContextMint Bridge releases:
- Chrome: download the Chrome zip, unzip it, then
chrome://extensions→ Developer mode → Load unpacked → pick the unzipped folder. - Safari: not available yet (it will ship inside the ContextMint app, which has no public download) — use Chrome for now.
ContextMint Bridge is the fetchproxy extension renamed, same maintainer (see https://github.com/chrischall/fetchproxy#extension); source at https://github.com/nullnet-app/contextmint-bridge — build it yourself or verify a release zip with shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256.
3. Open redfin.com and sign in.
That's it. No API keys, no env vars.
Tools
Public data
redfin_search_properties— Search by location + filters (price, beds/baths min, home type). Resolves the location via Redfin's autocomplete then queries the/stingray/api/gisendpoint. Returns matching listings with price, beds/baths, sqft, year built, address, and the Redfin home URL. Passboundsto search a lat/lng box (works inside big cities).redfin_sweep_area— Every for-sale listing in a lat/lng box, not just one capped page: tiles the map until no tile hits Redfin's 350-home cap and reports whether the sweep is complete. Use it when the user needs the whole inventory; passoutput_pathfor large areas.redfin_get_property(view?)— Full property record byurl(Redfin homedetails URL or path),property_idalone (resolved internally by following Redfin's/home/<id>redirect to the canonical slug, theninitialInfo), orproperty_id+listing_id(fastest — skips resolution). Two-round-trip API:initialInforesolves the URL to IDs, thenaboveTheFoldfetches the data. Returns address, beds/baths, sqft, year built, price, status, days on market, primary photo.redfin_get_market_report— Median sale/list prices, price per sqft, days on market, year-over-year change, homes sold/on market for a Redfin region. Provide eitherlocation(free-text) orregion_id+region_type. All metrics returned as formatted strings (e.g."$870K","+2.4%").redfin_calculate_mortgage— Local PITI calculator. No network call. Provide home price, interest rate, optional down payment / taxes / insurance / HOA / PMI; returns a full monthly breakdown.
Signed-in user data (the unique value vs. paid scrapers)
redfin_get_saved_homes(view?)— Your favorited homes, flattened across all collections. Returns{ count, homes }(address, price, beds/baths, status per home), with anotewhen none were found.redfin_get_saved_searches(view?)— Your saved searches with region URLs and display text. Returns{ count, searches }, with anotewhen none were found.
Response shape (view)
Six tools take view: "compact" | "full", and compact is the default —
the slim rung arrives without being asked for, because an efficiency a caller
has to know about and request is one that usually is not requested:
redfin_get_property, redfin_get_saved_homes, redfin_get_saved_searches,
redfin_bulk_get, redfin_compare_properties, redfin_resolve_addresses.
Compact strips image URLs, and claims no field projection. This server hands Redfin's payloads back close to verbatim and holds no captured fixture or documented field list for them, so nothing here can honestly say which of Redfin's fields matter and which are noise. Stripping media needs no such knowledge and is SUBTRACTIVE, so it cannot lose a field nobody knew about — which is what an invented field list would risk, returning a record with holes in it that still reads like a verified answer. Do not expect a named field set from compact; expect the same record minus picture URLs.
Two photo fields are decided by name rather than left to the blind rule, and the distinction is worth knowing because it looks arbitrary until you see why:
image_urlandthumbnail_urlare KEPT. On a saved-home card this server CONSTRUCTS them frommlsId+dataSourceId— they are derived with knowledge of Redfin's URL scheme, not incidental decoration — and thephoto_countbeside them is your cue thatredfin_get_property_photoshas more.primary_photo_urlis DROPPED.redfin_get_propertyreads it straight off Redfin'satf.mediaBrowserInfo— an upstream CDN URL carried through verbatim, which is exactly the shape media stripping exists to remove. Naming it is what makes the removal deterministic: the blind rule catches it today only because Redfin's URLs happen to end in.jpg, so a signed or extension-less URL would silently start surviving compact.
view: "full" returns Redfin's payload untouched. There is no raw rung:
full already IS the untouched payload, so a third value could only alias it.
The other fifteen tools take no view, and not for one blanket reason:
redfin_search_properties,redfin_get_market_report,redfin_get_price_history,redfin_get_comparable_rentals,redfin_get_climate_risk(and its bulk/baseline siblings), andredfin_get_by_addresseach build their answer through a hand-written formatter —formatHome,formatMetric,formatPriceEvent,formatRentalComp,formatClimate. The response is already field-picked with knowledge of the payload and carries no pass-through CDN URL, so a blind rung run over it could only overrule a grounded choice with an un-grounded one.redfin_get_property_photosis the documented way media stripping can be misused: its PRODUCT is thephotoUrlsbundle. Compacting here would not shrink the answer, it would empty it.redfin_calculate_mortgageandredfin_calculate_affordabilitymake no network call at all. There is no upstream payload — the response is arithmetic this server did.redfin_register_session,redfin_set_active_sessionandredfin_get_session_contextare session bookkeeping: an id and a status.redfin_healthcheckanswers reachability and auth.
Trigger examples
- "Find me 2-bedroom condos under $1.5M in Brooklyn on Redfin" →
redfin_search_properties - "What does Redfin say about 42 Monroe St in Brooklyn?" →
redfin_get_property - "Pull up my favorited homes on Redfin" →
redfin_get_saved_homes - "What's new on my saved Redfin searches?" →
redfin_get_saved_searches - "Brooklyn housing market trends on Redfin" →
redfin_get_market_report - "Monthly payment on a $500k home, 20% down, 6.5% rate" →
redfin_calculate_mortgage
Gotchas
- Sign-in required for saved- tools.* If the user isn't signed into redfin.com in the bridged Chrome tab, those tools fail with
SessionNotAuthenticatedError. Public tools work either way. - AWS WAF challenge. Redfin occasionally serves a WAF challenge to fresh sessions. Solving it in the Chrome tab once unblocks subsequent fetches.
- No write surface yet. All tools are read-only. Saving a home / search / contact form are not implemented in v0.1.
for_rent/soldlisting statuses map to entirely different Redfin URL paths (/apartments-for-rent/...,/recently-sold).redfin_search_propertiessupportsfor_saleonly —sold/for_rentreturn an error rather than for-sale results.- No equivalent to Zillow's Zestimate history tool. Redfin's Redfin Estimate is exposed as a current scalar inside
redfin_get_property; there's no historical-series endpoint yet.
