Skip to main content
Glama
chrischall

zillow-mcp

by chrischall

zillow-mcp

CI npm license

Zillow real-estate access as an MCP server for Claude — search listings, fetch property details, Zestimate history, your saved searches & homes, and market reports via natural language.

⚠️ Zillow does not publish a public consumer API. The official Bridge API is gated to MLS partners. This server uses the same private endpoints the zillow.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 Zillow's website. Use at your own discretion.

Why this exists

The four existing Zillow MCPs all sit on one of two foundations:

  • The Bridge API — requires MLS membership, IDX vendor relationship, or "approved technology partnership" (10+ business-day approval). Consumers can't get in.

  • A paid scraper (RapidAPI, Apify) — adds a third party to the trust path and rate-limits.

None of them can see what you have saved, favorited, or recently viewed — because both Bridge and third-party scrapers are out-of-session. zillow-mcp uses your already-signed-in zillow.com tab.

Related MCP server: Zillow56 MCP Server

Tools

Tool

Purpose

Auth-scoped

zillow_search_properties

Search listings by location, status, price band, beds/baths, home type

zillow_get_property

Full record for a zpid (price, Zestimate, beds, schools, neighborhood, price history)

zillow_get_by_address

Resolve a free-text address (with optional city/state/zip) to its Zillow zpid + canonical URL

zillow_resolve_addresses

Batch-resolve many free-text addresses (or structured rows) to zpids + canonical URLs

zillow_bulk_get

Fetch full records for many zpids/URLs at once, with partial-result + bot-wall handling

zillow_get_property_photos

Full photo gallery for a property — every image embedded in the homedetails page with multi-width jpeg + webp variants and captions

zillow_get_zestimate_history

Time series of Zestimate values (and rent Zestimate where available)

zillow_get_price_history

Listing history (Listed/Sold/Pending/etc.) with price + days on market

zillow_get_tax_history

Annual tax-roll history — taxes paid and assessed value year-over-year

zillow_compare_properties

Side-by-side comparison of up to 12 properties, with an aligned summary table

zillow_calculate_affordability

Local affordability calculator — max purchase price from income/DTI/rates

zillow_estimate_rent_vs_buy

Local rent-vs-buy break-even with appreciation + opportunity cost

zillow_get_saved_searches

Your saved searches with new-listing counts and notification frequency

✓

zillow_get_saved_homes

Your favorited homes with current price + Zestimate + primary photo

✓

zillow_get_market_report

Median sale/list/rent, days on market, inventory, ZHVI for a region

zillow_calculate_mortgage

Local PITI calculator — principal+interest, taxes, insurance, HOA, PMI (no network)

zillow_healthcheck

Round-trip a public Zillow URL through the bridge to localize bridge/extension/Zillow-side failures

zillow_register_session

Register a named Zillow session (bridge port) in the local session registry

zillow_set_active_session

Switch which registered session subsequent tool calls route through

zillow_get_session_context

Inspect the active session + the registered-session list

Acknowledgement of Terms

By using this MCP server, you acknowledge and agree to the following:

1. This server accesses your own Zillow session. Every request is dispatched through your own browser tab (logged in or not) via the fetchproxy extension. It does not — and cannot — access anyone else's account.

2. Zillow's Terms of Use govern your use of this server, just as they govern your direct use of zillow.com. The clauses most relevant here:

You may not use any robot, spider, scraper or other automated means to access the Services for any purpose without our express written permission… nor may you conduct automated queries (including screen and database scraping, spiders, robots, crawlers, bypassing CAPTCHAs or similar precautions).

You are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server. Zillow's terms broadly prohibit automated access without written permission; this is an unofficial tool and Zillow has not granted it permission.

3. Personal, non-commercial use only. This project is not affiliated with, endorsed by, sponsored by, or in partnership with Zillow Group. It is a personal automation tool that drives the same Zillow website you would drive by hand — one search at a time, your own saved homes, your own market reports. Do not use it to bulk-extract listings, train models, populate a competing real-estate product, or for any commercial purpose.

4. Stability is not guaranteed. This server reads private internal endpoints (/async-create-search-page-state/, __NEXT_DATA__ blobs, /myzillow/...) that Zillow 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 Zillow access — rate limiting, account warnings, suspension, IP blocks, captcha walls, or any enforcement action Zillow Group takes. If Zillow 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 Zillow's actual ToS.

Install

Option A — npx (after publishing)

Add to .mcp.json:

{
  "mcpServers": {
    "zillow": {
      "command": "npx",
      "args": ["-y", "zillow-mcp"]
    }
  }
}

Option B — from source

git clone https://github.com/chrischall/zillow-mcp
cd zillow-mcp
npm install
npm run build
{
  "mcpServers": {
    "zillow": {
      "command": "node",
      "args": ["/path/to/zillow-mcp/dist/bundle.js"]
    }
  }
}

One-time browser setup

zillow-mcp talks to your browser through the fetchproxy extension, which is shared across every fetchproxy-based MCP (resy-mcp, opentable-mcp, …). Install it once:

git clone https://github.com/chrischall/fetchproxy
cd fetchproxy
npm ci
npm --workspace=@fetchproxy/extension-chrome run build

Then in Chrome: chrome://extensions → toggle Developer mode → Load unpacked → pick packages/extension-chrome/dist/.

Open zillow.com and sign in. That's all the auth this server needs.

How it works

┌────────────────┐  stdio   ┌──────────────────┐   WS   ┌──────────────────┐    fetch()    ┌─────────────┐
│ MCP client     │◀────────▶│  dist/bundle.js  │◀──────▶│  fetchproxy      │◀────────────▶│ zillow.com  │
│ (Claude, etc.) │          │  (Zillow MCP)    │ :37149 │  extension       │   (real TLS, │ (your tab)  │
└────────────────┘          └──────────────────┘        │  (separate)      │   cookies)    └─────────────┘

The MCP server runs in Node, but every HTTP call to zillow.com is dispatched into your live browser tab through the fetchproxy extension. Each request rides your existing session — _abck, TLS fingerprint, and cookies 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.

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

20 tools
zillow_bulk_getBulk-fetch Zillow properties by zpidA
Read-onlyIdempotent

