redfin-mcp
This server is an MCP bridge that lets Claude search and inspect Redfin real-estate data using your own signed-in Redfin browser session via the fetchproxy extension.
Search listings — free-text location search with filters for price, beds/baths, home type, and status (
redfin_search_properties)Get property details — full records by URL, property ID, or ID+listing ID: price, beds/baths, sqft, year built, status, DOM, photos, price/tax history, and description (
redfin_get_property,redfin_bulk_get,redfin_compare_properties)Photos — full photo galleries at multiple CDN sizes (
redfin_get_property_photos)Market reports — median prices, YoY/MoM trends, inventory, days-on-market for a region (
redfin_get_market_report)Price history — listing events and tax history for a property (
redfin_get_price_history)Climate risk — First Street flood/fire/heat scores per property, plus bulk and area-baseline variants (
redfin_get_climate_risk,redfin_get_climate_risk_bulk,redfin_get_area_climate_baseline)Rent and affordability — comparable rentals near a property, local mortgage/PITI calculator, and max-affordable-price calculator (
redfin_get_comparable_rentals,redfin_calculate_mortgage,redfin_calculate_affordability)Address resolution — resolve free-text addresses to canonical Redfin URLs and home IDs, individually or in bulk (
redfin_get_by_address,redfin_resolve_addresses)Saved homes & searches — list the signed-in user's favorited homes and saved searches (
redfin_get_saved_homes,redfin_get_saved_searches)Session management — register, switch, and list authenticated Redfin sessions (
redfin_register_session,redfin_set_active_session,redfin_get_session_context)Diagnostics — end-to-end healthcheck of the fetchproxy bridge between the MCP server and redfin.com (
redfin_healthcheck)
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@redfin-mcpsearch for 3-bedroom homes under $500k in Austin, TX"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
redfin-mcp
Redfin real-estate access as an MCP server for Claude — search listings, fetch property details, market reports, and your saved homes/searches via natural language.
⚠️ Redfin does not publish a public consumer API. This server uses the same private
/stingray/...endpoints the redfin.com web app uses, routed through your own signed-in browser tab via the fetchproxy extension. Every request acts on behalf of your existing session — your cookies, your TLS, your JS context — exactly as if you'd clicked it in the browser yourself. Treat this as informal use of Redfin's website. Use at your own discretion.
Tools
Tool | Purpose | Auth-scoped |
| Search listings by location, price band, beds/baths, home type. Resolves free-text via Redfin's autocomplete then queries the | |
| Full record for a property by URL, | |
| Full photo gallery for a property — every CDN image at fullscreen/large/medium sizes plus thumbnails and captions. | |
| Median sale/list prices, ZHVI YoY, average days on market, inventory for a region. | |
| Listing-history and tax-roll events for a property — Listed/Sold/Pending entries plus annual assessed values and taxes paid. | |
| Side-by-side comparison of up to 12 properties: address, price, beds/baths, sqft, $/sqft, year built, status, days on market. Aligned summary table. | |
| First Street Foundation flood / fire / heat risk factors for a property — FEMA zones, 30-year flood-chance series, insurance bands, cumulative-heat projections. | |
| Comparable rentals near a property — monthly rent, beds/baths, sqft, distance. Used for rent estimation. | |
| Local affordability calculator — back-of-envelope max purchase price from income + DTI + rates (no network). | |
| Your favorited homes — flattened across all collections, with primary photo URLs constructed from each home's CDN handles. | ✓ |
| Your saved searches with region URLs and display text. | ✓ |
| Local PITI calculator — principal+interest, taxes, insurance, HOA, PMI (no network). | |
| Resolve a free-text address to its Redfin canonical URL + home_id. Degrades to | |
| End-to-end bridge check — round-trips |
Related MCP server: zillow-mcp
Acknowledgement of Terms
By using this MCP server, you acknowledge and agree to the following:
1. This server accesses your own Redfin session. Every request is dispatched through your own browser tab via the fetchproxy extension — your cookies, your TLS, your session. It does not — and cannot — access anyone else's account.
2. Redfin's Terms of Use govern your use of this server, just as they govern your direct use of redfin.com. The clauses most relevant here:
You may not automatedly crawl or query the Services for any purpose or by any means (including, without limitation, screen and database scraping, spiders, robots, crawlers and any other automated activity with the purpose of obtaining information from the Services) unless you have received prior express written permission from the applicable Redfin Company.
And: "You agree to keep your password confidential, not use others' accounts, nor permit others to use your account."
You are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server. Redfin's terms prohibit automated crawling without written permission, and IDX listing data is licensed for personal, non-commercial use only.
3. Personal, non-commercial use only. This project is not affiliated with, endorsed by, sponsored by, or in partnership with Redfin Corporation. It is a personal automation tool that calls the same /stingray/... endpoints redfin.com calls when you click around. Do not use it to bulk-extract listings, redistribute IDX data, train AI models, populate a competing real-estate product, or for any commercial purpose.
4. Stability is not guaranteed. This server reads private internal endpoints (/stingray/api/gis, /stingray/api/home/details/*, /stingray/api/region/.../market-trends, /myredfin/*) that Redfin may change without notice. It may break. It may stop working. That's by design — the surface is not theirs to maintain on our behalf.
5. You accept full responsibility for any consequences of using this server in connection with your Redfin access — rate limiting, account suspension, IP blocks, AWS WAF challenges, or any enforcement action Redfin takes. If Redfin objects to your use, stop using this server.
This section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Redfin's actual ToU.
Install
Option A — npx (after first publish)
Add to .mcp.json:
{
"mcpServers": {
"redfin": {
"command": "npx",
"args": ["-y", "redfin-mcp"]
}
}
}Option B — from source
git clone https://github.com/chrischall/redfin-mcp
cd redfin-mcp
npm install
npm run build{
"mcpServers": {
"redfin": {
"command": "node",
"args": ["/path/to/redfin-mcp/dist/bundle.js"]
}
}
}One-time browser setup
redfin-mcp talks to your browser through the fetchproxy extension, which is shared across every fetchproxy-based MCP (zillow-mcp, opentable-mcp, resy-mcp, …). Install it once:
git clone https://github.com/chrischall/fetchproxy
cd fetchproxy
npm ci
npm --workspace=@fetchproxy/extension-chrome run buildThen in Chrome: chrome://extensions → toggle Developer mode → Load unpacked → pick packages/extension-chrome/dist/.
Open redfin.com and sign in. That's all the auth this server needs.
How it works
┌────────────────┐ stdio ┌──────────────────┐ WS ┌──────────────────┐ fetch() ┌─────────────┐
│ MCP client │◀────────▶│ dist/bundle.js │◀──────▶│ fetchproxy │◀────────────▶│ redfin.com │
│ (Claude, etc.) │ │ (Redfin MCP) │ :37149 │ extension │ (real TLS, │ (your tab) │
└────────────────┘ └──────────────────┘ │ (separate) │ cookies) └─────────────┘The MCP server runs in Node, but every HTTP call to redfin.com is dispatched into your live browser tab through the fetchproxy extension. Each request rides your existing session — TLS fingerprint, cookies, and JS execution context all match the page that's already on screen. No headless browser stand-in, no separate identity, no third-party proxy: just your real browser, acting on its own behalf, with the MCP server picking what to ask for.
Redfin's /stingray/... JSON endpoints respond with a {}&& anti-CSRF prefix before the JSON body; the client strips it transparently.
Commands
npm test # vitest, mocked transport, no network
npm run test:watch
npm run test:coverage
npm run build # tsc --noEmit + esbuild bundle → dist/bundle.js
npm run dev # node dist/bundle.js (after build)License
MIT
Available Tools
21 toolsredfin_bulk_getBulk fetch Redfin property recordsARead-onlyIdempotent
Fetch up to 200 Redfin property records in a single tool call. Provide an array of targets, each one of: a url (full Redfin homedetails URL or path with the /home/ segment), a property_id alone (resolved internally by following Redfin's /home/ redirect to the canonical listing), or a property_id+listing_id pair (fastest — skips resolution). Returns the same per-property record shape as redfin_get_property, but without a summary table — use redfin_compare_properties for that. Per-target errors are captured per-row; a single bad ID does not fail the batch. Server-side concurrency, ~6 in flight at a time, with retry-once-on-timeout per row to absorb transient bridge hiccups. The whole call is bounded by an overall hard deadline: a single slow/hung row never wedges the server — when the deadline is reached any unsettled row is returned with status: "pending" (retryable) and a pending count so you can re-run just those targets. Use this when you have a list of saved homes / candidate properties and need the full structured data for every one of them.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Redfin's payload untouched. No field projection: this server has no verified record of which Redfin fields matter, and inventing one would risk dropping a field a caller needs. | |
| targets | Yes | Array of 1–200 properties to fetch | |
| include_description | No | Include each property's raw marketing/public-remarks description. Default false to save context — `extracted_features` always carries the structured signal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the read-only/idempotent annotations by disclosing per-target error capture, retry-once-on-timeout behavior, ~6 concurrent requests, a hard overall deadline, and the pending-status fallback for slow or hung rows. This gives the agent an accurate model of batch failure and retry semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence contributes behavioral or routing information, and the core purpose is front-loaded. It is dense and somewhat run-on, but not bloated or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex bulk tool with no output schema, the description covers the essential runtime contract: input shapes, per-record output parity with redfin_get_property, error isolation, concurrency, timeout handling, and retry semantics. The summary-table distinction and explicit use case complete the picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics around the targets array by explaining the three accepted target forms, the internal resolution path for property_id, and that pairing property_id with listing_id skips resolution for speed. It does not need to repeat the schema's detailed view and include_description docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource ('Fetch up to 200 Redfin property records') and immediately differentiates itself from siblings like redfin_get_property and redfin_compare_properties by noting the same per-property record shape but no summary table. The batch aspect is explicit and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use the tool: 'when you have a list of saved homes / candidate properties and need the full structured data for every one.' It also routes the agent away from the tool for summary tables by pointing to redfin_compare_properties, and implies single-record use belongs to redfin_get_property.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_calculate_affordabilityCalculate max affordable home priceARead-onlyIdempotent
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. Uses the canonical @chrischall/realty-core affordability engine shared across the realty MCP cohort. No network — pure local math.
| Name | Required | Description | Default |
|---|---|---|---|
| hoa_monthly | No | ||
| back_end_dti | No | ||
| down_payment | Yes | ||
| front_end_dti | No | ||
| interest_rate | Yes | ||
| monthly_debts | No | ||
| monthly_income | Yes | ||
| loan_term_years | No | ||
| insurance_annual | No | ||
| property_tax_rate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint, and the description adds valuable behavioral context: 'No network — pure local math' and reference to a canonical shared engine. This reassures the agent that invocation has no side effects or external dependencies. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences: purpose, inputs, outputs, then behavioral context. Every sentence earns its place, and the most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters and no output schema, the description needs to be self-sufficient. It covers outputs and most inputs, but it does not state units for interest_rate or property_tax_rate, nor does it mention the DTI override parameters. An agent could still make incorrect assumptions about exact call format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter-meaning burden. It names most parameters in plain language, adds examples like 'car/student loans' for monthly_debts, and flags optionality for tax/insurance/HOA/loan term. However, it omits the custom front_end_dti/back_end_dti override parameters and does not specify rate units, leaving some semantic gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear action and resource: 'Solve for the maximum home price you can afford.' It further specifies the standard 28/36 DTI rule and enumerates inputs and outputs, making it easy to distinguish from sibling tools like redfin_calculate_mortgage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case is clear: computing a maximum affordable home price under a standard DTI rule. It does not explicitly name sibling alternatives or state when not to use this tool, but the scope is specific enough that an agent can infer when it applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_calculate_mortgageCalculate mortgage payment (local)ARead-onlyIdempotent
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 — fully deterministic, safe to use for scenario comparison without burning a fetch. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| pmi_rate | No | Annual %, applied when LTV > 80% | |
| home_price | Yes | ||
| hoa_monthly | No | ||
| down_payment | No | ||
| interest_rate | Yes | Annual %, e.g. 6.5 | |
| loan_term_years | No | Default 30 | |
| insurance_annual | No | ||
| property_tax_rate | No | Annual % of home price | |
| property_tax_annual | No | ||
| down_payment_percent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description goes further by saying 'No network call — fully deterministic,' explaining PMI auto-application at LTV > 80%, the 20% down payment default, and property tax input alternatives. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with scope and output, no filler. Every sentence contributes a distinct piece of information: local behavior, return value, input alternatives, and PMI rule.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no output schema, the description covers the return contents, defaults, parameter selection rules, and conditional PMI behavior. An agent has enough information to select and invoke the tool correctly using the schema plus this description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, but the description compensates for the key ambiguities: 'either down_payment OR down_payment_percent; defaults to 20%', property tax as annual amount or rate, and the pmi_rate condition. It does not document every parameter, but the omitted ones are either self-explanatory or covered by schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: a 'Local-only mortgage payment calculator' that 'Returns a full PITI breakdown' plus total interest. This clearly separates it from data-fetching siblings like redfin_search_properties or redfin_calculate_affordability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames when to use it: 'safe to use for scenario comparison without burning a fetch' and labels it as local-only. It does not name sibling alternatives or state when NOT to use it, so there is minor room for improvement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_compare_propertiesCompare multiple Redfin properties side-by-sideARead-onlyIdempotent
Fetch and compare 2 to 25 Redfin properties side-by-side. Provide an array of targets, each either a url or a property_id+listing_id pair. Returns the full per-property record (price, beds/baths, sqft, year built, HOA monthly, last sold, derived price-drop, etc.). For >25 properties or workflows that don't need side-by-side analysis use redfin_bulk_get. Pass include_summary: true for an aligned-by-field summary table (default false to save context — the per-row records carry the same data, so emitting both duplicates ~30% of the response weight). Each record's extracted_features (lake_front, hot_tub, basement, furnished, dock, community) is always included. The raw marketing description is omitted by default — opt in with include_description: true. Errors for individual properties are captured per-row with a status (ok / timeout / bridge_down / protocol / pending / other) and retryable. Server-side concurrency (~6 in flight) with retry-once-on-timeout per row; the whole call is bounded by an overall deadline, and any row still unsettled then comes back as status: "pending" (retryable) with a pending count.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Redfin's payload untouched. No field projection: this server has no verified record of which Redfin fields matter, and inventing one would risk dropping a field a caller needs. | |
| targets | Yes | Array of 2–25 properties to compare. Use `redfin_bulk_get` for larger batches that don't need side-by-side analysis. | |
| include_summary | No | Include the aligned-by-field `summary` table. Default false — the per-row records carry the same data, so emitting both duplicates ~30% of the response weight. (#37) | |
| include_description | No | Include each property's raw marketing/public-remarks description. Default false to save context — `extracted_features` always carries the structured signal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, but the description adds substantial behavioral context beyond that: per-row error statuses (ok/timeout/bridge_down/protocol/pending/other), retryability, server-side concurrency, overall deadline, and the pending fallback. It also discloses response-size tradeoffs (summary duplication) and default omissions. This is exemplary transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than minimal, but every sentence carries operational information: purpose, target forms, response fields, sibling routing, parameter trade-offs, error handling, and concurrency behavior. It is dense and front-loaded, though it could be tightened with structural formatting. Appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 params, varied target forms, per-row error handling, no output schema), the description covers everything an agent needs: accepted inputs, response contents, error semantics, scaling behavior, and alternatives. There are no obvious gaps that would cause incorrect invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds genuine semantic value by clarifying that each target is either a url or a property_id+listing_id pair, and by noting that extracted_features is always included regardless of other parameters. This goes beyond the schema's field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb-resource-scope statement ('Fetch and compare 2 to 25 Redfin properties side-by-side') that clearly distinguishes it from redfin_bulk_get and other Redfin tools. It conveys the exact operation and constraints without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when NOT to use the tool ('For >25 properties or workflows that don't need side-by-side analysis use redfin_bulk_get') and gives parameter-level usage advice (include_summary default false to save context, include_description opt-in). This leaves no doubt about selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_get_area_climate_baselineSample climate baseline for an area by pulling a few addressesARead-onlyIdempotent
Fetch climate risk for a small set of representative URLs in an area, then return their averaged baseline values plus the shared cluster_id when present. Use this as a cheap area-level read BEFORE fanning out a per-property call: if all sample properties agree (same cluster_id, same fire/flood/heat factors), the baseline applies to the whole cluster and N redundant fetches are avoidable. Pass 2–10 URLs you believe represent the area; returns the aggregate plus the per-URL responses for transparency. Limitations of the per-property tool apply (no landslide coverage — note documented in the per-property tool description).
| Name | Required | Description | Default |
|---|---|---|---|
| sample_urls | Yes | Array of 2–10 sample Redfin URLs representative of the area. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds meaningful behavioral context: it returns both aggregate and per-URL responses for transparency, it avoids N redundant fetches when samples agree, and it notes that limitations of the per-property tool apply (e.g., no landslide coverage). This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads the core behavior and then explains the use case and limitations. It is efficient and every sentence earns its place, though it could be slightly more scannable with a break between the behavior and usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only sampling tool with one parameter and no output schema, the description covers the key context: what it returns, when to use it, and a known limitation. It doesn't describe the exact response shape, but the absence of an output schema and the tool's simple aggregate-return nature make this a minor gap. The mention of the per-property tool's limitations is a good completeness touch.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter sample_urls is well-described in the schema. The description adds value by explaining the purpose of the parameter (representative URLs for the area) and the expected count (2–10), which reinforces the schema's min/max constraints. It doesn't add syntax details, but with one fully documented parameter, the baseline is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches climate risk for a small set of representative URLs, averages their baseline values, and returns a shared cluster_id when present. It distinguishes itself from per-property climate tools by emphasizing the area-level sampling approach and explicitly naming the alternative (per-property call).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this as a cheap area-level read BEFORE fanning out per-property calls, and explains the condition under which it applies (all sample properties agree on cluster_id and factors). It also gives a concrete usage pattern: pass 2–10 representative URLs. This is strong when-to-use guidance with a clear alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_get_by_addressResolve an address to its Redfin canonical URL + home_idARead-onlyIdempotent
Resolve a free-text address (with optional city/state/zip) to its Redfin canonical home URL and home_id. Walks a 3-rung ladder: (1) autocomplete as-typed, (2) autocomplete with suffix expansion (Rd ↔ Road, Ln ↔ Lane, etc.), (3) search fallback (#75) — when autocomplete misses entirely and city/state are provided, resolves the locality to a region, fires a bounded gis search, and fuzzy-matches the input street tokens against returned homes. matched_via is 'autocomplete' or 'search_fallback'. Degrades to resolved: false when every rung misses — does not throw. Address discrepancies across MLS feeds are common (the 109 vs 169 Overlook Point Ln cross-MLS case is a regular occurrence) — companion address_alternates[] field (#42) surfaces conflicts when present. Use this when you have a property address and need its Redfin home_id for follow-on calls (e.g. redfin_get_property). Read-only, no auth required.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | ZIP code (e.g. "28746"). | |
| city | No | City name (e.g. "Lake Lure"). | |
| state | No | Two-letter state code (e.g. "NC"). | |
| address | Yes | Street address (e.g. "158 Raven Blvd"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint, openWorldHint, and idempotentHint annotations, the description reveals the 3-rung resolution ladder, the matched_via values, non-throwing resolved: false degradation, and the address_alternates conflict field. This is substantial behavior beyond what annotations encode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, and every subsequent sentence adds a distinct detail: algorithm, result markers, failure mode, real-world caveat, and use case. The length is justified by the tool's complexity; there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description discloses the key result fields (matched_via, resolved, address_alternates), the non-throwing error behavior, and the intended follow-on usage. It covers the tool's complexity well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage, so the baseline is 3. The description adds meaning by characterizing address as free-text, clarifying that city/state are optional but needed for the search fallback, and mentioning fuzzy street-token matching. That justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Resolve') and resource ('free-text address ... to its Redfin canonical home URL and home_id'), and details the resolution ladder, making the tool's purpose unmistakable. However, it does not explicitly contrast with the similarly named sibling redfin_resolve_addresses, so sibling differentiation is left to the tool name rather than the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states 'Use this when you have a property address and need its Redfin home_id for follow-on calls', and adds that city/state are needed for the search fallback. It does not state when not to use it or point to alternatives such as the bulk resolver.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_get_climate_riskGet Redfin climate risk for a propertyARead-onlyIdempotent
First Street Foundation climate risk scores for a property. COVERS: flood (factor 1–10, FEMA zones, 30-year annual chance series), fire (factor 1–10, relative risk, insurance price band, provider count), heat (factor 1–10, cumulative-risk projections at 0/5/10/15/20-year horizons). DOES NOT COVER: landslide. This is the Helene-relevant risk vector in the NC mountains market and many parts of California / the Pacific Northwest. First Street has no landslide product — for that vector check the NC Geological Survey landslide hazard maps (NC-specific) or USGS landslide hazard data (national). Surfaced on every response as not_covered: ['landslide']. Response shape: when First Street data is available, available: true with the risk blocks; when not, { available: false, reason } where reason is one of no_first_street_data, new_construction, address_outside_coverage. Sourced from Redfin's server-rendered homedetails HTML (no clean stingray endpoint exists). Pass a homedetails URL (full or path). When a cluster_id is surfaced, properties with the same value typically share identical climate scores — use that to group N properties and skip redundant fetches.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Redfin homedetails URL or path (e.g. /NY/Brooklyn/42-Monroe-St-11238/home/40732555) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld/idempotent annotations by disclosing the full failure envelope: `{ available: false, reason }` with the three specific reasons, the `not_covered: ['landslide']` field surfaced on every response, and the implementation fragility ('Sourced from Redfin's server-rendered homedetails HTML (no clean stingray endpoint exists)'). It also discloses the clustering behavior (same cluster_id typically shares identical scores). Annotations are consistent — a read-only, idempotent fetch — and the description adds substantial behavioral context on top.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is rigorously structured — COVERS block, DOES NOT COVER block, response-shape block, source note, input note, optimization note — and every sentence carries non-redundant information. Front-loaded with purpose and coverage before implementation details. Slightly dense, but the complexity of three risk vectors plus failure modes justifies the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain return values, and it does: the `available: true` shape, the `available: false` reason enum, and the `not_covered` field. Input format, geographic context, alternatives, and performance optimization are all covered. No critical gap for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the url parameter already has a clear description with an example path. The description adds only marginal reinforcement ('Pass a homedetails URL (full or path)'), mostly restating what the schema already conveys. Baseline 3 is appropriate since the schema carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource statement ('First Street Foundation climate risk scores for a property') and then enumerates the exact coverage — flood, fire, heat with per-vector detail (factors 1–10, FEMA zones, horizons, insurance bands). It explicitly carves out what it does NOT cover (landslide), which distinguishes it from a generic 'climate risk' tool and from siblings like redfin_get_area_climate_baseline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names concrete conditions for use ('Helene-relevant risk vector in the NC mountains market and many parts of California / the Pacific Northwest') and explicit alternatives for what it does not cover (NC Geological Survey and USGS for landslide). It also gives an efficiency directive — using cluster_id to group properties and skip redundant fetches — so an agent knows when to reuse results rather than call again.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_get_climate_risk_bulkBulk-fetch Redfin climate risk for many propertiesARead-onlyIdempotent
Fetch climate risk for up to 100 property URLs in a single call. Same per-property shape as redfin_get_climate_risk; output preserves input order. Per-row error capture — properties without First Street data return { available: false, reason } without aborting the batch. Server-side concurrency (~5 fetches in flight) with retry-once-on-timeout per URL. The whole call is bounded by an overall deadline: any URL still unsettled then comes back as status: "pending" (retryable) with a pending count, so re-run just those. Use this when batching ~60-property workflows where climate risk is the dominant cost. Limitations from the per-property tool apply (no landslide coverage).
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | Array of 1–100 Redfin homedetails URLs or paths. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnly/idempotent/open-world; the description goes well beyond that by disclosing per-row error capture with `available:false`, server-side concurrency (~5) and retry-once-on-timeout, and the overall deadline with `pending` rows returned retryably. This is exactly the operational behavior an agent needs to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but every sentence contributes: scope, output shape, error handling, concurrency/retry, deadline/pending behavior, use-case, and inherited limitations. It front-loads the core action and then layers operational detail logically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description substitutes by describing the per-property shape, failure representation, timeout/pending behavior, and counting information. Combined with annotations and the single parameter schema, an agent has what it needs to invoke and interpret the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description mainly reinforces 'property URLs' and the 100-item ceiling but adds no new parameter format detail beyond the schema; however it does explain that output preserves input order, which is behavior rather than parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete action ('Fetch climate risk'), a limit ('up to 100 property URLs'), and explicitly ties the output shape to `redfin_get_climate_risk`, distinguishing it from the single-property sibling. It also promises input-order preservation and per-row error handling, which clarify what the bulk variant does differently.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the intended workload directly: 'Use this when batching ~60-property workflows where climate risk is the dominant cost.' It references the per-property sibling and notes shared limitations, giving clear context. It doesn't spell out an explicit 'don't use for a single property' exclusion, so slightly below the top bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_get_comparable_rentalsGet comparable rentals near a Redfin propertyARead-onlyIdempotent
Find nearby rental comparables for a given property: nearby active rental listings with similar bed/bath/sqft, including monthly rent, distance, and the Redfin URL. Useful for estimating what a property could rent for, or for finding rentals near a home you're considering. Inputs are the rent estimate range + lat/lng + propertyId — typically taken from the upstream redfin_get_property (or read from the property page directly).
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | ||
| longitude | Yes | ||
| property_id | Yes | ||
| rent_estimate_low | Yes | Lower bound of the rent estimate. Use the same value for low+high if you only have one estimate. | |
| rent_estimate_high | Yes | Upper bound of the rent estimate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, covering safety and variability. The description adds value by specifying the output content (similar active rentals with rent, distance, URL) and the source of inputs (upstream property data). This exceeds annotation coverage without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The first sentence states the core function and output; the second covers use case and input provenance. Information is front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with robust annotations and no output schema, the description covers the essential aspects: what it returns, how it's useful, and where inputs come from. It doesn't mention pagination or distance limits, but these are not critical for a comparables tool and the description is otherwise sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 40%, so the description must compensate. It does by naming the parameter groups: 'rent estimate range + lat/lng + propertyId', which maps directly to the five parameters. It also clarifies the rent estimate low/high as a range and notes they can be equal. However, it does not explain the meaning of property_id beyond 'from upstream', which is a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Find') and resource ('nearby rental comparables for a given property'), details the criteria (similar bed/bath/sqft) and outputs (monthly rent, distance, Redfin URL). It also conveys the use case (estimating rent, finding nearby rentals), which distinguishes it from siblings like redfin_get_property or redfin_search_properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: when you have a property and need rental comparables, and it specifies that inputs typically come from upstream redfin_get_property or the property page. It does not explicitly state exclusions or alternatives, but the context is sufficient for an agent to decide when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_get_market_reportGet Redfin market report for a regionARead-onlyIdempotent
Market report for a Redfin region: median list/sold prices, $/sqft, sale-to-list ratio, total homes for sale + sold, all with year-over-year and month-over-month change. Provide either (a) location — free-text we resolve via autocomplete (best with city names; "New York", "Seattle"; neighborhoods typically return empty data), or (b) region_id + region_type directly. property_type defaults to 1 (all). Each metric returns { label, value, unit, yoy_change_fraction, yoy_direction, mom_change_fraction, mom_direction }. Read-only; safe to call repeatedly.
| Name | Required | Description | Default |
|---|---|---|---|
| location | No | Free-text location to autocomplete (alternative to region_id+region_type) | |
| region_id | No | Redfin region id (e.g. 30749 for New York City) | |
| region_type | No | Redfin region type code (2 = city, 5 = zip code, 6 = neighborhood) | |
| property_type | No | Property type filter, default 1 (all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description reinforces this with 'Read-only; safe to call repeatedly.' It goes beyond annotations by disclosing the return shape of each metric and the behavioral caveat that neighborhoods typically return empty data. This gives an agent useful expectations before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first defines scope and outputs, the second gives parameter routing guidance, and the third communicates return structure plus safety. The most actionable usage instruction follows immediately after the purpose statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 0 required parameters and no output schema, the description covers everything needed: the metric object structure, two region-specification modes, the property-type default, a location quality caveat, and read-only/idempotent safety. An agent can call the tool correctly without additional inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% since all four parameters have descriptions. The description adds meaning above the schema by explaining how `location` resolves via autocomplete, contrasting it with the direct `region_id`+`region_type` path, and stating the `property_type` default value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource ('market report for a Redfin region') and enumerates the exact metrics returned, including median list/sold prices, $/sqft, sale-to-list ratio, and change-over-time figures. This clearly distinguishes it from sibling tools like redfin_get_property or redfin_search_properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit invocation guidance: use either `location` (free-text via autocomplete, best with city names; neighborhoods typically return empty data) or `region_id` + `region_type` directly, and mentions the `property_type` default. It does not name sibling alternatives, but the market-report scope and metric list make the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_get_price_historyGet Redfin price history for a propertyARead-onlyIdempotent
Listing-price events for a property — listings, price changes, pending, sold, etc. Each entry has a date, event description, price, days-on-market at that point, and the data-source attribution (MLS, county records, etc.). Also returns the tax-history series from public records. Provide either url or property_id+listing_id. Read-only; safe to call repeatedly.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Redfin homedetails URL or path | |
| listing_id | No | ||
| property_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and open-world hints. The description adds valuable behavioral context by detailing the returned entry fields, data-source attribution, tax-history inclusion, and the either-or identifier requirement. Restating 'read-only; safe to call repeatedly' is redundant but harmless.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is mostly efficient and front-loaded with the core purpose and returned contents. The final 'Read-only; safe to call repeatedly' repeats annotation hints, adding slight redundancy, but the overall length is reasonable and each other sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, 3-parameter tool with no output schema, the description explains both the main return contents and the valid input modes. Minor gaps remain around what happens if both url and IDs are supplied, and how to obtain the identifiers, but the agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, with just the url parameter described. The description compensates by specifying the critical relationship: provide either url or the property_id+listing_id pair. It does not deeply define each ID's origin or format, but the names are self-explanatory and the grouping rule is materially useful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as listing-price events for a single property and enumerates event types (listings, price changes, pending, sold). It also mentions the tax-history series, distinguishing this tool from property-details, market-report, and climate-risk siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool — when you need listing-level price events or tax history for one property. However, it does not explicitly contrast it with siblings like redfin_get_property or redfin_get_market_report, nor does it state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_get_propertyGet Redfin property detailsARead-onlyIdempotent
Fetch a property's full Redfin record. Provide one of: (a) url — full Redfin homedetails URL or path, resolved via the initialInfo endpoint; (b) property_id alone — resolved internally by following Redfin's /home/ redirect to the canonical listing, then initialInfo; or (c) property_id + listing_id — fastest, skips resolution and goes straight to aboveTheFold. Returns address, beds/baths, sqft, lot_size (sq ft), year built, price, status, days on market, plus derived fields (lot_size_acres, price_drop_*, hoa_monthly_usd, last_sold_*, tax_annual, extracted_features). lot_size / lot_size_acres are null (never 0) for condos and listings with no public-records lot. primary_photo_url is a raw Redfin CDN URL and is dropped on the default compact view — pass view: "full" for it, or use redfin_get_property_photos for the whole gallery. The raw marketing description is OMITTED by default — opt in with include_description: true. Set include_price_history: true to bundle the full price history (and the cross-MCP-normalized events_normalized view) inline; set include_tax_history: true for tax_history. Read-only; safe to call repeatedly.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Redfin homedetails URL or path (e.g. /NY/Brooklyn/42-Monroe-St-11238/home/40732555) | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Redfin's payload untouched. No field projection: this server has no verified record of which Redfin fields matter, and inventing one would risk dropping a field a caller needs. | |
| listing_id | No | Numeric Redfin listing ID. Optional; pairs with property_id to skip resolution. | |
| property_id | No | Numeric Redfin property ID. Sufficient on its own — when no listing_id/url is given it is resolved internally via the /home/<id> redirect. Pair with listing_id to skip that resolve step entirely. | |
| include_description | No | Include the raw marketing/public-remarks description string in the response. Default false to save context — `extracted_features` always carries the structured signal callers actually need. | |
| include_tax_history | No | Bundle the full tax history inline as `tax_history`. Default false. (#49) | |
| include_price_history | No | Bundle the full price history inline as `price_history` + `events_normalized`. Default false. Saves a follow-up redfin_get_price_history round trip — use this when a workflow needs both. (#49) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, openWorldHint, idempotentHint), the description discloses concrete data-shape behavior: lot_size null for condos never 0, primary_photo_url dropped on compact view, raw marketing description omitted by default, and derived-field additions (events_normalized for price history). It also explicitly confirms read-only safety, reinforcing the annotations without contradicting them. No annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though the description is long, every sentence carries actionable detail — resolution mechanics, output fields, edge cases, and opt-in flags. It is front-loaded with the core purpose and input routes, and the subsequent clauses each add a distinct behavioral fact. No filler, no restatement of the title, and no redundancy with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must specify the return shape itself, and it does: it enumerates address, beds/baths, sqft, lot_size, year built, price, status, days on market, and a set of derived fields, plus the exact null behavior for condos. It also covers conditional output (photo drop, description omission) and how to enable them. Given the 7 optional parameters and multiple resolution modes, this is as complete as needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description goes well beyond the schema by explaining each parameter's behavioral purpose: url resolution via initialInfo, property_id's internal redirect, pairing listing_id to skip resolution, and the context-saving rationale for include_description. This adds operational meaning the schema's enum/value descriptions do not convey, such as 'fastest' and 'skips resolution'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair — 'Fetch a property's full Redfin record' — and immediately enumerates the three possible input routes (url, property_id alone, property_id+listing_id), each with a distinct resolution path. It clearly delineates this tool from siblings like redfin_get_property_photos and redfin_get_price_history by pointing to those as alternatives for photo galleries and price history, so an agent can select it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: the three call patterns are contrasted by speed ('fastest, skips resolution'), and each optional flag (include_description, include_tax_history, include_price_history) names the exact scenario that warrants it ('use this when a workflow needs both'). It also points to redfin_get_property_photos as the alternative when a photo gallery is required, making the routing decision fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_get_property_photosGet Redfin property photo galleryARead-onlyIdempotent
The full photo gallery for a Redfin property — every image in mediaBrowserInfo. Each entry returns CDN URLs at multiple sizes (fullscreen, large, medium, lightbox) plus a thumbnail and the photo's caption when set. Provide either url (full Redfin homedetails URL or path; we resolve to IDs via initialInfo) or property_id + listing_id (skip the resolve step). Returns { property_id, listing_id, count, photos }. Off-market or stub listings may return count=0. Read-only; safe to call repeatedly.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Redfin homedetails URL or path (e.g. /NY/Brooklyn/42-Monroe-St-11238/home/40732555) | |
| listing_id | No | Numeric Redfin listing ID. Required when property_id is provided. | |
| property_id | No | Numeric Redfin property ID. Pair with listing_id to skip the URL resolve step. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, and the description reinforces these with 'Read-only; safe to call repeatedly.' It also adds behavioral details beyond annotations, such as the URL resolution via initialInfo, the return structure, and the edge case of count=0 for off-market listings. This provides a clear picture of what happens during the call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundant words. It front-loads the core purpose ('The full photo gallery') and then provides necessary details about output format, input options, and edge cases. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only photo retrieval tool with no output schema, the description covers everything an agent needs: the exact return shape ({ property_id, listing_id, count, photos }), the contents of each photo entry, the two input methods, and a potential edge case (count=0). No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already documents each parameter (100% coverage), the description adds significant semantic value by explaining the two mutually exclusive input groups (url OR property_id+listing_id) and that the latter skips the resolve step. This clarifies the relationship between parameters and helps the agent choose the correct combination.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool does: it retrieves the full photo gallery for a Redfin property, including every image in mediaBrowserInfo, with CDN URLs at multiple sizes, a thumbnail, and captions. This is a specific verb+resource that clearly distinguishes it from sibling tools like redfin_get_price_history or redfin_get_climate_risk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on the two invocation modes (url vs property_id+listing_id) and includes a caveat about off-market or stub listings returning count=0. It does not explicitly name alternatives or state when not to use this tool, but the purpose is unambiguous enough that an agent knows to use it for photo retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_get_saved_homesGet my saved (favorited) Redfin homesARead-onlyIdempotent
The signed-in user's favorited homes on redfin.com. Returns address, price, beds/baths, status. Requires the user to be signed in. Read-only; safe to call repeatedly.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Redfin's payload untouched. No field projection: this server has no verified record of which Redfin fields matter, and inventing one would risk dropping a field a caller needs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description reinforces this while adding the requirement that the user be signed in. It does not disclose failure modes, but the auth requirement is meaningful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences are front-loaded with the resource and return fields. The read-only and safe-to-repeat statement is somewhat redundant with the annotations, but the overall text is compact and well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list with one optional parameter, the description plus schema covers purpose, authentication, and return fields. There is no output schema, but the listed fields give an agent enough expectation for the response shape; the main gap is unspecified pagination or limit behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single optional parameter `view` is fully documented in the schema with enum values and a detailed description, so the schema carries the parameter-semantics load. The tool description adds no input-parameter meaning beyond that, matching the baseline for 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: returns the signed-in user's favorited homes on redfin.com, and enumerates key returned fields (address, price, beds/baths, status). This clearly distinguishes it from siblings like redfin_get_saved_searches and redfin_search_properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: this is for the signed-in user's saved/favorited homes and requires authentication. It does not explicitly name alternatives or say when not to use it, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_get_saved_searchesGet my saved Redfin searchesARead-onlyIdempotent
The signed-in user's saved searches on redfin.com, derived from the saved-searches page HTML. Each entry is { url, region_segment, display_text }. Requires the user to be signed in. Returns an empty array if the user has none. Read-only; safe to call repeatedly.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Redfin's payload untouched. No field projection: this server has no verified record of which Redfin fields matter, and inventing one would risk dropping a field a caller needs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description reinforces these by stating it is read-only and safe to call repeatedly. It adds genuinely new behavioral context: the data is derived from the saved-searches page HTML, requires authentication, and returns an empty array when no searches exist. This goes beyond what the annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences deliver the core functionality, return shape, authentication requirement, empty-result behavior, and safety profile with no filler. The most important information is front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly fills the gap by documenting the entry structure, auth requirement, empty-array behavior, and read-only semantics. The single optional parameter is fully covered by the schema, and the tool is simple enough that nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema thoroughly explains the `view` parameter, including compact/full semantics and the rationale for not doing field projection. The tool description itself adds no parameter-specific guidance, so the baseline of 3 applies since the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: retrieving the signed-in user's saved searches from redfin.com. It also states the exact shape of each entry (`{ url, region_segment, display_text }`), making the purpose unambiguous. This clearly distinguishes it from siblings like redfin_get_saved_homes without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool works: the user must be signed in, and it returns an empty array when there are no saved searches. It does not explicitly contrast it with an alternative tool or say 'use X instead,' but the context is sufficient for an agent to know when it applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_get_session_contextList all registered Redfin sessionsARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds detail about the empty-session edge case (sessions empty, active_session_id null), which goes beyond the readOnlyHint annotation. It clearly aligns with the read-only and idempotent annotations without contradiction, and the added null-case disclosure provides useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exactly two sentences, each earning its place. The main action is front-loaded, and there is zero fluff or repetition of schema/annotation details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description adequately describes the return value (sessions list and active_session_id) and the edge case when no sessions exist. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema coverage is trivially 100%. The description doesn't need to explain parameters; a baseline of 4 applies for a parameterless tool, and the description adds no unnecessary information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Return the full set of registered sessions plus the current active_session_id.' This is a specific verb-resource pair that distinguishes it from sibling tools like redfin_set_active_session or redfin_register_session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives like redfin_set_active_session. However, the purpose is so specific that usage is implied—one would call this to inspect current sessions. There is no explicit 'when not to use' or mention of alternatives, so it only reaches 'implied usage'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_healthcheckVerify the fetchproxy bridge end-to-endARead-onlyIdempotent
Round-trips a small public www.redfin.com URL (/robots.txt) through the fetchproxy bridge and returns diagnostics: the bridge's role (host/peer/null), port, version, the extension link (linked / pair pending / not attached / never answered), the elapsed round-trip time, and a plain-English hint distinguishing 'bridge never came up' from 'extension not connected' from 'real www.redfin.com-side problem'. Read-only, no auth required. Call this when a real tool fails and you want to know which hop broke.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds value beyond them: no auth required, an external network round-trip, and the diagnostic categories (bridge role, extension link state, failure classification). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A dense first sentence front-loads the core behavior, and every diagnostic field listed earns its place. Slightly long, but justified by the number of outputs a health-check tool must describe.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and discharges it thoroughly: role, port, version, extension link states, elapsed RTT, and plain-English failure hints. Auth and side effects are addressed; nothing an agent needs to invoke this zero-parameter tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the empty schema is vacuously complete at 100% coverage; baseline 4 applies. The description's lack of parameter detail is harmless since there is nothing to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: round-trips /robots.txt through the fetchproxy bridge. Clearly distinguishes this diagnostic tool from the 19 data-retrieval siblings, and the closing sentence identifies its troubleshooting role (which hop broke).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call it: 'Call this when a real tool fails and you want to know which hop broke.' Provides clear context, though it does not name alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_register_sessionRegister a signed-in Redfin sessionAIdempotent
Register (or refresh) an authenticated Redfin 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.
| Name | Required | Description | Default |
|---|---|---|---|
| mark_active | No | When true, immediately make the newly-registered session the active one. | |
| auth_expires_at | No | Optional ISO timestamp at which the session expires. | |
| account_identity | Yes | Caller-supplied identifier for the signed-in account (typically the saved-account email). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral detail beyond annotations: re-registering the same account_identity updates the existing session instead of duplicating it, which expands on idempotentHint=true. It also discloses the default-active behavior and the effect of mark_active, giving an agent a clearer model of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences with no filler. It front-loads the core mutating action, then explains update semantics, return value, and activation behavior in a logical order. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with 3 parameters and no output schema, the description covers the essential behavior, return value, and active-session semantics. It could also mention what happens when no session is active and mark_active is false, but the first-registered-becomes-default rule largely covers that edge case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantic value by identifying account_identity as the idempotency key and by explaining the effect of mark_active on session activation, going slightly beyond the schema's property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Register (or refresh) an authenticated Redfin session') and a precise resource ('a session keyed by signed-in account identity'). It clearly differs from sibling tools like redfin_set_active_session and redfin_get_session_context by framing this as the registration/refresh entry point that returns a session_id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on how to use the tool: register the first session to become default, pass mark_active to set it active, and use the returned session_id for routing per-tool calls. It does not explicitly name excluded cases or alternatives, but the intended usage is strongly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_resolve_addressesBulk-resolve street addresses to Redfin URLs + home_idsARead-onlyIdempotent
Resolve up to 100 free-text street addresses to Redfin canonical home URLs + home_ids in a single tool call. Each input is either a string (full address) or a structured {street, city, state, zip} object. Output preserves input order. Unresolved entries return resolved: false without aborting the batch; a transient bridge failure surfaces a distinct retryable status (timeout/bridge_down/pending) so it is never mistaken for a genuine no-match. Per-row retry-once-on-timeout, server-side concurrency ~6 in flight. The whole call is bounded by an overall hard deadline: a single slow/hung row never wedges the server — unsettled rows come back with status: "pending" and a pending count so you can re-run just those. Use this when you have a list of properties from another system (Compass, MLS, spreadsheet) and need their Redfin handles for follow-on calls — collapses the typical 6-search-call + 15-resolve flow into one trip.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Redfin's payload untouched. No field projection: this server has no verified record of which Redfin fields matter, and inventing one would risk dropping a field a caller needs. | |
| addresses | Yes | Array of 1–100 addresses to resolve, each a string or a {street, city, state, zip} object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the bar is lower — yet the description still adds substantial behavioral context: input-order preservation, per-row no-match (`resolved: false`) vs. distinct retryable statuses (timeout/bridge_down/pending), retry-once-on-timeout, ~6 in-flight concurrency, and a hard overall deadline with re-runnable `pending` rows. This is exactly the kind of failure/semantics disclosure agents need and no annotation covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though long, every sentence earns its place: purpose → input forms → ordering → no-match vs. retryable failure → retry/concurrency → deadline behavior → usage scenario. It is front-loaded with the core action and flows logically with zero filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description carries full burden for return semantics — and it delivers: input-order preservation, resolved vs. unresolved vs. transient statuses, pending re-run guidance, batch limits, retry behavior, and the motivating use case. For a complex batch tool this is remarkably complete; nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — both `addresses` and `view` carry rich descriptions (including the compact/full distinction and the anyOf string/object shape). The tool description restates the input forms but adds little beyond the schema; the error-semantics detail it provides is output behavior, not parameter meaning. Baseline 3 applies since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Resolve up to 100 free-text street addresses to Redfin canonical home URLs + home_ids in a single tool call.' The batch scope (up to 100) and the URL+home_id output clearly distinguish this from single-address siblings like redfin_get_by_address, and the title reinforces the same purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Ends with an explicit when-to-use clause: 'Use this when you have a list of properties from another system (Compass, MLS, spreadsheet) and need their Redfin handles for follow-on calls.' It also frames the value proposition by contrasting with the 'typical 6-search-call + 15-resolve flow.' However, it does not name a specific alternative sibling for the single-address case or state any when-not-to-use conditions, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_search_propertiesSearch Redfin listingsARead-onlyIdempotent
Search Redfin listings by location (city, ZIP, neighborhood, or full street address) and optional filters. Resolves the location via Redfin's autocomplete then queries the gis API; full street addresses short-circuit to the single matched home (no gis call). Returns matching properties with price, beds/baths, sqft, year built, address, and the Redfin home URL. resolved_as is 'region' / 'address'. coverage is 'full' (gis indexed this region), 'profile_only' (Redfin has profiles for individual addresses here but search isn't indexed — use redfin_get_by_address per property), or 'none'. result_cap_hit: true signals the result page is full — gis returned as many rows as requested (limit, default 40, max 350) — so more listings likely exist; raise limit or narrow with price/beds filters. ZIP queries that fall into Redfin's cross-continent fallback (e.g. ZIP 28746 returning Seattle results) now error loudly. Only for_sale status is supported; sold / for_rent return an error (use redfin_get_comparable_rentals for rentals, redfin_get_market_report for sold-price trends). Read-only; safe to call repeatedly.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max listings to return (default 40; values above 350, the gis hard cap, are clamped to 350). | |
| status | No | Listing status. Only for_sale is supported; sold and for_rent return an error rather than for-sale results. | |
| beds_min | No | ||
| location | Yes | Free-text location: city, ZIP, neighborhood, or address (e.g. "Brooklyn, NY", "94110", "Park Slope") | |
| baths_min | No | ||
| price_max | No | ||
| price_min | No | ||
| home_types | No | Restrict to one or more property types. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/idempotentHint, it discloses the autocomplete-to-gis flow, the street-address short-circuit, the meaning of resolved_as and coverage values, result_cap_hit semantics, and loud errors on cross-continent ZIP fallback. It also explicitly confirms read-only safety, consistent with the annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense, front-loading the core action and packing each distinct behavior into its own sentence. A small amount of redundancy with the status schema and the readOnly annotations keeps it from being perfectly lean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining return values, and it does: price, beds/baths, sqft, year built, address, URL, plus resolved_as, coverage, and result_cap_hit. It covers error cases, limits, and sibling alternatives, so an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents location, limit, status, and home_types; the description adds operational meaning for those by explaining autocomplete resolution, limit clamping to 350, and the status error behavior. The numeric filter parameters (beds_min, baths_min, price_min, price_max) lack schema descriptions and are only hinted at via 'narrow with price/beds filters,' which is a modest gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Search Redfin listings by location...') and details the resolution pipeline, return fields, and envelope semantics. It explicitly distinguishes itself from redfin_get_by_address for per-property lookups and names rental/sold alternatives, so an agent can tell it apart from the 20 sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to use the tool (location-based listing searches) and when not to: sold/for_rent statuses return errors and should use redfin_get_comparable_rentals or redfin_get_market_report, and profile_only coverage should use redfin_get_by_address. It also gives operational guidance around result_cap_hit and ZIP fallback failures.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redfin_set_active_sessionSet the active Redfin sessionAIdempotent
Switch which registered session subsequent tool calls route through by default. Pass a session_id previously returned by redfin_register_session. Tools that accept an explicit session_id parameter override this default per-call.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session id to make active. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool changes default routing state for subsequent calls, which goes beyond the annotations (readOnlyHint=false, idempotentHint=true). It also notes the override behavior. It does not describe failure behavior for invalid/unregistered session IDs, but the core stateful effect is transparent and does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each earning its place: the first states the primary action and effect, the second provides the prerequisite and the override behavior. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple state-setting tool with one parameter and no output schema, the description is complete: it defines the action, the prerequisite for the parameter, and how the default interacts with explicit session_id parameters. No critical information needed for calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema describes session_id as 'Session id to make active.' The description adds important semantic meaning by requiring that the session_id was previously returned by redfin_register_session, which is not in the schema. This helps the agent understand the provenance requirement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Switch') and resource ('registered session') and clarifies that this sets the default routing for subsequent tool calls. It clearly distinguishes this tool from siblings like redfin_register_session (which creates sessions) and redfin_get_session_context (which reads session info).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to pass a session_id previously returned by redfin_register_session, giving a clear prerequisite. It also explains that tools accepting an explicit session_id override this default per-call, which tells the agent when the default applies and how to bypass it. It does not explicitly name alternative tools, but the guidance is sufficient for correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.1.2- Changed
redfin_search_properties2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max listings to return (default 40)."New value: +"Max listings to return (default 40; values above 350, the gis hard cap, are clamped to 350)." - changed
Input schema / properties / status / descriptionPrevious value: -"Listing status. Only for_sale fully works in v0.1.0."New value: +"Listing status. Only for_sale is supported; sold and for_rent return an error rather than for-sale results."
21 tool updates
v1.0.0- Changed
redfin_bulk_get1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_calculate_affordability1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_calculate_mortgage1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_compare_properties1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_get_area_climate_baseline1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_get_by_address1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_get_climate_risk1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_get_climate_risk_bulk1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_get_comparable_rentals1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_get_market_report1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_get_price_history1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_get_property1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_get_property_photos1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_get_saved_homes1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_get_saved_searches1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_get_session_context1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_healthcheck1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_register_session1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_resolve_addresses1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_search_properties1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
redfin_set_active_session1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
6 tool updates
v0.13.1- Changed
redfin_bulk_get1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Redfin's payload untouched. No field projection: this server has no verified record of which Redfin fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
redfin_compare_properties1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Redfin's payload untouched. No field projection: this server has no verified record of which Redfin fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
redfin_get_property1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Redfin's payload untouched. No field projection: this server has no verified record of which Redfin fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
redfin_get_saved_homes1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Redfin's payload untouched. No field projection: this server has no verified record of which Redfin fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
redfin_get_saved_searches1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Redfin's payload untouched. No field projection: this server has no verified record of which Redfin fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
redfin_resolve_addresses1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Redfin's payload untouched. No field projection: this server has no verified record of which Redfin fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
21 tool updates
v0.10.1- First observed
redfin_bulk_get - First observed
redfin_calculate_affordability - First observed
redfin_calculate_mortgage - First observed
redfin_compare_properties - First observed
redfin_get_area_climate_baseline - First observed
redfin_get_by_address - First observed
redfin_get_climate_risk - First observed
redfin_get_climate_risk_bulk - First observed
redfin_get_comparable_rentals - First observed
redfin_get_market_report - First observed
redfin_get_price_history - First observed
redfin_get_property - First observed
redfin_get_property_photos - First observed
redfin_get_saved_homes - First observed
redfin_get_saved_searches - First observed
redfin_get_session_context - First observed
redfin_healthcheck - First observed
redfin_register_session - First observed
redfin_resolve_addresses - First observed
redfin_search_properties - First observed
redfin_set_active_session
TDQS
Scored across 21 tools
Most tools target distinct resources and actions, with clear descriptions for single vs. bulk variants (get_property vs bulk_get, get_by_address vs resolve_addresses). A couple of pairs could still be confused if descriptions aren't read carefully, but the boundaries are well articulated.
All tools share the redfin_ prefix and mostly follow a verb_noun snake_case pattern. Minor deviations: bulk_get inverts the modifier order compared to get_climate_risk_bulk, and healthcheck is a noun rather than verb+noun, but overall the convention is consistent and readable.
At 21 tools, the set is on the heavy end of the borderline range. Each tool has a legitimate purpose (search, property details, climate risk, market reports, calculators, sessions, batch variants), but the count feels high and could be consolidated (e.g., merging session-management tools or some bulk variants).
Core buy-side workflows are covered: search, property details, price history, climate risk, market report, mortgage, affordability, photos, and address resolution. A notable gap is the lack of general rental search—redfin_search_properties explicitly rejects for_rent, and comparable rentals only work for a specific property, so broad rental browsing is impossible.
Maintenance
Related MCP Connectors
Redfin listings, sale-comps, and neighborhood market data via natural-language queries.
Redfin for-sale, for-rent and sold listings plus full property pages, as structured JSON.
Pull property listings, prices, and details from real-estate sites as structured JSON.
Search real-estate deals, rank top areas, run rental/BRRRR/flip analysis, pull sold comps.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceProvides real-time access to Zillow real estate data, enabling property search, details, Zestimates, market trends, and mortgage calculations via natural language.2 npm48MIT
- AlicenseAqualityAmaintenanceEnables natural-language access to Zillow real-estate data, including property search, details, Zestimate history, saved searches/homes, and market reports, by routing requests through the user's authenticated browser session.120555 npmMIT
- AlicenseAqualityAmaintenanceProvides real estate data from homes.com via a browser session, enabling property search, details, history, and affordability calculations through natural language.21522 npmMIT
- AlicenseAqualityAmaintenanceEnables searching curated OneHome property listings, fetching property details and photos, comparing homes, and running mortgage calculations from within Claude.21514 npm1MIT