Skip to main content
Glama

PropertyList: Spanish Property MLS

Area market summary

area_market_summary
Read-onlyIdempotent

Return aggregate market context for a Spanish area: number of active listings, median price, mean price, median €/m², and the count broken down by bedroom band. Filterable by property type and search type (for-sale / for-rent / holiday-rentals). Use this before recommending a price or commenting on whether a listing is good value.

If the place name is not one we hold, the response says so (error: location_not_found, location_match.matched: false) and returns no figures. Figures are NEVER nationwide fallbacks.

If several places share the name and one of them holds at least 80% of their live listings, the figures are for that place alone, and location_match.other_places names the others (id, municipality, province, listings). If the listings are split between them, or none has any, the response says so (error: ambiguous_location, location_match.ambiguous: true), lists them in location_match.candidates and returns no figures. Either way, ask again with the chosen id as location_id, or with the town or province after a comma ('El Limonar, Mijas'). A town that holds no area of that name is answered as location_not_found, with the areas of that name we do hold in location_match.candidates.

Price figures follow the search type and are labelled with price_unit: sale prices are totals, for-rent is per MONTH and holiday-rentals is per WEEK. median_price_per_sqm is reported for sales only.

The oracle block carries the attested transaction price for the area. Check oracle.verified before citing it as verified: it is true only for Spanish figures from the notarial register (Consejo General del Notariado) with at least 10 recorded transactions behind them. Outside Spain the figure comes from a national house-price index, carries no transaction count, and must never be described as notary-backed - oracle.source names the real source and oracle.note says why it is not verified.

The oracle figure follows property_types where the source has one for that kind of home: oracle.segment is apartments (flats and penthouses) or houses (villas, townhouses, country houses). Otherwise it is the figure for every home in the area, oracle.segment is all_homes, oracle.covers_all_homes is true and oracle.note says so: never quote it as the figure for the type asked for.

Transactions are recorded per municipality, so a sub-area (Sotogrande, Puerto Banus, Nueva Andalucia, Orihuela Costa) is answered with the figure for the municipality containing it, with oracle.rolled_up_from_sub_area true and oracle.municipality / oracle.municipality_code naming it. Quote it as the municipality's figure, never as the sub-area's own.

Commercial property (property_types commercial, a family such as offices, retail, cafes-bars-restaurants, hotels-leisure, industrial-warehouses, garages-storage-rooms, buildings or commercial-land, or one type such as shop) is answered with its own figures: the ASKING prices of live commercial listings (figures_basis asking_prices), per family, with the asking price or monthly rent per m² and size bands, and no oracle block. Below min_sample priced listings only the count is given. Homes and commercial property are never summarised together.

Input Schema

NameRequiredDescriptionDefault
tenureNoCommercial sales only: traspaso narrows the figures to business transfers (the lease and the business taken over).
locationYesPlace name (city, suburb, or urbanisation). e.g. 'Marbella'. Add the town or province after a comma when several places share the name: 'El Limonar, Mijas'.
location_idNoArea id from autocomplete_location or from location_match.candidates. Takes precedence over location.
search_typeNofor-sale
property_typesNoOptional comma-separated slugs: apartments, villas, penthouses, plots, townhouses; or commercial, a commercial family (offices, retail, cafes-bars-restaurants, hotels-leisure, industrial-warehouses, garages-storage-rooms, buildings, commercial-land, businesses) or one commercial type (office, shop, bar, warehouse...).

Output Schema

