Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

PropertyList: Spanish Property MLS

REMOTE · MCP.PROPERTYLIST.ES · SCANNED OCT 12

First-party Spanish and Portuguese property listings with notary-verified prices.

−7 this week 73 Trust /100

Recent critical change

Authorization (8 Oct 2026). See the changelog before you install this server.

Trust breakdown (7 categories)

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. How we score → Why this is hard to score →

Endpoint Security51
Transport & Reachability100
Schema Quality & AI Usability64
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 7746 tokens (~249/item across 31 items; 31 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage93
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 75% of tool parameters carry a description.Partial
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 32 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the PropertyList: Spanish Property MLS MCP server?

PropertyList: Spanish Property MLS is a hosted endpoint at https://mcp.propertylist.es/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.propertylist.es

# add to Claude Code
claude mcp add --transport http es-propertylist-propertylist 'https://mcp.propertylist.es/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "es-propertylist-propertylist": {
      "url": "https://mcp.propertylist.es/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "es-propertylist-propertylist": {
      "type": "http",
      "url": "https://mcp.propertylist.es/mcp"
    }
  }
}
# ~/.codex/config.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
    }
  }
}
# add to OpenClaw
openclaw mcp add es-propertylist-propertylist --url 'https://mcp.propertylist.es/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  es-propertylist-propertylist:
    url: "https://mcp.propertylist.es/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "es-propertylist-propertylist": {
      "Transport": "http",
      "Url": "https://mcp.propertylist.es/mcp"
    }
  }
}
# add to Vellum
assistant mcp add es-propertylist-propertylist -t streamable-http -u 'https://mcp.propertylist.es/mcp'
// mcp.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 we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 10 Oct 26 −1
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “submit_enquiry” rewrote its description, which is the text the model reads security
    • Server version: 1.0.0 → 1.1.0 functional
    • New tool “get_guide” functional
    • New tool “search_guides” functional
  • 8 Oct 26 −6
    • Authorization: partial → fail ▼ critical
    • Tool “find_properties_by_description” 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 security
    • Schema quality: 3991 → 7389 ▼ functional
    • Tool coverage: 33% → 100% ▲ functional
    • Schema quality: good → excellent functional
    • Destructive annotations: pass → 100 functional
    • “search_properties” reworded the description of “features” cosmetic
  • 30 Sept 26 0
    • The server rewrote its instructions, which are the text every model session reads security
  • 28 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 11 Sept 26 0
    • The server rewrote its instructions, which are the text every model session reads 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 security
    • Tool “submit_enquiry” rewrote its description, which is the text the model reads security
    • Tool “verified_valuation” rewrote its description, which is the text the model reads security
    • Schema quality: 233 → 265 ▼ functional
    • Schema quality: excellent → good functional
  • 10 Sept 26 0
    • Tool “find_properties_by_description” rewrote its description, which is the text the model reads security
    • The server no longer declares the “prompts” capability functional
    • The server no longer declares the “resources” capability functional
    • Server version: 0.1.0 → 1.0.0 functional
    • Tool “area_market_summary” changed its title: Area market summary cosmetic
    • Tool “autocomplete_location” changed its title: Autocomplete location cosmetic
    • Tool “create_contact” changed its title: Create contact cosmetic
    • Tool “create_listing” changed its title: Create listing draft cosmetic
    • Tool “find_contacts” changed its title: Find contacts cosmetic
    • Tool “find_properties_by_description” changed its title: Find properties by description cosmetic
    • Tool “get_property” changed its title: Get property details cosmetic
    • Tool “list_agencies” changed its title: List agencies cosmetic
    • Tool “log_note” changed its title: Log note cosmetic
    • Tool “my_leads” changed its title: My leads cosmetic
    • Tool “my_listings” changed its title: My listings cosmetic
    • Tool “my_pipeline” changed its title: My pipeline cosmetic
    • Tool “search_properties” changed its title: Search properties cosmetic
    • Tool “submit_enquiry” changed its title: Submit enquiry cosmetic
    • Tool “verified_valuation” changed its title: Verified valuation cosmetic
  • 9 Sept 26 0
    • The server rewrote its instructions, which are the text every model session reads security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 12 Oct 2026 · Probed https://mcp.propertylist.es/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=propertylist.es CN=WE1,O=Google Trust Services,C=US 9 Oct 2026 7 Jan 2027 ECDSA 256 ECDSA-SHA256 a04abad2b734631e0e311c35d81ce504
