Suburb · Repeat sales
suburbs_market_repeat_salesRealised resale growth — summary + individual buy/sell pairs (max 500).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| suburb_name | Yes |
suburbs_market_repeat_salesRealised resale growth — summary + individual buy/sell pairs (max 500).
| Name | Required | Description | Default |
|---|---|---|---|
| suburb_name | Yes |
Changes observed during successful MCP inspections.
Output 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": [
- {
- "additionalProperties": true,
- "description": "Repeat-sale summary + per-pair points (max 500, newest first).",
- "example": {
- "area_level": "suburb",
- "area_name": "Belmont North",
- "avg_annual_growth_pct": 9.01,
- "n": 2081,
- "n_loss": 0,
- "points": [
- {
- "address": "UNIT 2, 23 BIMBADEEN CLOSE",
- "annual_growth_pct": 8.28,
- "buy_date": "Jul 2022",
- "buy_price": 670000,
- "gnaf_pid": "GANSW704079753",
- "hold_years": 1.2,
- "lat": -33.01894618,
- "lng": 151.67840667,
- "sell_date": "Oct 2023",
- "sell_price": 740000
- }
- ]
- },
- "properties": {
- "area_level": {
- "description": "Always 'suburb' for these endpoints.",
- "title": "Area Level",
- "type": "string"
- },
- "area_name": {
- "description": "Suburb (SAL) name.",
- "title": "Area Name",
- "type": "string"
- },
- "avg_annual_growth_pct": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ],
- "description": "Average realised annual growth across pairs (%).",
- "title": "Avg Annual Growth Pct"
- },
- "n": {
- "anyOf": [
- {
- "type": "integer"
- },
- {
- "type": "null"
- }
- ],
- "description": "Repeat-sale pairs observed in the suburb.",
- "title": "N"
- },
- "n_loss": {
- "anyOf": [
- {
- "type": "integer"
- },
- {
- "type": "null"
- }
- ],
- "description": "Pairs that resold at a loss.",
- "title": "N Loss"
- },
- "points": {
- "description": "Individual buy/sell pairs (capped at 500).",
- "items": {
- "description": "One buy/sell pair with realised annual growth.",
- "properties": {
- "address": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "description": "Street address, when available.",
- "title": "Address"
- },
- "annual_growth_pct": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ],
- "description": "Realised annual growth between buy and sell (%).",
- "title": "Annual Growth Pct"
- },
- "buy_date": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "description": "Buy date ('Mon YYYY').",
- "title": "Buy Date"
- },
- "buy_price": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ],
- "description": "Buy price (AUD).",
- "title": "Buy Price"
- },
- "gnaf_pid": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "description": "GNAF principal address ID.",
- "title": "Gnaf Pid"
- },
- "hold_years": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ],
- "description": "Hold period (years, decimal).",
- "title": "Hold Years"
- },
- "lat": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ],
- "description": "Latitude of the property.",
- "title": "Lat"
- },
- "lng": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ],
- "description": "Longitude of the property.",
- "title": "Lng"
- },
- "sell_date": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "description": "Sell date ('Mon YYYY').",
- "title": "Sell Date"
- },
- "sell_price": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ],
- "description": "Sell price (AUD).",
- "title": "Sell Price"
- }
- },
- "title": "RepeatSalePoint",
- "type": "object"
- },
- "title": "Points",
- "type": "array"
- }
- },
- "required": [
- "area_name",
- "area_level",
- "points"
- ],
- "title": "RepeatSales",
- "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[RepeatSales]",
- "type": "object",
- "x-fastmcp-top-level-schema": "ApiResponse_RepeatSales_"
-}New value: +nullDoes the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds value by disclosing the output structure (summary + individual pairs) and the 500-pair limit, which are not in annotations. This provides useful behavioral context beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly packed sentence that conveys the core purpose and a key limitation (max 500). It is not verbose and earns its place, though it omits essential parameter context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description is insufficient. It does not explain what the summary contains, what fields each pair has, or any error conditions. The agent cannot fully anticipate the response format or parameter requirements, especially given the many sibling market tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description does not mention the only parameter, suburb_name, at all. The agent gets no guidance on what this parameter represents, its format, or how to obtain it. The description entirely fails to compensate for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns 'Realised resale growth' with a summary and individual buy/sell pairs, capped at 500. This is specific and distinguishes it from other market tools (e.g., price growth, sales summary) by focusing on repeat-sale realized growth. It lacks an explicit verb like 'get' but the intent is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. It does not mention any distinguishing context, such as 'use for repeat-sale growth analysis' or exclude scenarios better served by other market tools. The agent is left to infer usage from the name and sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Add one secure layer between your agents and this server.