streeteasy-mcp
This server provides an MCP interface to the StreetEasy GraphQL API, enabling LLM agents to search and retrieve NYC rental listings.
search_rentals: Search active NYC rentals filtered by area (name or numeric code), price range, bedrooms, bathrooms, amenities (e.g.WASHER_DRYER,DOORMAN,GYM), no-fee, and pet-friendly options. Supports sorting and pagination (up to 100/page). Returns compact summaries with listing IDs, photos, and URLs.get_rental_details: Retrieve full details for a single listing by ID, including description, amenities, pricing history, building info, nearby transit/schools, and media (photos, floor plans, YouTube/Vimeo videos, 3D tours).list_areas: Look up StreetEasy area names and numeric codes, with optional substring filtering (e.g.'brooklyn','harlem').list_amenities: List all valid amenity enum tokens accepted bysearch_rentals.
Notable limitations: Contact info and tour scheduling are not supported (users follow the listing URL directly). Cloud/datacenter deployments may require a residential proxy to bypass StreetEasy's bot-detection.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@streeteasy-mcpSearch for 2-bedroom apartments in Brooklyn under $3000"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
streeteasy-mcp
A remote MCP server that wraps the StreetEasy GraphQL API so an LLM agent can search and parse NYC rental listings.
It vendors the streeteasy-api
client (v0.4.0) and exposes it over either stdio (local) or Streamable
HTTP (remote) transport, so it can be connected to by Claude or any MCP client.
StreetEasy blocks datacenter/cloud IPs. Its API sits behind PerimeterX
bot-detection that 403s cloud/datacenter IPs (AWS, GCP, Railway, etc.). The
HTTP build deploys fine and the MCP layer works, but the upstream
search_rentals / get_rental_details calls fail from a datacenter unless you
do one of:
Run the stdio server locally from a normal home connection — see Run as a local MCP server, or
Route upstream calls through a residential proxy by setting
STREETEASY_PROXY— this is what lets the hosted HTTP build (Railway, etc.) reach the API. See Proxy / bot-detection.
Tools
Tool | Description |
| Search active NYC rentals by area, price, beds, baths, amenities, pets. Returns compact listings + |
| Full detail for one listing id: description, amenities, pricing history, building info, nearby transit/schools, and resolved media — |
| Look up StreetEasy area names ↔ numeric codes (optionally filtered by a search term). |
| List the valid amenity enum tokens. |
search_rentals accepts area names ("MANHATTAN", "Williamsburg",
"upper east side") or numeric codes, and validates amenity tokens against the
known set.
Media
Photos resolve to Zillow's CDN (photos.zillowstatic.com/fp/{key}-se_large_800_400.jpg),
videos to their provider watch URL (YouTube/Vimeo) plus a thumbnail, and 3D
tours to a direct tour3dUrl. All are public — no auth required.
Not included: contact info & inquiries
Listing agent contact details and "request a tour" inquiries are not exposed.
They live behind StreetEasy's contact flow, which is protected by PerimeterX
bot-detection (a "Press & Hold" human check). Automating it would mean evading
bot-detection, so it's intentionally left out — the right pattern is to surface
the listing url and let a human submit the tour request in their browser.
Related MCP server: nyc-property-intel
Endpoints
POST /mcp— the MCP Streamable HTTP endpoint (stateless). Requires a bearer token unlessMCP_DISABLE_AUTHis set — see Authentication.GET /andGET /health— health checks.OAuth:
/.well-known/oauth-authorization-server,/.well-known/oauth-protected-resource,/register,/authorize,/token,/revoke.
Run as a local MCP server (recommended)
Runs over stdio from your machine's residential IP — the configuration that actually reaches StreetEasy.
npm install
npm run build
# register with Claude Code (uses the stdio entry point):
claude mcp add streeteasy -- node "$(pwd)/dist/stdio.js"Then ask Claude to search rentals. To run the stdio server by hand:
npm run start:stdioRun as an HTTP server
npm install
npm run build
npm start # listens on $PORT (default 3000), POST /mcpTest it with the MCP SDK client (see test-client.mjs):
MCP_URL=http://localhost:3000/mcp node test-client.mjsConfiguration
Env var | Purpose |
| Port to listen on. Railway sets this automatically. |
| Public origin the server is reachable at (the OAuth issuer), e.g. |
| Set to |
| Optional. HTTP/HTTPS proxy for all upstream StreetEasy calls, e.g. |
Authentication (OAuth 2.1 + Dynamic Client Registration)
The HTTP transport requires OAuth by default — MCP clients (Claude, etc.) run the standard authorization flow automatically, so you usually don't configure anything. The server is a self-contained OAuth 2.1 authorization server:
Advertises metadata at
/.well-known/oauth-authorization-serverand/.well-known/oauth-protected-resource.Supports Dynamic Client Registration (RFC 7591) at
/register, so clients self-register with no manualclient_id/client_secret./authorize(PKCE S256 required) →/token(authorization-code + refresh), with/revokefor revocation.Unauthenticated
POST /mcpreturns401with aWWW-Authenticateheader pointing at the protected-resource metadata, which kicks off discovery + DCR.
Because the tools expose only public listing data, there's no per-user login:
authorization is auto-approved and the issued bearer token simply gates /mcp.
Tokens are held in memory (single replica); a restart just makes clients
transparently re-register. Set MCP_DISABLE_AUTH=1 to turn the whole layer off.
Proxy / bot-detection
StreetEasy 403s datacenter IPs, so any cloud host (Railway included) must send
upstream requests through a residential proxy. Set STREETEASY_PROXY to a
proxy URL (credentials may be embedded, e.g.
http://user:pass@host:port) and all StreetEasy GraphQL traffic is tunnelled
through it. On startup the server logs the proxy in use with credentials
redacted (Outbound proxy: http://***:***@host:port).
Rotating residential proxies hand out a fresh exit IP per connection, and a
clean IP isn't guaranteed every time, so the client automatically retries a
403 bot-challenge (up to 3 times when a proxy is set) to land on a good IP.
A local stdio server on a residential connection doesn't need a proxy.
Deploy on Railway
This repo ships a Dockerfile. With the Railway CLI:
railway login
railway init --name streeteasy-mcp
# Cloud hosts are datacenter IPs — set a residential proxy so calls aren't 403'd:
railway variables --set "STREETEASY_PROXY=http://user:pass@host:port"
railway up
railway domain # generate a public URL
# Set the OAuth issuer to your public URL (or rely on RAILWAY_PUBLIC_DOMAIN):
railway variables --set "PUBLIC_BASE_URL=https://<your-app>.up.railway.app"Connect from Claude Code
claude mcp add --transport http streeteasy https://<your-app>.up.railway.app/mcpThe client discovers the OAuth endpoints and registers itself automatically
(Dynamic Client Registration) — no client_id / token to configure.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Alec2435/streeteasy-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server