SANs: propertylist.es, *.propertylist.es
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of mcp.propertylist.es. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
es. present 54404 8 Verified
propertylist.es. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000; includeSubDomains
x-content-type-options nosniff
x-frame-options SAMEORIGIN
referrer-policy strict-origin-when-cross-origin

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.propertylist.es/mcp Verified 200
http (plaintext) http://mcp.propertylist.es/mcp Inconclusive 410
MCP tools · 31 exposed · ~7,227 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
area_market_summary ~434

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.

NameTypeReqDescription
locationstringyesPlace name (city, suburb, or urbanisation). e.g. 'Marbella'.
property_typesstring–Optional comma-separated slugs: apartments, villas, penthouses, plots, townhouses.
search_typestring––
NameTypeReqDescription
by_bedroom_bandobject––
errorstring|null––
locationstringyes–
location_matchobject|null––
max_priceinteger|null––
mean_priceinteger|null––
median_priceinteger|null––
median_price_per_sqminteger|null––
min_priceinteger|null––
notestring|null––
oracleobjectyes–
price_basisstring––
price_unitstring––
property_typesstring|null––
search_typestring––
total_listingsintegeryes–

No examples provided.

assign_listing ~174

Stage assigning one of YOUR agency's listings to a colleague. Returns a preview and an action_id; NOTHING changes until you call confirm_action with that id, after the agent has said yes. Only an agency admin (or someone allowed to edit every listing), or the agent the listing is assigned to now, may move it; an unassigned listing can be taken by anyone who may edit listings. Name the colleague as they appear in the CRM; if several match, the answer lists them. Requires a linked PropertyList account: the change is made in the agent's own name, with their CRM permissions, so an agency API key alone cannot make it.

NameTypeReqDescription
colleaguestringyesThe colleague's name, e.g. 'Sarah Lopez'.
referencestringyesThe listing reference.
NameTypeReqDescription
action_idintegeryesPass to confirm_action to make the change, or cancel_action to drop it.
detailsobjectyes–
expires_atstringyesISO 8601, UTC. After this the preview must be staged again.
statusstringyes–
summarystringyesWhat confirming will do, to show the agent.

No examples provided.

autocomplete_location ~199

Look up property areas (city, suburb, urbanisation, or a group of areas such as a region or a coast) by free-text name. Returns up to 10 matches with id, name, type, the parent province/city and the number of listings, biggest first, so a group that covers a whole region (e.g. 'Region of Murcia') comes before the city of the same name. 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', and pass the chosen id to search_properties as location_id.

NameTypeReqDescription
provincesstring–Optional comma-separated province ids to scope the search.
querystringyesFree-text place name. 2+ characters.
search_typestring–Market the listing counts and the ranking are for. Defaults to 'for-sale'.
NameTypeReqDescription
matchesarrayyes–

No examples provided.

cancel_action ~98

Drop a change you staged and the agent does not want. Nothing in the CRM changes; the action_id can no longer be confirmed. An unconfirmed preview also lapses by itself after 30 minutes. Requires a linked PropertyList account: the change is made in the agent's own name, with their CRM permissions, so an agency API key alone cannot make it.

NameTypeReqDescription
action_idintegeryesThe action_id from the preview.
NameTypeReqDescription
action_idintegeryes–
statusstringyes–

No examples provided.

confirm_action ~168

Make a change you staged with move_pipeline_stage, qualify_lead, assign_listing, set_listing_status, send_listings_to_contact or schedule_viewing. Call it ONLY after showing the agent the preview and hearing them say yes. It can charge credits and send email, exactly as the preview said. Everything is checked again first; if the client, listing or stage has changed so the action no longer applies, nothing happens and the answer says why. A preview is valid for 30 minutes, and each one can be confirmed once. Requires a linked PropertyList account: the change is made in the agent's own name, with their CRM permissions, so an agency API key alone cannot make it.

