Skip to main content
Glama

Microburbs Australian Property Data

Search suburbs

suburbs_finder_search
Read-onlyIdempotent

Boolean-AND range filter over suburb metrics, single-column sort, paginated. Every row carries its rank — position in the ranked result (1 = top of the sort, out of meta.total). When sorting by a median or a growth, the actual value is also shown for the first 5 and last 5 rows of the page; for any other suburb's number, call the per-field endpoint (market/, forecast/).

Paging: a page is capped at 25 rows. A bigger limit is clamped, not rejected — so always read meta: total is the full match count, has_more says whether rows remain, and next_offset is the offset to pass for the next page. A "top 50" needs two calls, each charged.

Flat 30c.

Price: 30¢ per call.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sortNoSort field. Prefix '-' for descending (highest first), e.g. `-growth10yrCagr`. Must be one of the field keys (see enum). Works on its own — you do NOT need a filter on the field you sort by; to rank without a threshold, pass `sort` and no filter. Only when `sort` is omitted does it default to the first filter field, desc. Apartment/unit metrics are the `unit`-prefixed keys (unitMedianPrice, unitGrossYield, unitMedianRent, …); the unprefixed market keys are houses. Unit data only exists where a suburb has a real unit market — coverage runs ~13-54% of suburbs depending on the field, so a unit filter implicitly excludes house-only suburbs.
limitNoPage size. Hard cap 25 — a larger value is clamped, NOT an error, and `meta.requested_limit` says so. For more than 25 results, page with `offset`.
filterNoRange filter `fieldKey:min..max` (repeatable). Open-ended `min..` / `..max`. Valid fieldKeys: medianHousePrice, grossYield, medianRent, growthForecast4yr, growth10yrCagr, growth3yrCagr, rentGrowth3yr, soldAtLossPct, daysOnMarket, vacancyRate, unitMedianPrice, unitGrossYield, unitMedianRent, unitGrowthForecast4yr, unitGrowth10yrCagr, unitGrowth3yrCagr, unitRentGrowth3yr, unitSoldAtLossPct, unitDaysOnMarket, unitVacancyRate, stockOnMarket, monthsOfInventory, landValuePerSqm, lifestyleScore, safetyScore, hipScore, affluenceScore, renters, distanceCbdKm, publicHousingPct, overseasBornPct, welfareReliancePct, unemploymentPct, singleParentsPct, familyHouseholdsPct, privateSchoolPct, medianIncomeWeekly, communityDepthIndex, premiumRenovationIndex, homeOfficeIndex, tranquilityIndex, innovationEconomyIndex, alternativeLivingIndex, investorConcentration, negativeGearingExposure, mortgageStress. Apartment/unit metrics are the `unit`-prefixed keys (unitMedianPrice, unitGrossYield, unitMedianRent, …); the unprefixed market keys are houses. Unit data only exists where a suburb has a real unit market — coverage runs ~13-54% of suburbs depending on the field, so a unit filter implicitly excludes house-only suburbs.
offsetNoRow offset — page through results more than 25 deep. `meta.next_offset` gives the value for the next page.
statesNoComma-separated states — abbreviation or full name, e.g. `VIC` or `Victoria`. Anything else is a 422 listing the valid values (a city name is not a state — use `regions`).
regionsNoComma-separated EXACT SA4 region names — call GET /v1/suburbs/finder/regions for the list. e.g. `Melbourne - Inner`, `Melbourne - West`. A metro name like `Melbourne` alone will NOT match; an unknown value 422s with the closest real names.
property_typeNoLegacy flag: 'unit' re-points the ten unprefixed house-market keys (medianHousePrice, grossYield, ...) at their unit column. It does NOT affect the explicit `unit`-prefixed keys, which are always units. Prefer the `unit` keys — they are visible in /fields and can be mixed with house keys in one query.house

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -{
      -  "properties": {
      -    "available": {
      -      "anyOf": [
      -        {
      -          "type": "boolean"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "description": "`false` on no-data responses. Omitted on success — branch on `data !== null` if you want a single discriminator.",
      -      "title": "Available"
      -    },
      -    "data": {
      -      "anyOf": [
      -        {
      -          "description": "A page of matched suburbs.",
      -          "example": {
      -            "meta": {
      -              "limit": 25,
      -              "offset": 0,
      -              "returned": 25,
      -              "total": 126
      -            },
      -            "suburbs": [
      -              {
      -                "lga": "Lake Macquarie",
      -                "rank": 3,
      -                "sa4": "Newcastle and Lake Macquarie",
      -                "state": "NSW",
      -                "suburb": "Windale",
      -                "value": 0.163
      -              }
      -            ]
      -          },
      -          "properties": {
      -            "meta": {
      -              "additionalProperties": true,
      -              "description": "Total + pagination.",
      -              "properties": {
      -                "limit": {
      -                  "description": "Applied page size (clamped to 25).",
      -                  "title": "Limit",
      -                  "type": "integer"
      -                },
      -                "offset": {
      -                  "description": "Applied row offset.",
      -                  "title": "Offset",
      -                  "type": "integer"
      -                },
      -                "returned": {
      -                  "description": "Rows in this page.",
      -                  "title": "Returned",
      -                  "type": "integer"
      -                },
      -                "sort_field": {
      -                  "anyOf": [
      -                    {
      -                      "type": "string"
      -                    },
      -                    {
      -                      "type": "null"
      -                    }
      -                  ],
      -                  "description": "Field the results are ranked by.",
      -                  "title": "Sort Field"
      -                },
      -                "total": {
      -                  "description": "Total suburbs matching the filter (ignores limit/offset).",
      -                  "title": "Total",
      -                  "type": "integer"
      -                },
      -                "values": {
      -                  "anyOf": [
      -                    {
      -                      "type": "string"
      -                    },
      -                    {
      -                      "type": "null"
      -                    }
      -                  ],
      -                  "description": "How values are exposed for this search (top/bottom-5 reveal, or withheld).",
      -                  "title": "Values"
      -                }
      -              },
      -              "required": [
      -                "total",
      -                "limit",
      -                "offset",
      -                "returned"
      -              ],
      -              "title": "FinderMeta",
      -              "type": "object"
      -            },
      -            "suburbs": {
      -              "description": "Matched suburbs, sorted.",
      -              "items": {
      -                "description": "One matched suburb — rank + identity, plus the value for the first/last few.\n\n`rank` (the row's position in the ranked result, 1 = top of the sort, out of\n`meta.total`) is present on every row. `value` (the sort field's actual number)\nis present only for the first 5 and last 5 rows of the page, and only when the\nsort field is a median or a growth. For any other suburb's number, call the\nper-field endpoint (market/*, forecast/*).",
      -                "example": {
      -                  "lga": "Lake Macquarie",
      -                  "rank": 3,
      -                  "sa4": "Newcastle and Lake Macquarie",
      -                  "state": "NSW",
      -                  "suburb": "Windale",
      -                  "value": 0.163
      -                },
      -                "properties": {
      -                  "lga": {
      -                    "anyOf": [
      -                      {
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Local Government Area name.",
      -                    "title": "Lga"
      -                  },
      -                  "rank": {
      -                    "description": "Position in the ranked result, 1 = top of the sort (out of `meta.total`).",
      -                    "title": "Rank",
      -                    "type": "integer"
      -                  },
      -                  "sa4": {
      -                    "anyOf": [
      -                      {
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "SA4 region name.",
      -                    "title": "Sa4"
      -                  },
      -                  "state": {
      -                    "anyOf": [
      -                      {
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "State abbreviation (NSW, VIC, ...).",
      -                    "title": "State"
      -                  },
      -                  "suburb": {
      -                    "description": "Suburb (SAL) name.",
      -                    "title": "Suburb",
      -                    "type": "string"
      -                  },
      -                  "value": {
      -                    "anyOf": [
      -                      {
      -                        "type": "number"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Value of the sort field (as ranked). Present only for the first 5 and last 5 rows of the page, and only for a median or growth sort. Absent = not shown — call the per-field endpoint for this suburb.",
      -                    "title": "Value"
      -                  }
      -                },
      -                "required": [
      -                  "rank",
      -                  "suburb"
      -                ],
      -                "title": "FinderRow",
      -                "type": "object"
      -              },
      -              "title": "Suburbs",
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "suburbs",
      -            "meta"
      -          ],
      -          "title": "FinderSearchResponse",
      -          "type": "object"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "description": "The endpoint's payload, or `null` when Microburbs has no value."
      -    },
      -    "message": {
      -      "anyOf": [
      -        {
      -          "type": "string"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "description": "Human-readable explanation. Omitted on success.",
      -      "title": "Message"
      -    },
      -    "reason": {
      -      "anyOf": [
      -        {
      -          "type": "string"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "description": "Machine-readable slug naming the no-data condition (e.g. `no_avm_for_GANSW704074813`). Stable per endpoint. Omitted on success.",
      -      "title": "Reason"
      -    }
      -  },
      -  "title": "ApiResponse[FinderSearchResponse]",
      -  "type": "object",
      -  "x-fastmcp-top-level-schema": "ApiResponse_FinderSearchResponse_"
      -}New value: +null
  2. First observed

TDQS

A5/5.0
Behavior5/5

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

The description goes beyond the annotations (readOnlyHint, idempotentHint, etc.) to disclose key behaviors: it warns about the clamped `limit` (not rejected), describes the `rank` field and its meaning, explains the partial value display for the first and last 5 rows when sorting by median/growth, and upfront mentions the 30c cost per call. This adds significant context that the annotations do not cover.

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

Conciseness5/5

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

The description is well-structured with clear sections (purpose, paging, pricing) and is appropriately sized given the tool's complexity. It front-loads the core functionality and then provides necessary details without unnecessary fluff. The use of bold for 'Paging' and 'Price' helps navigation.

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?

The description is complete for the tool's complexity: it covers the query mechanism, sorting, pagination, cost, and key limitations (unit coverage). With no output schema and no required parameters, the description anticipates agent needs by detailing meta fields and the per-field endpoint. It leaves no critical aspect unexplained for correct usage.

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

Parameters5/5

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

Although schema description coverage is 100%, the description adds value beyond the schema by explaining the interplay between `sort` and `filter` (e.g., sort works without filter, default sort is first filter field desc), the clamping behavior of `limit` with `meta.requested_limit`, and the distinction between `property_type` legacy flag and explicit `unit`-prefixed keys. It also clarifies the `regions` parameter's exact-match requirement and the `states` parameter's format.

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?

The description clearly states the tool's purpose: 'Boolean-AND range filter over suburb metrics, single-column sort, paginated.' It identifies the resource (suburbs) and the specific operation (search/filter with sorting), and the title 'Search suburbs' is appropriately descriptive. It distinguishes itself from sibling tools like 'suburbs_finder_count' and 'suburbs_finder_fields' by focusing on the searching behavior.

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?

The description explains when to use this tool versus alternatives: it details pagination for results over 25, explicitly mentions the per-field endpoint for non-highlighted rows ('call the per-field endpoint'), and notes the 'flat 30c' cost per call, implying cost considerations. It also instructs to read 'meta' for total and next_offset, providing clear guidance on how to handle pagination.

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