Recipe: Property research
The task
You have a street address and want valuation, tax assessment, sales history, and neighborhood market context in as few calls as possible.
Tools used: housing_property_report (compound, 1 call) or attom_avm +
attom_assessment + altos_market_stats (manual, 3 calls) for finer control.
Everything here is BYO key — ATTOM (free tier available at api.gateway.attomdata.com) and Altos Research. No platform key is shared for either, so every example below is live-verified for tool name, argument names, and error shape, but not for the actual property numbers — bring your own key to see real figures.
Copy-paste prompt
Give me a full property report for "<street address>, <city>, <state> <zip>" using
Pipeworx: AVM with its confidence band, last sale, tax assessment, and neighborhood market
context. Flag if the AVM has no confidence band attached — never state a bare point value.
What a good answer looks like
housing_property_report({
address1: "123 Main St",
address2: "Denver, CO 80202",
_attomKey: "..."
})
Structure verified against source (mcps/housing-intel/src/index.ts, which flattens
ATTOM’s raw property/AVM/sales-history/assessment endpoints into this shape) — field names
are real, the numbers below are illustrative since no live key was available this session:
{
"address": "123 Main St, Denver, CO 80202",
"property": { "beds": 3, "baths": 2.5, "sqft": 2150, "yearBuilt": 1998, "lotSqft": 6200 },
"valuation": { "avm": 687000, "low": 661000, "high": 712000, "confidence": "..." },
"sales_history": [ { "date": "2021-06-14", "amount": 545000, "type": "..." } ],
"assessment": { "assessed": 41000, "market": 640000, "taxAmount": 3400 }
}
A trustworthy answer has:
valuation.lowandvaluation.highalongsideavm. A bare point estimate with no band is a rounding error away from misleading — always carry both when you state a value.sales_historyas an array, even for a single past sale — don’t collapse it to “last sold for $X” without the date, which tells you how stale that comparable is.assessment.assesseddistinct fromassessment.market. County-assessed value and ATTOM’s estimated market value are two different numbers on the same property; conflating them overstates or understates tax burden relative to market value.
A plausible-sounding failure here isn’t bad data — it’s a wrong argument name that produces a clean, correctly-shaped error every time, which is easy to skim past if you’re not reading past “error.” Live-verified 2026-08-06, both real bugs in a prior draft of this recipe:
// Wrong (this recipe used to document this) — altos_market_stats takes _altosKey, not _apiKey:
altos_market_stats({ region: "us-co-denver", _apiKey: "..." })
// → { error: "tool_error", message: "Altos Research API key required. Get one at
// https://altosresearch.com and pass via _altosKey." }
// Also wrong — region format. Altos regions are `<state>_<city-slug>` (lowercase, underscore),
// not hyphenated "us-co-denver". Real accepted forms per the tool's own schema:
// "us_national", "ca_los-angeles", "ca_94105"
Fixed:
altos_market_stats({ region: "co_denver", _altosKey: "..." })
The failure mode for a wrong key-argument name and a wrong region string look identical —
both come back as an error: "tool_error" object — so read the message field rather than
assuming any error means “no key yet.”
Step-by-step tool calls
Fast path
housing_property_report({
address1: "123 Main St",
address2: "Denver, CO 80202",
_attomKey: "your-attom-api-key" // note: this compound tool wants _attomKey
})
Wraps ATTOM property detail + AVM + sales history + tax assessment in one call. Needs an ATTOM key (or a Housing Vertical subscription).
Manual path
attom_avm({ address1: "123 Main St", address2: "Denver, CO 80202", _apiKey: "your-attom-api-key" })
attom_assessment({ address1: "123 Main St", address2: "Denver, CO 80202", _apiKey: "your-attom-api-key" })
altos_market_stats({ region: "co_denver", _altosKey: "your-altos-api-key" })
Note the key-argument name differs by tool: attom_avm/attom_assessment/
attom_sales_trend take _apiKey; housing_property_report (a different pack,
housing-intel) takes _attomKey; altos_market_stats takes _altosKey. Same underlying
ATTOM account works for the first two forms — just spelled differently per tool.
attom_assessment is the county tax-assessor record: assessed value, market value, tax
amount, tax year, and historical trend.
Market trend by ZIP
attom_sales_trend({
geoid: "ZI80202", // ZIP code prefixed with "ZI" — case-sensitive prefix
interval: "monthly",
startYear: "2020",
endYear: "2024",
_apiKey: "your-attom-api-key"
})
Median sale price and volume trend for the ZIP — call this to frame the AVM against the local market, or as a standalone “is this ZIP heating up” answer.
What we don’t cover: FEMA flood zones
Pipeworx has no FEMA flood-zone lookup — there is no tool that maps an address to its FEMA
zone designation, so don’t state one in your output. For the official determination, point
users at FEMA’s Flood Map Service Center (msc.fema.gov). get_flood_forecast (Open-Meteo,
live-verified to exist) gives a river-discharge flood forecast for a lat/lon — a different
question from a zone rating, and shouldn’t be presented as one.
Citation pattern
The figures are illustrative — carry the ones your calls actually returned:
123 Main St, Denver — ATTOM AVM $687K (band $661K–$712K, last sold 2021-06 at $545K). Single-family, 2,150 sqft, 3/2.5. Assessed at $640K market value, $3.4K annual tax per the county assessor. Neighborhood market context per Altos.
No pipeworx:// resource template is registered for ATTOM or Altos records as of this
writing — cite the tool/source by name rather than inventing a resource URI shape.
Caveats
- AVM band is the honest answer. A point estimate without
low/highis misleading — always carry both. - Assessment data is yearly, pulled from county records via ATTOM. Recent reassessments may not be reflected for 6–12 months.
- Neighborhood vs. property-specific. Altos gives metro/ZIP-level stats. ATTOM gives the property. Both matter, neither substitutes for the other.
- Key-argument names are not uniform across these tools — see the failure-mode example
above. Check the tool’s own schema rather than assuming
_apiKeyworks everywhere in this recipe. attom_sales_trend’sgeoidneeds the"ZI"prefix on the ZIP code —"80202"alone will not match; it must be"ZI80202".
Use the prompt
prompts/get({
name: "property_research",
arguments: { address: "123 Main St, Denver, CO 80202" }
})
Returns a substituted prompt that runs the full sequence and concludes with whether a list price is data-supported.