NameTypeReqDescription
action_idintegeryesThe action_id from the preview.
NameTypeReqDescription
action_idintegeryes–
detailsobject––
statusstringyes–
summarystringyes–

No examples provided.

create_contact ~162

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 a linked PropertyList account (or an agency API key).

NameTypeReqDescription
company_namestring–Company name (for a business contact). Optional.
emailstring–Email address. Optional but recommended (used for de-duplication).
namestringyesContact's first name (or full name).
phonestring–Phone number. Optional.
surnamestring–Contact's surname. Optional.
NameTypeReqDescription
contact_idintegeryesFor log_note.
statusstringyesexists: a contact with this email was already in the CRM, and nothing was added.

No examples provided.

create_listing ~307

Start a new property listing in YOUR agency's CRM from a description. Use when the agent is describing a property they have taken on and wants it in the system. Creates a DRAFT. It is never published and never appears on the portal from here: the agent adds photographs and the energy rating in the CRM and publishes it themselves. The response includes a direct link to the draft. Location is resolved against the real area tree, so a town, suburb or urbanisation name is enough. Requires a linked PropertyList account (or an agency API key).

NameTypeReqDescription
bathroomsinteger––
bedroomsinteger––
build_sqminteger–Built area in square metres.
descriptionstringyesThe property description, in the language the agent wrote it.
headlinestring–Short headline for the listing. Optional.
languagestring–Language the description is written in. Defaults to the agency language.
locationstring–Town, suburb or urbanisation, e.g. "Nueva Andalucia" or "Menara Beach".
plot_sqminteger–Plot size in square metres.
priceinteger–Asking price in euros, or monthly rent for a rental.
property_typestring–apartment, villa, penthouse, townhouse, plot or commercial.
search_typestring–Whether it is for sale or for long-term rent. Defaults to for-sale.
NameTypeReqDescription
locationstring|null–Where the draft was filed; null when the place name matched no area.
next_stepsarrayyes–
property_idintegeryes–
referencestringyes–
statusstringyes–
urlstringyesThe draft in the CRM, where the agent finishes and publishes it.
warningstring–Advice to pass on to the agent before they publish.

No examples provided.

find_contacts ~94

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 a linked PropertyList account (or an agency API key); only ever searches the calling agency's own contacts.

NameTypeReqDescription
limitinteger––
querystringyesName, company, email or phone fragment to search for.
NameTypeReqDescription
contactsarrayyes–
countintegeryes–

No examples provided.

find_price_reductions ~252

Live listings whose asking price has been reduced recently, biggest reduction first. Each listing carries the price before the cut, the price now, the reduction in euros and percent, and when it was cut. Use for "what has dropped in price in Estepona this month?" or to spot motivated sellers. Filters work as in search_properties (location, type, bedrooms, price). A location we do not hold returns zero results with error: location_not_found. Listings shown as price on application are never included.

NameTypeReqDescription
bedrooms_mininteger––
daysinteger–How far back to look for reductions.
languagestring––
limitinteger––
locationstring–Place name, e.g. 'Marbella'. Omit for every area.
min_percentnumber–Only reductions of at least this percentage.
price_maxinteger–Maximum CURRENT price in euros (sale) or monthly euros (rent).
property_typesstring–Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, commercial.
search_typestring–Defaults to 'for-sale'.
NameTypeReqDescription
daysinteger––
errorstring|null––
history_fromstring|null–Earliest date we hold price history for.
location_matchobject|null––
propertiesarrayyes–
totalintegeryes–

No examples provided.

find_properties_by_description ~243

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"). The matcher translates 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). Features in the brief are filters too: a private pool, a communal pool, a sea view, a garden, a garage and the like. Works without an API key up to a daily allowance per user (allowance.daily_answers in the result; briefs that find nothing do not count). An API key has its own, larger allowance. When the allowance is used up the call returns an error naming the limit; search_properties stays available for structured queries.

NameTypeReqDescription
briefstringyesPlain-English (or Spanish) description of what the user is looking for. 10-500 chars.
languagestring––
NameTypeReqDescription
allowanceobject|null––
billedboolean|null––
errorstring|null––
interpretationarray|null–How the brief was read, one pill per constraint.
propertiesarrayyes–
summarystring|null––
unresolvedarray––

