PropertyList: Spanish Property MLS
Server Details
First-party Spanish and Portuguese property listings with notary-verified prices.
- Status
- Healthy
- Uptime
- 99.9% over 40 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 15 tools
Each tool has a clear primary purpose, and the descriptions actively cross-reference how to choose between near-neighbours (search_properties vs find_properties_by_description, area_market_summary vs verified_valuation, my_leads vs my_pipeline). A couple of pairs could still tempt an agent skimming names, but the descriptions resolve the boundaries well.
All tools use lowercase snake_case and mostly follow an imperative verb_noun pattern (create_listing, search_properties, submit_enquiry). Two noun-phrase exceptions (area_market_summary, verified_valuation) and the my_ prefix group prevent a perfect 5.
Fifteen tools is at the upper edge of the ideal range, but each one earns its place: the set splits cleanly between public MLS search/valuation and agency CRM operations. There are no redundant utilities or filler tools.
The buyer journey is complete — find, compare, view, value, and enquire — and the CRM covers contacts, leads, notes, listings, and pipeline views. The main gaps are update/delete operations for CRM records and moving pipeline cards, but those are workaroundable and partly left to the CRM UI by design.
Available Tools
15 toolsarea_market_summaryArea market summaryARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | Place name (city, suburb, or urbanisation). e.g. 'Marbella'. | |
| search_type | No | for-sale | |
| property_types | No | Optional comma-separated slugs: apartments, villas, penthouses, plots, townhouses. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| error | No | |
| oracle | Yes | |
| location | Yes | |
| max_price | No | |
| min_price | No | |
| mean_price | No | |
| price_unit | No | |
| price_basis | No | |
| search_type | No | |
| median_price | No | |
| location_match | No | |
| property_types | No | |
| total_listings | Yes | |
| by_bedroom_band | No | |
| median_price_per_sqm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by disclosing concrete failure behavior (location_not_found, no nationwide fallback), unit semantics per search type, sales-only metric constraints, oracle.verified requirements, notarial source conditions, and sub-area rollup logic. No statements contradict annotation readOnly/idempotent/destructive hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than most, but every block earns its space because it covers caveats that would otherwise be unseen (error behaviours, oracle trust conditions, municipality rollup). It is front-loaded with purpose and usage, then stacks internal logic. It could be tightened slightly, but the density justifies most of the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that includes an output schema and has this many edge cases, the description gives almost everything the agent needs: output purpose, parameter effects, error shapes, data provenance, source verification, price-unit rules, and sub-area resolution. The presence of an output schema plus this level of behavioural detail makes the definition contextually complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the schema already documents location and available property_type slugs. The description adds meaningful semantics where the schema is thin: search_type controls price units (total, per month, per week), prices are labelled, and median_price_per_sqm applies only to sales. Location behavior on unknown names is also clarified, though semantics for property_type could go a bit deeper.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Return aggregate market context') and lists highly concrete outputs (active listings, median/mean price, median €/m², bedroom bands). It also names the filter dimensions, making the tool distinct from sibling listing/property tools like search_properties and get_property.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool: 'before recommending a price or commenting on whether a listing is good value.' It does not identify conflicting sibling tools by name, so an agent might still need to infer why not to use verified_valuation or search_properties, but the contextual trigger is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
autocomplete_locationAutocomplete locationARead-onlyIdempotentInspect
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Free-text place name. 2+ characters. | |
| provinces | No | Optional comma-separated province ids to scope the search. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds behavioral context by specifying the maximum number of matches (10), the fields returned (id, name, parent province/city), and the purpose of resolving place names. It doesn't mention edge cases like no matches or error handling, but the added context is valuable and doesn't contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It front-loads the core function, then provides output details, and finally gives usage guidance with examples. Every sentence earns its place, and there is no redundant information. The length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a read-only lookup tool. It covers the purpose, output, and usage context. The output schema is absent, but the description explicitly states what the tool returns (up to 10 matches with id, name, parent province/city), which compensates. It doesn't mention pagination or error cases, but for a simple autocomplete tool, this is sufficient. The annotations cover safety, so the description doesn't need to repeat that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters ('query' and 'provinces'). The description adds context about the 'query' parameter by giving examples of free-text place names, but it doesn't add significant meaning beyond the schema. The 'provinces' parameter is not elaborated in the description, but the schema's description is sufficient. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: looking up Spanish property areas by free-text name, with a specific verb ('Look up'), a resource ('Spanish property areas'), and a defined output (up to 10 matches with id, name, parent province/city). It distinguishes itself from siblings by explicitly mentioning its role in resolving place names before calling search_properties, which is a clear differentiator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'Use this to resolve place names before calling search_properties'. It also provides concrete examples of common spelling variations ('Nueva Andalucia' vs 'Nueva Andalucía') and 'Marbella old town', which helps an agent understand the intended use case. It doesn't explicitly mention when not to use it, but the context and examples make the usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_contactCreate contactAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Contact's first name (or full name). | |
| No | Email address. Optional but recommended (used for de-duplication). | ||
| phone | No | Phone number. Optional. | |
| surname | No | Contact's surname. Optional. | |
| company_name | No | Company name (for a business contact). Optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false and provide minimal signal, so the description carries the burden. It discloses deduplication by email (returns existing contact), creation as unassigned, flagging for attention, and the requirement of an agency API key. These go well beyond annotations, though it doesn't specify the return format for a new contact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying distinct value: purpose, dedup behavior, and side effects/requirements. No fluff, front-loaded with the core action. Efficiently structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers most operational context: purpose, dedup, post-creation state, and auth requirement. The only notable gap is the lack of a clear statement about the return value for a fresh creation (it only mentions 'returned' in the case of duplicate). Given no output schema, a bit more explicit return description would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already described in the schema. The description adds no parameter-specific meaning beyond what the schema provides (e.g., email is for dedup is already in the schema). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Add') and resource ('contact to YOUR agency's CRM'), and clarifies the types of persons (buyer, owner, enquirer). It is clearly distinguished from sibling tools like find_contacts (search) and create_listing (different resource).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool: 'Use when the agent wants to save a person'. It does not explicitly list alternatives or conditions to avoid, but the guidance is clear and the dedup behavior is called out. Missing explicit 'when not to use' prevents a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_listingCreate listing draftAInspect
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 an agency API key.
| Name | Required | Description | Default |
|---|---|---|---|
| price | No | Asking price in euros, or monthly rent for a rental. | |
| bedrooms | No | ||
| headline | No | Short headline for the listing. Optional. | |
| language | No | Language the description is written in. Defaults to the agency language. | |
| location | No | Town, suburb or urbanisation, e.g. "Nueva Andalucia" or "Menara Beach". | |
| plot_sqm | No | Plot size in square metres. | |
| bathrooms | No | ||
| build_sqm | No | Built area in square metres. | |
| description | Yes | The property description, in the language the agent wrote it. | |
| search_type | No | Whether it is for sale or for long-term rent. Defaults to for-sale. | |
| property_type | No | apartment, villa, penthouse, townhouse, plot or commercial. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds far more than the annotations: it creates a DRAFT that is never published, shows that the user, not this tool, is responsible for publishing, includes a direct link in the response, resolves the location against a real area tree, and mentions the agency API key requirement. These are exactly the behaviours an agent needs to set expectations and act accordingly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the very first sentence states the core action and target system, followed by the relevant when-to-use context, the DRAFT caveat, and the key technical side (link, area-tree resolution, API key). Every sentence earns its place with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create tool with 11 parameters and no output schema, the description covers almost all procedural essentials: the draft state, the link, the auth, and the area-tree tolerance. It leaves out edge cases like validation failures or further required fields, but with 82% schema description coverage and a clear intent statement, the agent has enough to decide when and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 82%, so the description doesn't need to re-list parameters. It goes beyond the baseline by clarifying that location is matched loosely against the real area tree, thus allowing town names. It also implies that the same free-form description drives the creation, hinting that many optional fields may get filled from it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('start'), a specific resource ('a new property listing'), and a source/frame ('in YOUR agency's CRM from a description'). This clearly distinguishes it from sibling tools like create_contact or search_properties, and the 'draft' notice further pins down what it is that is created.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use when the agent is describing a property they have taken on and wants it in the system' supplies a clear trigger context. The 'never published / on the portal' statement provides a strong boundary. It does not name a specific alternative tool, but the usage context is explicit enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_contactsFind contactsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Name, company, email or phone fragment to search for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive. The description adds valuable context: it requires an agency API key and only searches the calling agency's contacts, which explains scope and authorization. This goes beyond the annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences. The primary purpose is front-loaded, followed by usage guidance and constraints. No unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool, the description adequately covers the core invocation: query string, auth, and scope. However, it does not explain the 'limit' parameter (though schema gives default/max) nor describe the return format or potential result behavior, which an agent might want to know. Given no output schema, these are minor gaps but still leave the description slightly incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: only 'query' has a description, and the tool description repeats that query accepts name, company, email, or phone. The 'limit' parameter is completely omitted from both schema and description, so the description fails to compensate for the missing documentation on a parameter with constraints and a default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Search'), the resource ('YOUR agency's CRM contacts'), and the searchable fields (name, company, email, phone). It is distinct from sibling tools like find_properties_by_description by focusing on contacts, but does not explicitly name that alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides specific use cases: 'before logging a note' and 'to check if they're already in the CRM', which gives context on when to call. It also notes the prerequisite of an agency API key. However, it does not explicitly state when not to use it or mention alternative tools like create_contact or search_properties.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_properties_by_descriptionFind properties by descriptionARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| brief | Yes | Plain-English (or Spanish) description of what the user is looking for. 10-500 chars. | |
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| billed | No | |
| summary | No | |
| properties | Yes | |
| unresolved | No | |
| interpretation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only/idempotent/non-destructive, and the description adds real behavior beyond that: it breaks the brief into 'one to three parallel structured searches', merges and ranks results, returns 'up to 9 listings with match scores', and discloses interpretation limitations ('what couldn't be resolved'). This is substantial, non-obvious behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the purpose, the ideal input profile, and the processing/output contract. The example is illustrative but compact, and all sentences add information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and annotations, the description covers input, interpretation mechanics, and return shape. It is slightly incomplete because it never conditions this tool against search_properties for structured queries, and the language parameter is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description enriches the 'brief' parameter by characterizing acceptable input as vague, conditional, or lifestyle-heavy, but it does not discuss the 'language' parameter at all. Schema coverage is exactly 50%: brief has a description, language only has an enum/default, so the description only partially compensates for that gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Match Spanish properties from a free-form description of what the user wants.' The example and mention of 'PropertyList's full MLS' ground what it acts on. It is clearly distinguishable from the sibling search_properties because it targets vague, lifestyle-heavy briefs rather than structured queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use it: 'Best for vague, conditional, or lifestyle-heavy briefs' and gives a concrete example. It does not explicitly name an alternative for structured queries or state when not to use it, but the positive guidance is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_propertyGet property detailsARead-onlyIdempotentInspect
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 per-IP allowance of distinct listings; 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 only when
we hold a real, publishable 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,
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.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | en | |
| reference | Yes | PropertyList reference, e.g. 'PLE-12345'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| property | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnly/idempotent hint, but the description adds meaningful behavioral detail: works without an API key up to a daily per-IP allowance and is raised with a key. It also explains tricky response semantics: `city` is the filing tier, `municipality` is never guessed, and coordinates are absent rather than 0,0 when unavailable. No annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
All sentences add value: purpose, sibling alternative, API-key behavior, then two dense field-semantics caveats. Front-loaded; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description flags the non-obvious fields an agent would otherwise misread (municipality null semantics, latitude/longitude absent, precision tiers) and the authentication/rate-limit context. Enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
reference is described in schema; description reinforces with example. The language parameter receives no description beyond enum names + default. With 50% schema coverage, the description does not fill the gap, but language as an enum of locale codes is low-risk. Score 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and object: 'Fetch the full record for one PropertyList listing by its reference code.' It precisely identifies the input ('human-readable id like 'PLE-12345''), distinguishes this from search tools by saying it is used after the user has settled on a listing, and names sibling `submit_enquiry` as the alternative for contact details. Clear and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use: once the user has settled on a listing from search_properties or find_properties_by_description and wants details/photos. It also routes the contact case to submit_enquiryable and notes the API-key/rate-limit context, giving the agent enough to choose between siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_agenciesList agenciesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| location | Yes | Place name (city, suburb, or urbanisation). e.g. 'Estepona'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds behavioral context: ranking by active listings, returning up to 10 agencies, and including a public URL. It doesn't mention pagination or sorting details beyond ranking, but the added context is meaningful and non-contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: it states the purpose, the ranking logic, the return fields, and the usage context in three sentences. Every sentence earns its place, and the most important information (what it does) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with two parameters and no output schema, the description is largely complete. It covers what the tool returns (name, location, listing count, URL), the ranking criterion, and the usage context. The only minor gap is the lack of explicit mention of the 'limit' parameter's behavior, but the description's 'up to 10' partially covers it. Given the tool's simplicity, this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: 'location' is described in the schema, but 'limit' is not. The description mentions 'up to 10 agencies' which implies the limit parameter's effect, but doesn't explicitly explain the limit parameter or its default/maximum. The description adds some meaning beyond the schema (ranking, return fields) but doesn't fully compensate for the undocumented 'limit' parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: finding PropertyList agencies in a Spanish area, ranked by active listing count. It specifies the resource (agencies), the action (list/find), and the context (Spanish area), which distinguishes it from sibling tools like search_properties or find_contacts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: 'Use this after a buyer has narrowed in on an area and wants to know which agencies dominate it.' This implies when to use it, though it doesn't explicitly mention alternatives or when not to use it. The context is strong enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_noteLog noteAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes | The note text to record. | |
| contact_id | No | Contact to attach the note to (from find_contacts). Optional if a property reference is given. | |
| property_reference | No | Listing reference to attach the note to. Optional if a contact_id is given. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already marking this as non-read-only, the description adds meaningful behavioral detail: the note appears on the contact/listing timeline and an agency API key is required. This goes beyond the schema and annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, required inputs, attachment behavior, and authentication requirement. The description is short, front-loaded, and immediately actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the key operational facts an agent needs: target type, input source, result of the action, and authentication. It does not describe return values or error cases, but for a simple logging action with a clear input schema, the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is essentially complete for all parametersley, so the baseline applies. The description adds modest value by clarifying that contact_id comes from find_contacts and that the target can be a contact and/or property, but it does not significantly extend the schema semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Log a note against a contact or a listing in your agency's CRM.' The examples (call outcome, viewing) and attachment targets make the tool's purpose immediately clear and distinguish it from sibling tools that create contacts/listings or submit enquiries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context on when to use the tool and what inputs it needs, including that contact_id should come from find_contacts and that either a contact_id or property_reference can be used. It does not explicitly exclude alternatives or state when not to use this tool, but the context is strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_leadsMy leadsARead-onlyIdempotentInspect
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 an agency API key; only ever returns the calling agency's own leads.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since | No | ISO date/time - only leads created on or after this. Optional. | |
| property_reference | No | Only leads about this listing reference. Optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint, idempotentHint, destructiveHint), and the description adds valuable non-obvious behavior: it requires an agency API key, only ever returns the calling agency's own leads, lists enquiry sources, and explains the move from inbox to pipeline. This goes well beyond what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main purpose is front-loaded in the first sentence, followed by clear usage guidance and a genuinely important empty-inbox clarification. Every sentence earns its place; the length is justified by the need to prevent false negatives and sibling confusion.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers auth scoping, ownership, ordering, sources, and the pipeline distinction, which is a strong level of context. However, with no output schema present, it does not describe the shape or fields of a returned lead, nor any pagination behavior beyond the limit parameter, leaving a small completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents 'since' and 'property_reference', and 'limit' has useful defaults and bounds. The description adds 'newest first' and 'what came in today' context, which helps interpret the ordering and recency, but it does not substantially explain parameter semantics beyond what the schema provides. With 67% schema coverage, the description neither fully compensates nor is redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'List recent enquiries (leads) for YOUR agency's CRM - newest first.' It also distinguishes itself from my_pipeline by defining the inbox versus pipeline lifecycle, so an agent can confidently tell these siblings apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use the tool: when the agent asks what has just come in, e.g. 'what came in today?'. It also gives an exclusion and alternative ('for those, use my_pipeline') and clarifies that an empty inbox is not equivalent to having no leads, preventing a common misinterpretation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_listingsMy listingsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| status | No | Listing status. Defaults to 'online'. 'draft' covers listings not yet published (new + in review); 'all' returns every status. | online |
| reference | No | A specific listing reference. Optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Though annotations already mark it read-only and idempotent, the description adds key behavior: it requires an agency API key, returns only own properties, orders newest first, and clarifies status semantics (e.g., 'draft' includes new + in review). This goes beyond the annotations and gives necessary context for correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact two-sentence statement that integrates purpose, usage, auth, and scope without redundancy. The ordering constraint and filtering options are front-loaded, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool, all needed information is present: auth requirement, scope, ordering, and filter options. The default limit is in the schema, and no output schema is required for a list operation. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Status and reference have explicit descriptions, and the enum values with explanations (especially 'draft' and 'all') are helpful. The limit parameter lacks a prose description, but its minimum, maximum, and default are self-explanatory from the schema. Overall, parameter meaning is clear despite 67% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists the calling agency's own property listings, newest first, with optional status/reference filters. This is distinct from siblings like search_properties (general search) and get_property (single property), and the scope is explicitly limited to own listings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete usage examples ('show my listings', 'is reference X still online?') and notes the agency API key requirement, which implies it is for agency-specific queries. It does not explicitly name alternatives or say when not to use it, but the scope statement effectively excludes general searches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_pipelineMy pipelineARead-onlyIdempotentInspect
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 - an API key belongs to the agency, not to a person. Requires an agency API key; only ever returns the calling agency's own data.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Cards per stage. Counts are always the full stage total, whatever this is set to. | |
| stage | No | 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. | |
| pipeline | No | Which board. Omit for a summary of all of them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds critical behavioral context beyond that: it returns the whole agency's boards (not one agent's), requires an agency API key, only ever exposes the calling agency's data, and stage names are custom so they must be read from the reply. This is exactly the kind of context that helps an agent avoid misinterpreting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than strictly necessary, but every sentence earns its place – there is no filler. The core action is front-loaded, and the structure (scope → usage → alternatives → behavior) is logical. It loses a point only for not being as tight as the two-sentence ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema and three optional parameters, the description covers all necessary aspects: what is returned (board names, stage counts, cards), ordering, scoping to the calling agency, authentication, and alternatives. An agent has everything it needs to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description enriches every parameter. It clarifies that limit only caps cards per stage while counts are full totals, that stage matching is case-insensitive and can target closed stages by name, and that omitting pipeline yields a summary. These are non-obvious behaviors that materially change how an agent should set parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('List the cards on YOUR agency's CRM pipeline boards') and enumerates the exact boards, making the tool's function immediately unambiguous. It also explicitly differentiates itself from the sibling my_leads, so an agent can tell them apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is spelled out: call with no pipeline for a per-board summary, with a pipeline for a specific board's cards, and 'newest activity first' is noted. The description explicitly routes to my_leads for unworked enquiries, giving a clear when-to-use versus when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_propertiesSearch propertiesARead-onlyIdempotentInspect
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.
location.latitude / location.longitude are present only when
we hold a real, publishable 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,
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| language | No | Preferred language for property titles and description excerpts. | en |
| location | No | 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_size | No | ||
| price_max | No | Maximum price in euros (sale) or monthly euros (rent). | |
| price_min | No | Minimum price in euros (sale) or monthly euros (rent). | |
| search_type | No | Listing market. Defaults to 'for-sale'. | |
| bedrooms_max | No | ||
| bedrooms_min | No | ||
| bathrooms_min | No | ||
| property_types | No | Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, commercial. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| error | No | |
| total | Yes | |
| limits | No | |
| page_size | Yes | |
| properties | Yes | |
| location_match | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and idempotency, and the description goes well beyond them by revealing exact failure behavior for unknown locations, the guarantee not to substitute listings, coordinate-omission rules, and the meaning of coordinates_precision. It adds rich context rather than contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then use guidance, then behavioral expectations. Every sentence earns its place: error semantics and coordinate precision are dense but directly relevant, with no filler or restatement of structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex read-only search tool, the description covers the key behaviors an agent needs: pagination, location-not-found behavior, oracle verification, municipality resolution nuance, and coordinate precision. Since an output schema exists, return-shape details do not need to be repeated here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 55% schema coverage, the description compensates by mapping filter categories to actual parameters and by explaining subtle location semantics such as city tier, municipality resolution, and coordinate presence. It does not restate every schema field, but it adds meaningful guidance beyond the bare schema, especially for location behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Search PropertyList's full Spanish property MLS by structured filters.' It also distinguishes itself from find_properties_by_description by explicitly naming the sibling for free-form queries, so an agent can select correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use guidance: structured filters such as bedrooms, bathrooms, price, type, and area; and an explicit when-not-to-use with the alternative: 'For free-form briefs use find_properties_by_description instead.' This is direct and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_enquirySubmit enquiryAInspect
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 per-IP allowance; an API key removes that allowance.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Enquirer's full name. | |
| Yes | Enquirer's email address. | ||
| phone | Yes | Enquirer's phone number (with country code where possible). | |
| message | No | Optional message / what they want to know or arrange (e.g. a viewing). | |
| language | No | Preferred language for the agency to reply in. | en |
| reference | Yes | PropertyList listing reference the enquiry is about, e.g. 'PLE-12345'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a non-read-only, open-world, non-idempotent, non-destructive operation. The description adds significant behavioral context: the enquiry goes to the agency's CRM, there is a per-IP daily allowance without an API key, and it sends personal details to a real estate agency, requiring consent. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured in clear paragraphs, front-loading the core purpose and then adding usage conditions and rate-limit context. It is somewhat verbose but each sentence contributes essential information; it could be tightened but is not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a submission tool with 6 parameters and no output schema, the description covers the essential aspects: purpose, when to use, side effects, consent, and rate limits. It does not describe the return value or error handling, but those are not critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all parameters have descriptions. The description adds minor context by specifying that the 'reference' comes from search results and that contact details are needed, but this largely reiterates the schema. It meets the baseline for full schema coverage but does not add substantial new meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Submit an enquiry'), the resource ('a specific listing'), and the context ('on behalf of a prospective buyer or tenant'). It also distinguishes itself from siblings by noting this is the supported way to contact a listing agency, unlike other tools that don't expose direct contact details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance ('once the user has chosen a property and wants the agency to contact them') and a critical condition ('Only submit with the person's clear intent and consent'). It also implies an alternative path by stating that direct phone/email details are not exposed by other tools, making this the appropriate route.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verified_valuationVerified valuationARead-onlyIdempotentInspect
Get a valuation for a property or area from recorded market data, not asking prices. Returns the €/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.
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.
Elsewhere - Portugal and Cyprus especially - the figure comes from a
national house-price index and is an estimate: transaction_backed is
false, source_label names the real source, and it must not be
described as notary-verified. 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).
| Name | Required | Description | Default |
|---|---|---|---|
| build | No | Alias of build_sqm. | |
| location | No | Municipality / city name, e.g. "Marbella". Ignored if a reference is given. | |
| build_sqm | No | Built size in m² to value. Optional. | |
| reference | No | Value a specific PropertyList listing by reference (uses its municipality, type and size). Optional. | |
| build_size | No | Alias of build_sqm. | |
| property_type | No | Optional segment slug: apartment, villa, penthouse, townhouse, plot. Defaults to the municipality-wide figure. |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | No | |
| network | No | |
| location | Yes | |
| on_chain | No | |
| verified | Yes | |
| build_sqm | No | |
| period_end | No | |
| rollup_note | No | |
| sample_size | No | |
| content_hash | No | |
| source_label | No | |
| property_type | No | |
| requested_area | No | |
| attestation_url | No | |
| indicative_range | No | |
| municipality_code | No | |
| transaction_backed | No | |
| valuation_estimate | No | |
| indicative_band_pct | No | |
| verified_price_per_sqm | No | |
| requested_property_type | No | |
| rolled_up_from_sub_area | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds rich behavioral context beyond the readOnly/idempotent annotations: the meaning of 'verified', the distinction between notarial and index-based sources, the rollup behavior for sub-areas, the segment fallback, and the field-level caveats. It clearly explains what users must check before citing the result. This is far more than the annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but organized in clear thematic paragraphs and front-loads the core purpose. Every paragraph carries an actionable caveat, and the density is justified by the tool's complexity. It is not minimal, but it avoids redundancy and each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all essential aspects of the tool: data source, verification semantics, geographic aggregation, segment fallback, alternative tool, and error/fallback behavior. Given the rich output schema and read-only annotations, nothing an agent needs to call the tool correctly or interpret its results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is a 3, but the description adds meaning beyond the schema by explaining how parameters affect the result: build_sqm produces an indicative valuation, reference values a listing, property_type resolves to the nearest attested segment, and sub-area locations roll up to the containing municipality. These behavioral details are not inferable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get a valuation for a property or area from recorded market data, not asking prices.' It clearly distinguishes itself from the sibling area_market_summary by noting that asking-price statistics belong to that tool. The tool's scope and output are stated explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when the tool is appropriate ('recorded market data, not asking prices') and gives an explicit alternative: 'use area_market_summary for asking-price stats instead.' It also warns against quoting rolled-up or unverified figures, giving concrete conditions for when the data can and cannot be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
- Changed
area_market_summary8 fields changed- added
Output schema / properties / oracle / properties / minimum_verified_sampleAdded value: +{ + "type": [ + "integer", + "null" + ] +} - added
Output schema / properties / oracle / properties / municipalityAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / oracle / properties / municipality_codeAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / oracle / properties / noteAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / oracle / properties / requested_areaAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / oracle / properties / rolled_up_from_sub_areaAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / oracle / properties / source_labelAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / oracle / properties / transaction_backedAdded value: +{ + "type": "boolean" +}
- Changed
find_properties_by_description2 fields changed- added
Output schema / properties / billedAdded value: +{ + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / errorAdded value: +{ + "type": [ + "string", + "null" + ] +}
- Changed
search_properties1 field changed- added
Output schema / properties / limitsAdded value: +{ + "type": [ + "object", + "null" + ] +}
- Changed
verified_valuation4 fields changed- added
Output schema / properties / municipality_codeAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / requested_areaAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / rolled_up_from_sub_areaAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / rollup_noteAdded value: +{ + "type": [ + "string", + "null" + ] +}
4 tool updates
- Changed
find_properties_by_description1 field changed- changed
Input schema / properties / language / enumPrevious value: -[ - "en", - "es" -]New value: +[ + "en", + "es", + "de", + "fr", + "it", + "nl", + "pt", + "bg", + "el", + "da", + "sv", + "no", + "fi", + "pl", + "ru" +]
- Changed
get_property2 fields changed- changed
Input schema / properties / language / enumPrevious 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" +] - added
Output schema / properties / property / properties / features_languageAdded value: +{ + "type": "string" +}
- Changed
search_properties1 field changed- changed
Input schema / properties / language / enumPrevious 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" +]
- Changed
submit_enquiry1 field changed- changed
Input schema / properties / language / enumPrevious 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" +]
1 tool update
- Added
my_pipeline
1 tool update
- Added
create_listing
1 tool update
- Changed
verified_valuation2 fields changed- added
Input schema / properties / buildAdded value: +{ + "description": "Alias of build_sqm.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / build_sizeAdded value: +{ + "description": "Alias of build_sqm.", + "minimum": 1, + "type": "integer" +}
1 tool update
- Changed
my_listings2 fields changed- changed
Input schema / properties / status / descriptionPrevious value: -"Listing status. Defaults to 'online'."New value: +"Listing status. Defaults to 'online'. 'draft' covers listings not yet published (new + in review); 'all' returns every status." - changed
Input schema / properties / status / enumPrevious value: -[ - "online", - "offline", - "sold", - "all" -]New value: +[ + "online", + "offline", + "sold", + "draft", + "all" +]
1 tool update
- Changed
verified_valuation4 fields changed- added
Output schema / properties / indicative_band_pctAdded value: +{ + "type": [ + "integer", + "null" + ] +} - added
Output schema / properties / requested_property_typeAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / source_labelAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / transaction_backedAdded value: +{ + "type": "boolean" +}
2 tool updates
- Changed
area_market_summary5 fields changed- added
Output schema / properties / errorAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / location_matchAdded 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" + ] +} - added
Output schema / properties / noteAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / price_basisAdded value: +{ + "type": "string" +} - added
Output schema / properties / price_unitAdded value: +{ + "enum": [ + "total", + "per_month", + "per_week" + ], + "type": "string" +}
- Changed
search_properties2 fields changed- added
Output schema / properties / errorAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / location_matchAdded 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" + ] +}
13 tool updates
- First observed
area_market_summary - First observed
autocomplete_location - First observed
create_contact - First observed
find_contacts - First observed
find_properties_by_description - First observed
get_property - First observed
list_agencies - First observed
log_note - First observed
my_leads - First observed
my_listings - First observed
search_properties - First observed
submit_enquiry - First observed
verified_valuation
Related MCP Connectors
Provenance-grade Portugal residential property data and signed JWS verification for AI agents.
Portugal real estate search — 224,000+ listings, commute times and market prices
Search public property listings in Portugal, compare homes and read INE housing statistics.
Property listings in Portugal: search, market stats, comparables, neighbourhoods.
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables access to Idealista API for searching and retrieving property listings across Spain, Portugal, and Italy. Supports various property types including homes, apartments, garages, commercial properties, offices, and land with detailed filtering options.143MIT
- FlicenseNot gradedqualityFmaintenanceFrench real estate data platform for AI agents. Identifies property owners likely to sell and tracks behavioral signals on active listings. Coverage: metropolitan France.-
- FlicenseNot gradedqualityBmaintenanceEnables discovery and evaluation of primary residence housing opportunities in Ibiza, including property scoring, mortgage scenario calculations, and validated submission of candidate listings.-
- AlicenseNot gradedqualityCmaintenanceEnables users to calculate Portuguese property purchase costs (IMT, stamp duty, deed/registration) and query annual IMI rates and costs for all 308 municipalities, with sourced figures.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.