Skip to main content
Glama

PropertyList: Spanish Property MLS

Search properties

search_properties
Read-onlyIdempotent

Search PropertyList's full Spanish property MLS by structured filters. Use for queries that translate cleanly to fields: bedrooms, bathrooms, price ceiling, property type, area name. For free-form briefs use find_properties_by_description instead.

Free use, with or without an API key, is for an assistant answering a person's questions and has a daily allowance of results. Reading listings in bulk, or showing them on a website, needs MCP Pro or the agency's website feed. When the day's allowance is used the result is empty and carries error and limits.

Returns a paginated list with summary text plus structured JSON. Every property carries oracle_verified and oracle_attestation_url — true when PropertyList Oracle holds a verified attestation for the listing's municipality and segment.

A location we do not hold returns zero results with error: location_not_found and location_match.matched: false. It never substitutes listings from other areas. location_id takes an area id from autocomplete_location instead of a name; a group id (type group, e.g. a region or a coast) searches every area in the group.

features keeps only listings that have ALL the features asked for: pool (any pool, communal included), private_pool, communal_pool, sea_view, garden, parking (a garage or parking space) and terrace. Each result then carries matched_features, saying which tags (and, for parking and terrace, which space count or terrace size) the listing matched on. private_pool means the listing is tagged with a private or heated pool; many agency feeds tag every pool that way, communal ones included, so use pool for "with a pool" and check the listing when a pool must be private. communal_pool means the listing is tagged with a communal (shared) pool: use it when the user asks for a communal pool; pool also finds the communal pools a feed tagged as private, so widen to pool when communal_pool finds too few.

location.city is whatever tier the listing was filed under and may be a municipality OR a locality inside one. To place a listing administratively use location.municipality (with its INE municipality_code); it is null, never guessed, when we cannot resolve it.

