Fless Apartment Hunt
Apartment hunting across 13 US states: rents, briefs, hunt links.
Should I use this
Quality & Safety
Findings (5)
- MEDIUMin search_cities
- LOWin get_city_overview
- LOWin get_city_request_stats
- LOWin realtor_list_candidate_buildings
- LOWin fetch
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"mcp": {
"url": "https://mcp.fless.io/mcp"
}
}
}Remote endpoints
https://mcp.fless.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (19)
🟢search_cities(query)
List cities where Fless operates (live + coming soon). Returns ids needed for hunts.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Optional name/state filter"
}
}
}🟢get_city_overview(city)
Neighborhood-level overview of a live city: median rents (1BR/2BR), walk/transit/bike scores per neighborhood.
Input Schema
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City slug or name, e.g. 'alexandria'"
}
},
"required": [
"city"
]
}🟢get_neighborhood(city, neighborhood)
Full detail for one neighborhood: rents, scores, POI counts, descriptions, nearby neighborhoods.
Input Schema
{
"type": "object",
"properties": {
"city": {
"type": "string"
},
"neighborhood": {
"type": "string",
"description": "slug or name"
}
},
"required": [
"city",
"neighborhood"
]
}🟢get_hunt_requirements(city)
Every hunt field, enum, and rule; canonical amenity keys; binary restrictions (55+, pets, smoking); transparent credit pricing. Read this before collecting a hunt brief.
Input Schema
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Optional city to pin the brief to"
}
}
}🟢build_hunt_link(hunt_params, channel)
Validate a hunt brief and get a URL that pre-fills the full hunt form for the human. Works with partial briefs (missing_fields lists what to collect).
Input Schema
{
"type": "object",
"properties": {
"hunt_params": {
"type": "object",
"description": "Hunt brief per get_hunt_requirements (city_id, min_price, max_price, bedrooms, move_in_date, proximity_criteria[], amenities{}, additional_questions[])"
},
"channel": {
"type": "string",
"description": "Your product name, e.g. 'claude', 'openclaw'"
}
},
"required": [
"hunt_params"
]
}🟢check_hunt_link(token)
Aggregate status of a hunt link (created/opened/started) — no personal data.
Input Schema
{
"type": "object",
"properties": {
"token": {
"type": "string"
}
},
"required": [
"token"
]
}🟢request_city(city, state)
Request that Fless expand to a new city. Use when the user's target city is not currently served (check live coverage first with search_cities). Returns the total request count for that city. No account or email needed.
Input Schema
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name, e.g. 'Houston'",
"maxLength": 100
},
"state": {
"type": "string",
"description": "2-letter US state code, e.g. 'TX'",
"pattern": "^[A-Z]{2}$"
}
},
"required": [
"city",
"state"
]
}🟢get_city_request_stats
See which cities have been requested most. Useful for telling users whether their city has demand.
Input Schema
{
"type": "object",
"properties": {}
}🟢search(query)
Search Fless content (cities, neighborhoods, hunt guide). Returns citable ids for fetch.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string"
}
},
"required": [
"query"
]
}🟢fetch(id)
Fetch full content by id from search: markdown text + canonical url for citations.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "city:<slug> | neighborhood:<city>:<nb> | doc:hunt-how-to"
}
},
"required": [
"id"
]
}🟡submit_error_report(error_type, tool_name, error_code, what_happened, what_expected)
Report a problem with Fless tools or data so we can fix it. Include: the tool you called, the error code from the error contract if present, what happened vs what you expected. Do NOT include personal data.
Input Schema
{
"type": "object",
"properties": {
"error_type": {
"type": "string",
"enum": [
"tool_error",
"bad_data",
"missing_city",
"documentation",
"auth",
"rate_limit",
"other"
],
"description": "What kind of problem this is."
},
"tool_name": {
"type": "string",
"enum": [
"search_cities",
"get_city_overview",
"get_neighborhood",
"get_hunt_requirements",
"build_hunt_link",
"check_hunt_link",
"request_city",
"get_city_request_stats",
"search",
"fetch",
"submit_error_report",
"website",
"docs",
"other"
],
"description": "The tool (or surface) the problem occurred on."
},
"error_code": {
"type": "string",
"pattern": "^[A-Z][A-Z0-9_]{0,63}$",
"description": "Error code from the error contract, if present (e.g. CITY_NOT_FOUND). Omit when absent."
},
"what_happened": {
"type": "string",
"minLength": 10,
"maxLength": 1000,
"description": "Factual description of what happened (plain text, no personal data, 10-1000 chars)."
},
"what_expected": {
"type": "string",
"maxLength": 500,
"description": "What you expected to happen instead (optional)."
}
},
"required": [
"error_type",
"tool_name",
"what_happened"
]
}🟢realtor_list_clients
Realtor tool: requires Authorization: Bearer with an API key (create one at fless.io/realtor under API keys); anonymous calls return the structured UNAUTHORIZED error. Accepted clients (id, name, email) + pending invitations (email, expires).
Input Schema
{
"type": "object",
"properties": {}
}🟡realtor_create_client(email, first_name, last_name)
Realtor tool: requires Authorization: Bearer with an API key (create one at fless.io/realtor under API keys); anonymous calls return the structured UNAUTHORIZED error. Invite a client by email; the invitation email carries a 7-day accept link. Gated on an active subscription/trial.
Input Schema
{
"type": "object",
"properties": {
"email": {
"type": "string"
},
"first_name": {
"type": "string"
},
"last_name": {
"type": "string"
}
},
"required": [
"email",
"first_name",
"last_name"
]
}🟡realtor_create_hunt(name, city_id, client_user_id, client_email, min_price, ...)
Realtor tool: requires Authorization: Bearer with an API key (create one at fless.io/realtor under API keys); anonymous calls return the structured UNAUTHORIZED error. Create a hunt FOR one of your clients (fields mirror get_hunt_requirements). Returns hunt_id + matched_count; the hunt parks at awaiting_realtor_curation. Gated on an active subscription/trial.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Optional hunt name; when omitted it is derived from bedrooms + the hunt's POIs (e.g. '2 bed near Logan Circle')."
},
"city_id": {
"type": "integer",
"description": "Live city id (search_cities returns ids)"
},
"client_user_id": {
"type": "integer",
"description": "Your client's user id (realtor_list_clients). Provide client_user_id OR client_email."
},
"client_email": {
"type": "string",
"description": "Alternative to client_user_id: the client's linked email"
},
"min_price": {
"type": "number",
"description": "Monthly USD"
},
"max_price": {
"type": "number",
"description": "Monthly USD, > min_price"
},
"bedrooms": {
"type": "string",
"enum": [
"0",
"1",
"2",
"3",
"4",
"4+",
"studio"
]
},
"move_in_date": {
"type": "string",
"format": "YYYY-MM-DD",
"description": "Must be a future date"
},
"proximity_criteria": {
"type": "array",
"description": "POIs the hunt centers on (name, latitude, longitude, category?, max_distance miles 0.1-10)",
"items": {
"type": "object"
}
}
},
"required": [
"city_id"
]
}🟢realtor_list_candidate_buildings(hunt_id)
Realtor tool: requires Authorization: Bearer with an API key (create one at fless.io/realtor under API keys); anonymous calls return the structured UNAUTHORIZED error. The matched candidate list for one of your hunts (counts + buildings with eligibility, distance, and your curation status).
Input Schema
{
"type": "object",
"properties": {
"hunt_id": {
"type": "integer"
}
},
"required": [
"hunt_id"
]
}🟢realtor_curate_hunt(hunt_id, removals, notes)
Realtor tool: requires Authorization: Bearer with an API key (create one at fless.io/realtor under API keys); anonymous calls return the structured UNAUTHORIZED error. Curate the candidate list WITHOUT sending: removals [{id, reason?}] and notes [{id, internal_notes?, client_notes?}] (hunt_building ids from realtor_list_candidate_buildings). Not gated.
Input Schema
{
"type": "object",
"properties": {
"hunt_id": {
"type": "integer"
},
"removals": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"reason": {
"type": "string"
}
}
}
},
"notes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"internal_notes": {
"type": "string",
"description": "Private to you (never shown to the client)"
},
"client_notes": {
"type": "string",
"description": "Shown to the client in review"
}
}
}
}
},
"required": [
"hunt_id"
]
}🟡realtor_add_building_to_hunt(hunt_id, query)
Realtor tool: requires Authorization: Bearer with an API key (create one at fless.io/realtor under API keys); anonymous calls return the structured UNAUTHORIZED error. Search your hunt's building inventory by name and manually add the one unambiguous match into the hunt (several matches: top 3 are named and nothing is added).
Input Schema
{
"type": "object",
"properties": {
"hunt_id": {
"type": "integer"
},
"query": {
"type": "string",
"description": "Building name fragment (min 2 chars)"
}
},
"required": [
"hunt_id",
"query"
]
}🟡realtor_send_to_client(hunt_id)
Realtor tool: requires Authorization: Bearer with an API key (create one at fless.io/realtor under API keys); anonymous calls return the structured UNAUTHORIZED error. Send the curated list to the client: every non-removed building becomes included and the hunt moves to awaiting_client_approval (the CLIENT releases outreach). Gated on an active subscription/trial.
Input Schema
{
"type": "object",
"properties": {
"hunt_id": {
"type": "integer"
}
},
"required": [
"hunt_id"
]
}🟢realtor_get_hunt_status(hunt_id)
Realtor tool: requires Authorization: Bearer with an API key (create one at fless.io/realtor under API keys); anonymous calls return the structured UNAUTHORIZED error. Status of one of your hunts: review_state, counts, and the client's name.
Input Schema
{
"type": "object",
"properties": {
"hunt_id": {
"type": "integer"
}
},
"required": [
"hunt_id"
]
}Recommended Prompts
search_citiesget_city_overviewsearch_citiesget_city_overviewsearch_citiesget_city_overviewCommunity
Evidence