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 ContextMint Bridge browser 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. Optional map_bounds viewport; include_meta reports Zillow's own total vs fetched, so truncation is visible

zillow_sweep_area

Exhaustive enumeration of an area: recursive map tiling until no tile is truncated, deduped, with a completeness summary and drift warnings; optional JSON output file

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

Record which Zillow account the signed-in tab belongs to, in the local session registry (a label only)

zillow_set_active_session

Mark a registered session as the current account label — does not change which account requests use (every call goes through the signed-in browser tab)

zillow_get_session_context

Inspect the active session + the registered-session list

Input and output contract

Changes to tool inputs and outputs, so you can adjust any scripts or prompts that call these tools:

  • zillow_compare_properties reports bot-wall rows like zillow_bulk_get does. A row that Zillow keeps blocking with a captcha now comes back as error_kind: "bot_challenge" instead of a generic error kind, so you can tell it apart from a missing listing. The response can also include blocked (how many rows stayed blocked), retry_after_s (how many seconds to wait before retrying just those rows) and pending (how many rows did not finish before the overall deadline; those rows have error_kind: "pending").

  • A zpid must be a number. Every tool that takes a zpid (zillow_get_property, zillow_bulk_get, zillow_compare_properties, zillow_get_property_photos, zillow_get_zestimate_history, zillow_get_price_history, zillow_get_tax_history) accepts a positive whole number, or a string of digits only such as "12345". Any other string, such as "12345_zpid" or a URL, is now rejected as invalid input. Pass a homedetails URL in the url or urls field instead.

  • Pass zpids or urls, not both. zillow_bulk_get and zillow_compare_properties now return an error when a call includes both lists. Before, the urls list was silently ignored. To fetch both kinds, make two calls.

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 ContextMint Bridge 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 ContextMint Bridge extension, which is shared across every fetchproxy-based MCP (resy-mcp, opentable-mcp, …). Install it once from the ContextMint Bridge releases:

  • Chrome: download the Chrome zip, unzip it, then chrome://extensions → toggle Developer mode → Load unpacked → pick the unzipped folder.

  • Safari: not available yet — it will ship inside the ContextMint app, which has no public download. Use Chrome for now.

ContextMint Bridge is the fetchproxy browser extension under its new name, from the same maintainer — fetchproxy's own README (Install → Extension) points to it. Its source is public at nullnet-app/contextmint-bridge: build it yourself (see that repo's README), or check a release zip against the .sha256 file published beside it before loading it — shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256.

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  │◀──────▶│  ContextMint     │◀────────────▶│ zillow.com  │
│ (Claude, etc.) │          │  (Zillow MCP)    │ :37149 │  Bridge          │   (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 ContextMint Bridge 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

21 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, status: "ok", property } on success or { zpid, status, error_kind, retryable, error } on failure (status = error_kind) — 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. The envelope also reports count / ok / errored.

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

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld, and the description layers on substantial extra behavior: 6-in-flight concurrency cap, retry-once-on-timeout, per-host RPM throttle with burst 20, PerimeterX bot-wall retries with exponential backoff, a hard overall deadline, and per-row error isolation. It also names the failure taxonomy (bot_challenge vs pending vs missing) and the blocked/retry_after_s and pending envelopes.

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

Conciseness4/5

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