location.latitude / location.longitude are present whenever we hold a real coordinate; the fields are absent otherwise, and are never 0,0. location.coordinates_precision says what the point is: exact or street is the property itself, approximate is a pin the agent keeps private, rounded to about 1 km, locality or administrative_area is an area centroid (accurate to the town, not the building), unknown is a pin we hold no precision record for.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNo
tenureNoCommercial sales only: traspaso finds business transfers (the lease and the business taken over), freehold the premises sold outright.
featuresNoOnly listings with ALL of these: pool (any pool), private_pool (tagged private or heated pool), communal_pool (tagged communal pool), sea_view, garden (private, landscaped or communal), parking (garage or parking space), terrace. Results say what each matched on in matched_features.
languageNoPreferred language for property titles and description excerpts.en
locationNoFree-text place name (city, suburb, or urbanisation). e.g. 'Marbella', 'Nueva Andalucia', 'Sotogrande'. Pre-resolved with autocomplete_location if you need to confirm match.
page_sizeNo
price_maxNoMaximum price in euros (sale) or monthly euros (rent).
price_minNoMinimum price in euros (sale) or monthly euros (rent).
location_idNoArea id from autocomplete_location. Takes precedence over location. A group id (a region or coast, type group) searches every area in the group.
search_typeNoListing market. Defaults to 'for-sale'.
bedrooms_maxNo
bedrooms_minNo
bathrooms_minNo
property_typesNoComma-separated slugs: apartments, villas, penthouses, plots, townhouses, or commercial (every commercial type; a family such as offices, retail, cafes-bars-restaurants, hotels-leisure, industrial-warehouses, garages-storage-rooms, buildings or commercial-land; office, shop, restaurant, hotel, warehouse and the other commercial types also work alone). Without it the search covers homes only.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageYes
errorNo
totalYes
limitsNo
page_sizeYes
propertiesYes
location_matchNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / property_types / description
      Previous value: -"Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, or commercial (every commercial type; office, shop, restaurant, hotel, warehouse and the other commercial types also work alone). Without it the search covers homes only."New value: +"Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, or commercial (every commercial type; a family such as offices, retail, cafes-bars-restaurants, hotels-leisure, industrial-warehouses, garages-storage-rooms, buildings or commercial-land; office, shop, restaurant, hotel, warehouse and the other commercial types also work alone). Without it the search covers homes only."
    • addedInput schema / properties / tenure
      Added value: +{
      +  "description": "Commercial sales only: traspaso finds business transfers (the lease and the business taken over), freehold the premises sold outright.",
      +  "enum": [
      +    "traspaso",
      +    "freehold"
      +  ],
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / property_types / description
      Previous value: -"Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, commercial."New value: +"Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, or commercial (every commercial type; office, shop, restaurant, hotel, warehouse and the other commercial types also work alone). Without it the search covers homes only."
  3. Changed2 schema fields changed
    • changedInput schema / properties / features / description
      Previous value: -"Only listings with ALL of these: pool (any pool), private_pool (tagged private or heated pool), sea_view, garden (private, landscaped or communal), parking (garage or parking space), terrace. Results say what each matched on in matched_features."New value: +"Only listings with ALL of these: pool (any pool), private_pool (tagged private or heated pool), communal_pool (tagged communal pool), sea_view, garden (private, landscaped or communal), parking (garage or parking space), terrace. Results say what each matched on in matched_features."
    • changedInput schema / properties / features / items / enum
      Previous value: -[
      -  "pool",
      -  "private_pool",
      -  "sea_view",
      -  "garden",
      -  "parking",
      -  "terrace"
      -]New value: +[
      +  "pool",
      +  "private_pool",
      +  "communal_pool",
      +  "sea_view",
      +  "garden",
      +  "parking",
      +  "terrace"
      +]
  4. Changed3 schema fields changed
    • addedInput schema / properties / features
      Added value: +{
      +  "description": "Only listings with ALL of these: pool (any pool), private_pool (tagged private or heated pool), sea_view, garden (private, landscaped or communal), parking (garage or parking space), terrace. Results say what each matched on in matched_features.",
      +  "items": {
      +    "enum": [
      +      "pool",
      +      "private_pool",
      +      "sea_view",
      +      "garden",
      +      "parking",
      +      "terrace"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / location_id
      Added value: +{
      +  "description": "Area id from autocomplete_location. Takes precedence over location. A group id (a region or coast, type group) searches every area in the group.",
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / properties / items / properties / matched_features
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "feature": {
      +        "type": "string"
      +      },
      +      "parking_spaces": {
      +        "type": "integer"
      +      },
      +      "tags": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "terrace_sqm": {
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  5. Changed1 schema field changed
    • addedOutput schema / properties / limits
      Added value: +{
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  6. Changed1 schema field changed
    • changedInput schema / properties / language / enum
      Previous value: -[
      -  "en",
      -  "es",
      -  "de",
      -  "fr",
      -  "it",
      -  "nl",
      -  "pt",
      -  "bg",
      -  "el",
      -  "da",
      -  "sv",
      -  "no",
      -  "fi"
      -]New value: +[
      +  "en",
      +  "es",
      +  "de",
      +  "fr",
      +  "it",
      +  "nl",
      +  "pt",
      +  "bg",
      +  "el",
      +  "da",
      +  "sv",
      +  "no",
      +  "fi",
      +  "pl",
      +  "ru"
      +]
  7. Changed2 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"
      +  ]
      +}
  8. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: it discloses a daily result allowance, the shape of the exhausted-allowance response (empty plus `error` and `limits`), the strict no-substitution behavior on unknown locations (error: location_not_found), and the meaning of oracle_verified/oracle_attestation_url.

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-loads purpose, alternative, and licensing before the deep field semantics, and every paragraph carries an actionable detail. It is nonetheless long and some feature text overlaps the schema, so it is dense rather than maximally tight.

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?

For a 14-parameter, zero-required search tool with an output schema, the description still covers the edge cases an agent must handle (empty allowance, location_not_found, feature matching, coordinate precision). Nothing needed to call it correctly is missing.

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?

Despite 64% schema coverage, the description adds real semantics the schema lacks: private_pool vs communal_pool feed-tagging caveats with a widening strategy, the `location_id` group-id behavior, `location.city` vs administrative `municipality` resolution, and coordinates_precision values. This meaningfully exceeds what the schema documents.

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 ('Search PropertyList's full Spanish property MLS by structured filters') and immediately distinguishes itself from the sibling find_properties_by_description by scope ('queries that translate cleanly to fields' vs 'free-form briefs'). An agent can route between the two search tools without opening either schema.

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?

Explicitly names the alternative (find_properties_by_description) and the condition that selects it, then specifies eligibility ('free use... for an assistant answering a person's questions') and when a paid plan is required ('reading listings in bulk, or showing them on a website'). Both when-to-use and when-not-to-use are covered.

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