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.

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.

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

TableJSON 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'.
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

TableJSON 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. 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"
      +]
  2. 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."
  3. 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"
      +}
  4. 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"
      +}
  5. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent safety, but the description adds substantial behavior: location_not_found error shape, explicit refusal to fall back to nationwide figures, price_unit semantics per search type, oracle.verified gating rules, sub-area municipality roll-up, and commercial listing handling. These are exactly the details an agent cannot infer from 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.

Conciseness4/5

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

Five paragraphs is long, but it is front-loaded with purpose and each subsequent block covers a distinct edge case (location miss, price units, oracle verification, sub-area roll-up, commercial). Dense but not padded; the length is proportionate to the behavioral surface.

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?

Even though an output schema exists (so return values need not be spelled out), the description covers error modes, verification caveats, and the commercial/homes split thoroughly. Nothing an agent needs to call this correctly appears to be 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 75%, and the description adds real meaning beyond it — property_types commercial families drive a completely different response path (asking prices, no oracle block) and search_type drives the price_unit labelling. It does not revisit the tenure (traspaso) parameter, but overall it meaningfully enriches enum interpretation.

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 verb and resource ('Return aggregate market context for a Spanish area') and enumerates the exact outputs (active listing count, median price, mean price, median €/m², bedroom-band counts). This is distinguishable from valuation-oriented siblings like verified_valuation or listing_health without opening a schema.

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?

Gives a clear triggering condition: 'Use this before recommending a price or commenting on whether a listing is good value.' It does not name an alternative (e.g. verified_valuation) or state when not to use it, so the when-vs-what-else routing is left implicit.

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