Front-loaded correctly: purpose, then the sibling alternative, then return shape, then internals. It is dense and somewhat over-stuffed, and the 6-in-flight cap is stated twice ('capped at 6 in flight' then 'fan out bounded to 6 in flight'), plus issue-number citations (#78/#90/#98) are marginal for an agent, but nearly every sentence carries real behavioral information.

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 fully carries the return-value burden: it specifies the two row shapes, the status/error_kind/retryable fields, and the count/ok/errored/blocked/pending envelope. Combined with annotations covering safety, an agent has everything needed to call and interpret the 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%, so both urls and zpids are already documented (including maxItems/minItems and mutual exclusivity), which sets the baseline at 3. The description adds meaning beyond the schema by mapping inputs to outputs one-to-one ('one structured row per input id') and clarifying that a single bad id does not fail the batch.

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, resource, and hard scope cap ('Fetch up to 200 Zillow property records in a single call') and explicitly distinguishes itself from the sibling zillow_compare_properties. An agent can route correctly without opening any schema.

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?

Gives an explicit when-not rule and names the alternative with its own selection condition ('no pivoted side-by-side summary table — for 2-25 listings with a comparison summary use zillow_compare_properties'). It also frames the batch scenario ('all saved homes') that selects this tool, leaving nothing to inference.

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, recurring monthly 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. Same math across the realty MCP cohort (@chrischall/realty-core). 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, max 50
insurance_annualNo
property_tax_rateNoAnnual % of home price, default 1.1

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, and closed-world behavior, so the bar is lower; the description still adds real value by declaring 'No network — pure local math' and by spelling out the return contents (max price, binding constraint, full PITI breakdown). With no output schema, that return-shape disclosure is genuinely useful. It stops short of 5 because it says nothing about error cases or edge behavior (e.g., zero down payment).

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 tight sentences: the core purpose first, then inputs, then outputs, with the local-math note last. Every sentence carries information an agent needs and none is redundant.

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, no-output-schema tool, the description covers purpose, most inputs, return contents, and the stateless/no-network characteristic. The one real gap is that it does not explain the overridable DTI caps or defaults for the optional cost parameters, which matters for a tool whose whole premise is a debt-ratio rule.

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 coverage is 60%, so the schema already documents the DTI caps, interest rate format, loan term, and property-tax rate. The description recasts the inputs in plain language ('monthly income, recurring monthly debts (car loans, student loans, etc.), down payment, interest rate, and optional property-tax rate / insurance / HOA / loan term') and clarifies which are optional, which is a modest addition over the schema. It never mentions the tunable front_end_dti/back_end_dti parameters beyond the fixed '28/36' framing, leaving part of the 60%-uncovered surface unaddressed.

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

Purpose4/5

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

The description names a specific verb and outcome: solving for the maximum affordable home price under the 28/36 DTI rule, which is inherently distinct from a payment-calculator sibling like zillow_calculate_mortgage. It is clear and concrete, but it never names or contrasts an alternative tool, so it stops short of the sibling differentiation a 5 requires.

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?

Usage is implied by the framing ('Solve for the maximum home price you can afford'), which tells an agent this is for affordability/budget questions rather than payment math. There is no explicit when-to-use, no when-not-to-use, and no reference to zillow_calculate_mortgage or zillow_estimate_rent_vs_buy, so routing must be inferred.

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, max 50
insurance_annualNo
property_tax_rateNoAnnual % of home price
property_tax_annualNo
down_payment_percentNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and openWorld=false, so the safety profile is covered. The description adds genuinely new behavior: the returned PITI components, total interest over loan life, and the conditional PMI rule (LTV > 80%). It does not discuss failure/validation behavior for bad inputs, keeping it at 4.

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

Conciseness4/5

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

Front-loads the purpose and return value before usage notes and parameter rules; each sentence carries distinct information with no filler. Slightly dense in the final sentence but not wasteful.

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 steps in to describe the return (PITI breakdown plus lifetime interest), and it resolves the key input ambiguities. It is essentially complete for invocation, missing only explicit sibling routing.

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 only 40% across 10 parameters, so the description must compensate, and it does: it clarifies that down_payment and down_payment_percent are alternatives with a 20% default, and that property tax can be supplied as an annual figure or a rate. It leaves several parameters (hoa_monthly, insurance_annual, loan_term_years default) to the schema, so not fully compensating.

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

Purpose4/5

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

States a specific verb and resource ("mortgage payment calculator") plus the distinctive attribute "Local-only", so the agent immediately knows it is a deterministic computation rather than a network fetch. It does not explicitly differentiate itself from the related sibling zillow_calculate_affordability, keeping it just short of a 5.

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?

Gives a clear use context — "safe to use for scenario comparison without burning a fetch" — which tells the agent when this local tool is preferable to a network call. It never names the alternative calculator siblings (e.g. affordability) or states exclusions, so it stops at clear context rather than explicit when/when-not routing.

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), paced by the same throttle as zillow_bulk_get; a bot-wall block is retried with backoff and, if it persists, reported as error_kind: "bot_challenge" (distinct from a missing listing) with { blocked, retry_after_s } on the envelope. The call is bounded by an overall deadline — unsettled rows come back as error_kind: "pending".

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsNoArray of 2-25 Zillow homedetails URLs/paths to compare. Provide either zpids or urls, not both.
zpidsNoArray of 2-25 zpids to compare. Provide either zpids or urls, not both. 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?