NameRequiredDescriptionDefault
noteNo
errorNo
oracleNo
tenureNo
familiesNo
locationYes
max_priceNo
min_priceNo
commercialNo
mean_priceNo
min_sampleNoFewer priced listings than this and no median is given, only the count.
price_unitNo
size_bandsNo
price_basisNo
search_typeNo
median_priceNo
per_sqm_areaNo
figures_basisNo
location_matchNo
property_typesNo
total_listingsYes
by_bedroom_bandNo
priced_listingsNo
median_rent_per_sqmNoCommercial lettings: median monthly asking rent per m² of built area.
median_price_per_sqmNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / oracle / properties / covers_all_homes
      Added value: +{
      +  "description": "True when price_per_sqm is the figure for every home in the area, whatever property_types asked for.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / oracle / properties / segment
      Added value: +{
      +  "description": "The homes price_per_sqm describes: apartments (flats and penthouses), houses (villas, townhouses, country houses), or all_homes when the source has no figure for the types asked for.",
      +  "enum": [
      +    "apartments",
      +    "houses",
      +    "all_homes"
      +  ],
      +  "type": "string"
      +}
  2. Changed5 schema fields changed
    • changedInput schema / properties / location / description
      Previous value: -"Place name (city, suburb, or urbanisation). e.g. 'Marbella'."New value: +"Place name (city, suburb, or urbanisation). e.g. 'Marbella'. Add the town or province after a comma when several places share the name: 'El Limonar, Mijas'."
    • addedInput schema / properties / location_id
      Added value: +{
      +  "description": "Area id from autocomplete_location or from location_match.candidates. Takes precedence over location.",
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / location_match / properties / ambiguous
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / location_match / properties / candidates
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "id": {
      +        "description": "Pass it as location_id.",
      +        "type": "integer"
      +      },
      +      "listings": {
      +        "type": "integer"
      +      },
      +      "municipality": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "municipality_code": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "parent": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "province": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / location_match / properties / other_places
      Added value: +{
      +  "items": {
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  3. Changed12 schema fields changed
    • changedInput schema / properties / property_types / description
      Previous value: -"Optional comma-separated slugs: apartments, villas, penthouses, plots, townhouses."New value: +"Optional comma-separated slugs: apartments, villas, penthouses, plots, townhouses; or commercial, a commercial family (offices, retail, cafes-bars-restaurants, hotels-leisure, industrial-warehouses, garages-storage-rooms, buildings, commercial-land, businesses) or one commercial type (office, shop, bar, warehouse...)."
    • addedInput schema / properties / tenure
      Added value: +{
      +  "description": "Commercial sales only: traspaso narrows the figures to business transfers (the lease and the business taken over).",
      +  "enum": [
      +    "traspaso"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / commercial
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / families
      Added value: +{
      +  "items": {
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / figures_basis
      Added value: +{
      +  "enum": [
      +    "asking_prices"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / median_rent_per_sqm
      Added value: +{
      +  "description": "Commercial lettings: median monthly asking rent per m² of built area.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / min_sample
      Added value: +{
      +  "description": "Fewer priced listings than this and no median is given, only the count.",
      +  "type": "integer"
      +}
    • addedOutput schema / properties / per_sqm_area
      Added value: +{
      +  "enum": [
      +    "built",
      +    "plot"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / priced_listings
      Added value: +{
      +  "type": "integer"
      +}
    • addedOutput schema / properties / size_bands
      Added value: +{
      +  "items": {
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / tenure
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "location",
      -  "total_listings",
      -  "oracle"
      -]New value: +[
      +  "location",
      +  "total_listings"
      +]
  4. Changed2 schema fields changed
    • addedOutput schema / properties / oracle / properties / price_per_sqm
      Added value: +{
      +  "description": "EUR per m². Verified only when `verified` is true; otherwise an estimate from the source in source_label.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / oracle / properties / verified_price_per_sqm / description
      Added value: +"Deprecated: the same figure as price_per_sqm, under its old name. Despite the name it is verified only when `verified` is true."
  5. Changed8 schema fields changed
    • addedOutput schema / properties / oracle / properties / minimum_verified_sample
      Added value: +{
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / oracle / properties / municipality
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / oracle / properties / municipality_code
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / oracle / properties / note
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / oracle / properties / requested_area
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / oracle / properties / rolled_up_from_sub_area
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / oracle / properties / source_label
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / oracle / properties / transaction_backed
      Added value: +{
      +  "type": "boolean"
      +}
  6. Changed5 schema fields changed
    • addedOutput schema / properties / error
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / location_match
      Added value: +{
      +  "properties": {
      +    "exact": {
      +      "type": "boolean"
      +    },
      +    "matched": {
      +      "type": "boolean"
      +    },
      +    "matched_areas": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "matched_location": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "requested": {
      +      "type": "string"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / note
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / price_basis
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / price_unit
      Added value: +{
      +  "enum": [
      +    "total",
      +    "per_month",
      +    "per_week"
      +  ],
      +  "type": "string"
      +}
  7. First observed

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses extensive behavior beyond the annotations, including location resolution failures, ambiguity handling, price-unit semantics, oracle verification rules, sub-area roll-up behavior, and commercial-property restrictions. These are precisely the operational details an agent needs to avoid misrepresenting the returned figures.

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 description is long, but it is front-loaded with purpose, metrics, filters, and usage before moving into edge cases. Most sentences carry operational value, though the length is near the upper bound for a tool description and could be tightened in places without losing meaning.

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's complexity, the description is complete: it covers metric semantics, location-resolution outcomes, oracle caveats, sub-area behavior, and commercial-versus-residential separation. An output schema and annotations also exist, but the description still supplies the interpretation rules an agent needs to use the tool correctly.

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 coverage is already 80%, the description adds substantial meaning: it explains how search_type affects price units, how location_id takes precedence after ambiguous matches, and how property_types separates homes from commercial figures. The schema alone would not make those behavioral consequences clear.

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 opens with a precise verb and resource: return aggregate market context for a Spanish area, listing the exact metrics provided. It also clarifies that this is a market-context tool rather than a listing search or individual valuation, which differentiates it from siblings such as search_properties and verified_valuation.

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 context: use this before recommending a price or commenting on whether a listing is good value. However, it does not explicitly state when to prefer a sibling tool, such as verified_valuation for a specific property valuation, or when not to use this tool.

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