Wrixton MCP Servers

Remote MCP (Model Context Protocol) servers hosted at mcp.wrixton.xyz — house and car search, plus a gateway that fronts both (and two other personal apps) behind one authenticated endpoint. Every tool below is documented with its parameters and a real sample response.

House search

/house/mcp

Zillow + 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.

Auth
None — open endpoint.
Legacy SSE
/house/sse
Tools
3
claude mcp add --transport http house-search https://mcp.wrixton.xyz/house/mcp
search_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.

ParamTypeDefaultDescription
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_priceinteger—Minimum price in USD.
max_priceinteger—Maximum price in USD.
min_bedsinteger—Minimum bedrooms.
min_bathsnumber—Minimum bathrooms.
property_types("house" | "condo" | "townhouse" | "multi_family" | "land" | "other")[]—Restrict to these property types (default: all).
limitinteger20Maximum 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 Redfin

Redfin only, via its public (unofficial) Stingray JSON API. Keyless — works out of the box.

ParamTypeDefaultDescription
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_priceinteger—Minimum price in USD.
max_priceinteger—Maximum price in USD.
min_bedsinteger—Minimum bedrooms.
min_bathsnumber—Minimum bathrooms.
property_types("house" | "condo" | "townhouse" | "multi_family" | "land" | "other")[]—Restrict to these property types (default: all).
limitinteger20Maximum 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.

ParamTypeDefaultDescription
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_priceinteger—Minimum price in USD.
max_priceinteger—Maximum price in USD.
min_bedsinteger—Minimum bedrooms.
min_bathsnumber—Minimum bathrooms.
property_types("house" | "condo" | "townhouse" | "multi_family" | "land" | "other")[]—Restrict to these property types (default: all).
limitinteger20Maximum number of results to return (1–50).
{
  "location": "Seattle, WA",
  "status": "for_sale",
  "min_beds": 4,
  "limit": 3
}

Car search

/cars/mcp

Dealer 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.

Auth
None — open endpoint.
Legacy SSE
/cars/sse
Tools
4
claude mcp add --transport http car-search https://mcp.wrixton.xyz/cars/mcp
search_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).

ParamTypeDefaultDescription
makestring—Vehicle make, e.g. "Toyota".
modelstring—Vehicle model, e.g. "RAV4".
condition"new" | "used" | "certified"—Restrict to new, used, or certified pre-owned (default: all).
year_mininteger—Earliest model year.
year_maxinteger—Latest model year.
price_mininteger—Minimum price in USD.
price_maxinteger—Maximum price in USD.
mileage_maxinteger—Maximum odometer miles.
zipstring—5-digit ZIP code to search near.
radius_milesinteger—Search radius in miles around the ZIP code (1–500).
limitinteger20Max 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 VIN

Decodes 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.

ParamTypeDefaultDescription
vin*string—The VIN to decode (17 characters; partial VINs of 11+ accepted).
{
  "vin": "2T3P1RFV0NC123456"
}
list_makesList car makes

Lists 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 make

Lists all models for a given make (optionally for a specific model year) from the free NHTSA vPIC API. No API key needed.

ParamTypeDefaultDescription
make*string—Vehicle make, e.g. "Honda".
yearinteger—Restrict to a specific model year.
{
  "make": "Honda",
  "year": 2023
}

Gateway

/gateway/mcp

Authenticated, 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/mcp

Backends

BackendReached asScoped toNotes
houselocalAny tenant — no per-user state.This deployment's house-search tools, called in-process (no HTTP hop).
carslocalAny tenant — no per-user state.This deployment's car-search tools, called in-process.
draft-appremoteOwner 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-trackerremoteOwner 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:

  1. DiscoveryClient GETs /.well-known/oauth-protected-resource, then /.well-known/oauth-authorization-server to find the authorize/token/register endpoints.
  2. Dynamic registrationPOST /gateway/oauth/register — no manual client setup.
  3. AuthorizeBrowser opens /gateway/oauth/authorize with PKCE params; the login page just asks for the admin-issued API key.
  4. 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.
Tenants are admin-issued — no public signup. Issue one with:
npm run gateway:create-tenant -- --name "Acme Inc" --email "ops@acme.example" --scopes house,cars

Sample 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 backend

The 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 dev

Test

npm testnpm run test:coveragenpm run typecheck

Inspect a server

npx @modelcontextprotocol/inspector \  http://localhost:3000/house/mcp

Claude 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"
      ]
    }
  }
}