# PropertyList — Spanish Property MLS (remote · mcp.propertylist.es)

First-party Spanish, Portuguese and Italian property listings with notarial-verified prices.

- Trust score: 68/100 (medium)
- Change this week: +10
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `mcp.propertylist.es`: 68/100 (this document), [markdown](https://verifymcp.io/servers/es-propertylist-propertylist/mcp.md), [page](https://verifymcp.io/servers/es-propertylist-propertylist/mcp)

## Channel facts

- Endpoint: `https://mcp.propertylist.es/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.1.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 69/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS not yet verified: we couldn't determine whether a plaintext access path exists.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 64/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2520 tokens (~193/item across 13 items; 13 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 93/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 75% of tool parameters carry a description.
  - Structured output schemas are declared (38% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http es-propertylist-propertylist https://mcp.propertylist.es/mcp
```

### Codex

```toml
[mcp_servers.es-propertylist-propertylist]
url = "https://mcp.propertylist.es/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "es-propertylist-propertylist": {
      "type": "remote",
      "url": "https://mcp.propertylist.es/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add es-propertylist-propertylist --url https://mcp.propertylist.es/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  es-propertylist-propertylist:
    url: "https://mcp.propertylist.es/mcp"
```

### Other

```json
{
  "mcpServers": {
    "es-propertylist-propertylist": {
      "type": "http",
      "url": "https://mcp.propertylist.es/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 67, +2)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-31 (score 65, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 64, +1)

- [security] Tool “area_market_summary” rewrote its description, which is the text the model reads
- [security] Tool “get_property” rewrote its description, which is the text the model reads
- [security] Tool “search_properties” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 174 → 193
- [functional] Schema quality: good → excellent

### 2026-07-28 (score 63, +5)

- [security improvement] Authorization: unverified → partial
- [functional improvement] Stability: unverified → 0.03

### 2026-07-27 (score 58)

First indexed and scored.

## MCP tools (13)

### `search_properties` (~385 tokens)

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.

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

Input parameters:

- `bathrooms_min` (integer)
- `bedrooms_max` (integer)
- `bedrooms_min` (integer)
- `language` (string): Preferred language for property titles and description excerpts.
- `location` (string): Free-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` (integer)
- `page_size` (integer)
- `price_max` (integer): Maximum price in euros (sale) or monthly euros (rent).
- `price_min` (integer): Minimum price in euros (sale) or monthly euros (rent).
- `property_types` (string): Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, commercial.
- `search_type` (string): Listing market. Defaults to 'for-sale'.

Output parameters:

- `error` (string|null)
- `location_match` (object|null)
- `page` (integer)
- `page_size` (integer)
- `properties` (array)
- `total` (integer)

### `find_properties_by_description` (~147 tokens)

Match Spanish properties from a free-form description of what the
user wants. Best for vague, conditional, or lifestyle-heavy briefs
("3-bed near a good international school, flexible on budget if
there's a sea view"). Uses Gemini to translate the brief into one
to three parallel structured searches across PropertyList's full
MLS, then merges and ranks the results. Returns up to 9 listings
with match scores and an explanation of how the brief was
interpreted (and what couldn't be resolved).

Input parameters:

- `brief` (string, required): Plain-English (or Spanish) description of what the user is looking for. 10-500 chars.
- `language` (string)

Output parameters:

- `interpretation` (object|null)
- `properties` (array)
- `summary` (string|null)
- `unresolved` (array)

### `autocomplete_location` (~115 tokens)

Look up Spanish property areas (city, suburb, urbanisation) by
free-text name. Returns up to 10 matches with id, name, and the
parent province/city. Use this to resolve place names before
calling search_properties, especially for common spellings like
'Nueva Andalucia' (vs 'Nueva Andalucía') or 'Marbella old town'.

Input parameters:

- `provinces` (string): Optional comma-separated province ids to scope the search.
- `query` (string, required): Free-text place name. 2+ characters.

### `get_property` (~154 tokens)

Fetch the full record for one PropertyList listing by its reference
code (the human-readable id like 'PLE-12345'). Use this once the
user has settled on a listing from search_properties or
find_properties_by_description and wants details, photos, or
agency contact info.

\`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.

Input parameters:

- `language` (string)
- `reference` (string, required): PropertyList reference, e.g. 'PLE-12345'.

Output parameters:

- `property` (object)

### `area_market_summary` (~233 tokens)

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.

Input parameters:

- `location` (string, required): Place name (city, suburb, or urbanisation). e.g. 'Marbella'.
- `property_types` (string): Optional comma-separated slugs: apartments, villas, penthouses, plots, townhouses.
- `search_type` (string)

Output parameters:

- `by_bedroom_band` (object)
- `error` (string|null)
- `location` (string)
- `location_match` (object|null)
- `max_price` (integer|null)
- `mean_price` (integer|null)
- `median_price` (integer|null)
- `median_price_per_sqm` (integer|null)
- `min_price` (integer|null)
- `note` (string|null)
- `oracle` (object)
- `price_basis` (string)
- `price_unit` (string)
- `property_types` (string|null)
- `search_type` (string)
- `total_listings` (integer)

### `list_agencies` (~110 tokens)

Find PropertyList agencies (estate agents) in a given Spanish area,
ranked by how many active listings they carry there. Returns up to
10 agencies with name, location, listing count, and a public URL
the user can visit. Use this after a buyer has narrowed in on an
area and wants to know which agencies dominate it.

Input parameters:

- `limit` (integer)
- `location` (string, required): Place name (city, suburb, or urbanisation). e.g. 'Estepona'.

### `verified_valuation` (~240 tokens)

Get a VERIFIED valuation for a Spanish property or area, sourced from
the Spanish notarial register (Consejo General del Notariado) - not
asking prices. Returns the verified €/m² for the municipality and
segment, an indicative valuation when you give a size (build_sqm) or a
listing reference, and a content-hashed attestation URL the figure can
be cited from. Also returns our proprietary network achieved-sale
figure where available. Use this for "what's it worth / is the asking
price fair?". If no attestation covers the area yet, it says so plainly
(use area_market_summary for asking-price stats instead).

Input parameters:

- `build_sqm` (integer): Built size in m² to value. Optional.
- `location` (string): Municipality / city name, e.g. "Marbella". Ignored if a reference is given.
- `property_type` (string): Optional segment slug: apartment, villa, penthouse, townhouse, plot. Defaults to the municipality-wide figure.
- `reference` (string): Value a specific PropertyList listing by reference (uses its municipality, type and size). Optional.

Output parameters:

- `attestation_url` (string|null)
- `build_sqm` (integer|null)
- `content_hash` (string|null)
- `indicative_range` (object)
- `location` (string|null)
- `network` (object|null)
- `on_chain` (boolean)
- `period_end` (string|null)
- `property_type` (string|null)
- `sample_size` (integer|null)
- `source` (string|null)
- `valuation_estimate` (integer|null)
- `verified` (boolean)
- `verified_price_per_sqm` (integer|null)

### `submit_enquiry` (~211 tokens)

Submit an enquiry (lead) about a specific listing on behalf of a prospective
buyer or tenant. Use this once the user has chosen a property and wants the
agency to contact them. The listing agency receives the enquiry in their CRM
and follows up directly.

Requires an API key. Provide the property `reference` (from search results)
plus the enquirer's contact details. Only submit with the person's clear
intent and consent - this sends their details to a real estate agency.

Input parameters:

- `email` (string, required): Enquirer's email address.
- `language` (string): Preferred language for the agency to reply in.
- `message` (string): Optional message / what they want to know or arrange (e.g. a viewing).
- `name` (string, required): Enquirer's full name.
- `phone` (string, required): Enquirer's phone number (with country code where possible).
- `reference` (string, required): PropertyList listing reference the enquiry is about, e.g. 'PLE-12345'.

### `my_leads` (~108 tokens)

List recent enquiries (leads) for YOUR agency's CRM - newest first.
Use when the agent asks about their own leads/enquiries (e.g. "what
came in today?"). Requires an agency API key; only ever returns the
calling agency's own leads.

Input parameters:

- `limit` (integer)
- `property_reference` (string): Only leads about this listing reference. Optional.
- `since` (string): ISO date/time - only leads created on or after this. Optional.

### `find_contacts` (~86 tokens)

Search YOUR agency's CRM contacts by name, company, email or phone.
Use to look a person up before logging a note or to check if they're
already in the CRM. Requires an agency API key; only ever searches the
calling agency's own contacts.

Input parameters:

- `limit` (integer)
- `query` (string, required): Name, company, email or phone fragment to search for.

### `my_listings` (~96 tokens)

List YOUR agency's own property listings (newest first), optionally
filtered by status or a specific reference. Use for "show my listings"
/ "is reference X still online?". Requires an agency API key; only ever
returns the calling agency's own properties.

Input parameters:

- `limit` (integer)
- `reference` (string): A specific listing reference. Optional.
- `status` (string): Listing status. Defaults to 'online'.

### `create_contact` (~154 tokens)

Add a new contact to YOUR agency's CRM. Use when the agent wants to
save a person (buyer, owner, enquirer). If a contact with the same
email already exists it is returned rather than duplicated. The contact
is created unassigned and flagged as needing attention so it surfaces
in the CRM. Requires an agency API key.

Input parameters:

- `company_name` (string): Company name (for a business contact). Optional.
- `email` (string): Email address. Optional but recommended (used for de-duplication).
- `name` (string, required): Contact's first name (or full name).
- `phone` (string): Phone number. Optional.
- `surname` (string): Contact's surname. Optional.

### `log_note` (~132 tokens)

Log a note against a contact or a listing in YOUR agency's CRM (e.g.
record a call outcome or a viewing). Provide the note text plus a
contact_id (from find_contacts) and/or a property reference. The note
appears on the contact/property timeline. Requires an agency API key.

Input parameters:

- `contact_id` (integer): Contact to attach the note to (from find_contacts). Optional if a property reference is given.
- `note` (string, required): The note text to record.
- `property_reference` (string): Listing reference to attach the note to. Optional if a contact_id is given.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/es-propertylist-propertylist/mcp#diagnostics

## Score history

- 2026-08-03: 68
- 2026-08-02: 68
- 2026-08-01: 67
- 2026-07-31: 65
- 2026-07-30: 64
- 2026-07-29: 64
- 2026-07-28: 63
- 2026-07-27: 58

## Links

- Remote endpoint: https://mcp.propertylist.es/mcp
- Website: https://propertylist.es/mcp
- Changelog RSS feed: https://verifymcp.io/servers/es-propertylist-propertylist/mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/es-propertylist-propertylist/mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/es-propertylist-propertylist/mcp