No examples provided.

find_similar_properties ~137

Listings similar to one property: same market (sale or rent), same town, same kind of home, a similar number of bedrooms and a price within about 25%. Closest in price first. Use it for "show me alternatives to PL12345" or "anything like this but cheaper?". Every property carries `oracle_verified` and `oracle_attestation_url`, as in search_properties.

NameTypeReqDescription
languagestring–Language for titles and description excerpts.
limitinteger––
referencestringyesReference of the listing to find alternatives to, e.g. PL12345.
NameTypeReqDescription
propertiesarrayyes–
referencestringyes–

No examples provided.

get_contact ~167

The full picture of one client in YOUR agency's CRM: contact details, where they sit on the pipeline boards, the agents they belong to, their saved searches, their enquiries, recent notes and history, viewings with outcomes, listings already sent to them, when they were last in touch and what is booked next. Get the contact_id from find_contacts or my_pipeline first. Use this before advising an agent on a client, and before match_buyer_to_inventory, so you know what has already been sent. Requires a linked PropertyList account (or an agency API key); only ever reads the calling agency's own contacts, and only those the caller may see in the CRM.

NameTypeReqDescription
contact_idintegeryesThe contact id, from find_contacts or my_pipeline.
NameTypeReqDescription
archivedboolean––
assigned_agentsarrayyes–
company_namestring––
created_atstring–ISO 8601, UTC.
crm_urlstring––
emailsarrayyes–
enquiriesarrayyes–
idintegeryes–
languagesarray––
last_contact_atstring–ISO 8601, UTC.
lost_reasonstring|integer––
marketing_consentboolean––
namestring––
next_actionsarrayyes–
phonesarrayyes–
pipelinesobject–Board name to the stage the client is on.
properties_sentarrayyes–
recent_notesarrayyes–
searchesarrayyes–
sourcestring––
viewingsarrayyes–

No examples provided.

get_guide ~147

Read one PropertyList guide. Answer from its text and link its url. If last_reviewed is set, say the page was checked on that date; if it is null, say the page shows no review date. If truncated is true, call again with offset set to next_offset. It is general information, not legal or tax advice.

NameTypeReqDescription
max_charsinteger–Most characters of text to return (default 12000).
offsetinteger–Where to continue a long page: the next_offset of the previous call.
urlstringyesThe guide on info.propertylist.es: a full URL from search_guides, or its path (/docs/...).
NameTypeReqDescription
alternates––Each language version's URL.
descriptionstring|null––
languagestring|null––
last_reviewedstring|null–The page's own review date, as the page states it; null when it shows none.
next_offsetinteger|null–Pass as offset to read on, when truncated.
source–––
textstringyesThe page as Markdown-style text.
titlestring|null––
total_charsinteger|null––
truncatedboolean––
urlstringyesCanonical URL of the page; link it.

No examples provided.

get_property ~319

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 or photos. To contact the listing agency, use submit_enquiry - direct phone or email details are not part of the payload. Works without an API key up to a daily allowance of distinct listings, counted per IP address, or per account for an app linked to a PropertyList account; an API key raises that allowance. `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.

NameTypeReqDescription
languagestring––
referencestringyesPropertyList reference, e.g. 'PLE-12345'.
NameTypeReqDescription
propertyobjectyes–

No examples provided.

list_agencies ~110

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.

NameTypeReqDescription
limitinteger––
locationstringyesPlace name (city, suburb, or urbanisation). e.g. 'Estepona'.
NameTypeReqDescription
agenciesarrayyes–

No examples provided.

listing_health ~199

Checks YOUR agency's own listings for what is holding them back, and lists the ones with problems, most problems first: - stale: online for 90 days or more, no enquiry in the last 60 days and no price change in the last 90 - too_few_photos: fewer than the 5 photos a listing needs to publish - no_energy_rating - missing_description: no Spanish or no English description - no_price: no asking price and not marked price on application Defaults to online listings; status 'draft' checks what is not published yet (what stops it publishing), 'all' checks both. Requires a linked PropertyList account (or an agency API key); only the calling agency's own listings.

NameTypeReqDescription
issuestring–Only listings with this problem. Optional.
limitinteger––
statusstring––
NameTypeReqDescription
checkedintegeryes–
issuesobjectyesIssue name to how many listings have it.
listingsarrayyes–
rulesobjectyes–

No examples provided.

log_note ~140

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 a linked PropertyList account (or an agency API key).

NameTypeReqDescription
contact_idinteger–Contact to attach the note to (from find_contacts). Optional if a property reference is given.
notestringyesThe note text to record.
property_referencestring–Listing reference to attach the note to. Optional if a contact_id is given.
NameTypeReqDescription
activity_idintegeryes–
statusstringyes–

No examples provided.

match_buyer_to_inventory ~211

The listings that fit one client's search in YOUR agency's CRM: your own listings first, then shared MLS listings your agency can sell, newest first. Each listing says whether it is your own. Uses the client's saved search (or, if none is saved, the search their latest debrief described), the same search the CRM runs for that client. A client with no search returns an explanation rather than a guess; set one up in the CRM or ask the agent for the brief and use search_properties instead. Get the contact_id from find_contacts. Call get_contact first if you need to know what has already been sent to them. Requires a linked PropertyList account (or an agency API key); only the calling agency's clients that the caller may see in the CRM.

NameTypeReqDescription
contact_idintegeryesThe client, from find_contacts or my_pipeline.
languagestring–Language for listing titles and excerpts.
limitinteger––
NameTypeReqDescription
contact_idintegeryes–
propertiesarrayyes–
searchobject|null––
totalintegeryes–

No examples provided.

match_inventory_to_buyers ~155

The clients in YOUR agency's CRM whose saved search fits one listing: who to call about it. Works for your own listings and for shared MLS listings your agency can sell. Only online listings can be matched (a saved search only ever shows online stock); a draft returns an explanation. Clients are listed with their assigned agent, pipeline stage and the search they matched on. Use get_contact on any of them for the full picture. Requires a linked PropertyList account (or an agency API key); only the calling agency's clients that the caller may see in the CRM.

NameTypeReqDescription
limitinteger––
property_referencestringyesListing reference, e.g. PL12345.
NameTypeReqDescription
clientsarrayyes–
property_referencestringyes–
searches_checkedinteger––
totalintegeryes–

No examples provided.

move_pipeline_stage ~268

Stage a move of a client's card to another step on a pipeline board they are already on (buyer, seller, lead or tenant), as dragging the card on the CRM board does. Returns a preview and an action_id; NOTHING changes until you call confirm_action with that id, after the agent has said yes. Use the stage name as it reads on the board (my_pipeline lists them). Putting a client on a board they are not on yet, or qualifying a lead, is qualify_lead. Won and Lost need details the CRM asks for, so they are done in the CRM. For an offer stage, pass offer_amount (and property_reference if the card has no listing yet). Requires a linked PropertyList account: the change is made in the agent's own name, with their CRM permissions, so an agency API key alone cannot make it.

NameTypeReqDescription
contact_idintegeryesThe client, from find_contacts or my_pipeline.
offer_amountinteger–Euros, for an offer stage. Optional.
pipelinestringyes–
property_referencestring–The listing the offer is on, if the card has none. Optional.
stagestringyesThe step to move to, as named on the board.
NameTypeReqDescription
action_idintegeryesPass to confirm_action to make the change, or cancel_action to drop it.
detailsobjectyes–
expires_atstringyesISO 8601, UTC. After this the preview must be staged again.
statusstringyes–
summarystringyesWhat confirming will do, to show the agent.

No examples provided.

my_leads ~188

List recent enquiries (leads) for YOUR agency's CRM - newest first. Use when the agent asks what has just come in (e.g. "what came in today?"). This is the enquiry inbox: an enquiry that arrived from the portal, a website or a microsite. Once an agent starts working a person they live on a pipeline board instead - for those, use my_pipeline. An agency that works everything off the boards can have a busy CRM and an empty inbox here, which is not the same as having no leads. Requires a linked PropertyList account (or an agency API key); only ever returns the calling agency's own leads.

NameTypeReqDescription
limitinteger––
property_referencestring–Only leads about this listing reference. Optional.
sincestring–ISO date/time - only leads created on or after this. Optional.
NameTypeReqDescription
countintegeryes–
leadsarrayyes–

No examples provided.

my_listings ~125

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 a linked PropertyList account (or an agency API key); only ever returns the calling agency's own properties.

NameTypeReqDescription
limitinteger––
referencestring–A specific listing reference. Optional.
statusstring–Listing status. Defaults to 'online'. 'draft' covers listings not yet published (new + in review); 'all' returns every status.
NameTypeReqDescription
countintegeryes–
listingsarrayyes–

No examples provided.

my_pipeline ~296

List the cards on YOUR agency's CRM pipeline boards (Kanban), with each board's own stage names and card counts. Boards: lead, buyer, seller, tenant, nurture (each card is a contact) and property (each card is a listing). Stage names are whatever the agency renamed them to, so read them from the reply rather than assuming. Call with no pipeline for a summary of every board - use this to answer "what's in my pipeline?" or "how many buyers do I have?". Call with a pipeline for that board's cards, newest activity first. This is the board view. For enquiries that have just arrived and have not been worked yet, use my_leads instead. Returns the WHOLE agency's boards, not one agent's cards: CRM access belongs to the agency, not to a person. Requires a linked PropertyList account (or an agency API key); only ever returns the calling agency's own data.

NameTypeReqDescription
limitinteger–Cards per stage. Counts are always the full stage total, whatever this is set to.
pipelinestring–Which board. Omit for a summary of all of them.
stagestring–Only cards in this stage. Match on the stage name as it reads on the board (case-insensitive); closed stages such as Won or Lost can be asked for by name. Optional.
NameTypeReqDescription
boardsarray–The summary of every board, when no pipeline was asked for.
pipelinestring–The board asked for.
stagesarray–That board's stages, each with its full count and up to `limit` cards, most recently updated first.
total_cardsintegeryes–

No examples provided.

qualify_lead ~225

Stage qualifying a client, as the CRM's Qualified popup does: tags them as a buyer, seller or tenant, puts them on that pipeline board and takes them off the Lead board. Returns a preview, including what it will COST (a place on the Buyer board uses a free place or one credit), and an action_id; NOTHING changes or is charged until you call confirm_action with that id, after the agent has said yes. Without `board`, the type comes from what the CRM already knows (the client's saved search, or a Vendor/Landlord tag); with neither, it asks for their details instead of guessing. With `board`, the client goes onto that board at its first step. Requires a linked PropertyList account: the change is made in the agent's own name, with their CRM permissions, so an agency API key alone cannot make it.

NameTypeReqDescription
boardstring–The board to put them on. Optional.
contact_idintegeryesThe client, from find_contacts or my_pipeline.
NameTypeReqDescription
action_idintegeryesPass to confirm_action to make the change, or cancel_action to drop it.
detailsobjectyes–
expires_atstringyesISO 8601, UTC. After this the preview must be staged again.
statusstringyes–
summarystringyesWhat confirming will do, to show the agent.

No examples provided.

schedule_viewing ~223

Stage a viewing in the agent's own CRM diary, with the client and the listing on it. Returns a preview and an action_id; NOTHING is saved until you call confirm_action with that id, after the agent has said yes. The listing can be the agency's own or a shared MLS listing. This only books the agent's diary: for an MLS listing, the listing agency is not contacted, so the agent arranges access with them. Times are read in Spanish time (Europe/Madrid) unless they carry an offset. Requires a linked PropertyList account: the change is made in the agent's own name, with their CRM permissions, so an agency API key alone cannot make it.

NameTypeReqDescription
contact_idintegeryesThe client, from find_contacts.
duration_minutesinteger––
notesstring–Optional.
property_referencestringyes–
starts_atstringyesISO 8601 date and time, e.g. '2026-10-08T11:00'.
NameTypeReqDescription
action_idintegeryesPass to confirm_action to make the change, or cancel_action to drop it.
detailsobjectyes–
expires_atstringyesISO 8601, UTC. After this the preview must be staged again.
statusstringyes–
summarystringyesWhat confirming will do, to show the agent.

No examples provided.

search_guides ~137

Search PropertyList's guides on buying, selling and renting in Spain: taxes such as ITP, IBI and non-resident income tax, the NIE, the buying process, laws and area guides. Use it for how-to, cost and legal questions, then call get_guide for the page. Spanish words need their accents (for example tributación, tasación).

NameTypeReqDescription
languagestring–Language of the guides: en (default) or es.
limitinteger––
querystringyes1 to 6 keywords work best, e.g. "NIE number" or "IBI".
NameTypeReqDescription
fallback_languagestring–Set when nothing matched in Spanish and these are the English guides.
resultsarrayyes–

No examples provided.

search_properties ~815

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_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…

NameTypeReqDescription
bathrooms_mininteger––
bedrooms_maxinteger––
bedrooms_mininteger––
featuresarray–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 (gara…
languagestring–Preferred language for property titles and description excerpts.
locationstring–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.
location_idinteger–Area id from autocomplete_location. Takes precedence over location. A group id (a region or coast, type group) searches every area in the group.
pageinteger––
page_sizeinteger––
price_maxinteger–Maximum price in euros (sale) or monthly euros (rent).
price_mininteger–Minimum price in euros (sale) or monthly euros (rent).
property_typesstring–Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, commercial.
search_typestring–Listing market. Defaults to 'for-sale'.
NameTypeReqDescription
errorstring|null––
limitsobject|null––
location_matchobject|null––
pageintegeryes–
page_sizeintegeryes–
propertiesarrayyes–
totalintegeryes–

No examples provided.

send_listings_to_contact ~213

Stage an email from the agent to one of their clients with listings attached, as the CRM sends listings (it appears on the client's timeline). You write the subject and message, in the client's language. Returns a preview with the address, subject, message and listings, and an action_id; NOTHING is sent until you call confirm_action with that id, after the agent has read it and said yes. Listings can be the agency's own or shared MLS listings it can sell (match_buyer_to_inventory finds them). Up to 10 per email. Requires a linked PropertyList account: the change is made in the agent's own name, with their CRM permissions, so an agency API key alone cannot make it.

NameTypeReqDescription
contact_idintegeryesThe client, from find_contacts.
messagestringyesThe email text, in the client's language. The listings are attached below it.
property_referencesarrayyes–
subjectstringyes–
NameTypeReqDescription
action_idintegeryesPass to confirm_action to make the change, or cancel_action to drop it.
detailsobjectyes–
expires_atstringyesISO 8601, UTC. After this the preview must be staged again.
statusstringyes–
summarystringyesWhat confirming will do, to show the agent.

No examples provided.

set_listing_status ~231

Stage putting one of YOUR agency's listings online (it goes into approval, as the CRM's Publish button does), taking it offline, or marking it sold. Returns a preview, including any credit cost (a private, unshared listing costs credits to publish), and an action_id; NOTHING changes until you call confirm_action with that id, after the agent has said yes. Publishing checks what the CRM checks (photos, required details, your agency's listing limit) and the preview says what is missing. Sold is for a sale listing that is online or offline; sale_price is recorded for market statistics unless hide_sale_price is true. Requires a linked PropertyList account: the change is made in the agent's own name, with their CRM permissions, so an agency API key alone cannot make it.

NameTypeReqDescription
hide_sale_priceboolean–For sold: do not record the price. Optional.
referencestringyesThe listing reference.
sale_priceinteger–Achieved price in euros, for sold. Optional.
statusstringyes–
NameTypeReqDescription
action_idintegeryesPass to confirm_action to make the change, or cancel_action to drop it.
detailsobjectyes–
expires_atstringyesISO 8601, UTC. After this the preview must be staged again.
statusstringyes–
summarystringyesWhat confirming will do, to show the agent.

No examples provided.

submit_enquiry ~280

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. This is the supported way to contact a listing agency - direct phone or email details are not exposed by other tools. Works without an API key up to a small daily allowance, counted per IP address, or per account for an app linked to a PropertyList account; an API key raises it to 40 enquiries per key in any 24 hours. 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.

NameTypeReqDescription
emailstringyesEnquirer's email address.
languagestring–Preferred language for the agency to reply in.
messagestring–Optional message / what they want to know or arrange (e.g. a viewing).
namestringyesEnquirer's full name.
phonestringyesEnquirer's phone number (with country code where possible).
referencestringyesPropertyList listing reference the enquiry is about, e.g. 'PLE-12345'.
NameTypeReqDescription
agencystring|null–The agency that received the enquiry.
lead_idintegeryes–
referencestringyes–
statusstringyes–

No examples provided.

verified_valuation ~510

Get a valuation for a property or area in Spain, Portugal or Cyprus from recorded market data, not asking prices. Returns the €/m² (`price_per_sqm`) 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. Check `verified` before citing. It is true ONLY for Spanish figures drawn from the notarial register (Consejo General del Notariado) with at least 10 recorded transactions behind them. Portuguese figures come from the INE house-price index and Cypriot ones from the Cyprus Statistical Service house-price index: they are estimates, `transaction_backed` is false, `source_label` names the source, and they must not be described as notary-verified. Other countries have no figure yet. `indicative_band_pct` widens as the evidence thins. Transactions are recorded per municipality, so a query for a sub-area (Sotogrande, Puerto Banus, Nueva Andalucia, Orihuela Costa) is answered with the containing municipality's attestation: `rolled_up_from_sub_area` is true, `location` and `municipality_code` name the municipality, `requested_area` is what you asked for and `rollup_note` is the sentence to repeat. Never quote a rolled-up figure as the sub-area's own price. Only two segment attestations exist per municipality, so a request for penthouse or townhouse resolves to the nearest attested segment. `property_type` is the segment actually used and `requested_property_type` is what you asked for; when they differ the text says so. Also returns our proprietary network achieved-sale figure where available. If no attestation covers the area yet, it says so plainly (use area_market_summary for asking-price stats instead).

NameTypeReqDescription
build_sqminteger–Built size in m² to value. Optional.
locationstring–Municipality / city name, e.g. "Marbella". Ignored if a reference is given.
property_typestring–Optional segment slug: apartment, villa, penthouse, townhouse, plot. Defaults to the municipality-wide figure.
referencestring–Value a specific PropertyList listing by reference (uses its municipality, type and size). Optional.
NameTypeReqDescription
attestation_urlstring|null––
build_sqminteger|null––
content_hashstring|null––
indicative_band_pctinteger|null––
indicative_rangeobject––
locationstring|nullyes–
municipality_codestring|null––
networkobject|null––
on_chainboolean––
period_endstring|null––
price_per_sqminteger|null–EUR per m². Verified only when `verified` is true; otherwise an estimate from the source in source_label.
property_typestring|null––
requested_areastring|null––
requested_property_typestring|null––
rolled_up_from_sub_areaboolean––
rollup_notestring|null––
sample_sizeinteger|null––
sourcestring|null––
source_labelstring|null––
transaction_backedboolean––
valuation_estimateinteger|null––
verifiedbooleanyes–
verified_price_per_sqminteger|null–Deprecated: the same figure as price_per_sqm, under its old name. Despite the name it is verified only when `verified` is true.

No examples provided.

Common questions

What is the PropertyList: Spanish Property MLS MCP server?

PropertyList: Spanish Property MLS is an MCP server listed in the public MCP registry as es.propertylist/propertylist. First-party Spanish and Portuguese property listings with notary-verified prices. This page covers its hosted endpoint (https://mcp.propertylist.es/mcp).

Is the PropertyList: Spanish Property MLS MCP server safe to use?

PropertyList: Spanish Property MLS scores 73 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the PropertyList: Spanish Property MLS MCP server expose?

PropertyList: Spanish Property MLS exposes 31 tools: search_properties, find_properties_by_description, autocomplete_location, get_property, area_market_summary, and 26 more. Their descriptions and schemas cost roughly 7,227 tokens of context every time the server is loaded.

Does the PropertyList: Spanish Property MLS MCP server require authentication?

No. We connected to PropertyList: Spanish Property MLS without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the PropertyList: Spanish Property MLS MCP server still maintained?

PropertyList: Spanish Property MLS is still listed as active in the MCP registry. We last reached this channel on 12 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.