Fetch up to 200 Zillow property records in a single call — the "give me everything for these N saved homes" endpoint. Returns one structured row per input id (no pivoted side-by-side summary table — for 2-25 listings with a comparison summary use zillow_compare_properties). Each row is either { zpid, property } on success or { zpid, error, error_kind } on failure — one bad zpid never fails the whole call. Calls fan out concurrently against /homedetails/<zpid>_zpid/ (capped at 6 in flight, per issue #78, with retry-once-on-timeout per sub-request to absorb transient SW evictions). Big lists fan out bounded to 6 in flight and paced by a per-host requests-per-minute throttle (burst 20) so the batch doesn't trip Zillow's PerimeterX bot-wall (issue #90). If the bot-wall is hit, the blocked sub-requests are retried with exponential backoff; anything still blocked is reported with error_kind: "bot_challenge" (distinct from a missing listing) and the response carries a { blocked, retry_after_s } envelope so you can finish the rest in a second pass. The whole call is bounded by an overall hard deadline (issue #98): a single slow/hung row never wedges the server — when the deadline is reached any row that has not yet settled is returned with error_kind: "pending" and the response carries a { pending } count so you can re-run just those ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsNoZillow homedetails URLs/paths to fetch. 1..200.
zpidsNoZpids to fetch. 1..200. Provide either zpids or urls.

TDQS

A4.4/5.0
Behavior5/5

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

Even though annotations already declare readOnlyHint and idempotentHint, the description adds substantial behavior: per-row success/error isolation, retry-once-on-timeout, concurrency cap of 6, bot-wall handling with exponential backoff, error_kind values like bot_challenge and pending, a blocked/retry_after_s envelope, and an overall hard deadline. This goes far 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and the alternative tool, but the rest is one dense paragraph packed with implementation specifics, issue references (#78, #90, #98), and jargon like 'SW evictions' and 'burst 20'. The content is valuable, but the structure is not concise or easily scannable; bullet points would improve it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description takes on the burden of explaining return values—and it does cover the per-row shapes, error kinds, bot-challenge envelope, and pending count. The main gap is that the success `property` object's fields are left unspecified, though the description is otherwise remarkably complete for a complex bulk endpoint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds 'one structured row per input id' and explains that a bad zpid does not fail the whole call, but it does not define exact URL/path formats or clarify how zpids and urls relate beyond what the schema already says. The schema carries most of the parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Fetch up to 200 Zillow property records in a single call' and clearly frames it as the bulk endpoint. It also distinguishes itself from zillow_compare_properties by stating there is no pivoted side-by-side summary table, so an agent can tell them apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly routes to an alternative: 'for 2-25 listings with a comparison summary use zillow_compare_properties'. This is a clear when-to-use-this-versus-that signal, which is exactly what an agent needs for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_calculate_affordabilityCalculate max affordable home priceA
Read-onlyIdempotent

Solve for the maximum home price you can afford under the standard 28/36 DTI rule. Inputs: monthly income, monthly recurring debts (car loans, student loans, etc.), down payment, interest rate, and optional property-tax rate / insurance / HOA / loan term. Output: max home price, the binding constraint (front-end vs back-end), and the full PITI breakdown at that price. No network — pure local math.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoa_monthlyNo
back_end_dtiNoBack-end DTI cap as decimal, default 0.36
down_paymentYes
front_end_dtiNoFront-end DTI cap as decimal, default 0.28
interest_rateYesAnnual %, e.g. 6.5
monthly_debtsNoSum of monthly debt payments (car, student loans, etc.)
monthly_incomeYes
loan_term_yearsNoDefault 30
insurance_annualNo
property_tax_rateNoAnnual % of home price, default 1.1

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover readOnly and idempotent, but the description adds 'No network — pure local math', clarifying it is a deterministic, side-effect-free calculation. It also discloses the output structure (binding constraint, PITI breakdown), which goes beyond annotations. No contradiction found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the primary action and rule, then inputs and outputs. Every sentence adds value—no fluff. The 'No network' note is a meaningful behavioral distinction, not filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 10 parameters and no output schema, the description covers the purpose, inputs, outputs, and a behavioral note. It gives an agent all information needed to decide whether to call it and what to expect. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 60%, but the tool description lists all input categories (income, debts, down payment, interest rate, property tax, insurance, HOA, term) and adds meaning to parameters lacking schema descriptions (e.g., down_payment, insurance_annual, hoa_monthly). It also explains the 28/36 DTI context, which enriches parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Solve for'), resource ('maximum home price'), and the governing rule (28/36 DTI). It clearly differentiates from siblings like zillow_calculate_mortgage by focusing on affordability rather than payments, and notes 'No network — pure local math' to distinguish from network-based tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly conveys when to use it (when an agent needs to determine max affordable home price), but it does not explicitly name alternatives or state when not to use it. It gives clear context via inputs/outputs, but lacks explicit exclusions. Still, the purpose is unambiguous enough for an agent to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_calculate_mortgageCalculate mortgage payment (local)A
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pmi_rateNoAnnual %, applied when LTV > 80%
home_priceYes
hoa_monthlyNo
down_paymentNo
interest_rateYesAnnual %, e.g. 6.5
loan_term_yearsNoDefault 30
insurance_annualNo
property_tax_rateNoAnnual % of home price
property_tax_annualNo
down_payment_percentNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already provide readOnlyHint, idempotentHint, and openWorldHint=false. The description adds valuable beyond-annotation context: no network call, fully deterministic, safe for scenario comparison, automatic PMI logic, and default down payment behavior. This significantly enhances an agent's understanding of side effects and constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences with no filler. The core purpose and key outputs are front-loaded, followed by the most important parameter rules. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with no output schema, the description covers the main return values and the critical parameter interactions. Minor gaps remain—such as what happens if both down_payment and down_payment_percent are provided, and the loan_term_years default (though the schema handles it). These are small enough not to hamper correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 40%, so the description carries the burden—and it delivers. It explains the mutual exclusivity of down_payment and down_payment_percent, the 20% default, the property_tax_annual vs property_tax_rate alternatives, and the PMI condition tied to LTV and pmi_rate. These are the trickiest parameters and the description clarifies them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Local-only mortgage payment calculator.' It further details the exact outputs (full PITI breakdown and total interest over the life of the loan), making the tool's function unambiguous. It is clearly distinct from sibling tools like property search or market report tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use it: 'safe to use for scenario comparison without burning a fetch.' This gives clear context for local/no-network usage. However, it does not explicitly name alternatives or state when NOT to use it, so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_compare_propertiesCompare multiple Zillow properties side-by-sideA
Read-onlyIdempotent

Side-by-side analysis of 2-25 Zillow properties. If you just want N property records, use zillow_bulk_get instead — compare is for genuine side-by-side (its pivoted summary table is the value-add); bulk_get is the fetch-many endpoint and accepts up to 200 ids. (Issue #79 raised this cap from 8 to 25 — a 19-listing analysis now fits in one call instead of three.) Provide an array of zpids (or homedetails URLs). Returns the full per-property record per row (with extracted_features populated). Pass include_summary: true for an extra pivoted summary table (one row per field) — defaults off because results[].property.* already carries everything. The raw description is omitted from each row by default — pass include_description: true to keep it. Errors for individual properties are captured per-row — one bad zpid won't fail the whole call. Calls fan out concurrently (capped at 6 in flight, per issue #78, with retry-once-on-timeout per sub-request to absorb transient SW evictions).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsNoArray of 2-25 Zillow homedetails URLs/paths to compare. Provide either zpids or urls.
zpidsNoArray of 2-25 zpids to compare. Provide either zpids or urls. For larger batches, use `zillow_bulk_get`.
include_summaryNoInclude the pivoted `summary` table (one row per compared field, one column per listing). Defaults to `false` because `results[].property.*` already carries everything — the summary roughly doubles response weight and is mainly useful for human-readable rendering.
include_descriptionNoInclude the raw `description` on each row. Defaults to `false`.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond what readOnlyHint/openWorldHint/idempotentHint already convey, the description discloses per-row error isolation, a concurrency cap of 6 in-flight requests, retry-once-on-timeout behavior, and default omissions of description and summary. This is rich behavioral context that helps the agent predict partial failures and response weight.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and the key alternative, then moves methodically through inputs, output, and failure behavior. It is dense but mostly earns its length. Some internal issue references ('Issue #79', 'issue #78') are changelog-style noise that an agent does not need for invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by clearly describing the return shape: full per-property records per row, extracted_features populated, optional pivoted summary, and behavior when a single zpid fails. Together with the schema and annotations, an agent has enough context to call this tool correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining when to use zpids vs urls, how include_summary affects response weight, and why include_description defaults off. It doesn't fully re-document each parameter, but it adds meaningful usage context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Side-by-side analysis of 2-25 Zillow properties.' It clearly scopes the tool to comparing properties rather than fetching them, and explicitly names the sibling it is not (zillow_bulk_get), so an agent can distinguish it from related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states exactly when to use this tool versus zillow_bulk_get: use compare for genuine side-by-side analysis, use bulk_get when you just want N property records. It also explains optional flags (include_summary, include_description) and their defaults, giving clear invocation guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_estimate_rent_vs_buyEstimate rent-vs-buy break-even over a horizonA
Read-onlyIdempotent

Project the cumulative cost of buying a home versus renting a comparable place over N years. Accounts for down payment, closing costs, monthly PITI, maintenance (~1%/yr default), property appreciation (~3%/yr default), rent growth (~3%/yr default), and the opportunity cost of the down payment (renter invests it at the investment_return_rate, default 6%/yr). Mortgage P&I stops once the loan is paid off, so horizons longer than the loan term are handled. horizon_years and loan_term_years are capped at 50. Returns the year-by-year cumulative costs, the break-even year, and the net difference at the horizon. No network — pure local math.

ParametersJSON Schema
NameRequiredDescriptionDefault
home_priceYes
hoa_monthlyNo
down_paymentYes
monthly_rentYes
horizon_yearsNoDefault 7, max 50
interest_rateYes
loan_term_yearsNoDefault 30, max 50
insurance_annualNo
maintenance_rateNoAnnual % of home value, default 1.0
rent_growth_rateNoAnnual %, default 3.0
appreciation_rateNoAnnual %, default 3.0
closing_cost_rateNo% of home price, default 2.5
property_tax_rateNo
selling_cost_rateNo% of sale price, default 6.0
investment_return_rateNoAnnual return on the renter's parallel-invested down payment, default 6.0

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds valuable behavior beyond that: 'No network — pure local math', handling of mortgages paid off within the horizon, and the capping of horizon_years and loan_term_years at 50. It does not contradict annotations and enriches the agent's understanding of execution behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph with five sentences, each adding substantive detail. It is front-loaded with the primary purpose and follows with assumptions and outputs. While it could be bulleted for readability, it is appropriately sized for the tool's complexity with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 15 parameters and no output schema, the description is remarkably complete: it explains inputs, defaults, edge cases (mortgage payoff, horizon caps), and outputs (year-by-year costs, break-even year, net difference). An agent has sufficient information to invoke the tool correctly without needing further clarification.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 53%, leaving many parameters undocumented. The description compensates by explaining the role of key parameters: down payment, closing costs, monthly PITI, maintenance (default 1%), appreciation (default 3%), rent growth (default 3%), investment_return_rate (default 6%), and the cap on horizon_years and loan_term_years. This adds meaning beyond the schema, though not every parameter is covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Project') and resource ('cumulative cost of buying a home versus renting'), and outlines the key factors and outputs (year-by-year costs, break-even year, net difference). It is distinct from sibling tools, none of which offer rent-vs-buy analysis, so an agent can immediately identify its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for rent-vs-buy decisions through its detailed cost modeling, but it does not explicitly state when to use it versus alternatives. Since no sibling tool provides this functionality, the context is clear without needing exclusions, but explicit guidance would improve it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_get_by_addressResolve an address to its Zillow canonical URL + zpidA
Read-onlyIdempotent

Resolve a free-text address (with optional city/state/zip) to its Zillow canonical homedetails URL and zpid. IMPORTANT: for rural / mountain-MLS / locality-mismatched addresses (the search-fallback rung is often the ONLY rung that hits), ALWAYS pass price_min and price_max if you have any sense of the property's price band — without them the city/state search can't disambiguate and the call returns { resolved: false }. The price params are not optional niceties; they are frequently load-bearing. Tries up to 5 rungs: (1) direct resolver hit, (2) autocomplete typeahead — Zillow's own canonical address suggestions, whole-token street-matched then resolved to a zpid (high recall), (3) bidirectional street-token swap ("Rd" <-> "Road", "Hts" <-> "Heights", "Bluebird" <-> "Blue Bird"), (4) locality remap — city-drop + locality-alias substitution when the caller-supplied city fails (real-world cases: Lake Lure <-> Rutherfordton, Beech/Sugar Mountain <-> Banner Elk), (5) city/state search fallback bounded by the price band. Returns via: "direct" | "autocomplete" | "suffix_expansion" | "locality_remap" | "search_fallback" so the caller knows how the match was made; when the locality remap fires, queried_city (what you sent) and resolved_city (what Zillow returned) are both set so the caller can see the substitution. Degrades to { resolved: false } when ALL rungs miss — does not throw. Read-only, no auth required.

ParametersJSON Schema
NameRequiredDescriptionDefault
zipNoZIP code (e.g. "28746").
cityNoCity name (e.g. "Lake Lure").
viewNoResponse 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 Zillow's payload untouched. No field projection: this server has no verified record of which Zillow fields matter, and inventing one would risk dropping a field a caller needs.
stateNoTwo-letter state code (e.g. "NC").
addressYesStreet address (e.g. "126 Sleeping Bear Ln").
price_maxNoUpper bound for the search-fallback rung. Pair with `price_min` — same load-bearing role for rural/remapped-locality addresses.
price_minNoLower bound for the search-fallback rung. Frequently load-bearing: for rural / locality-mismatched addresses this is often the only rung that hits, and without a price band it cannot disambiguate. Pass it if you have ANY sense of the price band.

TDQS

A4.8/5.0
Behavior5/5

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

The description discloses the multi-rung resolution algorithm (direct, autocomplete, suffix expansion, locality remap, search fallback), the via field that reports which rung matched, the queried_city/resolved_city substitution visibility, and the degrade-to-{resolved:false} behavior. It also states 'Read-only, no auth required,' which complements the readOnlyHint annotation. This goes well beyond the annotations' boolean hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: the price-band warning is front-loaded, the rung list is compact, and the return contract is stated. It is longer than average, but the complexity of the tool (5 rungs, 2 special return fields, fallback behavior) justifies the length. Slight redundancy between the price_min schema description and the tool description is the only minor waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-param tool with no output schema, the description covers the resolution algorithm, the failure mode, the return contract (via, queried_city, resolved_city), and the auth/read-only profile. The view parameter's behavior is documented in the schema. Nothing an agent needs to call this correctly and interpret the result is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds load-bearing context for price_min/price_max (disambiguation in search fallback) and explains the address/city/state interplay via the locality-remap rung. It doesn't add syntax details for zip/state/view, but the schema already covers those. The added price-band guidance and the rung-specific role of address components justify a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Resolve a free-text address ... to its Zillow canonical homedetails URL and zpid.' This clearly distinguishes it from siblings like zillow_search_properties (search) and zillow_get_property (fetch by ID). The title reinforces the same purpose, and the description names the exact output artifacts (URL + zpid).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: it explains that for rural/mountain-MLS/locality-mismatched addresses, the search-fallback rung is often the only rung that hits, and instructs callers to ALWAYS pass price_min and price_max in those cases. It also names the fallback behavior when all rungs miss. This is actionable routing guidance beyond what the schema provides.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_get_market_reportGet Zillow market report for a regionA
Read-onlyIdempotent

Market report for a Zillow region: median sale/list prices, days on market, for-sale inventory, new listings, Zillow Home Value Index (ZHVI), and year-over-year ZHVI change. Provide either a region_path (e.g. "/home-values/6181/brooklyn-ny/") or a full Zillow home-values URL. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFull Zillow URL to a home-values page
region_pathNoPath under /home-values/, e.g. "/home-values/6181/brooklyn-ny/" or "6181/brooklyn-ny/"

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true. The description reinforces this with 'Read-only; safe to call repeatedly' but adds no new behavioral context such as rate limits, authentication needs, or error behavior. No contradiction with annotations is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tight sentences, front-loading the core purpose and metrics, then giving input instructions and safety reassurance. There is no filler or redundant expansion.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with two documented optional params and no output schema, the description adequately prepares an agent by listing the expected report contents and the acceptable input forms. It would be slightly stronger if it explicitly stated the one-of requirement and possible behavior when neither parameter is supplied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented. The description adds the key semantic insight that the parameters are alternatives — 'Provide either a region_path ... or a full Zillow home-values URL' — which is not encoded in the schema's optional-parameter structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches a market report for a Zillow region and enumerates the specific metrics included (median sale/list prices, days on market, inventory, new listings, ZHVI, and YoY change). This is a specific verb+resource and it distinguishes the tool from property-level, search, and comparison siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool via its purpose, but it does not explicitly state 'use this when you need regional market stats' or mention any alternatives. It does give a clear instruction to provide either a region_path or a full URL, which is useful, but no exclusionary guidance versus sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_get_price_historyGet Zillow price history for a propertyA
Read-onlyIdempotent

Listing-price events for a property — listings, price changes, pending, sold, etc. — by zpid or homedetails URL. Returns two parallel arrays: events (raw Zillow shape with event strings and MLS attribution) and events_normalized (cross-MCP shared shape with a fixed type enum: Listed/PriceChange/Pending/Contingent/Sold/Withdrawn/Relisted/Delisted). The normalized form lets callers merge histories across real-estate MCPs without re-implementing taxonomy. Sourced from the same homedetails page as zillow_get_property. For some listings (commonly non-Showcase) Zillow omits the history from the server-rendered page; then events is empty and an explanatory note is returned — distinct from a genuine no-history.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoZillow homedetails URL or path
zpidNoZillow Property ID

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the operation as readOnly, openWorld, and idempotent. The description adds substantial behavioral detail beyond that: the dual output arrays (events and events_normalized), the fixed type enum, and the critical edge case where empty events plus a note indicate omitted history rather than a genuine absence. This is exactly the kind of contextual disclosure that helps an agent handle responses correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three dense sentences with the core purpose front-loaded, followed by output structure and a caveat. Every sentence earns its place, and there is no filler or repetition of the title/name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description fully explains the return shape (raw events vs. normalized events with the enum) and the important non-Showcase edge case. Combined with the annotations covering safety, idempotency, and open-world behavior, an agent has everything needed to call and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents both url and zpid at 100% coverage, so the baseline is 3. The description adds value by clarifying that the two parameters are alternative lookup keys ("by zpid or homedetails URL"), which is a relationship not explicitly stated in the individual schema descriptions. This modest extra semantics justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: "Listing-price events for a property" and states the two input identifiers (zpid or homedetails URL). It clearly differentiates this tool from siblings by focusing on listing-price events and explicitly mentioning the same source page as zillow_get_property, which helps distinguish it from property-details and other history tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: it is for retrieving price history events, and it explains the cross-MCP normalized shape, which is a strong usage signal. It also discloses the non-Showcase caveat where history may be omitted. However, it does not explicitly name alternative tools or give when-not-to-use conditions, stopping short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_get_propertyGet Zillow property detailsA
Read-onlyIdempotent

Fetch a property's full Zillow record by zpid (numeric Zillow Property ID, e.g. 12345) or by homedetails URL. Returns address (Zillow's slugged form), mls_street_address (canonical MLS form — prefer this when it disagrees), neighborhood, price, Zestimate, rent Zestimate, beds/baths, square footage, lot_size (sq ft) plus the derived lot_size_acres (round(lot_size / 43560, 2); both null — never 0 — for condos and listings with no lot), year built, schools, and an extracted_features block (lake_front, hot_tub, basement, furnished, dock, community) keyword-parsed from the description. Also returns zest_vs_list_pct — the list-vs-Zestimate spread, (price − zestimate) / zestimate × 100 rounded to 1 decimal: POSITIVE means listed ABOVE the Zestimate, negative below (null when either input is missing). The raw description is omitted by default — pass include_description: true to keep it; in most cases the extracted features cover what callers need. Price-history and tax-history are also opt-in (include_price_history: true / include_tax_history: true) — bundle them in to skip a separate call. Provide exactly one of zpid or url. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoA Zillow homedetails URL (or path beginning with /homedetails/)
zpidNoZillow Property ID (numeric)
include_descriptionNoInclude the raw `description` in the response. Defaults to `false` — `extracted_features` is always populated and usually sufficient.
include_tax_historyNoInclude the tax-history series (mirrors `zillow_get_tax_history`) on the response under `tax_history`. Defaults to `false`.
include_price_historyNoInclude the price-history series (mirrors `zillow_get_price_history`) on the response under `price_history`. Defaults to `false`. Saves a round trip when you already know you want the full picture.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark this read-only, open-world, and idempotent, and the description adds substantial behavioral detail beyond that: exact formulas for lot_size_acres and zest_vs_list_pct, null-never-zero behavior for lots, keyword-derived extracted_features, and default omission of raw description. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but appropriately dense for a tool with no output schema; the primary purpose is front-loaded and every major field/formula earns its place. Minor redundancy exists, such as restating the read-only/safe-to-repeat trait that annotations already convey, so it is not flawless.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description carries the full burden of explaining the return shape, and it does so thoroughly: address variants, neighborhood, prices, Zestimate, derived lot fields, schools, extracted_features, and the list-vs-Zestimate spread. It also covers all opt-in flags and the 'exactly one' input constraint, leaving no obvious gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description raises this by clarifying the exclusivity of zpid vs url, giving a numeric zpid example, and explaining when include_description is unnecessary. It adds useful decision context on top of the schema's descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Fetch a property's full Zillow record by zpid ... or by homedetails URL.' It clearly distinguishes this from sibling tools like zillow_get_by_address, zillow_search_properties, and the history-specific tools by framing it as the comprehensive property-record fetch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete usage context, including 'Provide exactly one of zpid or url' and recommends bundling price/tax history 'to skip a separate call,' which routes the agent away from zillow_get_price_history and zillow_get_tax_history. It does not explicitly name alternatives for address-vs-zpid lookups, but the input conditions are clear enough for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_get_property_photosGet Zillow property photo galleryA
Read-onlyIdempotent

The full photo gallery for a Zillow property — every image embedded in the homedetails page. Each entry returns the canonical hero URL plus the widest jpeg + webp variants and caption when present. Provide exactly one of zpid or url. Set include_sources: true to also include the full multi-width source lists (warning: a 50+ photo property can exceed the per-call token budget). Returns { zpid, count, photos, street_view_url?, high_res_url? }. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoA Zillow homedetails URL (or path beginning with /homedetails/)
zpidNoZillow Property ID (numeric)
include_sourcesNoInclude the full multi-width jpeg + webp source lists per photo (default false; on for properties with <~15 photos).

TDQS

A4.7/5.0
Behavior5/5

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 adds substantial behavioral detail beyond annotations: the token-budget warning for 50+ photo properties, the conditional behavior of include_sources, and the exact return shape including optional keys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences with no filler: purpose, return contents, parameter rules, warning, return shape, and safety are all included. The most important scoping 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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even with no output schema, the description provides enough context for an agent to call the tool correctly: return object shape, optional fields, exclusivity constraint, include_sources behavior, token risk, and read-only safety. This is complete for a photo-fetching tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds critical semantics the schema omits: `zpid` and `url` are mutually exclusive despite both being optional in the schema, and `include_sources` carries a warning about token usage. It does not fully reconcile the schema's ambiguous 'on for properties with <~15 photos' default, which keeps this from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pairing: 'The full photo gallery for a Zillow property.' It explains exactly what is returned (hero URL, widest jpeg/webp variants, caption) and is clearly distinct from sibling tools like zillow_get_property or zillow_get_price_history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear invocation guidance: provide exactly one of `zpid` or `url`, and set `include_sources: true` only when the full source lists are needed. It does not explicitly name sibling alternatives or state 'use this when you need photos rather than property details,' so it falls just short of full when-to-use-vs-alternatives guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_get_saved_homesGet my saved (favorited) Zillow homesA
Read-onlyIdempotent

The signed-in user's saved (favorited) homes on zillow.com, flattened across all of the user's collections. Returns address, price, Zestimate, status, and when each home was saved. Pass an optional session_id (from zillow_register_session) to target a specific signed-in account; defaults to the active session. Requires the user to be signed in. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idNoOptional registered session id (from `zillow_register_session`). Defaults to the active session.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds valuable behavioral context: it requires the user to be signed in, it flattens across collections, and it is safe to call repeatedly. It does not detail pagination or error behavior, but for a read-only list tool with these annotations, the added context is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no wasted words. It front-loads the core purpose and return fields, then covers the optional parameter and safety note. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with one optional parameter and no output schema, the description is nearly complete. It covers the resource, scope, return fields, session handling, and sign-in requirement. The only minor gap is the lack of explicit pagination or result-limit information, but that is not critical for a saved-homes list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the single optional `session_id` parameter. The description adds meaning by explaining the parameter's purpose (target a specific signed-in account) and its default behavior (defaults to the active session). This goes beyond the schema's description, which only says 'Optional registered session id'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('get'), a clear resource ('saved/favorited homes'), and a scope ('flattened across all collections'). It also lists the returned fields (address, price, Zestimate, status, saved timestamp), which distinguishes it from sibling tools like zillow_get_saved_searches and zillow_search_properties. The title reinforces the purpose without being a tautology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool: to retrieve the signed-in user's saved homes. It also provides a clear alternative/context by mentioning `session_id` from `zillow_register_session` and the default active session. It does not explicitly name sibling alternatives, but the resource and scope are so specific that an agent can route correctly without ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_get_saved_searchesGet my saved Zillow searchesA
Read-onlyIdempotent

The signed-in user's saved searches on zillow.com (name, filters, new-listing count, notification frequency). Requires the user to be signed in at zillow.com in the bridged browser tab — throws SessionNotAuthenticatedError otherwise. Pass an optional session_id (from zillow_register_session) to target a specific signed-in account; defaults to the active session. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idNoOptional registered session id (from `zillow_register_session`). Defaults to the active session.

TDQS

A4.6/5.0
Behavior4/5

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 valuable context beyond annotations: the authentication requirement, the specific error thrown, and the session targeting behavior. It does not describe pagination or exact response shape, but for a read-only list tool this is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler. The core purpose is front-loaded, followed by the key prerequisite/error, then the optional parameter behavior. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, single-optional-parameter tool with no output schema, the description covers purpose, auth requirement, error behavior, and session selection. It is slightly incomplete in not mentioning whether the result is paginated or limited, but the annotations (readOnly, idempotent, openWorld) cover the safety and world-modification aspects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents session_id. The description adds meaning by explaining where session_id comes from (zillow_register_session) and its default behavior (active session), which goes beyond the schema's description. This justifies a score above the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('get'), a resource ('saved searches on zillow.com'), and enumerates the returned fields (name, filters, new-listing count, notification frequency). It is clearly distinguishable from sibling tools like zillow_get_saved_homes and zillow_search_properties.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the prerequisite (signed in at zillow.com in the bridged browser tab), the failure mode (SessionNotAuthenticatedError), and how to target a specific account via session_id from zillow_register_session. It also notes the default behavior (active session). This is strong when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_get_session_contextList all registered Zillow sessionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral detail by specifying the empty-sessions edge case: when no sessions are registered, sessions is empty and active_session_id is null. This goes beyond what the annotations state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short, information-dense sentences. The primary return value is front-loaded, and the edge-case behavior is stated in a separate concise clause. There is no redundant or filler language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only session-context tool, the description covers the key return values and the empty-sessions behavior. It does not describe the structure of each session object, but given the simple scope and read-only annotations, this is a minor omission rather than a blocking gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter documentation burden. The description instead clarifies what the response will contain, which fully compensates for the absence of an output schema. This is appropriate for a parameterless context getter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Return') and names the exact resource ('the full set of registered sessions plus the current active_session_id'). It clearly distinguishes this read-only context tool from mutation-oriented siblings like zillow_register_session and zillow_set_active_session by focusing on retrieval rather than modification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies this is the tool to call when the agent needs to inspect all registered sessions and the current active session ID. It does not explicitly exclude alternatives, but the read-only nature and focus on session state make the intended usage unambiguous compared to its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_get_tax_historyGet Zillow tax history for a propertyA
Read-onlyIdempotent

Year-by-year property-tax record for a property: tax paid, assessed value, and the year-over-year change rates. Sourced from the homedetails page. Useful for spotting reassessment jumps or comparing tax burdens across properties. For some listings (commonly non-Showcase) Zillow omits the history from the server-rendered page; then events is empty and an explanatory note is returned — distinct from a genuine no-history.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoZillow homedetails URL or path
zpidNoZillow Property ID

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds valuable behavioral context beyond that: it explains the source page, that non-Showcase listings may omit the history, and that an empty `events` plus a `note` is distinct from a genuine no-history response. This gives the agent actionable expectations about edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured: each sentence earns its place. It front-loads the core purpose, then adds practical use context, then explains an important edge case without padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must convey what the tool returns. It does so thoroughly: tax paid, assessed value, change rates, and the `events`/`note` behavior for omitted history. Combined with the annotations, the agent has enough to call the tool correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the input schema already documents both `url` and `zpid`. The description does not add parameter-level detail, which is acceptable given the high schema coverage, but it also does not go beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: retrieving the year-by-year property-tax record for a property. It names the exact data included (tax paid, assessed value, change rates), making it instantly distinguishable from sibling tools like price history or zestimate history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear use context: spotting reassessment jumps and comparing tax burdens across properties. It does not explicitly name sibling alternatives or state when not to use it, but the tax-specific focus makes the appropriate use case clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_get_zestimate_historyGet Zestimate history for a propertyA
Read-onlyIdempotent

Historical Zestimate values for a property by zpid or homedetails URL. Returns a time series of {date, value, rent?} entries (rent included when Zillow has a rent Zestimate for the property). Note: zillow_get_property returns only the current Zestimate as a scalar — call this tool when you need the trend. For some listings (commonly non-Showcase) Zillow renders the trend client-side and omits it from the server-rendered page; then points is empty and an explanatory note is returned — distinct from a genuine no-history. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoZillow homedetails URL (or path). Provide either zpid or url.
zpidNoZillow Property ID. Provide either zpid or url.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint and idempotentHint annotations, the description discloses that rent values are conditionally included, that empty `points` may indicate a rendering limitation rather than absence of history, and that an explanatory `note` is returned in that case. It also reiterates that the tool is read-only and safe to call repeatedly, adding 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact yet information-dense, front-loading the core behavior and output format before addressing the edge case. Every sentence adds value—either clarifying the return structure, guiding tool selection, or explaining empty results—so nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is no output schema, the description adequately explains the return format (time series of {date, value, rent?}), the conditional rent inclusion, and the empty-points note behavior. It also covers parameter choice and read-only safety, leaving no critical gap for an agent to call and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully documents both parameters with clear descriptions ('Provide either zpid or url'). The description only restates the 'zpid or homedetails URL' selection without adding new semantic information, so the baseline of 3 is appropriate because schema coverage is 100%.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns historical Zestimate values for a property by zpid or homedetails URL, and describes the output as a time series. It explicitly distinguishes itself from the sibling zillow_get_property, which returns only the current Zestimate as a scalar, so an agent can immediately tell the tools apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use this tool: 'call this tool when you need the trend.' It contrasts with zillow_get_property and even explains an edge case where `points` is empty due to client-side rendering versus a genuine no-history scenario, which helps the agent interpret a non-obvious result.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_healthcheckVerify the fetchproxy bridge end-to-endA
Read-onlyIdempotent

Round-trips a small public www.zillow.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.zillow.com-side problem'. Read-only, no auth required. Call this when a real tool fails and you want to know which hop broke.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the read-only and idempotent annotations, the description discloses the exact network action (fetching a public URL through the bridge), the diagnostics returned (role, port, version, link status, elapsed time, hint), and the three failure modes it can disambiguate. It also adds 'no auth required,' which is not covered by the annotations. Nothing contradicts 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense sentence that front-loads the action and then uses a colon to itemize the diagnostic output. Every clause adds useful information: the URL probed, the fields returned, the hint categories, and the read-only no-auth note. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameters, the description carries the full burden of explaining the return value, and it does so by listing every diagnostic field plus the plain-English failure hints. It also supplies the invocation context and safety profile, so an agent has enough information to call and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty, so there are no parameter semantics to clarify; the baseline for a zero-parameter tool is 4. The description focuses on what the tool returns rather than input semantics, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete verb ('Round-trips'), a specific resource ('fetchproxy bridge' via www.zillow.com/robots.txt), and the diagnostic purpose, which clearly separates this healthcheck from the property-data sibling tools. It even enumerates the diagnostic fields returned, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to call it 'when a real tool fails and you want to know which hop broke,' giving a clear triggering condition. It does not name sibling alternatives or explicitly state when not to use it, but for a diagnostic utility the use case is well scoped.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_register_sessionRegister a signed-in Zillow sessionA
Idempotent

Register (or refresh) an authenticated Zillow 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
mark_activeNoWhen true, immediately make the newly-registered session the active one.
auth_expires_atNoOptional ISO timestamp at which the session expires.
account_identityYesCaller-supplied identifier for the signed-in account (typically the saved-account email).

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint: false, openWorldHint: false, and idempotentHint: true. The description adds context beyond that: the refresh behavior aligns with idempotency, and it explains the default-active-session rule and mark_active semantics. However, it doesn't disclose side effects like authentication requirements, rate limits, or what happens to other session contexts. Given the annotations cover the safety profile, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states the action and scope, followed by two focused sentences that cover refresh behavior and active-session logic. No wasted words or repetition. It earns a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple session-registration tool with only three parameters, 100% schema coverage, and no output schema, the description covers all essential operational details: the refresh path, the return of session_id, the default active behavior, and mark_active. An agent can correctly invoke it without gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaningful context beyond the schema: it clarifies account_identity is 'typically the saved-account email', explains that re-registering the same identity updates rather than duplicates, and describes the effect of mark_active. This goes beyond the bare schema definitions, so a 4 is justified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource statement: 'Register (or refresh) an authenticated Zillow session keyed by signed-in account identity.' It also explains the refresh behavior ('updates the existing session rather than creating a duplicate'), which distinguishes it from a naive create. Though it doesn't explicitly contrast with siblings like set_active_session, the core purpose is unambiguous and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool: for registering or refreshing a session, and how to make it active via mark_active. It notes that the first registration becomes default active, and that routing uses session_id. It doesn't explicitly name alternatives or exclusions, but the sibling set_active_session is implicitly differentiated (register vs. switch active), so it earns a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_resolve_addressesBulk-resolve addresses → Zillow zpidsA
Read-onlyIdempotent

Resolve up to 100 free-text or structured addresses to Zillow zpids + canonical URLs in one call. Each row may be a bare string or {address, city?, state?, zip?, price_hint?}. IMPORTANT: price_hint (USD) is frequently load-bearing — for rural / mountain-MLS / locality-mismatched rows the search-fallback rung is often the ONLY rung that hits, and without a price band it cannot disambiguate. The resolver derives a ±0.5% band from the hint. Always pass price_hint for any row where you have a sense of the price. Runs the same 5-rung resolver as zillow_get_by_address (direct → autocomplete-typeahead → suffix-expansion → locality-remap → search-fallback) — bulk and single walk the same ladder via the shared resolver, so they match the same partition for the same inputs. Locality-remap rung handles real-world mountain-MLS cases (Lake Lure <-> Rutherfordton, Beech/Sugar Mountain <-> Banner Elk) where Zillow indexes the parent locality; when it fires, queried_city (what you sent) and resolved_city (what Zillow returned) are both set so the caller can see the substitution. Concurrent fan-out — a 60-address batch returns in roughly one round trip instead of 60. Per-row error capture so one bad address never fails the batch. confidence is "exact" for direct hits, "autocomplete" / "suffix_expansion" / "locality_remap" / "search_fallback" for retries, "none" when all rungs missed. The whole call is bounded by an overall hard deadline (issue #98), like zillow_bulk_get: a single slow/hung row never wedges the server — when the deadline is reached any unsettled row is returned with error_kind: "pending" (distinct from a real miss) and the response carries a pending count so you can re-run just those addresses. Every lookup is paced by the same per-host requests-per-minute throttle as zillow_bulk_get so a big batch does not trip Zillow's PerimeterX bot-wall. If the wall is hit, the remaining rows stop querying Zillow and come back with error_kind: "bot_challenge" (never a plain miss), and the response carries a { blocked, retry_after_s } envelope so you can re-run them later. Other failed rows carry error_kind timeout / bridge_down / protocol / other. Read-only, no auth required.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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 Zillow's payload untouched. No field projection: this server has no verified record of which Zillow fields matter, and inventing one would risk dropping a field a caller needs.
addressesYesFree-text addresses (e.g. "126 Sleeping Bear Ln, Lake Lure, NC") or structured rows. 1..100.

TDQS

A4.7/5.0
Behavior5/5

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

This is unusually transparent. It discloses concurrent fan-out, a hard overall deadline, per-row error capture, bot-wall challenges with blocked/retry_after_s, rate throttling, rung-wise confidence values, and locality remapping behavior. The readOnly/idempotent annotations are consistent with 'Read-only, no auth required,' so there is 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but dense and front-loaded: purpose, limit, and the critical price_hint warning come first. Some redundancy exists in repeatedly cross-referencing zillow_bulk_get and the shared resolver, but each sentence still contributes behavioral or operational context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full burden of explaining return semantics, and it largely succeeds. It defines all confidence values, enumerates error_kind values including 'pending' and 'bot_challenge,' and documents the pending count and blocked envelope. This is complete enough for an agent to call the tool correctly and handle failure modes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds substantial param-level value. It explains that price_hint is frequently the only disambiguator, derives a ±0.5% band from it, and clarifies the bare-string vs structured-object address forms. This goes well beyond the schema's type definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Resolve up to 100 free-text or structured addresses to Zillow zpids + canonical URLs in one call.' It clearly distinguishes itself from the single-address sibling zillow_get_by_address by framing this as the bulk variant and explicitly stating both share the same 5-rung resolver.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives strong practical guidance: 'Always pass price_hint for any row where you have a sense of the price' and explains why it is load-bearing. It names zillow_get_by_address as the single-address alternative and notes that bulk and single walk the same resolver ladder, but it does not explicitly state a when-not condition such as 'for one address, prefer zillow_get_by_address.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_search_propertiesSearch Zillow listingsA
Read-onlyIdempotent

Search Zillow listings by location (city, ZIP, neighborhood, or address) and optional filters (status, price band, beds/baths minimums, home types). Returns matching properties with price, beds/baths, sqft, Zestimate, status, image, and homedetails URL. Works with city/ZIP-level queries (filtered against your criteria) AND with full-address or street-only queries (returns the listings Zillow resolves to directly — filters are not applied in this single-round-trip path; use zillow_get_by_address for the cleanest one-shot address → zpid lookup). Throws LocationNotResolved if Zillow can't pin either a region or matching listings for the input (instead of silently falling back to your default search region). Heads up: Zillow renders ~40 listings per page server-side; this tool auto-paginates by default when limit exceeds that, walking subsequent pages and concatenating results (set auto_paginate: false to opt out and get the single-page response). For dense markets, price-band the search to enumerate fully. Does NOT return Zestimate history — use zillow_get_zestimate_history for that. Read-only; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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 Zillow's payload untouched. No field projection: this server has no verified record of which Zillow fields matter, and inventing one would risk dropping a field a caller needs.
limitNoMax listings to return (default 40, max 1000). When > 40 and `auto_paginate` is true (the default), the tool walks Zillow's pagination server-side and aggregates pages until `limit` is reached, an empty page is returned, or a page adds no new listings. Zillow caps each search response at ~40 listings (issue #54).
statusNoListing status. Default for_sale.
beds_minNo
locationYesFree-text location: city, ZIP, neighborhood, or address (e.g. "Brooklyn, NY", "94110", "Park Slope")
baths_minNo
price_maxNo
price_minNo
home_typesNoRestrict to one or more home types.
auto_paginateNoWhen true (default), aggregate across Zillow's paginated search responses until `limit` is reached. Pass `false` to disable pagination — only one Zillow page is fetched (~40 listings).

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, openWorldHint, idempotentHint), the description discloses important behaviors: it throws LocationNotResolved rather than silently falling back, it auto-paginates past Zillow's ~40-listing page cap by default, it does not apply filters in the address-resolved path, and it does not return Zestimate history. The safety profile is consistent with the annotations and the 'Read-only' statement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence carries actionable information: scope, return fields, path-specific behavior, error behavior, pagination mechanics, and sibling routing. The main function is front-loaded, and caveats are grouped logically without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with no output schema, the description covers the essential invocation context: inputs, return fields, error semantics, pagination defaults, and alternatives for adjacent use cases. An agent has enough to call it correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 60% schema coverage, the description adds meaningful semantics for key parameters: it explains what 'location' accepts, that limit interacts with auto_paginate, that status/price/beds/baths/home_types are filters, and that 'full' view vs. compact is about field presence. It doesn't detail every parameter, but the schema covers several, and the description compensates for the most behaviorally important ones.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Search'), resource (Zillow listings), primary input (location), and optional filters, and enumerates the return fields (price, beds/baths, sqft, Zestimate, status, image, homedetails URL). It also explicitly distinguishes itself from sibling tools like zillow_get_by_address and zillow_get_zestimate_history, so an agent can select it without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit routing guidance: use zillow_get_by_address for the cleanest one-shot address→zpid lookup, and use zillow_get_zestimate_history when Zestimate history is needed. It also explains the two query paths (region-level vs. address-level) and when filters are applied, plus the practical hint to price-band dense markets for full enumeration.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zillow_set_active_sessionSet the active Zillow sessionA
Idempotent

Switch which registered session subsequent tool calls route through by default. Pass a session_id previously returned by zillow_register_session. Tools that accept an explicit session_id parameter override this default per-call.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession id to make active.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate a mutating (readOnlyHint=false) and idempotent operation, and the description does not contradict that. It adds the key behavioral fact that this sets a default for later calls and that explicit per-call session ids take precedence. It doesn't discuss persistence or error behavior, but these are less critical given the simple semantics and idempotence annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core switching behavior, followed by the prerequisite and override rule. Every sentence adds necessary information without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter setter with annotations for mutation and idempotence, the description covers what the tool does, where the session_id comes from, and how it interacts with per-call overrides. The only minor gap is lack of explicit return-value or error semantics, but that is low-stakes for such a simple setter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema alone documents session_id as 'Session id to make active' and covers 100% of parameters. The description adds essential provenance: it must be a previously registered session from zillow_register_session. This extra context helps the agent supply a valid value rather than any arbitrary string.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Switch') and resource ('which registered session subsequent tool calls route through'), making the action unmistakable. It also distinguishes itself from session creation by requiring a previously registered session_id. No ambiguity with siblings like zillow_register_session.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states the exact use case: change the default routing for subsequent calls. It conditions the input on a session_id previously returned by zillow_register_session, telling the agent where to obtain a valid value. It further clarifies that explicit per-call session_id parameters override this default, which prevents misuse, though it does not explicitly enumerate when not to use the tool.

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. 1 tool updatev1.1.3
    • Changedzillow_estimate_rent_vs_buy4 fields changed
      • changedInput schema / properties / horizon_years / description
        Previous value: -"Default 7"New value: +"Default 7, max 50"
      • changedInput schema / properties / horizon_years / maximum
        Previous value: -9007199254740991New value: +50
      • addedInput schema / properties / loan_term_years / description
        Added value: +"Default 30, max 50"
      • changedInput schema / properties / loan_term_years / maximum
        Previous value: -9007199254740991New value: +50
  2. 1 tool updatev1.1.2
    • Changedzillow_search_properties2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max listings to return (default 40). When > 40 and `auto_paginate` is true (the default), the tool walks Zillow's pagination server-side and aggregates pages until either `limit` is reached or an empty page is returned. Zillow caps each search response at ~40 listings (issue #54)."New value: +"Max listings to return (default 40, max 1000). When > 40 and `auto_paginate` is true (the default), the tool walks Zillow's pagination server-side and aggregates pages until `limit` is reached, an empty page is returned, or a page adds no new listings. Zillow caps each search response at ~40 listings (issue #54)."
      • changedInput schema / properties / limit / maximum
        Previous value: -9007199254740991New value: +1000
  3. 20 tool updatesv1.0.0
    • Changedzillow_bulk_get1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_calculate_affordability1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_calculate_mortgage1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_compare_properties1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_estimate_rent_vs_buy1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_get_by_address1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_get_market_report1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_get_price_history1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_get_property1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_get_property_photos1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_get_saved_homes1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_get_saved_searches1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_get_session_context1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_get_tax_history1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_get_zestimate_history1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_healthcheck1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_register_session1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_resolve_addresses1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_search_properties1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedzillow_set_active_session1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  4. 3 tool updatesv0.13.0
    • Changedzillow_get_by_address1 field changed
      • addedInput schema / properties / view
        Added 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 Zillow's payload untouched. No field projection: this server has no verified record of which Zillow fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedzillow_resolve_addresses1 field changed
      • addedInput schema / properties / view
        Added 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 Zillow's payload untouched. No field projection: this server has no verified record of which Zillow fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedzillow_search_properties1 field changed
      • addedInput schema / properties / view
        Added 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 Zillow's payload untouched. No field projection: this server has no verified record of which Zillow fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
  5. 20 tool updatesv0.11.1
    • First observedzillow_bulk_get
    • First observedzillow_calculate_affordability
    • First observedzillow_calculate_mortgage
    • First observedzillow_compare_properties
    • First observedzillow_estimate_rent_vs_buy
    • First observedzillow_get_by_address
    • First observedzillow_get_market_report
    • First observedzillow_get_price_history
    • First observedzillow_get_property
    • First observedzillow_get_property_photos
    • First observedzillow_get_saved_homes
    • First observedzillow_get_saved_searches
    • First observedzillow_get_session_context
    • First observedzillow_get_tax_history
    • First observedzillow_get_zestimate_history
    • First observedzillow_healthcheck
    • First observedzillow_register_session
    • First observedzillow_resolve_addresses
    • First observedzillow_search_properties
    • First observedzillow_set_active_session

TDQS

A4.4/5.0

Scored across 20 tools

Disambiguation5/5

Each tool targets a clearly distinct resource or calculation: property lookup, histories, photos, searches, address resolution, financial calculators, saved data, and session management are all cleanly separated. Even the overlapping-sounding bulk_get and compare_properties are explicitly cross-referenced and differentiated in their descriptions.

Naming Consistency4/5

All tools share the zillow_ prefix and follow snake_case with verb-first names like get_, calculate_, and search_. Minor deviations such as healthcheck and bulk_get break the strict verb_noun pattern but are still intuitive and do not create confusion.

Tool Count4/5

At 20 tools, this is on the heavier side, but every tool covers a distinct facet of real-estate research: property details, multiple history types, photos, market reports, address resolution, bulk operations, and financial calculators. The count feels justified for the domain rather than bloated.

Completeness4/5

The read-only research surface is comprehensive: search, property detail, price/tax/Zestimate histories, photos, market report, address resolution (single and bulk), comparisons, and financial calculators are all present. Minor gaps like not being able to add or remove saved homes or search by geographic boundary are noticeable but not blocking for most agent workflows.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    Enables access to the Zillow56 API to search for real estate listings and rental market trends using locations, coordinates, or specific property filters. It also provides comprehensive housing market snapshots and historical data based on the Zillow Home Value Index (ZHVI).
    37
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Provides real-time access to Zillow real estate data, enabling property search, details, Zestimates, market trends, and mortgage calculations via natural language.
    4 npm
    48
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Integrates Zillow real estate data with AI assistants, enabling property search, neighborhood insights, and affordability calculations through natural language.
    4 npm
    1
    MIT