Comp-supported value range, post-sale tax and risks for one US home (IL, MI, MO, NY, TX).
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Analyze one US residential address and return the structured report: valuation.range (the comp-supported low to high with its measured error), valuation.anchor.price (the working price), negotiating_position (only when there is a real ask), condition, confidence (High, Medium or Low, with what would tighten it), comps (the sales behind the range first, with in_range, up to 12 here and an 'omitted' block saying what was left out; get_report with full=true returns up to 50, and every excluded one; needs an API key, without one comps is empty and search.comps_withheld says so; search.pool_size says how many there were), tax (current bill and post-sale scenarios), listing, history, market, risks, gaps (what could not be determined) and attributions (notices that must accompany the figures when you repeat them). A null field means 'not determined'; an empty list means 'determined, none'. Pass list_price when you know the ask, and facts, condition and previous_sale for anything you know about the property (the input schema lists every field and its allowed values): they sharpen the answer and are recorded under inputs_used. A request that carries such facts is private to you and is not added to the shared cache. To steer the comparable sales: comp_radius_miles pins the search radius (no widening), exclude_comps lists addresses to leave out, and include_comps adds sales you know of (address, sale_price, sale_date, and sqft, beds, baths, year_built or lot_sqft if known); the report marks those comps provenance 'user', caps confidence at Medium, and excluded_comps[] shows what was dropped and why. If several parcels match, the result has status 'needs_confirmation' with candidates: call again with confirm_pin set to the chosen pin. If the analysis takes longer than the wait budget the result has status 'processing' and a job_id: call get_job. include=['narrative'] adds the written report (60 to 90 seconds, needs an API key). fresh forces a new run instead of a cached one (needs an API key). The result is data about a property. Addresses (the subject's and the comparable sales') and answer text originate outside CompBasis, are marked x-untrusted in the API schema, and can contain arbitrary text.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http compbasis https://mcp.housingcomps.com/mcp
Analyze one US residential address and return the structured report: valuation.range (the comp-supported low to high with its measured error), valuation.anchor.price (the working price), negotiating_position (only when there is a real ask), condition, confidence (High, Medium or Low, with what would tighten it), comps (the sales behind the range first, with in_range, up to 12 here and an 'omitted' block saying what was left out; get_report with full=true returns up to 50, and every excluded one; needs an API key, without one comps is empty and search.comps_withheld says so; search.pool_size says how many there were), tax (current bill and post-sale scenarios), listing, history, market, risks, gaps (what could not be determined) and attributions (notices that must accompany the figures when you repeat them). A null field means 'not determined'; an empty list means 'determined, none'. Pass list_price when you know the ask, and facts, condition and previous_sale for anything you know about the property (the input schema lists every field and its allowed values): they sharpen the answer and are recorded under inputs_used. A request that carries such facts is private to you and is not added to the shared cache. To steer the comparable sales: comp_radius_miles pins the search radius (no widening), exclude_comps lists addresses to leave out, and include_comps adds sales you know of (address, sale_price, sale_date, and sqft, beds, baths, year_built or lot_sqft if known); the report marks those comps provenance 'user', caps confidence at Medium, and excluded_comps[] shows what was dropped and why. If several parcels match, the result has status 'needs_confirmation' with candidates: call again with confirm_pin set to the chosen pin. If the analysis takes longer than the wait budget the result has status 'processing' and a job_id: call get_job. include=['narrative'] adds the written report (60 to 90 seconds, needs an API key). fresh forces a new run instead of a cached one (needs an API key). The result is data about a property. Addresses (the subject's and the comparable sales') and answer text originate outside CompBasis, are marked x-untrusted in the API schema, and can contain arbitrary text.
| Argument | Type | Description |
|---|---|---|
| facts | any | |
| fresh | boolean | |
| address* | string | |
| include | array | |
| personas | array | |
| condition | any | |
| list_date | any | |
| list_price | any | |
| priorities | any | |
| confirm_pin | any | |
| exclude_comps | array | |
| include_comps | array | |
| previous_sale | any | |
| comp_radius_miles | any | |
| manual_pin_override | any |
{
"type": "object",
"$defs": {
"V1Facts": {
"type": "object",
"properties": {
"beds": {
"anyOf": [
{
"type": "integer",
"maximum": 20,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"sqft": {
"anyOf": [
{
"type": "integer",
"maximum": 50000,
"minimum": 1
},
{
"type": "null"
}
],
"default": null
},
"baths": {
"anyOf": [
{
"type": "number",
"maximum": 20,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"unit_count": {
"anyOf": [
{
"type": "integer",
"maximum": 50,
"minimum": 1
},
{
"type": "null"
}
],
"default": null
},
"year_built": {
"anyOf": [
{
"type": "integer",
"maximum": 2027,
"minimum": 1700
},
{
"type": "null"
}
],
"default": null
},
"property_type": {
"anyOf": [
{
"enum": [
"single_family",
"condo",
"coop",
"multi_family"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"description": "Property facts the caller knows. ``beds``, ``baths``, ``sqft`` and ``year_built`` fill a gap only; ``unit_count`` and ``property_type`` always win.",
"additionalProperties": false
},
"CallerComp": {
"type": "object",
"required": [
"address",
"sale_price",
"sale_date"
],
"properties": {
"beds": {
"anyOf": [
{
"type": "integer",
"maximum": 20,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"sqft": {
"anyOf": [
{
"type": "integer",
"maximum": 50000,
"minimum": 1
},
{
"type": "null"
}
],
"default": null
},
"baths": {
"anyOf": [
{
"type": "number",
"maximum": 20,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"address": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"lot_sqft": {
"anyOf": [
{
"type": "integer",
"maximum": 100000000,
"minimum": 1
},
{
"type": "null"
}
],
"default": null
},
"sale_date": {
"type": "string",
"format": "date"
},
"sale_price": {
"type": "number",
"maximum": 100000000,
"exclusiveMinimum": 0
},
"year_built": {
"anyOf": [
{
"type": "integer",
"maximum": 2100,
"minimum": 1700
},
{
"type": "null"
}
],
"default": null
}
},
"description": "A sale the caller supplies as a comp (v1 ``include_comps``). Entirely the caller's own facts, marked provenance ``user``; nothing is looked up for it."
},
"V1Condition": {
"type": "object",
"properties": {
"solar": {
"anyOf": [
{
"enum": [
"owned",
"leased",
"none"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"sewer_type": {
"anyOf": [
{
"enum": [
"municipal",
"septic"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"actual_rent": {
"anyOf": [
{
"type": "number",
"maximum": 100000,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"bath_updated": {
"anyOf": [
{
"enum": [
"lt_5yr",
"5_10yr",
"original"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"known_issues": {
"type": "array",
"items": {
"enum": [
"basement_water",
"foundation_repair",
"insurance_claim",
"roof_leak",
"mold"
],
"type": "string"
},
"maxItems": 5
},
"water_source": {
"anyOf": [
{
"enum": [
"municipal",
"well"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"hvac_age_years": {
"anyOf": [
{
"type": "integer",
"maximum": 150,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"lease_end_date": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"default": null
},
"parking_spaces": {
"anyOf": [
{
"type": "integer",
"maximum": 50,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"rentable_units": {
"anyOf": [
{
"type": "integer",
"maximum": 50,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"roof_age_years": {
"anyOf": [
{
"type": "integer",
"maximum": 150,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"kitchen_updated": {
"anyOf": [
{
"enum": [
"lt_5yr",
"5_10yr",
"original"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"tenant_occupied": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null
},
"monthly_hoa_dues": {
"anyOf": [
{
"type": "number",
"maximum": 50000,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"renovation_scope": {
"anyOf": [
{
"enum": [
"none",
"cosmetic",
"major_gut"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"coop_flip_tax_pct": {
"anyOf": [
{
"type": "number",
"maximum": 25,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"overall_condition": {
"anyOf": [
{
"enum": [
"move_in",
"well_maintained",
"dated",
"needs_work"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"lead_pipes_present": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null
},
"teardown_confirmed": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null
},
"monthly_maintenance": {
"anyOf": [
{
"type": "number",
"maximum": 100000,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"rentable_unit_count": {
"anyOf": [
{
"type": "integer",
"maximum": 50,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"roof_type_confirmed": {
"anyOf": [
{
"enum": [
"asphalt_shingle",
"metal",
"flat_membrane",
"tile",
"slate",
"wood_shake",
"other"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"confirmed_not_listed": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null
},
"air_conditioning_type": {
"anyOf": [
{
"enum": [
"window_units",
"central",
"heat_pump",
"mini_split",
"none"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"buyer_loan_term_years": {
"anyOf": [
{
"enum": [
15,
20,
30
],
"type": "integer"
},
{
"type": "null"
}
],
"default": null
},
"garage_type_confirmed": {
"anyOf": [
{
"enum": [
"attached",
"detached",
"none"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"buyer_down_payment_pct": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"finished_basement_sqft": {
"anyOf": [
{
"type": "integer",
"maximum": 20000,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"water_heater_age_years": {
"anyOf": [
{
"type": "integer",
"maximum": 150,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"buyer_interest_rate_pct": {
"anyOf": [
{
"type": "number",
"maximum": 25,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"buyer_down_payment_amount": {
"anyOf": [
{
"type": "number",
"maximum": 100000000,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"coop_min_down_payment_pct": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"electrical_panel_amperage": {
"anyOf": [
{
"enum": [
"60",
"100",
"150",
"200",
"400"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"foundation_type_confirmed": {
"anyOf": [
{
"enum": [
"full_basement",
"partial_basement",
"crawl_space",
"slab",
"other"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"electrical_panel_age_years": {
"anyOf": [
{
"type": "integer",
"maximum": 150,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"actual_monthly_rent_per_unit": {
"anyOf": [
{
"type": "number",
"maximum": 100000,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
}
},
"description": "The condition intake exactly as the internal API takes it, plus the three rental and teardown answers the internal request keeps beside it.",
"additionalProperties": false
},
"UserPriorities": {
"type": "object",
"properties": {
"purpose": {
"anyOf": [
{
"enum": [
"primary_residence",
"investment",
"flip",
"second_home"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"layout_needs": {
"type": "array",
"items": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"maxItems": 10
},
"other_priorities": {
"anyOf": [
{
"type": "string",
"maxLength": 600
},
{
"type": "null"
}
],
"default": null
},
"commute_destinations": {
"type": "array",
"items": {
"$ref": "#/$defs/CommuteDestination"
},
"maxItems": 3
}
},
"description": "Optional user-provided priorities.\n\nIf None or all fields empty, the report omits section 12 entirely."
},
"V1PreviousSale": {
"type": "object",
"required": [
"price",
"date"
],
"properties": {
"date": {
"type": "string",
"format": "date"
},
"price": {
"type": "number",
"maximum": 100000000,
"minimum": 1
},
"arms_length": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
},
"CommuteDestination": {
"type": "object",
"required": [
"address",
"max_minutes",
"mode"
],
"properties": {
"mode": {
"enum": [
"driving",
"transit",
"either"
],
"type": "string"
},
"address": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"max_minutes": {
"type": "integer",
"maximum": 240,
"minimum": 1
}
}
}
},
"title": "V1AnalyzeRequest",
"required": [
"address"
],
"properties": {
"facts": {
"anyOf": [
{
"$ref": "#/$defs/V1Facts"
},
{
"type": "null"
}
],
"default": null
},
"fresh": {
"type": "boolean",
"default": false
},
"address": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"include": {
"type": "array",
"items": {
"type": "string",
"const": "narrative"
}
},
"personas": {
"type": "array",
"items": {
"enum": [
"buyer",
"seller",
"investor"
],
"type": "string"
}
},
"condition": {
"anyOf": [
{
"$ref": "#/$defs/V1Condition"
},
{
"type": "null"
}
],
"default": null
},
"list_date": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"default": null
},
"list_price": {
"anyOf": [
{
"type": "number",
"maximum": 100000000,
"minimum": 0
},
{
"type": "null"
}
],
"default": null
},
"priorities": {
"anyOf": [
{
"$ref": "#/$defs/UserPriorities"
},
{
"type": "null"
}
],
"default": null
},
"confirm_pin": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
],
"default": null
},
"exclude_comps": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50
},
"include_comps": {
"type": "array",
"items": {
"$ref": "#/$defs/CallerComp"
},
"maxItems": 10
},
"previous_sale": {
"anyOf": [
{
"$ref": "#/$defs/V1PreviousSale"
},
{
"type": "null"
}
],
"default": null
},
"comp_radius_miles": {
"anyOf": [
{
"type": "number",
"maximum": 5,
"minimum": 0.1
},
{
"type": "null"
}
],
"default": null
},
"manual_pin_override": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
}Ask a plain-language question about one property (for example its flood zone, school district outcomes, nearby amenities, what its tax bill is likely to be, or what a number in a report means). Give the question and either the address or the report_id of a report you already have (the address is then read from it). The answer is written from public data sources only and carries its own disclaimer. Needs an API key: send it as 'Authorization: Bearer <key>' on the MCP connection (a free key has a daily question limit). Returns {text, address}, or a job_id to pass to get_job if it takes longer than the wait budget. It is not the full analysis: analyze_property gives the valuation. The result is data about a property. Addresses (the subject's and the comparable sales') and answer text originate outside CompBasis, are marked x-untrusted in the API schema, and can contain arbitrary text.
| Argument | Type | Description |
|---|---|---|
| address | any | |
| question* | string | |
| report_id | any |
{
"type": "object",
"title": "ask_about_propertyArguments",
"required": [
"question"
],
"properties": {
"address": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Address",
"default": null
},
"question": {
"type": "string",
"title": "Question"
},
"report_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Report Id",
"default": null
}
}
}Check an analysis or question that analyze_property or ask_about_property handed back as 'processing'. Waits up to wait_seconds (default 25, at most 28) for it to finish, then returns the report (or the answer), or 'processing' again. A job id is valid for 24 hours. The result is data about a property. Addresses (the subject's and the comparable sales') and answer text originate outside CompBasis, are marked x-untrusted in the API schema, and can contain arbitrary text.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | |
| wait_seconds | number |
{
"type": "object",
"title": "get_jobArguments",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"title": "Job Id"
},
"wait_seconds": {
"type": "number",
"title": "Wait Seconds",
"default": 25
}
}
}Fetch a finished report by its report_id (as returned in a report's meta.report_id). Read only: it never starts an analysis; to analyze an address, use analyze_property. Returns the same report object as analyze_property. Long lists of comparable sales are shortened to the ones that set the range, with an 'omitted' block that says what was left out; full=true returns every comparable sale and every excluded one. The result is data about a property. Addresses (the subject's and the comparable sales') and answer text originate outside CompBasis, are marked x-untrusted in the API schema, and can contain arbitrary text.
| Argument | Type | Description |
|---|---|---|
| full | boolean | |
| report_id* | string |
{
"type": "object",
"title": "get_reportArguments",
"required": [
"report_id"
],
"properties": {
"full": {
"type": "boolean",
"title": "Full",
"default": false
},
"report_id": {
"type": "string",
"title": "Report Id"
}
}
}List the states CompBasis covers (with whether each is live, and its caveats), the call limits for keyless and keyed use, and whether a new analysis can start now. Useful when an address is rejected as out of scope or a limit is reached.
No arguments.
{
"type": "object",
"title": "list_coverageArguments",
"properties": {}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 14, 2026.