Skip to main content
Glama

Homejourney Singapore property listings

Look up a property agent

search_agents
Read-only

Use this when someone asks about a Singapore property agent (salesperson) by name or CEA registration number, such as R028241G, including an agent asking what Homejourney shows about them, or wants agents who work in an area or at an agency. The query searches names and CEA numbers only: for agents in an area, such as an HDB seller in Tampines, pass area, alone or with agency. Returns matching agents on CEA's register with their agency, CEA number, Homejourney listing count and public profile URL; with an area, agents with the most CEA-recorded deals there in the last three years come first, then those with the latest deal, each with their sales and rentals there and their latest deal month. Pass deal_type sale for a seller or buyer, so agents rank by their sales there, or rental for a landlord or tenant; without it every deal counts, and most HDB agent deals are rentals. Pass property_type to rank them by their deals in one kind of home there, such as landed for a landed home seller in D10. For a CEA number, or a name only one agent matches, it also returns the profile: transactions CEA records for them, their top areas and their public Homejourney listings, whose ids get_listing_details reads. Never returns contact details; send the user to the profile URL. Needs no sign-in.

Input Schema

NameRequiredDescriptionDefault
areaNoAn HDB town (TAMPINES, ANG MO KIO) or private district (D01 to D28), or a place a district names, such as Orchard; lists agents with CEA-recorded transactions there.
limitNo
queryNoThe agent's name, or their CEA registration number. Never an area or agency.
agencyNoThe agency's full name as CEA registers it, in any case, such as PropNex Realty Pte. Ltd. (a match's agency), or a featured agency's short name, such as PropNex, ERA or Huttons.
deal_typeNoWith an area: rank its agents by their sales there (sale: for a seller or buyer) or their rentals there (rental: for a landlord or tenant). Leave out to count every deal.
property_typeNoWith an area: count only the agents' CEA-recorded deals in that kind of home there (hdb, condo, ec for executive condominiums, or landed for landed and strata landed houses). Leave out to count every kind.

Output Schema