Annotations declare read-only/idempotent/open-world, and the description adds substantial behavior beyond that: concurrency capped at 6 in flight, retry-once-on-timeout, shared throttling, per-row error capture (one bad zpid won't fail the call), bot-wall handling surfaced as error_kind 'bot_challenge' with {blocked, retry_after_s}, and an overall deadline yielding error_kind 'pending'. This is rich operational context consistent with the annotations (no contradiction).

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

Conciseness4/5

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

The critical routing distinction is front-loaded and bolded, and most sentences carry behavioral payload. It is long though, and the internal churn asides ('Issue #79 raised this cap from 8 to 25', 'per issue #78') are development noise an agent doesn't need, which slightly dilutes structure.

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 fully compensates: it describes rows (full per-property record with extracted_features), the optional pivoted summary table shape, per-row error envelope fields, and terminal error kinds. Nothing needed to interpret results 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 baseline is 3, but the description adds meaning beyond the schema: it explains why include_summary defaults off (results[].property.* already carries everything, and the summary roughly doubles response weight) and that include_description is omitted from rows by default. That rationale/payload-implication is genuine added value.

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 and resource with scope ('Side-by-side analysis of 2-25 Zillow properties') and explicitly differentiates itself from the sibling zillow_bulk_get. An agent can tell immediately which tool does the pivoted comparison vs. the plain fetch-many.

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?

Names the alternative explicitly and the condition that selects it: 'If you just want N property records, use zillow_bulk_get instead — compare is for genuine side-by-side... bulk_get accepts up to 200 ids.' This gives both when-to-use and when-not-to-use with the routing rationale.

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.5/5.0
Behavior5/5

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

Annotations already mark this read-only/idempotent, and the description adds substantial non-structured context: the dual return arrays, the fixed normalized `type` enum, and the important edge case where Zillow omits history (empty `events` plus explanatory `note`, distinct from genuine no-history).

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?

Front-loads the core purpose, then the return shape, then the edge case, in four tight sentences with no filler. The em-dash clauses carry real information rather than 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?

With no output schema, the description fully carries the burden: it explains both return arrays, the normalized enum, and the failure/empty case. An agent has everything needed to call 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 coverage is 100%, so both parameters (url, zpid) are already documented in the schema. The description only restates the two lookup keys without adding format or precedence guidance (e.g., which key wins if both are supplied).

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 and resource ('Listing-price events for a property') plus the full event taxonomy and the two lookup keys. It is immediately distinguishable from siblings like zillow_get_zestimate_history and zillow_get_tax_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?

Gives clear context: use zpid or homedetails URL, and notes it is sourced from the same page as zillow_get_property. It does not explicitly state exclusions (e.g., 'use zestimate_history instead for value estimates'), so routing is implied rather than spelled out.

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 cover the safety profile (readOnly, idempotent, openWorld), and the description adds substantial non-obvious behavior: the raw `description` is suppressed by default, price/tax history are opt-in, lot_size_acres is a derived rounded field that is null (never 0) for condos. It also pins down the sign convention of zest_vs_list_pct, which is exactly the kind of trap an agent would otherwise get wrong.

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?

Information-dense but front-loaded: the identifier options come first, then return contents, then the opt-in flags. Given there is no output schema, explaining the return payload here is earned rather than filler; the only mild duplication is restating the include_description default that the schema already states.

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 5 parameters, no output schema, and heavy derived-value logic (lot_size_acres, zest_vs_list_pct, extracted_features), the description carries the full burden and does so: it documents return shape, defaults, null semantics, and the one-of identifier rule. Nothing an agent needs to call it correctly is missing.

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

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 baseline is 3, but the description adds real meaning on top: why include_description defaults to false, what each history flag mirrors, and that bundling them saves a round trip. The one gap is `url`, whose accepted formats are only documented in the schema, not the description.

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?

Opens with a specific verb+resource ('Fetch a property's full Zillow record') and names both accepted identifiers (zpid or homedetails URL). It also enumerates the returned fields, which lets an agent distinguish it from siblings like zillow_get_by_address, zillow_search_properties, or the history tools without opening any schema.

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?

Gives a hard calling constraint ('Provide exactly one of zpid or url') and a clear decision rule for the opt-in flags ('bundle them in to skip a separate call'), naming the sibling calls they mirror. It does not, however, explain when to reach for this tool versus zillow_get_by_address or zillow_search_properties, so routing among the retrieval siblings is left to inference.

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.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the 'read-only; safe to call repeatedly' line is largely redundant. However, the description adds genuinely new behavioral context: the token-budget warning for large galleries and the exact return shape. That is real value beyond the structured fields.

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?

Every sentence carries a distinct payload — scope, return contents, parameter constraint, opt-in flag with warning, and return shape — and the most important scoping information is front-loaded. No 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?

With no output schema, the description compensates by naming the returned keys (zpid, count, photos, street_view_url, high_res_url) and by flagging the one real failure mode (token overflow on 50+ photo properties). Nothing an agent needs to invoke it correctly is missing.

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

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, but the description adds meaning the schema does not encode: the mutual exclusivity of zpid and url ('provide exactly one of') and the practical guidance that include_sources is on by default for properties under ~15 photos.

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 and resource ('full photo gallery for a Zillow property') and scopes it to images embedded in the homedetails page, which clearly separates it from the sibling zillow_get_property and 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 Guidelines3/5

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

It gives the selection rule between the two input modes ('provide exactly one of zpid or url') and a condition for include_sources, but never says when to prefer this tool over zillow_get_property or zillow_bulk_get. Usage is implied by the tool name rather than stated.

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. An optional session_id (from zillow_register_session) is checked against the session registry — an unknown id errors — but it is a label only: the request always goes through whichever browser tab the extension is signed into. 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.7/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/openWorld, and the description adds genuinely non-obvious behavior: an unknown session_id errors, and the id is a label only because the request goes through whichever tab the extension is signed into. That is exactly the kind of surprising routing detail annotations cannot express.

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?

Front-loaded with purpose and return contents, then the session_id caveat, then auth and safety notes. Every sentence carries information — notably the return-field list, which is needed because no output schema exists.

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 enumerating returned fields, and it also documents the auth requirement and the session-id edge case. An agent has everything needed to call it 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?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: session_id is validated against a registry and errors if unknown, yet does not control routing and defaults to the active session. That is substantive semantic detail, not a restatement.

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 specific verb+resource (the signed-in user's saved/favorited homes) and adds scope precision ('flattened across all of the user's collections'), which cleanly separates it from zillow_get_saved_searches and the other zillow_get_* siblings.

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 states the precondition ('Requires the user to be signed in') and the safety profile ('Read-only; safe to call repeatedly'), giving clear context for when the tool applies. It never explicitly routes the agent away from an alternative such as zillow_get_saved_searches, so it stops short of the 5-level when/when-not 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_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. An optional session_id (from zillow_register_session) is checked against the session registry — an unknown id errors — but it is a label only: the request always goes through whichever browser tab the extension is signed into. 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.7/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/open-world, yet the description adds genuinely new behavior: the authentication requirement and its named error, and the non-obvious caveat that session_id is only a registry label and does not control which tab serves the request. This is exactly the kind of auth and side-effect context annotations cannot express.

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?

Three sentences, front-loaded with what the tool returns before the operational caveats. Dense with parenthetical detail but no wasted sentences; slightly crammed rather than bloated.

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 enumerating the returned fields, and it covers the auth precondition, the error case, and the session_id behavior. Nothing an agent needs to invoke it correctly is missing.

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

Parameters5/5

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

Schema coverage is 100%, so the baseline would be 3, but the description goes well beyond the schema text: it explains that an unknown session_id errors and that the parameter is a label only, with routing always following the signed-in tab. That is meaningful semantics the schema does not convey.

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 the exact resource (the signed-in user's saved searches on zillow.com) and enumerates the returned fields (name, filters, new-listing count, notification frequency), which cleanly separates it from the sibling zillow_get_saved_homes. An agent can identify this tool without opening the schema.

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 states the precondition clearly (user must be signed in at zillow.com in the bridged tab) and the failure mode if not (SessionNotAuthenticatedError), plus when session_id applies. It does not explicitly route the agent away from alternatives, but the context for use is unambiguous.

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

List every registered account label plus the current active_session_id. When none are registered, sessions is empty and active_session_id is null. The registry is a label only: it does not change which Zillow account requests use. Every zillow tool call goes through whichever browser tab the ContextMint Bridge extension is signed into; to read a different account, sign that tab into it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior5/5

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

Adds substantial context beyond annotations: describes the empty/null degenerate case, clarifies that the registry doesn't affect which account requests use, and explains the ContextMint Bridge tab-sign-in requirement for switching accounts.

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

Conciseness4/5

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

Front-loaded with the core purpose and return shape, then adds the important caveat about label-only semantics. Somewhat long, but every sentence earns its place given the unusual registry-vs-account distinction.

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?

No output schema, so description carries the return-value burden, which it does by naming sessions and active_session_id. It covers the key behavioral gotcha, though a hint about how the label maps to account changes via zillow_set_active_session would close the loop.

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?

Zero parameters, so baseline is 4. No params to document, and the description correctly omits parameter discussion.

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?

State a specific verb (List) and resource (registered Zillow sessions/account labels) and names the exact return fields (sessions, active_session_id), distinguishing it from the sibling zillow_set_active_session and 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 explains the registry is a label only and that switching accounts requires signing a tab into the desired account, effectively routing agents toward the correct behavior. However, it doesn't explicitly name zillow_set_active_session as the alternative for changing the active session.

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

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, open-world, so the safety profile is covered. The description adds real value beyond that: the data source (homedetails page) and the important edge case where `events` is empty with an explanatory `note` for some (often non-Showcase) listings.

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?

Three sentences, front-loaded with what it returns, then source, then the edge case. Dense but every clause adds distinct information; no filler.

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

Completeness4/5

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

No output schema exists, and the description compensates by describing the record contents and the empty-events/note behavior. Both optional params are schema-documented, so the only faint gap is no explicit sibling routing.

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 `url` and `zpid` are already documented in the schema, and the description adds no format or selection guidance for them. Baseline 3 applies where structured data carries the parameter burden.

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

Purpose4/5

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

States a specific verb and resource (year-by-year property-tax record for a property) and enumerates the payload (tax paid, assessed value, YoY change rates). It is clearly distinguishable from zillow_get_price_history and zillow_get_zestimate_history by resource, but it never names those siblings to route the agent explicitly.

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?

Offers intended use ('spotting reassessment jumps or comparing tax burdens across properties'), which implies context but gives no explicit when-to-use-vs-alternative guidance. It does flag the empty-`events` case as distinct from a genuine no-history, which is partial exclusion guidance.

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.6/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/openWorld, and the description goes further by disclosing the return shape ({date, value, rent?}), when rent appears, and the empty-`points`-plus-`note` edge case that is distinct from genuine no-history. That is real behavioral context beyond what the annotations provide, even if 'read-only; safe to call repeatedly' restates the 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?

Front-loaded with the core purpose, then the sibling distinction, then the edge case — a sensible ordering with no filler. The closing 'Read-only; safe to call repeatedly' is redundant with readOnlyHint/idempotentHint, a minor wasted sentence.

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 return-value burden and does so: it specifies the time-series shape, the optional rent field, and the empty-result semantics. An agent has everything needed to call and interpret it.

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 coverage is 100% and both parameters (url, zpid) are fully documented in the schema, so the description adds no syntax or constraint detail beyond restating the either/or input. Baseline 3 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?

States a specific verb+resource (historical Zestimate values) and the exact retrieval key (zpid or homedetails URL). It explicitly distinguishes itself from the sibling zillow_get_property, which returns only the current scalar Zestimate.

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?

Gives an explicit when-to-use rule: 'call this tool when you need the trend,' and names the alternative that covers the current value. It also flags the common failure mode (client-side-rendered trend → empty points) so the agent can interpret the result rather than assume no history exists.

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

zillow_healthcheckVerify the ContextMint Bridge connection end-to-endA
Read-onlyIdempotent

Round-trips a small public www.zillow.com URL (/robots.txt) through ContextMint Bridge (your signed-in browser tab) 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 'this browser can't serve a capability' 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.6/5.0
Behavior5/5

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

Annotations already declare read-only, open-world, and idempotent semantics. The description adds substantial behavioral detail beyond that: the exact round-trip performed, the diagnostic fields returned (role, port, version, extension link state, elapsed time), and a plain-English hint that distinguishes four failure modes. This is rich context for a tool with no output schema.

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

Conciseness4/5

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

Front-loaded with the core action and a compact list of return diagnostics. The first sentence is long but every element earns its place; no filler sentences. Slightly dense, but appropriate for the amount of useful information conveyed.

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 the tool's complexity as a diagnostic endpoint, zero parameters, rich annotations, and absence of an output schema, the description covers what the agent needs: what it does, what it returns, safety profile, and when to invoke it. Nothing essential 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?

The tool takes zero parameters, so there are no parameter semantics to explain. Baseline for zero parameters is 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?

States a specific action (round-trips a URL through ContextMint Bridge) and enumerates the diagnostics returned, making clear this is a diagnostic tool distinct from all data-fetching siblings. An agent can immediately tell it apart from tools like zillow_get_property or 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 Guidelines4/5

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

Explicitly says when to call it: 'when a real tool fails and you want to know which hop broke.' Clear context, but does not provide when-not-to-use guidance or name alternative diagnostic paths, which would be needed for a 5.

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

Record (or refresh) which Zillow account the signed-in session belongs to, keyed by account_identity. Re-registering the same identity updates the existing entry. Returns a session_id; pass mark_active: true to mark it as the current account in the same call. The registry is a label only: it does not change which Zillow account requests use. Every zillow tool call goes through whichever browser tab the ContextMint Bridge extension is signed into; to read a different account, sign that tab into it.

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.5/5.0
Behavior5/5

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

Annotations cover the safety profile (idempotent, non-destructive, not read-only), and the description adds non-obvious behavior beyond them: the registry is a label only and does not change which account requests use, plus the browser-tab constraint governing every zillow call. This is exactly the kind of caveat an agent cannot get from structured fields.

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?

Front-loaded with the core action, followed by idempotency, return value, parameter tip, and the routing caveat. Every sentence carries distinct information with no 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?

Covers the action, the update semantics, the returned session_id (important since there is no output schema), and the critical constraint that the registry does not affect request routing. Nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters are already documented; the description's mention of 'keyed by account_identity' and 'pass mark_active: true' largely restates the schema. auth_expires_at is not elaborated on at all, so no value is added 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?

States a specific verb and resource ('Record (or refresh) which Zillow account the signed-in session belongs to') and names the keying field, which distinguishes it from siblings like zillow_set_active_session and zillow_get_session_context. An agent can identify the tool's scope without opening the schema.

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?

Gives clear context: re-registering the same identity updates the existing entry, and mark_active can promote it in the same call. However, it never explicitly names or excludes the sibling zillow_set_active_session, leaving the agent to infer when to use that instead.

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.
map_boundsNoOptional map viewport (lat/lng box) to intersect with the location — use to tile dense markets.
include_metaNoWhen true, return {meta, results}: meta carries Zillow's own total_result_count, pages fetched, listings dropped by the filter/home-type guards, and `truncated` (more matches exist than were returned).
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.8/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/open-world, but the description goes well beyond them: error behavior (throws LocationNotResolved rather than silently defaulting), the ~40-listings-per-page server cap and auto-pagination semantics, and the fact that filters are skipped on the address path. That is exactly the behavioral context annotations cannot express.

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

Conciseness4/5

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

Front-loads purpose, then routings, then caveats, with no filler sentences. It is long and leans on parenthetical asides, but nearly every clause carries actionable information, so it stays just short of over-verbose.

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 12-param open-world search with no output schema, the description names the returned fields, the meta behavior (total_result_count, pages fetched, truncated), pagination edge cases, and failure mode. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

With 67% schema coverage, the description still adds real meaning: the interaction between `limit` and `auto_paginate`, what `view: compact` strips (image/avatar URLs), and that `map_bounds` exists to tile dense markets. A few params (beds_min, baths_min, price_min/max) get no extra context, keeping it below 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?

Opens with a specific verb+resource ('Search Zillow listings by location...and optional filters') and enumerates the filter dimensions and return fields, so an agent knows exactly what it produces. It also explicitly distinguishes itself from zillow_get_by_address and zillow_get_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 Guidelines5/5

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

Gives explicit routing rules: city/ZIP queries get filters applied, full-address queries do not, and zillow_get_by_address is named as the cleaner one-shot address lookup. It adds a tactical recommendation (price-band dense markets) and names the alternative for Zestimate history.

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

Mark a previously registered session_id as the current account label, for your own bookkeeping across a conversation. The registry is a label only: it does not change which Zillow account requests use. Every zillow tool call goes through whichever browser tab the ContextMint Bridge extension is signed into; to read a different account, sign that tab into it.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession id to make active.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare non-readOnly, idempotent, non-destructive, but the description adds the critical behavioral fact that this is a label only and routing is controlled by the browser tab the extension is signed into. This is exactly the context that stops an agent from assuming the call changes account 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?

Three tight sentences with the purpose front-loaded and the crucial caveat following immediately. No filler, though the routing sentence is slightly extended and could be trimmed marginally.

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 single-parameter, no-output tool, everything an agent needs is present: the action, the prerequisite that the session must already be registered, and the limitation that it does not affect request routing.

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 coverage is 100% and the single parameter is fully documented in-schema, so the baseline is 3. The description adds the 'previously registered' prerequisite, but no format or syntax detail beyond the schema.

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

Purpose5/5

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

States a specific verb and object ('Mark a previously registered session_id as the current account label') and immediately scopes it as bookkeeping-only. An agent can tell this apart from zillow_register_session and zillow_get_session_context without opening schemas.

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?

Gives clear context ('for your own bookkeeping across a conversation') and an important when-not: it does not switch the account requests use. It stops short of naming a specific alternative tool, but the exclusion is explicit and prevents the most likely misuse.

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

zillow_sweep_areaExhaustively sweep a Zillow search areaA
Idempotent

Enumerate EVERY Zillow listing matching the filters inside a location (resolved like zillow_search_properties) or an explicit bounding box, without silent truncation. Splits the area into map tiles and recursively quarters any tile whose Zillow-reported total exceeds what one query can return, dedupes by zpid and re-applies the numeric filters (drift guard). Returns a completeness summary (requests, tiles, unique listings, tiles still truncated at max depth, drift warnings such as Zillow ignoring the price filter or the viewport) plus the listings, or writes the listings to output_path as JSON for large areas (inside the output directory: ZILLOW_OUTPUT_DIR, default ~/Downloads/zillow-mcp). Sequential requests with a delay, paced by the same per-host requests-per-minute throttle as zillow_bulk_get; if Zillow's bot-wall blocks a request the sweep stops and returns { blocked: true, retry_after_s } with what it had. Read-only against Zillow; the only write is the optional local output file.

ParametersJSON Schema
NameRequiredDescriptionDefault
boundsNoOptional box to sweep; defaults to the resolved region's map bounds.
statusNo
beds_minNo
delay_msNoPause before every Zillow request, including each page within a tile (default 1200).
locationYesCity / ZIP / county used to resolve the region (e.g. "King County, WA").
tile_capNoTreat a tile as complete only if its total is at most this (default 400).
baths_minNo
max_depthNoMax quarterings per tile (default 6).
price_maxNo
price_minNo
home_typesNo
output_pathNoOptional NEW .json file to write the full results (and per-tile counts) to: a file name (e.g. "san-jose.json") written into the output directory (ZILLOW_OUTPUT_DIR, default ~/Downloads/zillow-mcp), or an absolute path inside it. Paths outside that directory are refused, and an existing file is never overwritten. Omit to get the results inline; use a file for large areas so the listings stay out of the conversation.
max_requestsNoHard request budget (default 150), counting the resolve call and every page; the sweep stops mid-tile rather than exceed it.

TDQS

A4.1/5.0
Behavior5/5

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

Annotations only declare readOnly=false, openWorld=true, idempotent=true, destructive=false. The description goes well beyond: it discloses sequential paced requests sharing the `zillow_bulk_get` throttle, the bot-wall failure contract (`{ blocked: true, retry_after_s }` with partial results), the recursive quartering/dedupe/drift-guard algorithm, and clarifies that the only write is the optional local output file. This explains the readOnly=false annotation rather than contradicting it.

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

Conciseness4/5

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

Front-loaded with the purpose, then densely sequenced through algorithm, return shape, output options, and failure behavior. It is one very long paragraph and somewhat dense to parse, but essentially every clause carries operational information rather than filler.

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

Completeness4/5

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

For a high-complexity, 13-param tool with no output schema, the description covers the critical ground: what the return contains (completeness summary plus listings), the file-output alternative, the throttling model, and the blocked/retry failure mode. Only the individual filter parameters and the exact shape of individual listing fields are left unaddressed.

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 coverage is only 54% across 13 params. The description gives useful conceptual context for the sweep controls (tile_cap, max_depth, max_requests, output_path) and mentions re-applying numeric filters, but those params already carry schema descriptions, and the remaining filter params (beds_min, baths_min, home_types, status, price range) are undocumented in both places. It partially, not fully, compensates for the coverage gap.

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 and resource: 'Enumerate EVERY Zillow listing matching the filters inside a location ... or an explicit bounding box, without silent truncation.' The phrase 'without silent truncation' and 'EVERY' distinguish it from the ordinary sibling search by defining the exhaustive-completeness guarantee. An agent can tell it apart from zillow_search_properties without opening either schema.

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?

Usage is implied rather than stated: the tool's completeness guarantee suggests when to reach for it, and it advises using `output_path` for large areas. But there is no explicit when-to-use/when-not statement and no direct instruction like 'prefer zillow_search_properties for a quick single-page lookup'; the sibling references (search_properties, bulk_get) are made for resolution and throttling reasons, not routing.

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. 8 tool updatesv1.2.4
    • Changedzillow_bulk_get2 fields changed
      • changedInput schema / properties / zpids / description
        Previous value: -"Zpids to fetch. 1..200. Provide either zpids or urls."New value: +"Zpids to fetch. 1..200. Provide either zpids or urls, not both."
      • changedInput schema / properties / zpids / items / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "maximum": 9007199254740991,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "pattern": "^\\d+$",
        +    "type": "string"
        +  }
        +]
    • Changedzillow_compare_properties3 fields changed
      • changedInput schema / properties / urls / description
        Previous value: -"Array of 2-25 Zillow homedetails URLs/paths to compare. Provide either zpids or urls."New value: +"Array of 2-25 Zillow homedetails URLs/paths to compare. Provide either zpids or urls, not both."
      • changedInput schema / properties / zpids / description
        Previous value: -"Array of 2-25 zpids to compare. Provide either zpids or urls. For larger batches, use `zillow_bulk_get`."New value: +"Array of 2-25 zpids to compare. Provide either zpids or urls, not both. For larger batches, use `zillow_bulk_get`."
      • changedInput schema / properties / zpids / items / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "maximum": 9007199254740991,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "pattern": "^\\d+$",
        +    "type": "string"
        +  }
        +]
    • Changedzillow_get_price_history1 field changed
      • changedInput schema / properties / zpid / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "maximum": 9007199254740991,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "pattern": "^\\d+$",
        +    "type": "string"
        +  }
        +]
    • Changedzillow_get_property1 field changed
      • changedInput schema / properties / zpid / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "maximum": 9007199254740991,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "pattern": "^\\d+$",
        +    "type": "string"
        +  }
        +]
    • Changedzillow_get_property_photos1 field changed
      • changedInput schema / properties / zpid / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "maximum": 9007199254740991,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "pattern": "^\\d+$",
        +    "type": "string"
        +  }
        +]
    • Changedzillow_get_tax_history1 field changed
      • changedInput schema / properties / zpid / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "maximum": 9007199254740991,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "pattern": "^\\d+$",
        +    "type": "string"
        +  }
        +]
    • Changedzillow_get_zestimate_history1 field changed
      • changedInput schema / properties / zpid / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "maximum": 9007199254740991,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "pattern": "^\\d+$",
        +    "type": "string"
        +  }
        +]
    • Changedzillow_sweep_area1 field changed
      • changedInput schema / properties / output_path / description
        Previous value: -"Optional absolute path of a NEW .json file to write the full results (and per-tile counts) to; an existing file is never overwritten. Omit to get the results inline; use a file for large areas so the listings stay out of the conversation."New value: +"Optional NEW .json file to write the full results (and per-tile counts) to: a file name (e.g. \"san-jose.json\") written into the output directory (ZILLOW_OUTPUT_DIR, default ~/Downloads/zillow-mcp), or an absolute path inside it. Paths outside that directory are refused, and an existing file is never overwritten. Omit to get the results inline; use a file for large areas so the listings stay out of the conversation."
  2. 2 tool updatesv1.2.0
    • Changedzillow_search_properties2 fields changed
      • addedInput schema / properties / include_meta
        Added value: +{
        +  "description": "When true, return {meta, results}: meta carries Zillow's own total_result_count, pages fetched, listings dropped by the filter/home-type guards, and `truncated` (more matches exist than were returned).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / map_bounds
        Added value: +{
        +  "description": "Optional map viewport (lat/lng box) to intersect with the location — use to tile dense markets.",
        +  "properties": {
        +    "east": {
        +      "type": "number"
        +    },
        +    "north": {
        +      "type": "number"
        +    },
        +    "south": {
        +      "type": "number"
        +    },
        +    "west": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "north",
        +    "south",
        +    "east",
        +    "west"
        +  ],
        +  "type": "object"
        +}
    • Addedzillow_sweep_area
  3. 2 tool updatesv1.1.5
    • Changedzillow_calculate_affordability2 fields changed
      • changedInput schema / properties / loan_term_years / description
        Previous value: -"Default 30"New value: +"Default 30, max 50"
      • changedInput schema / properties / loan_term_years / maximum
        Previous value: -9007199254740991New value: +50
    • Changedzillow_calculate_mortgage2 fields changed
      • changedInput schema / properties / loan_term_years / description
        Previous value: -"Default 30"New value: +"Default 30, max 50"
      • changedInput schema / properties / loan_term_years / maximum
        Previous value: -9007199254740991New value: +50
  4. 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
  5. 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
  6. 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"
  7. 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"
        +}
  8. 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.1/5.0

Scored across 21 tools

Disambiguation4/5

Most tools target a unique resource or action, and descriptions explicitly cross-reference related tools such as bulk_get vs compare_properties and get_by_address vs resolve_addresses. Some overlap remains between search_properties and sweep_area, and among single/bulk/compare property fetch, but the descriptions clearly delineate when to use each.

Naming Consistency4/5

All tools share the zillow_ prefix and snake_case, and most follow a verb_noun pattern (get_property, search_properties, calculate_mortgage). Minor deviations exist (zillow_bulk_get is noun_verb, zillow_healthcheck lacks a verb), but the set remains highly predictable.

Tool Count4/5

21 tools is on the heavy side, but the server spans search, property details, histories, photos, bulk/compare, saved items, market reports, calculators, sessions, and diagnostics, so each tool has a distinct role. There is no obvious redundant filler.

Completeness4/5

The surface covers core read-only Zillow workflows: search/enumeration, property records, price/Zestimate/tax histories, photos, bulk/compare, saved searches/homes, market reports, and calculators. Gaps are minor for a read-only scraper (e.g., no save/unsave mutation, no agent or tour actions), and agents can work around them.

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.
    9 npm
    55
    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.
    9 npm
    1
    MIT