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.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "suburbs_finder_search"
  }
}

Input 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. Fields with unit `percent` are FRACTIONS, not 0-100: 0.06 means 6%, so a gross yield of at least 6% is `grossYield:0.06..`. 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
    • changedInput schema / properties / filter / description
      Previous value: -"Range 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."New value: +"Range 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. Fields with unit `percent` are FRACTIONS, not 0-100: 0.06 means 6%, so a gross yield of at least 6% is `grossYield:0.06..`. 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."
  2. 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
  3. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/closed-world, and the description adds behavior they can't express: the 25-row cap is clamped rather than rejected, values are only shown for the first and last 5 rows of a page, rank is relative to the sort, and each call is charged. The duplicate price line wastes a little space but the substantive disclosure is strong.

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 query model, then paging, then cost; the format is scannable and each section earns its place. Two sentences state the same 30c charge in different formatting, which is pure waste in an otherwise tight definition.

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?

No output schema, so the description carries the return-shape burden and does it: rank semantics, meta fields, clamping, next_offset chaining, and the cost model are all present. Combined with fully documented parameters, an agent has everything needed to page and budget correctly.

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 100% so the baseline is 3, but the description adds operational meaning beyond it: a 'top 50' requires two charged calls, and the agent must read meta.total/has_more/next_offset rather than trusting the requested limit. The sort/filter defaults are covered in the schema and only lightly reinforced here.

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 mechanism (boolean-AND range filter with single-column sort, paginated) over a specific resource (suburb metrics), and distinguishes itself from the per-field market/* and forecast/* endpoints for non-page values. An agent can tell what this tool returns and what it does not.

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?

Explicitly says sort works alone without a filter on the sorted field, and routes the agent to the per-field endpoints when a number falls outside the page's first/last 5 rows. Missing only an explicit pointer to suburbs_finder_count for count-only needs, though meta.total is described as the full match count.

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