realtystack-mcp
RemoteAbout realtystack-mcp
realtystack-mcp is a remote MCP adapter for RealtyStack's U.S. real-estate data API, for clients such as Claude and ChatGPT. It maps six read-only REST endpoints to tools covering property records, valuations, and active sale and rental listings.
Key features
- 01Search property records by address or area
- 02Retrieve an individual property's details
- 03Get sale-value estimates and comparable sales
- 04Get long-term rent estimates and comparable rentals
- 05Search for-sale listings
- 06Search long-term rental listings
Use cases
- 01Find property records in a location
- 02Review property estimates and comparable data
- 03Research current properties for sale
- 04Find long-term rental listings
MCP support
It exposes six typed tools to MCP clients through a single `/mcp` Streamable HTTP endpoint. The tools forward requests to the RealtyStack API and return its JSON results.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://realtystack-mcp.vercel.app/mcpclaude mcp add --transport http isaiahdupree-realtystack https://realtystack-mcp.vercel.app/mcp{"mcpServers":{"isaiahdupree-realtystack":{"type":"http","url":"https://realtystack-mcp.vercel.app/mcp"}}}Open in Cursor{"servers":{"isaiahdupree-realtystack":{"type":"http","url":"https://realtystack-mcp.vercel.app/mcp"}}}Open in VS Code{"mcpServers":{"isaiahdupree-realtystack":{"type":"http","url":"https://realtystack-mcp.vercel.app/mcp"}}}{"mcpServers":{"isaiahdupree-realtystack":{"serverUrl":"https://realtystack-mcp.vercel.app/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
6| Parameter | Type | Required | Description |
|---|---|---|---|
| city | string | No | City name; combine with state (and optionally zipCode) for an area search. |
| limit | integer | No | Max records to return per page. Default 50. |
| state | string | No | 2-character state abbreviation, e.g. TX. |
| offset | integer | No | Number of records to skip, for pagination. Default 0. |
| radius | number | No | Search radius in miles (max 100); used with latitude/longitude. |
| address | string | No | Full address, format "Street, City, State, Zip". Alternative to city/state/zipCode or lat+long. e.g. "5500 Grand Lake Dr, San Antonio, TX, 78244". |
| lotSize | string | No | Lot size in square feet; supports ranges and multiple values. |
| zipCode | string | No | 5-digit ZIP code. |
| bedrooms | string | No | Bedroom count; supports ranges and multiple values. |
| latitude | number | No | Latitude of the search center; requires longitude and radius. |
| bathrooms | string | No | Bathroom count; supports fractions, ranges, and multiple values. |
| longitude | number | No | Longitude of the search center; requires latitude and radius. |
| yearBuilt | string | No | Year built; supports ranges and multiple values. |
| propertyType | enum | No | Filter by property type.Single Family | Condo | Townhouse | Manufactured | Multi-Family | Apartment | Land |
| saleDateRange | string | No | Days since last sale (min 1) — restricts to properties last sold within that window. |
| squareFootage | string | No | Living-area square footage; supports ranges and multiple values. |
| includeTotalCount | boolean | No | When true, RentCast also returns the total matching count. Default false. |
Details
From the project READMErealtystack-mcp
A remote MCP (Model Context Protocol) connector for the RealtyStack API — U.S. real-estate data built on RentCast: property records search + single-record lookup, AVM sale-value and long-term-rent estimates with comparables, and active sale/rental listings, all in one flat /v1 JSON contract.
Upstream: https://realestate-api-kappa.vercel.app (RealtyStack REST API) — 6 tools, one per /v1 endpoint. Since the upstream deployment is metered (RapidAPI/Apify, and itself layered over RentCast's metered quota), this connector authenticates its own outbound calls with a server-side RapidAPI proxy secret (REALTYSTACK_MCP_PROXY_SECRET, sent as the X-RapidAPI-Proxy-Secret header) and applies a soft per-IP rate limit (REALTYSTACK_MCP_RATE_LIMIT, default 30 tool-calls/hour, in-memory) so this free MCP tier stays a discovery channel rather than an unmetered bypass of the paid listing — see lib/ratelimit.js.
What this is, and why it's a separate connector
RealtyStack is a plain REST API. Any HTTP client can already call it directly. This repo exists because MCP clients (Claude, ChatGPT, and other MCP-aware agents) don't consume arbitrary REST APIs — they consume MCP tools. realtystack-mcp is a thin adapter layer that:
- Exposes each RealtyStack
/v1endpoint as a discoverable, typed MCP tool (name, description, zod input schema, annotations) that an LLM can reason about and call directly, instead of having to be taught the REST surface out-of-band. - Speaks the MCP streamable-HTTP transport at a single
/mcpendpoint, so it can be registered as a connector in Claude, ChatGPT, or any other MCP client with one URL. - Does nothing else. It has no business logic of its own — every tool call is a pass-through
fetchto RealtyStack, and the JSON response RealtyStack returns is handed back verbatim as the tool result.
Authentication: none on the MCP caller side (deliberate)
RealtyStack's data has no per-user dimension — it's objective real-estate data (property records, valuation estimates, listings). There is nothing to gate per-caller, so this connector intentionally ships with:
- No OAuth, no login, no bearer tokens from the MCP client
- No Supabase / database
- No demo-vs-real account split — every caller gets the same real, live data
api/mcp.js builds a fresh, stateless McpServer per request and serves it with zero MCP-caller auth checks.
Upstream auth (outbound)
The upstream RealtyStack deployment gates every /v1/* route behind a RapidAPI proxy secret (see realestate-api/src/guard.js). This connector reaches real data by sending that same secret as the X-RapidAPI-Proxy-Secret header on its outbound fetch calls, read from the REALTYSTACK_MCP_PROXY_SECRET env var. Verified behavior: sending X-RapidAPI-Proxy-Secret passes the guard and returns real data; sending nothing returns 403 "This API is served through RapidAPI.". This is an upstream monetization detail — it does not add any auth to this connector, which still has zero MCP-caller auth by design.
Tool list
One tool per RealtyStack /v1 endpoint (from realestate-api/openapi.yaml; /api/health is intentionally not wrapped):
| Tool | RealtyStack endpoint | Description |
|---|---|---|
search_properties | GET /v1/properties | Search property records by address, city/state/zip, or lat/long radius, with structural filters. |
get_property | GET /v1/properties/{id} | Full detail for one property record by its RentCast id. |
avm_value | GET /v1/avm/value | AVM sale-value estimate (point + range) with scored comparable sales. |
avm_rent | GET /v1/avm/rent | AVM long-term-rent estimate (point + range) with scored comparable rentals. |
search_sale_listings | GET /v1/listings/sale | Active (or inactive) for-sale listings with MLS + agent/office contact. |
search_rental_listings | GET /v1/listings/rental | Active (or inactive) long-term rental listings. |
All 6 tools are read-only GETs, annotated { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true } — none of them write anything, and all of them reflect live, externally-changing real-estate data.
How it wraps realestate-api
Each tool handler does a plain fetch(\${REALTYSTACK_MCP_API_BASE_URL}${path}`, ...)against the real RealtyStack REST API (adding theX-RapidAPI-Proxy-Secret` header when configured) and returns the parsed JSON as MCP tool-result content:
{ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }
Upstream HTTP errors (4xx/5xx) are caught and surfaced as a typed MCP error result via an asError helper rather than crashing the request.
Environment variables
| Var | Purpose | Default |
|---|---|---|
REALTYSTACK_MCP_API_BASE_URL | Upstream RealtyStack base URL | https://realestate-api-kappa.vercel.app |
REALTYSTACK_MCP_PROXY_SECRET | Sent as X-RapidAPI-Proxy-Secret to pass the upstream guard | (unset — 403 from guarded upstream) |
REALTYSTACK_MCP_RATE_LIMIT | Soft per-IP tools/call cap per hour | 30 |
Project layout
api/mcp.js MCP endpoint (StreamableHTTPServerTransport, stateless, no caller auth)
api/health.js GET /api/health
lib/tools.js All 6 tool definitions (zod schemas + fetch-and-forward handlers)
lib/ratelimit.js Soft in-memory per-IP tools/call cap
local-server.js Plain-Node http server for local dev / smoke testing (not deployed)
test/smoke.mjs Real end-to-end smoke test (initialize, tools/list, tools/call)
vercel.json Routes /mcp -> api/mcp.js, /health -> api/health.js
server.json MCP registry metadata
Local development
npm install
npm run dev # starts local-server.js on http://localhost:3900
Endpoints locally: POST http://localhost:3900/mcp, GET http://localhost:3900/health.
To hit real upstream data locally, set the proxy secret:
REALTYSTACK_MCP_PROXY_SECRET=<secret> npm run dev
Smoke test
npm run dev & # terminal 1
npm run smoke # terminal 2
test/smoke.mjs drives the running server over real HTTP/JSON-RPC and verifies:
GET /healthreturns{ ok: true, ... }initializesucceeds and reportsserverInfo.name === "realtystack"tools/listreturns all 6 tools with their zod-derived JSON schemastools/callforsearch_propertiesexercises the tool end-to-end (whenREALTYSTACK_MCP_PROXY_SECRETis set it asserts a real upstream result; without it, the tool-calling mechanics are still proven and the upstream's honest 403 guard response is accepted)
Deploy
Not deployed by this build (verify first). Once verified:
cd /Users/isaiahdupree/Software/realtystack-mcp
npx vercel --yes --prod
After deploy, the MCP connector URL to register in Claude/ChatGPT/any MCP client is:
https://<deployment-domain>/mcp
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.