Skip to main content
Glama

Homejourney Singapore property listings

Compare Homejourney listings

compare_listings
Read-only

Use this after search_listings or list_saved_properties when the user wants two to six Homejourney listings compared side by side. Pass their listing_ids (a saved home's property_id), and optionally the user criteria: budget, bedrooms, bathrooms, preferred districts or MRT stations, the longest acceptable walk to the MRT, the fewest years of lease that must remain, and must-have features. Returns the listings ranked against those criteria, each with its score out of 100 (null when no criterion given can be judged) and the points it earns on each criterion, the reasons it fits, its tradeoffs and any missing data, plus price, size, nearest MRT, nearby schools, the nearest childcare centres and preschools and, for an HDB flat, the lease left on its block. Never returns owner or agent contact details. To show the result as a card, pass it to render_shortlist.

Input Schema

NameRequiredDescriptionDefault
hostNoThe AI app making this call, such as chatgpt or claude. It records where the request came from; it is not the listing owner or agent.
criteriaNo
listing_idsYes
host_reference_idNo

Output Schema

NameRequiredDescriptionDefault
dataYes
nextStepsNoSuggestions for what the user usually does next, best first. Each names the tool to call or the page to open; none is taken without the user asking, and a tool that writes still needs their confirmation.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / gcbArea
      Added value: +{
      +  "description": "Details only: the URA Good Class Bungalow area a landed home stands in, from its location, such as Kilburn Estate; null outside every area. The Ministry of Law has approved no foreign buyer, PRs included, for one since 2021.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  2. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / financing
      Added value: +{
      +  "description": "Details only, for a sale listing: the financing figures its web page shows at the asking price and lease, for a Singapore citizen's first home with no other loans. primary is the bank loan; options adds the HDB loan for an HDB flat when its lease allows one. grossIncomeNeeded is the monthly income a loan needs under incomeLimitLabel (MSR for an HDB flat, else TDSR) at stressRatePct. buyerStampDuty, legalFees and totalUpfront (down payment, BSD and legal fees, no ABSD) are in S$. buyerAge is the youngest buyer's age assumed; estimate_mortgage_options takes another age or residency. Null for a rental.",
      +  "properties": {
      +    "buyerAge": {
      +      "type": "integer"
      +    },
      +    "buyerStampDuty": {
      +      "type": "number"
      +    },
      +    "cpfUsagePct": {
      +      "type": "number"
      +    },
      +    "legalFees": {
      +      "type": "number"
      +    },
      +    "options": {
      +      "items": {
      +        "additionalProperties": true,
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "primary": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    "remainingLeaseYears": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "totalUpfront": {
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "primary",
      +    "totalUpfront"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  3. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / requestedListing
      Added value: +{
      +  "description": "Details and compare: the id asked for when it is one portal's listing of this home, such as an agent's own listing from search_agents, which Homejourney shows as this listing (id). platform and price are that portal's; sourceAgents names each portal's agent. Use id for viewings and saves.",
      +  "properties": {
      +    "id": {
      +      "format": "uuid",
      +      "type": "string"
      +    },
      +    "platform": {
      +      "type": "string"
      +    },
      +    "price": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  4. Changed2 schema fields changed
    • changedOutput schema / properties / data / properties / listings / items / properties / listingCluster / description
      Previous value: -"Search only: this result stands for listingCount listings one agent lists at one address (scope address) or in one development (scope development), itself and otherListingIds, priced minPrice to maxPrice. Absent for a listing no other on the page joins. The listings may be different homes, since an agent can list two flats in one block; pass an id to get_listing_details to tell them apart."New value: +"Search only: this result stands for listingCount listings one agent lists at one address (scope address) or in one development (scope development), itself and otherListingIds, priced minPrice to maxPrice. Absent for a listing no other on this page or the next joins. The listings may be different homes, since an agent can list two flats in one block; pass an id to get_listing_details to tell them apart."
    • addedOutput schema / properties / data / properties / listings / items / properties / listingCluster / properties / listingsOnThisPage
      Added value: +{
      +  "description": "Present when some of them are on the next page: how many are on this one. The next page leaves those out and names this result in continuedClusters.",
      +  "minimum": 1,
      +  "type": "integer"
      +}
  5. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / listingCluster
      Added value: +{
      +  "description": "Search only: this result stands for listingCount listings one agent lists at one address (scope address) or in one development (scope development), itself and otherListingIds, priced minPrice to maxPrice. Absent for a listing no other on the page joins. The listings may be different homes, since an agent can list two flats in one block; pass an id to get_listing_details to tell them apart.",
      +  "properties": {
      +    "listingCount": {
      +      "minimum": 2,
      +      "type": "integer"
      +    },
      +    "maxPrice": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "minPrice": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "otherListingIds": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "scope": {
      +      "enum": [
      +        "address",
      +        "development"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "listingCount",
      +    "otherListingIds",
      +    "scope"
      +  ],
      +  "type": "object"
      +}
  6. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / hdbFlatTypeUnknownReason
      Added value: +{
      +  "description": "For an HDB flat without hdbFlatType: why its type is unverified. no_block and no_block_records: its block has no HDB resale records yet; no_size_match: its size matches no flat type in its block's records; ambiguous: its size fits more than one flat type in its block; no_size: the listing gives no floor area.",
      +  "type": "string"
      +}
  7. Changed2 schema fields changed
    • changedOutput schema / properties / data / properties / listings / description
      Previous value: -"Each listing also carries its rank, reasonCodes and reasons (the same reasons in plain words), tradeoffs, and score out of 100 over the criteria given that its data answers, or null when it answers none or none were given; scoreBreakdown gives each criterion its points of maxPoints, or null points when the data cannot answer it (also listed in missingData)."New value: +"Each listing also carries its rank, reasonCodes and reasons (the same reasons in plain words), tradeoffs, and score out of 100 over the criteria given that its data answers, or null when it answers none or none were given; scoreBreakdown gives each criterion its points of maxPoints, or null points when the data cannot answer it (also listed in missingData). nearestPreschools lists the three nearest ECDA-licensed childcare centres, kindergartens and early years centres within 1 km (name, place, distanceKm, walkMinutes); credit \"Contains information from ECDA\" when you show them."
    • changedOutput schema / properties / data / properties / listings / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them) and busStops (LTA bus stops within 400 m: code, name, place as the road, services as the bus numbers that call there, walkMinutes; credit \"Contains information from LTA DataMall\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them), busStops (LTA bus stops within 400 m: code, name, place as the road, services as the bus numbers that call there, walkMinutes; credit \"Contains information from LTA DataMall\" when you show them) and preschools (ECDA-licensed childcare centres, kindergartens and early years centres within 1 km: name, place, walkMinutes; credit \"Contains information from ECDA\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
  8. Changed2 schema fields changed
    • changedOutput schema / properties / data / properties / listings / description
      Previous value: -"Each listing also carries its rank, reasonCodes, tradeoffs, and score out of 100 over the criteria given that its data answers, or null when it answers none or none were given; scoreBreakdown gives each criterion its points of maxPoints, or null points when the data cannot answer it (also listed in missingData)."New value: +"Each listing also carries its rank, reasonCodes and reasons (the same reasons in plain words), tradeoffs, and score out of 100 over the criteria given that its data answers, or null when it answers none or none were given; scoreBreakdown gives each criterion its points of maxPoints, or null points when the data cannot answer it (also listed in missingData)."
    • changedOutput schema / properties / data / properties / listings / items / properties / reportUrl / description
      Previous value: -"Details only: for an owner listing, the listing page with its Report this listing form open, where the user tells Homejourney the details or photos are wrong, it isn't the owner's, it's gone or it looks like a scam. The user sends the report themselves; null for other listings."New value: +"Details only: for an owner listing, the listing page with its Report this listing form open, where the user tells Homejourney the details or photos are wrong, it isn't the owner's, it's gone or it looks like a scam. For a flat its owner lists on HDB Flat Portal, the same form takes only that it's gone or its details are wrong. The user sends the report themselves; null for other listings."
  9. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / searchedSchool
      Added value: +{
      +  "description": "Search with school only: {name, distanceKm}, that school and its straight-line distance from the block, or null when the home does not list it nearby. For Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  10. Changed1 schema field changed
    • addedInput schema / properties / criteria / properties / property_type / description
      Added value: +"One of HDB, Condominium, Executive Condominium, Landed. Common words such as Condo, EC, Apartment, HDB flat or Bungalow are read as these."
  11. Changed1 schema field changed
    • changedOutput schema / properties / data / properties / listings / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes) and malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them) and busStops (LTA bus stops within 400 m: code, name, place as the road, services as the bus numbers that call there, walkMinutes; credit \"Contains information from LTA DataMall\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
  12. Changed1 schema field changed
    • changedOutput schema / properties / data / properties / listings / items / properties / bookingUrl / description
      Previous value: -"Where the user asks for a viewing."New value: +"Where the user asks for a viewing. Absent when that page takes no request: the owner books on a portal (reach.bookOn says where) or no request reaches anyone."
  13. Changed1 schema field changed
    • changedOutput schema / properties / data / properties / listings / items / properties / houseRules / description
      Previous value: -"Details and compare: the house rules the listing states, such as {\"pets\": false, \"cooking\": true} (true allowed, false not allowed) or rules in words such as [\"no_smoking\"]. Empty or null when it states none."New value: +"Details and compare: the house rules the listing states, such as {\"pets\": false, \"cooking\": true} (true allowed, false not allowed) or rules in words such as [\"no_smoking\"]. An owner rental may add \"tenants\", who the owner says the home suits (families, couples, working_professionals, students); none is no preference. Empty or null when it states none."
  14. Changed3 schema fields changed
    • addedOutput schema / properties / data / properties / listings / items / properties / bathrooms / description
      Added value: +"The whole home's bathrooms; for a let room, read room.ownBathroom."
    • addedOutput schema / properties / data / properties / listings / items / properties / room
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "For a rental that lets a master room, common room or bed space: the room itself, which its card shows in place of the flat's bathrooms and floor area. Null for a whole home, a studio or a sale.",
      +  "properties": {
      +    "label": {
      +      "description": "Master room, Common room or Bed space.",
      +      "type": "string"
      +    },
      +    "ownBathroom": {
      +      "description": "True for an attached bathroom, false for a shared one, null when not stated.",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "squareFeet": {
      +      "description": "The room's own size; null when not stated, never the flat's.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "label"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / properties / listings / items / properties / squareFeet / description
      Added value: +"Floor area. An owner's let room gives the flat's here; read room.squareFeet for the room's own size."
  15. Changed1 schema field changed
    • changedOutput schema / properties / data / properties / listings / description
      Previous value: -"Each listing also carries its rank, reasonCodes, tradeoffs, and score out of 100 over the criteria given that its data answers; scoreBreakdown gives each criterion its points of maxPoints, or null points when the data cannot answer it (also listed in missingData)."New value: +"Each listing also carries its rank, reasonCodes, tradeoffs, and score out of 100 over the criteria given that its data answers, or null when it answers none or none were given; scoreBreakdown gives each criterion its points of maxPoints, or null points when the data cannot answer it (also listed in missingData)."
  16. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / offMarketListingIds
      Added value: +{
      +  "description": "The unavailable ids of listings taken off the market (sold, withdrawn or archived).",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  17. Changed1 schema field changed
    • addedOutput schema / properties / nextSteps
      Added value: +{
      +  "description": "Suggestions for what the user usually does next, best first. Each names the tool to call or the page to open; none is taken without the user asking, and a tool that writes still needs their confirmation.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "type": "string"
      +      },
      +      "tool": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "format": "uri",
      +        "type": "string"
      +      },
      +      "why": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "why"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 3,
      +  "type": "array"
      +}
  18. Changed1 schema field changed
    • changedOutput schema / properties / data / properties / listings / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, and parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes) and malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
  19. Changed2 schema fields changed
    • addedOutput schema / properties / data / properties / listings / items / properties / description
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / properties / listings / items / properties / descriptionSource
      Added value: +{
      +  "description": "Who wrote description: generated means Homejourney wrote it from the listing's photos and data, so say so when quoting it and never present it as the lister's words; listing means the lister wrote it; null with no description.",
      +  "enum": [
      +    "generated",
      +    "listing",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  20. Changed2 schema fields changed
    • addedOutput schema / properties / data / properties / listings / items / properties / maxOccupants
      Added value: +{
      +  "description": "Details only, for a rental: the most people who may live in the home or room, 1 to 20. Null when not stated.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / properties / listings / items / properties / utilitiesIncluded
      Added value: +{
      +  "description": "Details only, for a rental: whether the rent includes utilities (true) or not (false). Null when the listing does not say.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
  21. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / reportUrl
      Added value: +{
      +  "description": "Details only: for an owner listing, the listing page with its Report this listing form open, where the user tells Homejourney the details or photos are wrong, it isn't the owner's, it's gone or it looks like a scam. The user sends the report themselves; null for other listings.",
      +  "format": "uri",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  22. Changed1 schema field changed
    • changedOutput schema / properties / data / properties / listings / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, and parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
  23. Changed1 schema field changed
    • changedOutput schema / properties / data / properties / listings / description
      Previous value: -"Each listing also carries its rank, score, reasonCodes and tradeoffs."New value: +"Each listing also carries its rank, reasonCodes, tradeoffs, and score out of 100 over the criteria given that its data answers; scoreBreakdown gives each criterion its points of maxPoints, or null points when the data cannot answer it (also listed in missingData)."
  24. Changed1 schema field changed
    • changedOutput schema / properties / data / properties / listings / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
  25. Changed1 schema field changed
    • changedOutput schema / properties / data / properties / listings / items / properties / hdbFlatType / description
      Previous value: -"Search results only, for an HDB flat: its flat type, such as 4-room or executive, inferred from its block's resale records and its size."New value: +"For an HDB flat in search, details and compare: its flat type, such as 4-room or executive, inferred from its block's resale records and its size. Absent when no single type matches, so treat that flat's type as unverified and never infer it from bedrooms."
  26. Changed2 schema fields changed
    • changedOutput schema / properties / data / properties / listings / items / properties / depositMonths / description
      Previous value: -"Details only, for an owner rental: the security deposit in months of rent, as the owner stated it. Null when not stated; partner listings carry none."New value: +"Details and compare, for an owner rental: the security deposit in months of rent, as the owner stated it. Null when not stated; partner listings carry none."
    • addedOutput schema / properties / data / properties / listings / items / properties / houseRules
      Added value: +{
      +  "description": "Details and compare: the house rules the listing states, such as {\"pets\": false, \"cooking\": true} (true allowed, false not allowed) or rules in words such as [\"no_smoking\"]. Empty or null when it states none.",
      +  "type": [
      +    "object",
      +    "array",
      +    "null"
      +  ]
      +}
  27. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / sameHomeListingIds
      Added value: +{
      +  "description": "Ids left out because another source lists the same home, which is compared once under the first id given.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  28. Changed3 schema fields changed
    • changedInput schema / properties / criteria / properties / min_remaining_lease_years / description
      Previous value: -"Fewest whole years of lease that must remain, read from an HDB flat's block lease. Freehold and 999-year tenures always meet it."New value: +"Fewest whole years of lease that must remain, read from each home's lease: an HDB flat's block lease, or a condo, EC or landed home's land lease. Freehold and 999-year tenures always meet it."
    • changedOutput schema / properties / data / properties / listings / items / properties / hdbLease / description
      Previous value: -"Details and compare, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, from HDB resale records. Null when unknown."New value: +"Details and compare, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, as in lease; kept for earlier clients. Null when unknown."
    • addedOutput schema / properties / data / properties / listings / items / properties / lease
      Added value: +{
      +  "description": "Search, compare and details, for every home: its tenure, the lease left this month and its age from TOP, as the listing page shows them. An HDB flat's lease comes from its block's resale records; a condo, EC or landed home's from URA's records of its land lease, not its TOP. remainingLabel is 'Lease start not confirmed' for a leasehold whose start is not found, and null for freehold and 999-year homes. Null when nothing is known.",
      +  "properties": {
      +    "ageLabel": {
      +      "description": "Such as 26 years.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "ageYears": {
      +      "minimum": 0,
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "completionYear": {
      +      "description": "TOP or the year completed.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "freehold": {
      +      "type": "boolean"
      +    },
      +    "leaseYears": {
      +      "description": "99, 103 or 999; null for freehold.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "remainingLabel": {
      +      "description": "Such as 72 years 10 months.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "remainingMonths": {
      +      "maximum": 11,
      +      "minimum": 0,
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "remainingYears": {
      +      "minimum": 0,
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "startYear": {
      +      "description": "The year the lease began; null when not confirmed.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "tenureLabel": {
      +      "description": "Such as 99-year lease from 2000, or Freehold; null when the tenure is not known.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "freehold"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  29. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / hdbFlatType
      Added value: +{
      +  "description": "Search results only, for an HDB flat: its flat type, such as 4-room or executive, inferred from its block's resale records and its size.",
      +  "type": "string"
      +}
  30. Changed2 schema fields changed
    • addedInput schema / properties / criteria / properties / min_remaining_lease_years
      Added value: +{
      +  "description": "Fewest whole years of lease that must remain, read from an HDB flat's block lease. Freehold and 999-year tenures always meet it.",
      +  "maximum": 99,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / data / properties / listings / items / properties / hdbLease / description
      Previous value: -"Details only, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, from HDB resale records. Null when unknown."New value: +"Details and compare, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, from HDB resale records. Null when unknown."
  31. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / depositMonths
      Added value: +{
      +  "description": "Details only, for an owner rental: the security deposit in months of rent, as the owner stated it. Null when not stated; partner listings carry none.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
  32. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / priceReason
      Added value: +{
      +  "description": "Details only: the owner's own words on why the home is priced as it is.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  33. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / hdbLease
      Added value: +{
      +  "description": "Details only, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, from HDB resale records. Null when unknown.",
      +  "properties": {
      +    "ageYears": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "remainingMonths": {
      +      "maximum": 11,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "remainingYears": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "startYear": {
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "startYear",
      +    "remainingYears",
      +    "remainingMonths",
      +    "ageYears"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  34. Changed2 schema fields changed
    • changedOutput schema / properties / data / properties / listings / items / properties / seller / description
      Previous value: -"Details only, for an owner listing: whether the owner verified with Singpass, and their weekly viewing hours (Singapore time, weekday 0 is Sunday; empty when none are open)."New value: +"Details only, for an owner listing: whether the owner verified with Singpass, their weekly viewing hours (Singapore time, weekday 0 is Sunday; empty when none are open), and how many minutes they usually take to first answer a viewing request (null until they have answered at least 3)."
    • addedOutput schema / properties / data / properties / listings / items / properties / seller / properties / typicalReplyMinutes
      Added value: +{
      +  "minimum": 1,
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
  35. Changed1 schema field changed
    • changedOutput schema / properties / data / properties / listings / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, and supermarkets (name, place, walkMinutes), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
  36. Changed4 schema fields changed
    • addedOutput schema / properties / data / properties / listings / items / properties / facing
      Added value: +{
      +  "description": "Details only: which way the main windows face, as the owner states it (N, NE, E, SE, S, SW, W or NW).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / properties / listings / items / properties / flatModel
      Added value: +{
      +  "description": "Details only: HDB flat model.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / properties / listings / items / properties / renovationYear
      Added value: +{
      +  "description": "Details only: the year the owner last renovated.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / properties / listings / items / properties / storeyRange
      Added value: +{
      +  "description": "Details only: HDB's three-storey band, such as 13 to 15, never the exact storey.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  37. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / seller
      Added value: +{
      +  "description": "Details only, for an owner listing: whether the owner verified with Singpass, and their weekly viewing hours (Singapore time, weekday 0 is Sunday; empty when none are open).",
      +  "properties": {
      +    "role": {
      +      "enum": [
      +        "owner"
      +      ],
      +      "type": "string"
      +    },
      +    "singpassVerified": {
      +      "type": "boolean"
      +    },
      +    "viewingHours": {
      +      "items": {
      +        "properties": {
      +          "endsAt": {
      +            "description": "HH:MM",
      +            "type": "string"
      +          },
      +          "startsAt": {
      +            "description": "HH:MM",
      +            "type": "string"
      +          },
      +          "weekday": {
      +            "maximum": 6,
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  38. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / nearbyPlaces
      Added value: +{
      +  "description": "Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, and supermarkets (name, place, walkMinutes), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  39. Changed3 schema fields changed
    • addedOutput schema / properties / data / properties / listings / items / properties / builtYear
      Added value: +{
      +  "description": "Details only.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / properties / listings / items / properties / floorplans
      Added value: +{
      +  "description": "Details only: published floor plan image URLs.",
      +  "items": {
      +    "format": "uri",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / data / properties / listings / items / properties / listedAt
      Added value: +{
      +  "description": "When the listing was first shown publicly.",
      +  "format": "date-time",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  40. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / listings / items / properties / imageLabels
      Added value: +{
      +  "description": "One per image, in order: the tag to show with an owner's edited photo, or null for an unedited one.",
      +  "items": {
      +    "enum": [
      +      "Virtually staged",
      +      "Decluttered",
      +      null
      +    ],
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "type": "array"
      +}
  41. Changed1 schema field changed
    • addedInput schema / properties / host / description
      Added value: +"The AI app making this call, such as chatgpt or claude. It records where the request came from; it is not the listing owner or agent."
  42. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "data": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "criteriaSummary": {
      +          "type": "string"
      +        },
      +        "listings": {
      +          "description": "Each listing also carries its rank, score, reasonCodes and tradeoffs.",
      +          "items": {
      +            "additionalProperties": true,
      +            "properties": {
      +              "address": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "bathrooms": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "bedrooms": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "bookingUrl": {
      +                "description": "Where the user asks for a viewing.",
      +                "format": "uri",
      +                "type": "string"
      +              },
      +              "canonicalUrl": {
      +                "format": "uri",
      +                "type": "string"
      +              },
      +              "district": {
      +                "description": "Singapore postal district number.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "id": {
      +                "format": "uuid",
      +                "type": "string"
      +              },
      +              "listingType": {
      +                "description": "For Sale or For Rent.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "price": {
      +                "description": "SGD; monthly rent for a rental.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "propertyType": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "squareFeet": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "title": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "id"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "missingDataNotes": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "ranking": {
      +          "items": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "unavailableListingIds": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "required": [
      +        "listings"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "data"
      +  ],
      +  "type": "object"
      +}
  43. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld annotations: it discloses the ranking behavior, that scores are out of 100 and null when no criterion can be judged, that reasons, tradeoffs and missing data come back, and an explicit privacy constraint that owner or agent contact details are never returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the usage condition and the input, which is the right order. The return-value sentence is very long and dense, but every clause carries information an agent would otherwise have to discover.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a comparison tool with nested criteria and a privacy-sensitive domain, the definition covers input provenance, ranking semantics, null handling, and the rendering handoff. Nothing needed to call it correctly is missing, even though an output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 25%, and the description compensates by enumerating most criteria (budget, bedrooms, bathrooms, districts, MRT stations, max walk, min lease, must-have features) and clarifying that a saved home's property_id belongs in listing_ids. It leaves several nested fields unexplained (query, commute_note, listing_type, property_type, subletting_types) and says nothing about host or host_reference_id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('compared side by side' for two to six Homejourney listings) and names the upstream tools that produce the inputs, so it is clearly distinguished from search_listings and get_listing_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it ('after search_listings or list_saved_properties when the user wants two to six listings compared'), names the alternatives, and gives the downstream handoff ('pass it to render_shortlist' for a card).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources