Fless Apartment Hunt

Apartment hunting across 13 US states: rents, briefs, hunt links.

Should I use this

Quality & Safety

A
Description quality
95%
Schema completeness
83%
Naming quality
89%
Poisoning risk
100%
Permission match
90%
Protocol compliance
100%

Findings (5)

  • MEDIUMTool 'search_cities' description contains placeholder textin search_cities
  • LOWTool 'get_city_overview' description lacks action verbin get_city_overview
  • LOWTool 'get_city_request_stats' description lacks action verbin get_city_request_stats
  • LOWTool 'realtor_list_candidate_buildings' name length outside 3-30 rangein realtor_list_candidate_buildings
  • LOWTool 'fetch' suggests web access but openWorldHint=falsein fetch

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,759Tokens (tool definitions)
~716 BTypical response size
Significant attention impact (2.16% of 128k context)

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-http

What it can do

Tool inventory

Tools (19)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

research_workflow
Search for [topic], then get detailed information about the top results using Fless Apartment Hunt
Expected tools: search_citiesget_city_overview
search_research
Search for information about [topic] using Fless Apartment Hunt
Expected tools: search_cities
retrieve_data
Get details about [item] from Fless Apartment Hunt
Expected tools: get_city_overview
find_specific
Find [specific item] using Fless Apartment Hunt
Expected tools: search_cities
fetch_info
Fetch [information type] using Fless Apartment Hunt
Expected tools: get_city_overview

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded19 tools
verifiedversion not recorded19 tools
verifiedversion not recorded19 tools
verifiedversion not recorded19 tools
verifiedversion not recorded11 tools
verifiedversion not recorded11 tools