House search
/house/mcpZillow + Redfin listing search
Search for-sale and recently-sold homes across Zillow and Redfin, with a merged/de-duplicated view. Fully public — no API key required to run, though Zillow is far more reliable with one configured server-side.
claude mcp add --transport http house-search https://mcp.wrixton.xyz/house/mcpsearch_homesSearch homes (Zillow + Redfin)Searches Zillow and Redfin simultaneously, merges and de-duplicates by normalized address (Redfin wins collisions), sorts by ascending price, and reports a per-source status so partial results still come back if one source fails.
| Param | Type | Default | Description |
|---|---|---|---|
| location* | string | — | City, neighborhood, ZIP, or address — e.g. "Seattle, WA" or "98103". |
| status | "for_sale" | "sold" | "for_sale" | Search active listings or recently sold homes. |
| min_price | integer | — | Minimum price in USD. |
| max_price | integer | — | Maximum price in USD. |
| min_beds | integer | — | Minimum bedrooms. |
| min_baths | number | — | Minimum bathrooms. |
| property_types | ("house" | "condo" | "townhouse" | "multi_family" | "land" | "other")[] | — | Restrict to these property types (default: all). |
| limit | integer | 20 | Maximum number of results to return (1–50). |
{
"location": "Seattle, WA",
"status": "for_sale",
"min_price": 600000,
"max_price": 900000,
"min_beds": 3,
"limit": 5
}search_redfinSearch RedfinRedfin only, via its public (unofficial) Stingray JSON API. Keyless — works out of the box.
| Param | Type | Default | Description |
|---|---|---|---|
| location* | string | — | City, neighborhood, ZIP, or address — e.g. "Seattle, WA" or "98103". |
| status | "for_sale" | "sold" | "for_sale" | Search active listings or recently sold homes. |
| min_price | integer | — | Minimum price in USD. |
| max_price | integer | — | Maximum price in USD. |
| min_beds | integer | — | Minimum bedrooms. |
| min_baths | number | — | Minimum bathrooms. |
| property_types | ("house" | "condo" | "townhouse" | "multi_family" | "land" | "other")[] | — | Restrict to these property types (default: all). |
| limit | integer | 20 | Maximum number of results to return (1–50). |
{
"location": "98103",
"status": "for_sale",
"limit": 3
}search_zillowSearch Zillowrequires ZILLOW_RAPIDAPI_KEY (optional, recommended)Zillow only. Uses a RapidAPI wrapper when ZILLOW_RAPIDAPI_KEY is configured (recommended — Zillow blocks most datacenter IPs otherwise); falls back to Zillow's own endpoint with browser-like headers.
| Param | Type | Default | Description |
|---|---|---|---|
| location* | string | — | City, neighborhood, ZIP, or address — e.g. "Seattle, WA" or "98103". |
| status | "for_sale" | "sold" | "for_sale" | Search active listings or recently sold homes. |
| min_price | integer | — | Minimum price in USD. |
| max_price | integer | — | Maximum price in USD. |
| min_beds | integer | — | Minimum bedrooms. |
| min_baths | number | — | Minimum bathrooms. |
| property_types | ("house" | "condo" | "townhouse" | "multi_family" | "land" | "other")[] | — | Restrict to these property types (default: all). |
| limit | integer | 20 | Maximum number of results to return (1–50). |
{
"location": "Seattle, WA",
"status": "for_sale",
"min_beds": 4,
"limit": 3
}Car search
/cars/mcpDealer inventory + VIN/reference data
Search new/used/certified-pre-owned dealer inventory nationwide via Auto.dev, plus keyless VIN decoding and make/model reference data from the official NHTSA vPIC API.
claude mcp add --transport http car-search https://mcp.wrixton.xyz/cars/mcpsearch_carsSearch car listingsrequires AUTO_DEV_API_KEY (required)Searches dealer inventory nationwide for new, used, or certified pre-owned cars via the Auto.dev listings API. Filter by make/model, year range, price, mileage, and location (ZIP + radius).
| Param | Type | Default | Description |
|---|---|---|---|
| make | string | — | Vehicle make, e.g. "Toyota". |
| model | string | — | Vehicle model, e.g. "RAV4". |
| condition | "new" | "used" | "certified" | — | Restrict to new, used, or certified pre-owned (default: all). |
| year_min | integer | — | Earliest model year. |
| year_max | integer | — | Latest model year. |
| price_min | integer | — | Minimum price in USD. |
| price_max | integer | — | Maximum price in USD. |
| mileage_max | integer | — | Maximum odometer miles. |
| zip | string | — | 5-digit ZIP code to search near. |
| radius_miles | integer | — | Search radius in miles around the ZIP code (1–500). |
| limit | integer | 20 | Max results (1–50). |
{
"make": "Toyota",
"model": "RAV4",
"condition": "certified",
"year_min": 2021,
"price_max": 35000,
"zip": "98103",
"radius_miles": 50,
"limit": 3
}decode_vinDecode a VINDecodes a 17-character VIN using the free official NHTSA vPIC API. Returns make, model, year, trim, engine, and plant data. Empty/placeholder fields ('Not Applicable', etc.) are stripped. No API key needed.
| Param | Type | Default | Description |
|---|---|---|---|
| vin* | string | — | The VIN to decode (17 characters; partial VINs of 11+ accepted). |
{
"vin": "2T3P1RFV0NC123456"
}list_makesList car makesLists all passenger-car makes known to NHTSA. Useful for validating make names before calling search_cars. No API key needed.
No input parameters.
{}list_modelsList models for a makeLists all models for a given make (optionally for a specific model year) from the free NHTSA vPIC API. No API key needed.
| Param | Type | Default | Description |
|---|---|---|---|
| make* | string | — | Vehicle make, e.g. "Honda". |
| year | integer | — | Restrict to a specific model year. |
{
"make": "Honda",
"year": 2023
}Gateway
/gateway/mcpAuthenticated, multi-tenant proxy in front of all four backends
A hand-rolled reverse proxy (MCP SDK's low-level Server, not mcp-handler) that fronts house, cars, and two other personal apps' remote MCP servers behind one bearer-token-authenticated endpoint. It exists so auth and per-call usage logging live in one place instead of each backend doing its own thing.
claude mcp add --transport http gateway https://mcp.wrixton.xyz/gateway/mcpBackends
| Backend | Reached as | Scoped to | Notes |
|---|---|---|---|
| house | local | Any tenant — no per-user state. | This deployment's house-search tools, called in-process (no HTTP hop). |
| cars | local | Any tenant — no per-user state. | This deployment's car-search tools, called in-process. |
| draft-app | remote | Owner tenant only — operates on personal draft data. | A separate personal app's own remote MCP server, reached over HTTP with a gateway-held bearer token. |
| project-tracker | remote | Owner tenant only — operates on personal tracker data. | Another separate personal app's remote MCP server, same proxy pattern as draft-app. |
Connecting via OAuth
Unlike house/cars, the gateway is protected — but it still works with Claude's one-click connector UI. Under the hood it's a bearer-token check wrapped in an OAuth 2.1 + PKCE flow that just asks the caller to paste in an admin-issued API key:
- DiscoveryClient GETs /.well-known/oauth-protected-resource, then /.well-known/oauth-authorization-server to find the authorize/token/register endpoints.
- Dynamic registrationPOST /gateway/oauth/register — no manual client setup.
- AuthorizeBrowser opens /gateway/oauth/authorize with PKCE params; the login page just asks for the admin-issued API key.
- Token exchangePOST /gateway/oauth/token with the authorization code exchanges it for a bearer token — that same API key — which the client then sends as Authorization: Bearer <token> on every request to /gateway/mcp.
npm run gateway:create-tenant -- --name "Acme Inc" --email "ops@acme.example" --scopes house,carsSample calls
Tool names pass through unchanged — search_cars on the gateway is the same tool as search_cars on /cars/mcp directly.
tools/listmerged tool list for a house+cars-scoped tenant{
"tools": [
{
"name": "search_homes",
"description": "Search Zillow and Redfin, merge and de-duplicate by address, sort by price…"
},
{
"name": "search_redfin",
"description": "Search Redfin for homes…"
},
{
"name": "search_zillow",
"description": "Search Zillow for homes…"
},
{
"name": "search_cars",
"description": "Search dealer inventory nationwide for new, used, or certified pre-owned cars…"
},
{
"name": "decode_vin",
"description": "Decode a 17-character VIN using the free official NHTSA vPIC API…"
},
{
"name": "list_makes",
"description": "List all passenger-car makes known to NHTSA…"
},
{
"name": "list_models",
"description": "List all models for a given make…"
}
]
}tools/callproxied straight to the cars backendThe gateway finds the first in-scope backend that declares the tool, forwards the call unchanged, and logs {tenant, backend, tool, ok, durationMs} to mcp_gateway.usage_log — win or lose.
{
"name": "search_cars",
"arguments": {
"make": "Honda",
"model": "CR-V",
"limit": 5
}
}Development
Built with mcp-handler for house/cars — Streamable HTTP is the primary transport, with legacy SSE at /house/sse and /cars/sse. The gateway is hand-rolled on the MCP SDK’s low-level Server since mcp-handler doesn’t support proxying tool schemas it didn’t itself define.
Run locally
npm installnpm run devTest
npm testnpm run test:coveragenpm run typecheckInspect a server
npx @modelcontextprotocol/inspector \ http://localhost:3000/house/mcpClaude Desktop / stdio-only clients
{
"mcpServers": {
"house-search": {
"command": "npx",
"args": [
"mcp-remote",
"https://mcp.wrixton.xyz/house/mcp"
]
},
"car-search": {
"command": "npx",
"args": [
"mcp-remote",
"https://mcp.wrixton.xyz/cars/mcp"
]
}
}
}