NameRequiredDescriptionDefault
areaNoThe area the agents are filtered by: the area input, or the query when it names only an area and no agent.
dataYes
totalYes
agencyNoThe agency the agents are filtered by, from its full CEA name or a featured agency short name such as PropNex.
profileNoThe full profile; present when the query is a CEA number or one agent matches.
dealTypeNoWith an area: the kind of deal that ordered its agents. Absent when every deal counted.
directoryUrlYes
propertyTypeNoWith an area: the kind of home whose deals ordered its agents. Absent when every kind counted.
resultReasonNoSet when no agent matches, or the area is not an HDB town or private district.
queryNamesAreaNoAn area the query names. Without a matching area, the query was searched as agent names, not as that area.
areaRecentTotalNoWith an area: how many of `total` have a deal there since areaDeals.since. The rest dealt there only before it and come last.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / profile / properties / agentNextStep / description
      Previous value: -"For the agent themselves: how to verify with Singpass to get their viewing requests and add a photo, bio and languages. Null once they claimed the profile."New value: +"For the agent themselves: how to verify with Singpass to get their viewing requests and add a photo, bio and languages, and, when other portals send listings under their CEA number, that they can then take those over for free and fix them. Null once they claimed the profile."
  2. Changed3 schema fields changed
    • addedInput schema / properties / property_type
      Added value: +{
      +  "description": "With an area: count only the agents' CEA-recorded deals in that kind of home there (hdb, condo, ec for executive condominiums, or landed for landed and strata landed houses). Leave out to count every kind.",
      +  "enum": [
      +    "hdb",
      +    "condo",
      +    "ec",
      +    "landed"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / data / items / properties / areaDeals / description
      Previous value: -"With an area: the agent's CEA-recorded deals there (HDB in a town, private in a district) since `since`, which order the results, most first."New value: +"With an area: the agent's CEA-recorded deals there (HDB in a town, private in a district, or only propertyType's kind of home when set) since `since`, which order the results, most first."
    • addedOutput schema / properties / propertyType
      Added value: +{
      +  "description": "With an area: the kind of home whose deals ordered its agents. Absent when every kind counted.",
      +  "enum": [
      +    "hdb",
      +    "condo",
      +    "ec",
      +    "landed"
      +  ],
      +  "type": "string"
      +}
  3. Changed2 schema fields changed
    • changedOutput schema / properties / profile / properties / listings / description
      Previous value: -"Up to 10 of their public Homejourney listings."New value: +"Up to 10 of their public Homejourney listings. Their listings at one address or in one development are one item, whose listingCluster counts them and names the others."
    • addedOutput schema / properties / profile / properties / listings / items / properties / listingCluster
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "This item stands for listingCount of their listings at one address (scope address) or in one development (scope development): itself and otherListingIds, priced minPrice to maxPrice. Absent for a listing no other joins. They may be different homes, since an agent can list two flats in one block.",
      +  "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"
      +}
  4. Changed2 schema fields changed
    • addedOutput schema / properties / profile / properties / listings / items / properties / bathrooms
      Added value: +{
      +  "description": "The home's bathrooms.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / profile / properties / listings / items / properties / squareFeet
      Added value: +{
      +  "description": "The home's floor area.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
  5. Changed1 schema field changed
    • addedOutput schema / properties / areaRecentTotal
      Added value: +{
      +  "description": "With an area: how many of `total` have a deal there since areaDeals.since. The rest dealt there only before it and come last.",
      +  "type": "integer"
      +}
  6. Changed3 schema fields changed
    • addedOutput schema / properties / profile / properties / earliestTransactionMonth
      Added value: +{
      +  "description": "The month of the agent's first recorded transaction, such as 2017-01; recordedTransactions and areas count from it.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / profile / properties / listings / items / properties / bedrooms / description
      Added value: +"The home's bedrooms; for a let room, read room."
    • addedOutput schema / properties / profile / 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. Null for a whole home, a studio or a sale.",
      +  "properties": {
      +    "label": {
      +      "description": "Master room, Common room or Bed space.",
      +      "type": "string"
      +    },
      +    "ownBathroom": {
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "squareFeet": {
      +      "description": "The room's own size; null when not stated.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "label"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  7. Changed2 schema fields changed
    • addedOutput schema / properties / profile / properties / agentNextStep
      Added value: +{
      +  "description": "For the agent themselves: how to verify with Singpass to get their viewing requests and add a photo, bio and languages. Null once they claimed the profile.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / profile / properties / claimedOnHomejourney
      Added value: +{
      +  "description": "Whether the agent has verified and claimed this profile on Homejourney, as their page shows.",
      +  "type": "boolean"
      +}
  8. Changed1 schema field changed
    • addedOutput schema / properties / agency / properties / options
      Added value: +{
      +  "description": "When an agency that is not featured finds no agent: the featured agencies it could mean, else every featured agency. Pass one as agency.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  9. Changed6 schema fields changed
    • addedInput schema / properties / deal_type
      Added value: +{
      +  "description": "With an area: rank its agents by their sales there (sale: for a seller or buyer) or their rentals there (rental: for a landlord or tenant). Leave out to count every deal.",
      +  "enum": [
      +    "sale",
      +    "rental"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / data / items / properties / areaDeals / properties / count / description
      Added value: +"The deals counted: sales or rentals as dealType says, else both."
    • changedOutput schema / properties / data / items / properties / areaDeals / properties / latestMonth / description
      Previous value: -"The month of the agent's latest deal there, such as 2026-09."New value: +"The month of the agent's latest deal there of the kind counted, such as 2026-09."
    • addedOutput schema / properties / data / items / properties / areaDeals / properties / rentals
      Added value: +{
      +  "description": "Whole-unit and room rentals there.",
      +  "type": "integer"
      +}
    • addedOutput schema / properties / data / items / properties / areaDeals / properties / sales
      Added value: +{
      +  "description": "Resales, new sales and sub-sales there.",
      +  "type": "integer"
      +}
    • addedOutput schema / properties / dealType
      Added value: +{
      +  "description": "With an area: the kind of deal that ordered its agents. Absent when every deal counted.",
      +  "enum": [
      +    "sale",
      +    "rental"
      +  ],
      +  "type": "string"
      +}
  10. Changed2 schema fields changed
    • changedInput schema / properties / agency / description
      Previous value: -"The agency's full name as CEA registers it, in any case, such as PropNex Realty Pte. Ltd. (a match's agency)."New value: +"The agency's full name as CEA registers it, in any case, such as PropNex Realty Pte. Ltd. (a match's agency), or a featured agency's short name, such as PropNex, ERA or Huttons."
    • addedOutput schema / properties / agency
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The agency the agents are filtered by, from its full CEA name or a featured agency short name such as PropNex.",
      +  "properties": {
      +    "featured": {
      +      "description": "Whether it is one of the agent directory's featured agencies.",
      +      "type": "boolean"
      +    },
      +    "label": {
      +      "type": "string"
      +    },
      +    "value": {
      +      "description": "The CEA-registered agency name searched, such as PROPNEX REALTY PTE. LTD.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "value",
      +    "label",
      +    "featured"
      +  ],
      +  "type": "object"
      +}
  11. Changed1 schema field changed
    • addedOutput schema / properties / data / items / properties / areaDeals
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "With an area: the agent's CEA-recorded deals there (HDB in a town, private in a district) since `since`, which order the results, most first.",
      +  "properties": {
      +    "count": {
      +      "type": "integer"
      +    },
      +    "kind": {
      +      "enum": [
      +        "HDB",
      +        "private"
      +      ],
      +      "type": "string"
      +    },
      +    "latestMonth": {
      +      "description": "The month of the agent's latest deal there, such as 2026-09.",
      +      "type": "string"
      +    },
      +    "since": {
      +      "description": "The month counting starts, such as 2023-10.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "kind",
      +    "count",
      +    "since",
      +    "latestMonth"
      +  ],
      +  "type": "object"
      +}
  12. Changed8 schema fields changed
    • addedInput schema / properties / agency
      Added value: +{
      +  "description": "The agency's full name as CEA registers it, in any case, such as PropNex Realty Pte. Ltd. (a match's agency).",
      +  "maxLength": 120,
      +  "type": "string"
      +}
    • addedInput schema / properties / area
      Added value: +{
      +  "description": "An HDB town (TAMPINES, ANG MO KIO) or private district (D01 to D28), or a place a district names, such as Orchard; lists agents with CEA-recorded transactions there.",
      +  "maxLength": 60,
      +  "type": "string"
      +}
    • changedInput schema / properties / query / description
      Previous value: -"The agent's name, or their CEA registration number."New value: +"The agent's name, or their CEA registration number. Never an area or agency."
    • removedInput schema / required
      Removed value: -[
      -  "query"
      -]
    • addedOutput schema / properties / area
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The area the agents are filtered by: the area input, or the query when it names only an area and no agent.",
      +  "properties": {
      +    "label": {
      +      "type": "string"
      +    },
      +    "value": {
      +      "description": "The area input value, such as TAMPINES or D15.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "value",
      +    "label"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / queryNamesArea
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "An area the query names. Without a matching area, the query was searched as agent names, not as that area.",
      +  "properties": {
      +    "label": {
      +      "type": "string"
      +    },
      +    "value": {
      +      "description": "The area input value, such as TAMPINES or D15.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "value",
      +    "label"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / resultReason / description
      Previous value: -"Set when no agent matches."New value: +"Set when no agent matches, or the area is not an HDB town or private district."
    • changedOutput schema / properties / resultReason / enum
      Previous value: -[
      -  "no_match"
      -]New value: +[
      +  "no_match",
      +  "unknown_area"
      +]
  13. Added

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare a safe read (readOnlyHint true, destructiveHint false); the description adds behavior beyond them: ranking order with an area (most CEA-recorded deals in the last three years, then latest deal), what the profile payload contains, that listing ids feed get_listing_details, that contact details are never returned, and that no sign-in is required.

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?

The use case is front-loaded and every clause maps to a real decision point, but the single dense paragraph runs long and mixes retrieval scope, ranking, and return shape in one block. Slightly tighter segmentation would read faster.

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 6-parameter, multi-mode search with an output schema, the description covers trigger, mode selection, ranking semantics, return contents, downstream linkage and the no-contact-details constraint. Nothing an agent needs to call it correctly is missing.

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 already 83%, so the schema carries most parameter documentation. The description still adds meaning the schema does not: the sale-vs-rental ranking tradeoff, the parenthetical that 'most HDB agent deals are rentals', and the concrete landed/D10 example for property_type.

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?

Names a specific verb and resource — searching Singapore property agents by name or CEA registration number — and extends it to area/agency lookups. It is clearly distinct from siblings like search_listings, search_guides and get_listing_details, which are referenced only as downstream consumers.

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 frames the trigger ('when someone asks about a Singapore property agent... including an agent asking what Homejourney shows about them') and gives conditional guidance: pass area alone or with agency for area lookups, pass deal_type for seller/buyer vs landlord/tenant, pass property_type for one home kind. It also states what happens when these are omitted ('without it every deal counts').

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