Skip to main content
Glama

Homejourney Singapore property listings

Get Homejourney listing details

get_listing_details
Read-only

Use this after search_listings when the user wants the full details of one Homejourney listing, such as its description, size, tenure, furnishing, availability, nearest MRT, nearby schools, the MRT stations open or under construction, primary schools by 1 km and 2 km band, secondary schools, supermarkets, hawker centres, CHAS clinics, parks, malls, bus stops with their bus numbers, and childcare centres and preschools near it, and Homejourney link. For an owner listing, including a flat its owner lists on HDB Flat Portal, it adds reportUrl, where the user reports a wrong, misleading or scam listing to Homejourney. For an HDB rental, tenantEligibility says who may rent it: the 6-month minimum, the pass a non-citizen needs and, for a whole flat, the HDB non-citizen quota with a link to the HDB quota checker; use it when the user is a PR or a foreigner. Never returns owner or agent contact details.

Input Schema

NameRequiredDescriptionDefault
listing_idYes

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 / typicalRent
      Added value: +{
      +  "description": "Details only, for a sale listing: the typical rent and gross yield its web page shows. monthlyRent is the median monthly rent in S$ of the last 12 months' recorded whole-home rentals like it: the same bedroom count in its development, or for an HDB flat the same flat type on its street, in any block. rentals is how many, fromMonth and toMonth (YYYY-MM) the months they span, and basis names them. grossYieldPct is monthlyRent × 12 ÷ the asking price, leaving out costs, vacancy and ABSD. Null for a rental, or below five matching rentals.",
      +  "properties": {
      +    "basis": {
      +      "type": "string"
      +    },
      +    "fromMonth": {
      +      "type": "string"
      +    },
      +    "grossYieldPct": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "monthlyRent": {
      +      "type": "number"
      +    },
      +    "rentals": {
      +      "minimum": 5,
      +      "type": "integer"
      +    },
      +    "toMonth": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "monthlyRent",
      +    "rentals",
      +    "fromMonth",
      +    "toMonth",
      +    "basis"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  2. Changed2 schema fields changed
    • changedOutput schema / properties / data / properties / lease / description
      Previous value: -"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."New value: +"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, and its age from HDB's year completed when the block has no resale yet; 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."
    • addedOutput schema / properties / data / properties / lease / properties / minRemainingYears
      Added value: +{
      +  "description": "Only for an HDB flat whose lease start is not confirmed: the fewest whole years that can be left, from its block's year completed. min_remaining_lease_years uses it; it is not the lease left.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
  3. Changed3 schema fields changed
    • changedOutput schema / properties / data / properties / financing / description
      Previous value: -"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."New value: +"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; when a 75% HDB loan would need more than HDB's S$16,000 family income ceiling, that option is the largest loan a household at the ceiling repays, with incomeCap set. 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."
    • changedOutput schema / properties / data / properties / hdbFlatTypeUnknownReason / description
      Previous value: -"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."New value: +"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; room_size_only: a let room's listing gives only the room's size, not the flat's."
    • changedOutput schema / properties / data / properties / squareFeet / description
      Previous value: -"Floor area. An owner's let room gives the flat's here; read room.squareFeet for the room's own size."New value: +"Floor area. A let room may give the flat's here, as every owner's does; read room.squareFeet for the room's own size, null when the listing gives only the flat's."
  4. Changed1 schema field changed
    • addedOutput schema / properties / data / 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"
      +  ]
      +}
  5. Changed1 schema field changed
    • addedOutput schema / properties / data / 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"
      +  ]
      +}
  6. Changed1 schema field changed
    • addedOutput schema / properties / data / 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"
      +}
  7. Changed2 schema fields changed
    • changedOutput schema / properties / data / 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 / 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"
      +}
  8. Changed1 schema field changed
    • addedOutput schema / properties / data / 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"
      +}
  9. Changed1 schema field changed
    • addedOutput schema / properties / data / 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"
      +}
  10. Changed1 schema field changed
    • changedOutput schema / properties / data / 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."
  11. Changed1 schema field changed
    • changedOutput schema / properties / data / 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."
  12. Changed1 schema field changed
    • addedOutput schema / properties / data / 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"
      +  ]
      +}
  13. Changed1 schema field changed
    • changedOutput schema / properties / data / 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."
  14. Changed1 schema field changed
    • changedOutput schema / properties / data / 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."
  15. Changed1 schema field changed
    • changedOutput schema / properties / data / 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."
  16. Changed3 schema fields changed
    • addedOutput schema / properties / data / properties / bathrooms / description
      Added value: +"The whole home's bathrooms; for a let room, read room.ownBathroom."
    • addedOutput schema / properties / data / 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 / 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."
  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 / 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 / description
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / 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 / 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 / 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 / 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 / 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 / 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."
  24. Changed1 schema field changed
    • changedOutput schema / properties / data / 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."
  25. Changed2 schema fields changed
    • changedOutput schema / properties / data / 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 / 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"
      +  ]
      +}
  26. Changed2 schema fields changed
    • changedOutput schema / properties / data / 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 / 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"
      +  ]
      +}
  27. Changed1 schema field changed
    • addedOutput schema / properties / data / 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"
      +}
  28. Changed1 schema field changed
    • changedOutput schema / properties / data / 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."
  29. Changed1 schema field changed
    • addedOutput schema / properties / data / 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"
      +  ]
      +}
  30. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / priceReason
      Added value: +{
      +  "description": "Details only: the owner's own words on why the home is priced as it is.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  31. Changed1 schema field changed
    • addedOutput schema / properties / data / 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"
      +  ]
      +}
  32. Changed2 schema fields changed
    • changedOutput schema / properties / data / 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 / seller / properties / typicalReplyMinutes
      Added value: +{
      +  "minimum": 1,
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
  33. Changed1 schema field changed
    • changedOutput schema / properties / data / 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."
  34. Changed4 schema fields changed
    • addedOutput schema / properties / data / 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 / flatModel
      Added value: +{
      +  "description": "Details only: HDB flat model.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / properties / renovationYear
      Added value: +{
      +  "description": "Details only: the year the owner last renovated.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / properties / storeyRange
      Added value: +{
      +  "description": "Details only: HDB's three-storey band, such as 13 to 15, never the exact storey.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  35. Changed1 schema field changed
    • addedOutput schema / properties / data / 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"
      +  ]
      +}
  36. Changed1 schema field changed
    • addedOutput schema / properties / data / 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"
      +  ]
      +}
  37. Changed3 schema fields changed
    • addedOutput schema / properties / data / properties / builtYear
      Added value: +{
      +  "description": "Details only.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / properties / floorplans
      Added value: +{
      +  "description": "Details only: published floor plan image URLs.",
      +  "items": {
      +    "format": "uri",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / data / properties / listedAt
      Added value: +{
      +  "description": "When the listing was first shown publicly.",
      +  "format": "date-time",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  38. Changed1 schema field changed
    • addedOutput schema / properties / data / 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"
      +}
  39. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "data": {
      +      "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"
      +    }
      +  },
      +  "required": [
      +    "data"
      +  ],
      +  "type": "object"
      +}
  40. First observed

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the read-only annotations, the description discloses important behavior: it never returns owner or agent contact details, owner listings add reportUrl for reporting scam or misleading listings, and HDB rentals add tenantEligibility with quota details. These are meaningful conditional and privacy-related behaviors an agent would not infer from annotations or schema.

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

Conciseness3/5

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

The description is front-loaded with the key usage condition, but it becomes a long run-on sentence enumerating many returned fields. Much of that enumeration overlaps with the existing output schema, so the definition is informative but less concise than it could be.

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?

Given the tool has an output schema, the description need not enumerate every return field, but it goes further by explaining conditional fields like reportUrl and tenantEligibility and privacy constraints. An agent has enough context to know when and how to call this tool correctly.

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

Parameters3/5

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

There is one required listing_id parameter with 0% schema description coverage. The description implies the ID comes from a prior search_listings call, which adds useful sourcing context, but it does not explain the UUID format or explicitly say the value must be a listing ID from search results.

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

Purpose4/5

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

The description states a specific action—retrieving full details of one Homejourney listing—and explicitly positions it after search_listings. It is clearly a detail-fetch tool, though it does not differentiate itself from the sibling render_listing_detail or compare_listings.

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

Usage Guidelines4/5

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

It gives a clear usage sequence: call this after search_listings when the user wants full details of one listing. It also gives a conditional usage cue for tenantEligibility when the user is a PR or foreigner, but it does not state when not to use the tool or contrast it with sibling detail-rendering tools.

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