Skip to main content
Glama

PropertyList: Spanish Property MLS

Server Details

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

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.9% over 61 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.2/5.0

Scored across 29 tools

Disambiguation5/5

Despite several search-family tools (search_properties, find_properties_by_description, find_similar_properties, find_price_reductions) and valuation tools (area_market_summary, verified_valuation), each description explicitly states when to prefer one over another and draws a clear boundary. The inverse match pair (match_buyer_to_inventory / match_inventory_to_buyers) and the inbox-vs-board pair (my_leads / my_pipeline) are unambiguously distinguished.

Naming Consistency4/5

The dominant pattern is consistent snake_case verb_noun (search_, find_, get_, create_, set_, move_, schedule_, log_, submit_, match_, send_, confirm_, cancel_). A minority of noun-first or possessive names (my_leads, my_listings, my_pipeline, area_market_summary, listing_health, verified_valuation, autocomplete_location) are readable and idiomatic but break the verb-first convention.

Tool Count4/5

29 tools is on the heavy side, but the server genuinely spans two large surfaces (public MLS search/market data plus an agency CRM with a staged-action workflow), and each tool appears to earn its place. The staging pattern (confirm_action/cancel_action shared across staged mutations) keeps the count from ballooning further.

Completeness4/5

The surface covers search, listing lifecycle (create_listing, set_listing_status, listing_health), contacts (create/find/get), pipeline, matching, viewings, emails, enquiries, valuations and market statistics — a broad, closed-loop set. Minor gaps exist: no contact/listings update or delete operations, and no way to edit an existing listing's fields beyond its status.

Available Tools

31 tools
area_market_summaryArea market summaryA
Read-onlyIdempotent
Inspect

Return aggregate market context for a Spanish area: number of active listings, median price, mean price, median €/m², and the count broken down by bedroom band. Filterable by property type and search type (for-sale / for-rent / holiday-rentals). Use this before recommending a price or commenting on whether a listing is good value.

If the place name is not one we hold, the response says so (error: location_not_found, location_match.matched: false) and returns no figures. Figures are NEVER nationwide fallbacks.

Price figures follow the search type and are labelled with price_unit: sale prices are totals, for-rent is per MONTH and holiday-rentals is per WEEK. median_price_per_sqm is reported for sales only.

The oracle block carries the attested transaction price for the area. Check oracle.verified before citing it as verified: it is true only for Spanish figures from the notarial register (Consejo General del Notariado) with at least 10 recorded transactions behind them. Outside Spain the figure comes from a national house-price index, carries no transaction count, and must never be described as notary-backed - oracle.source names the real source and oracle.note says why it is not verified.

Transactions are recorded per municipality, so a sub-area (Sotogrande, Puerto Banus, Nueva Andalucia, Orihuela Costa) is answered with the figure for the municipality containing it, with oracle.rolled_up_from_sub_area true and oracle.municipality / oracle.municipality_code naming it. Quote it as the municipality's figure, never as the sub-area's own.

Commercial property (property_types commercial, a family such as offices, retail, cafes-bars-restaurants, hotels-leisure, industrial-warehouses, garages-storage-rooms, buildings or commercial-land, or one type such as shop) is answered with its own figures: the ASKING prices of live commercial listings (figures_basis asking_prices), per family, with the asking price or monthly rent per m² and size bands, and no oracle block. Below min_sample priced listings only the count is given. Homes and commercial property are never summarised together.

ParametersJSON Schema
NameRequiredDescriptionDefault
tenureNoCommercial sales only: traspaso narrows the figures to business transfers (the lease and the business taken over).
locationYesPlace name (city, suburb, or urbanisation). e.g. 'Marbella'.
search_typeNofor-sale
property_typesNoOptional comma-separated slugs: apartments, villas, penthouses, plots, townhouses; or commercial, a commercial family (offices, retail, cafes-bars-restaurants, hotels-leisure, industrial-warehouses, garages-storage-rooms, buildings, commercial-land, businesses) or one commercial type (office, shop, bar, warehouse...).

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
errorNo
oracleNo
tenureNo
familiesNo
locationYes
max_priceNo
min_priceNo
commercialNo
mean_priceNo
min_sampleNoFewer priced listings than this and no median is given, only the count.
price_unitNo
size_bandsNo
price_basisNo
search_typeNo
median_priceNo
per_sqm_areaNo
figures_basisNo
location_matchNo
property_typesNo
total_listingsYes
by_bedroom_bandNo
priced_listingsNo
median_rent_per_sqmNoCommercial lettings: median monthly asking rent per m² of built area.
median_price_per_sqmNo

TDQS

A4.6/5.0
Behavior5/5

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

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

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

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

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists (so return values need not be spelled out), the description covers error modes, verification caveats, and the commercial/homes split thoroughly. Nothing an agent needs to call this correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, and the description adds real meaning beyond it — property_types commercial families drive a completely different response path (asking prices, no oracle block) and search_type drives the price_unit labelling. It does not revisit the tenure (traspaso) parameter, but overall it meaningfully enriches enum interpretation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

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

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

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

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assign_listingAssign listingAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
colleagueYesThe colleague's name, e.g. 'Sarah Lopez'.
referenceYesThe listing reference.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
detailsYes
summaryYesWhat confirming will do, to show the agent.
action_idYesPass to confirm_action to make the change, or cancel_action to drop it.
expires_atYesISO 8601, UTC. After this the preview must be staged again.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only give the generic false/true flags; the description adds substantial context: this is a staged mutation that changes nothing until confirm_action, it returns a preview plus an action_id, and it requires a linked PropertyList account because the change executes under the agent's own CRM permissions. These are exactly the behavioral facts annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loaded with the staging behavior and the confirm dependency before the permission and account preconditions. Sentences are dense and each carries information, though the final account-requirement sentence is slightly parenthetical and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-shape explanation is unnecessary, and the description still supplies everything else an agent needs: the staging/confirm lifecycle, the permission gates, and the account prerequisite. Nothing relevant to calling it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage the baseline is 3, but the description adds real meaning for 'colleague' — supply the name as it appears in the CRM, and ambiguous matches are surfaced as a list rather than resolved silently. 'reference' is not elaborated beyond the schema, which holds it back from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource with scope ('Stage assigning one of YOUR agency's listings to a colleague'), and the second sentence distinguishes it from the confirmation step by naming confirm_action. An agent can separate this from siblings like set_listing_status or move_pipeline_stage without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It spells out the two-step workflow (stage now, confirm_action later after the agent says yes) and enumerates who is permitted to invoke it: agency admins, anyone who can edit every listing, or the current assignee; unassigned listings are open to anyone with listing-edit rights. The alternative (confirm_action) and the gating condition are explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

autocomplete_locationAutocomplete locationA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesFree-text place name. 2+ characters.
provincesNoOptional comma-separated province ids to scope the search.
search_typeNoMarket the listing counts and the ranking are for. Defaults to 'for-sale'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
matchesYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description still adds real behavioral detail beyond that: result cap (10), ordering rule (biggest first), and the tie-break that a region group precedes a same-named city. It does not mention truncation or empty-result behavior, so it falls just short of 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Two sentences that are front-loaded with the resource and followed by the routing guidance; every clause carries information. Slightly dense parenthetical enumerations of area types, but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present the description need not detail return values, yet it still summarizes them (id, name, type, parent, listing count, ranking). Inputs, ranking semantics, and the downstream call are all covered, so an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (query, provinces, search_type) are already documented in the schema. The description adds only indirect meaning, e.g. that ranking and counts depend on the market implied by search_type, which is largely restated from the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (look up) and resource (property areas: city, suburb, urbanisation, region/coast group), naming the accepted input (free-text name). It is clearly distinguishable from siblings like search_properties, which it explicitly feeds into.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use it ('resolve place names before calling search_properties'), covers the tricky case with concrete examples ('Nueva Andalucia' vs 'Nueva Andalucía', 'Marbella old town'), and specifies the handoff ('pass the chosen id to search_properties as location_id'). No inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_actionCancel actionA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
action_idYesThe action_id from the preview.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
action_idYes

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations: it states that nothing in the CRM changes, that the action_id becomes unconfirmable, that unconfirmed previews auto-lapse after 30 minutes, and that a linked account with the agent's own CRM permissions is required. This is meaningful behavioral and auth context the structured fields do not carry, and it is consistent with destructiveHint=false and idempotentHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Three sentences, front-loaded with the core effect, then the auto-lapse rule, then the auth prerequisite. The 'and the agent does not want' clause is slightly awkward but every sentence carries information; minor trimming would help.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the annotations already cover the safety profile. What remains for a mutate-ish tool — whether anything changes, what happens to the id, expiry, and auth requirements — is all stated. An agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single action_id parameter is already documented ('The action_id from the preview'). The description reinforces that the id relates to a preview but adds no new format or syntax detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Drop') and resource ('a change you staged'), and the phrase 'can no longer be confirmed' implicitly draws the boundary against the sibling confirm_action. An agent can tell what this does and which operation it is the inverse of.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear when-to-use condition ('a change you staged and the agent does not want') plus a prerequisite (linked PropertyList account, agency API key alone insufficient). It also notes that an unconfirmed preview lapses after 30 minutes, implying cancellation is unnecessary then. It stops short of explicitly naming confirm_action as the alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

confirm_actionConfirm actionA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
action_idYesThe action_id from the preview.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
detailsNo
summaryYes
action_idYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructive/openWorld/non-idempotent, but the description adds material context beyond them: it can charge credits and send email, it re-validates client/listing/stage and silently no-ops with an explanation, previews expire after 30 minutes, each preview is single-use, and a linked PropertyList account with CRM permissions is required. That is exactly the extra behavioral disclosure the annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loaded with purpose and the gating rule, then the re-validation/expiry/auth caveats. Four short paragraphs with no filler, though the expiration and single-use rules could be tightened into one sentence without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, credit-charging commit tool with an output schema already present, the description covers the safety gate, failure semantics, idempotency/expiry, and auth requirements. Nothing an agent needs before invoking it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single action_id parameter is fully documented as 'from the preview.' The description adds only the framing that the id originates from a staged preview, which the schema already states, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('make a change you staged') and enumerates the exact staging siblings (move_pipeline_stage, qualify_lead, assign_listing, etc.) whose previews it commits. An agent can distinguish this from cancel_action and from the staging tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit gating condition: 'Call it ONLY after showing the agent the preview and hearing them say yes.' That is a clear when-to-use rule, and the sibling enumeration establishes the when-not (you stage with those tools, you commit with this one).

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesContact's first name (or full name).
emailNoEmail address. Optional but recommended (used for de-duplication).
phoneNoPhone number. Optional.
surnameNoContact's surname. Optional.
company_nameNoCompany name (for a business contact). Optional.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesexists: a contact with this email was already in the CRM, and nothing was added.
contact_idYesFor log_note.

TDQS

A4/5.0
Behavior4/5

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

With annotations already declaring readOnlyHint=false, destructiveHint=false and openWorldHint=false, the description still adds real value: email-based de-duplication (existing contact returned instead of a duplicate created), the created contact's default state (unassigned, flagged as needing attention), and an auth prerequisite. Note the de-dup wording reads as effectively idempotent-by-email while idempotentHint=false; this is a nuance rather than a direct contradiction, but it is the one point where the two sources need reconciling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Four short sentences, front-loaded with the core action and scope, then usage trigger, dedup behavior, and prerequisite. No padding or repetition of the schema, though the final prerequisite sentence could be folded more tightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape need not be explained. For a create tool with clean annotations, the description covers action, trigger, side effects, de-duplication, default state and auth prerequisite — everything an agent needs to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across all 5 parameters, so the schema already documents name, email, phone, surname and company_name. The description adds only that email drives de-duplication, which is already stated in the email field's schema description, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource and scope: 'Add a new contact to YOUR agency's CRM', with a clarifying list of the entities involved (buyer, owner, enquirer). It is readily distinguishable from the read-side sibling find_contacts, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use when the agent wants to save a person (buyer, owner, enquirer)' gives a clear trigger condition, and the prerequisite of a linked PropertyList account or agency API key is stated. It does not name alternatives (e.g. submit_enquiry, log_note) or exclusion cases, so it falls short of a full when/when-not routing rule.

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

Commercial premises take a commercial property_type (office, shop, retail, bar, restaurant, warehouse, garage, storage-room, building, commercial-land...), no bedrooms, and their own facts: usable area, the activity licence, a sale's tenure (freehold, or traspaso: the lease and the business taken over, with the rent and years left on the lease), a letting's guarantee, minimum term and VAT. They are checked as the CRM checks them.

ParametersJSON Schema
NameRequiredDescriptionDefault
floorNoThe floor a flat or a unit (office, shop, garage, storage room) is on; 0 is the ground floor.
priceNoAsking price in euros, or monthly rent for a rental.
tenureNoCommercial sales only: freehold, or traspaso (the lease and the business are taken over).
bedroomsNo
headlineNoShort headline for the listing. Optional.
languageNoLanguage the description is written in. Defaults to the agency language.
locationNoTown, suburb or urbanisation, e.g. "Nueva Andalucia" or "Menara Beach".
plot_sqmNoPlot size in square metres.
bathroomsNo
build_sqmNoBuilt area in square metres.
frontage_mNoCommercial only: street frontage in metres.
usable_sqmNoCommercial only: usable floor area in square metres.
current_useNoCommercial only: what the premises are used as now.
descriptionYesThe property description, in the language the agent wrote it.
search_typeNoWhether it is for sale or for long-term rent. Defaults to for-sale.
property_typeNoA home: apartment, villa, penthouse, townhouse, country-house or plot. Commercial premises: office, business, cafe, bar, restaurant, retail (premises, a local comercial), shop, hotel, leisure, industrial, warehouse, commercial-land, garage, storage-room or building.
activity_licenceNoCommercial only: the activity licence (licencia de actividad): none, in_progress or granted.
ceiling_height_mNoCommercial only: ceiling height in metres.
lease_years_leftNoTraspaso only: years left on the lease.
licensed_activityNoCommercial only: the activity the licence is for.
rent_vat_applicableNoCommercial letting only: VAT is added to the rent.
minimum_lease_monthsNoCommercial letting only: the minimum lease term in months.
traspaso_monthly_rentNoTraspaso only: the monthly rent the buyer takes over, in euros.
extra_guarantee_monthsNoCommercial letting only: months of extra guarantee asked.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYesThe draft in the CRM, where the agent finishes and publishes it.
statusYes
warningNoAdvice to pass on to the agent before they publish.
locationNoWhere the draft was filed; null when the place name matched no area.
referenceYes
next_stepsYes
property_idYes

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond annotations: discloses the output is a DRAFT, never published, never on portal, requires agent follow-up in CRM, response includes a direct link, requires linked PropertyList account or API key, and location is resolved against a real area tree. Annotations only say non-readonly, non-idempotent, non-destructive; description adds the critical publishing semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loads the draft-never-published constraint, a crucial disclosure. The commercial-properties paragraph is denser but earns its place given 24 params. Slightly long but well-organized into distinct concerns.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 24 params, output schema present, and the high-stakes nature of listing creation, the description covers the key gaps: draft status, account requirements, location resolution, and the commercial variant rules. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 92% so baseline is high, but description adds substantive commercial-property semantics: commercial types need no bedrooms and specific facts, tenure/traspaso explanation, and location-resolves-by-name behavior. Adds meaning beyond raw enum lists in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (create) and resource (property listing draft) with explicit scope: 'in YOUR agency's CRM'. Clearly distinguished from siblings like my_listings (read) and set_listing_status (mutate existing).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear triggering context: 'when the agent is describing a property they have taken on and wants it in the system.' Doesn't explicitly name alternatives or exclusions, but the context is unambiguous enough to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_contactsFind contactsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYesName, company, email or phone fragment to search for.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
contactsYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior, so the safety profile is covered. The description adds genuinely new behavioral context beyond that: the auth requirement (linked account or API key) and the strict tenancy scoping ('only ever searches the calling agency's own contacts'), which materially changes how an agent should interpret empty results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

Three tight sentences that lead with what the tool does, then when to use it, then the auth/scoping constraint. No filler, no redundancy; each sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and annotations cover the safety profile. The description covers purpose, usage trigger, auth prerequisites, and tenancy scoping — everything an agent needs to decide when to call it and how to read the result boundary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%: the query parameter is documented in-schema, but limit is only constrained structurally (default 20, max 50) with no prose. The description restates the query semantics (name/company/email/phone) but says nothing about limiting result count, so it neither compensates for the gap nor adds meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource+scope: search the calling agency's own CRM contacts, with the searchable fields (name, company, email, phone) enumerated. This clearly distinguishes it from siblings like create_contact, my_leads, and find_properties_by_description without needing to open any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use context ('look a person up before logging a note or to check if they're already in the CRM') and names a prerequisite (linked PropertyList account or agency API key). It does not explicitly name create_contact as the write-side alternative, so the routing guidance is strong but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_price_reductionsFind price reductionsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoHow far back to look for reductions.
limitNo
languageNoen
locationNoPlace name, e.g. 'Marbella'. Omit for every area.
price_maxNoMaximum CURRENT price in euros (sale) or monthly euros (rent).
min_percentNoOnly reductions of at least this percentage.
search_typeNoDefaults to 'for-sale'.
bedrooms_minNo
property_typesNoComma-separated slugs: apartments, villas, penthouses, plots, townhouses, or commercial (every commercial type; office, shop, restaurant, hotel, warehouse and the other commercial types also work alone). Without it the search covers homes only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
daysNo
errorNo
totalYes
limitsNo
propertiesYes
history_fromNoEarliest date we hold price history for.
location_matchNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. Beyond that, the description adds real behavior: sort order, fields carried per listing, the location_not_found error surfaced as zero results, and exclusion of 'price on application' listings. Some of this (returned fields) overlaps the output schema, so it is not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loads the core definition, then ordering, then usage, then filter/edge-case behavior. Every sentence carries information, though the 'Each listing carries...' enumeration leans slightly verbose given an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter, zero-required read tool with annotations and an output schema, the description covers purpose, ordering, usage, filter inheritance, and key edge cases (location_not_found, P.O.A. exclusion). Nothing critical is missing, though pagination/limit behavior is left entirely to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

At 67% schema coverage, the schema documents days/limit/min_percent/search_type but the description adds a useful cross-reference ('filters work as in search_properties') tying location/type/bedrooms/price semantics to a sibling tool, plus the location_not_found edge case. It does not add syntax detail, so it stays above baseline without being exhaustive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Live listings whose asking price has been reduced recently', plus the display ordering ('biggest reduction first'). An agent can immediately distinguish this from search_properties or find_similar_properties without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete use-case framing ('what has dropped in price in Estepona this month?', 'to spot motivated sellers') and notes filters behave as in search_properties. It stops short of naming a sibling to prefer instead or stating explicit when-not-to-use conditions, so it is strong context but not full routing guidance.

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 descriptionA
Read-onlyIdempotent
Inspect

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. Commercial premises are matched too (an office, a local, a bar, a warehouse, a traspaso), never mixed with homes.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
briefYesPlain-English (or Spanish) description of what the user is looking for. 10-500 chars.
languageNoen

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
billedNo
limitsNo
summaryNo
allowanceNo
propertiesYes
unresolvedNo
interpretationNoHow the brief was read, one pill per constraint.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only cover the read-only/idempotent safe-read profile; the description goes far beyond them, disclosing the quota model (daily allowance without a key, larger with a key, briefs that find nothing don't count), the exact failure mode when exhausted, the result cap (up to 9 listings with scores and an interpretation explanation), and that commercial premises are never mixed with homes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loaded with the core purpose and the when-to-use condition before quota mechanics, and nearly every clause carries new information. The parenthetical marketing example and the feature list are slightly padded, but nothing is wasted or buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an open-ended semantic-search tool with an output schema already describing the return payload, the description covers everything the agent needs: invocation form, quota and error behavior, result cap, interpretation feedback, and residential/commercial separation. No material gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: 'brief' is documented in the schema, while the 15-value 'language' enum has no description at all and is not addressed in the tool description. The description does compensate well for 'brief' — explaining what a brief can contain, that features like pool/sea view act as filters, and that vague conditional phrasing is supported — but the language parameter remains undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (match) and resource (Spanish properties) from a free-form brief, and names the sibling it contrasts with (search_properties for structured queries). An agent can distinguish it from search_properties and find_similar_properties without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Best for vague, conditional, or lifestyle-heavy briefs' gives clear selection context with an example, and the closing sentence routes structured queries to search_properties. It never states an explicit 'do not use this when...' exclusion, so it falls just short of the top band.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_similar_propertiesFind similar propertiesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
languageNoLanguage for titles and description excerpts.en
referenceYesReference of the listing to find alternatives to, e.g. PL12345.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
limitsNo
referenceYes
propertiesYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description earns credit for adding ordering semantics ('closest in price first') and the matching rules that determine results. It also flags that returned properties carry oracle_verified and oracle_attestation_url, useful output enrichment beyond 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.

Conciseness4/5

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

Front-loads the core similarity definition and the use cases, with the oracle field note placed last. Two tight sentences plus a short caveat; the trailing note is slightly tangential but relevant to what comes back.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and the description covers matching logic, ordering, and a data-freshness/verification flag. Adequate for an agent to call correctly, with only minor gaps around limit/language semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, with limit undocumented in the schema. The description compensates partially by defining what 'similar' means, which governs how the required reference parameter is interpreted, and by clarifying price ordering. It still doesn't explain the limit or language parameters directly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (find listings similar to one property) and enumerates the exact similarity dimensions: same market, town, home type, bedroom count, price within ~25%. This distinguishes it clearly from siblings like search_properties, find_price_reductions, and find_properties_by_description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete trigger examples ('show me alternatives to PL12345', 'anything like this but cheaper?') so the agent knows the intent that selects this tool. It does not explicitly name a competing sibling to route away from, which keeps it short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contactGet contactA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contact_idYesThe contact id, from find_contacts or my_pipeline.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameNo
emailsYes
phonesYes
sourceNo
crm_urlNo
archivedNo
searchesYes
viewingsYes
enquiriesYes
languagesNo
pipelinesNoBoard name to the stage the client is on.
created_atNoISO 8601, UTC.
lost_reasonNo
company_nameNo
next_actionsYes
recent_notesYes
assigned_agentsYes
last_contact_atNoISO 8601, UTC.
properties_sentYes
marketing_consentNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is well covered. The description adds meaningful context beyond that: it requires a linked PropertyList account (or agency API key), it only ever reads the calling agency's own contacts, and it is scoped to those the caller may see in the CRM. That permission/auth disclosure is real value over 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.

Conciseness4/5

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

Front-loaded with the full content picture, then the workflow guidance (where to get the ID and when to call). The long facet list is informative but borders on verbose; still, every clause maps to a returned field, so it earns its place. Slightly dense but well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-param read tool with an output schema, the description covers purpose, prerequisites, workflow position, and access/permission constraints. The output schema handles return values, so no return-format detail is needed. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter contact_id is already documented in the schema with its origin (find_contacts or my_pipeline). The description reinforces the same source, which is redundant but not harmful. Baseline 3 applies when the schema does the heavy lifting; the description adds no new syntax or format meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get) and resource (contact), and enumerates the returned facets (contact details, pipeline position, agents, saved searches, enquiries, notes, viewings, listings sent, last contact, next booking). This clearly distinguishes it from find_contacts/my_pipeline, which are search tools that locate IDs rather than retrieve the full record.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent where to get contact_id (find_contacts or my_pipeline) and when to call it: 'before advising an agent on a client, and before match_buyer_to_inventory, so you know what has already been sent.' This names the prerequisite and the downstream consumer, which is exactly the routing guidance needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_guideRead a guideA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe guide on info.propertylist.es: a full URL from search_guides, or its path (/docs/...).
offsetNoWhere to continue a long page: the next_offset of the previous call.
max_charsNoMost characters of text to return (default 12000).

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYesCanonical URL of the page; link it.
textYesThe page as Markdown-style text.
titleNo
sourceNo
languageNo
truncatedNo
alternatesNoEach language version's URL.
descriptionNo
next_offsetNoPass as offset to read on, when truncated.
total_charsNo
last_reviewedNoThe page's own review date, as the page states it; null when it shows none.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds real behavior: truncation handling via next_offset, the meaning of last_reviewed being set vs null, and a scope disclaimer that this is general information, not legal/tax advice.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

Four short sentences, each carrying a distinct instruction (what to read, how to answer, truncation follow-up, disclaimer), with the core purpose front-loaded. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema and full annotations present, the description only needs to cover interpretation and edge cases, which it does (truncation loop, review-date wording, disclaimer). An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description goes further by explaining the offset/next_offset continuation contract and tying last_reviewed to output interpretation. This adds meaning beyond the raw schema property docs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Read one PropertyList guide" gives a specific verb and resource, and "one" implicitly contrasts with the sibling search_guides (plural/search). It's clear what the tool does, though it never names the alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete follow-up rules (if truncated is true, call again with offset set to next_offset) and instructs how to present last_reviewed. It stops short of stating when to use this vs search_guides to obtain the URL, which is left to the schema note.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_propertyGet property detailsA
Read-onlyIdempotent
Inspect

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 listings, counted per IP address, or per account for an app linked to a PropertyList account; an API key raises that allowance. The free allowance is for an assistant answering a person's questions: reading listings in bulk, or showing them on a website, needs MCP Pro or the agency's website feed. When the day's allowance is used the result carries error and limits instead of property.

photos holds the listing's first photos on the free tier and all of them with MCP Pro; photos_total says how many the listing has.

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.

Commercial premises (commercial true) carry no bedrooms: read commercial_facts (usable area, licence, price per m², a letting's terms, a traspaso's rent and years left) and tenure (freehold, or traspaso for a sale of the lease and the business).

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNoen
referenceYesPropertyList reference, e.g. 'PLE-12345'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
limitsNo
propertyNo

TDQS

A4.6/5.0
Behavior5/5

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

With annotations already declaring read-only, idempotent, non-destructive, and closed-world behavior, the description adds substantial operational context beyond them. It discloses daily allowance rules, per-IP versus per-account counting, the error-and-limits response when exhausted, photo-tier behavior, and nuanced location/coordinate precision semantics. It also explains commercial-premises return fields and that direct phone/email details are not part of the payload.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

The description is long but front-loads the core purpose and then organizes secondary details into paragraphs. Most content earns its place because it clarifies tiered access and return-field semantics beyond the output schema. It could be tightened slightly, but the length is justified by the tool's allowance, photo, location, and commercial nuances.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description does not need to enumerate every return field, yet it supplies critical context for interpreting errors, limits, photo coverage, location.city versus location.municipality, coordinate precision, and commercial premises. It pairs well with the annotations and leaves no significant gap for correct invocation or interpretation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: reference is documented in the schema, while language has an enum but no description. The description repeats the reference-code format (e.g., 'PLE-12345') and does not explain the language parameter or its default. With the schema already covering the required parameter and no added semantics for the optional one, this meets the baseline for partial coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: fetch the full record for one PropertyList listing by reference code. It differentiates itself from search_properties and find_properties_by_description by describing the settled-listing use case, and it routes agency-contact needs to submit_enquiry. An agent can identify the tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit timing and alternatives: use this once the user has settled on a listing from search_properties or find_properties_by_description and wants details/photos, and use submit_enquiry for agency contact. It also states when the free allowance allows use versus when MCP Pro or an agency feed is required. This covers when to use, when not to use, and which sibling to use instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_agenciesList agenciesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
locationYesPlace name (city, suburb, or urbanisation). e.g. 'Estepona'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
agenciesYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds the ranking behavior (by active listing count) and a result cap, but 'Returns up to 10 agencies' conflicts with the schema's limit maximum of 25, which could mislead an agent about result size.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Three tight sentences, front-loaded with the core action and ordering, then output fields, then usage. The enumeration of return fields is somewhat padded given an output schema exists, but nothing is genuinely wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Safety profile is covered by annotations and return values by the output schema, and the description supplies the domain (Spanish area) and workflow context. The missing piece is any explanation of the limit parameter and the correct resolution of the 10-vs-25 discrepancy.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%: location is documented in the schema, but limit is undocumented in both schema and description. The description never mentions the limit parameter and instead asserts a fixed cap of 10, which the schema contradicts (max 25), so it fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Find PropertyList agencies (estate agents)'), plus scope (a given Spanish area) and ordering (ranked by active listing count). It is clearly about agencies rather than properties or market stats, though it never names a sibling tool to make the boundary explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete when-to-use situation: 'Use this after a buyer has narrowed in on an area and wants to know which agencies dominate it.' It lacks explicit when-not or named alternatives (e.g., area_market_summary), so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listing_healthListing healthA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
issueNoOnly listings with this problem. Optional.
limitNo
statusNoonline

Output Schema

ParametersJSON Schema
NameRequiredDescription
rulesYes
issuesYesIssue name to how many listings have it.
checkedYes
listingsYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds genuinely useful context beyond them: the account linking/API key requirement and the own-listings-only auth boundary, which an agent must know before invoking.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loaded with the core purpose, then a scannable bulleted breakdown of issue definitions, then scope and prerequisites. Every element earns its place; the multi-line issue definitions are long but are precisely the information that makes the tool callable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and the description covers purpose, issue semantics, scope defaults, and auth prerequisites. It is essentially complete for a read-only diagnostic tool; only the absence of explicit alternative-routing keeps it out of the top tier.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%, so the description must compensate, and it does: it defines what each 'issue' enum value actually means (90 days online, no enquiry in 60 days, fewer than 5 photos, etc.) and spells out the 'status' semantics. Only 'limit' goes unexplained, but its default and bounds are already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (checks the calling agency's own listings and lists the problematic ones), and enumerates the exact issues detected. It is clearly distinguishable from siblings like my_listings or search_properties, which cover general listing retrieval rather than diagnostic auditing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the default scope (online listings) and what the 'draft' and 'all' status values select, plus the prerequisite of a linked PropertyList account and the own-listings-only restriction. It does not name a sibling tool as an alternative when this diagnosis is not the right call, so it falls short of the explicit when-not guidance a 5 requires.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
noteYesThe note text to record.
contact_idNoContact to attach the note to (from find_contacts). Optional if a property reference is given.
property_referenceNoListing reference to attach the note to. Optional if a contact_id is given.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
activity_idYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-idempotent write. The description adds real value beyond them: the note surfaces on the contact/property timeline, and an auth prerequisite (linked PropertyList account or agency API key) is disclosed. It stops short of noting duplicate-note risk or what the write returns, but the added context is substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loaded with the action and scope, then parameters, then the auth prerequisite. Three short sentences with little waste, though the parenthetical example and the account requirement could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. For a simple three-parameter write tool, the description covers purpose, target entities, the parameter relationship, and the account prerequisite — nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not enforce: it frames contact_id and property_reference as an 'and/or' pair where at least one is expected, even though the schema marks only 'note' as required. It also reiterates that contact_id comes from find_contacts, aiding correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Log a note against a contact or a listing in YOUR agency's CRM') plus concrete examples of use ('record a call outcome or a viewing'). It also distinguishes itself from the sibling find_contacts by naming it as the source of the contact_id, so an agent can route between them without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when the tool applies (recording call outcomes or viewings) and states the prerequisite of a linked PropertyList account or agency API key. It does not name an alternative tool or state when not to use this one, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

match_buyer_to_inventoryMatch buyer to inventoryA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
languageNoLanguage for listing titles and excerpts.en
contact_idYesThe client, from find_contacts or my_pipeline.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
totalYes
limitsNo
searchNo
contact_idYes
propertiesYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description layers on behavior the annotations cannot: result ordering, the no-search fallback that returns an explanation, the required linked PropertyList account or agency API key, and the scope limit to the calling agency's visible clients. Return format specifics are absent, but an output schema exists, so this is close to complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loaded with the core result definition and structured into short paragraphs, but a few clauses are redundant ('the same search the CRM runs for that client') and the auth/scope sentence is dense. Slightly verbose without being wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only lookup with an output schema, the description covers the essentials: what is returned, ordering, fallback behavior, auth prerequisites, and data scope. Minor gaps remain around limit/pagination behavior and what distinguishes 'shared MLS' listings, but nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%. The description adds real value for contact_id (source it from find_contacts or my_pipeline) and implies the limit's meaning via 'listings that fit', but says nothing about limit bounds/default or the language enum, which the schema already documents. This is the baseline 3 for a partially covered schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource and scope: the listings matching one client's search within the caller's agency CRM, with explicit ordering (own listings first, then shared MLS, newest first). It is clearly distinguishable from siblings like match_inventory_to_buyers (reverse direction) and search_properties (unsaved-search fallback), which are both named in context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use (client with a saved search or described search), when-not (client with no search returns an explanation rather than a guess), and the alternative ('use search_properties instead'). It also names the prerequisite tools (find_contacts for contact_id, get_contact to see what has been sent).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

match_inventory_to_buyersMatch inventory to buyersA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
property_referenceYesListing reference, e.g. PL12345.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
clientsYes
searches_checkedNo
property_referenceYes

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive/closed-world, and the description layers on genuinely extra behavior: only online listings produce matches, drafts return an explanation instead of matches, output includes assigned agent, pipeline stage and the matched search, plus an auth requirement (linked PropertyList account or agency API key) and a visibility scope constraint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loaded with the core purpose and organized into scope, constraints, and requirements. Parenthetical asides add useful detail without derailing, though a sentence or two could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be specified, and the description still covers auth, visibility limits, and non-match behavior. The only real gap is the unexplained limit parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50% — property_reference is documented in the schema (including the PL12345 example) and the description adds nothing to it, while the limit parameter is undocumented in both schema and description. Given only two parameters and a self-evident numeric bound, this is adequate but not compensating for the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — matching CRM clients whose saved search fits a given listing — and frames the outcome ('who to call about it'). The direction of the match is clear and distinguishable from the sibling match_buyer_to_inventory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context: works for own listings and shared MLS listings the agency can sell, only online listings are matchable, drafts return an explanation, and get_contact should be used for the full picture. It never explicitly names the reverse-direction sibling match_buyer_to_inventory as the alternative, so it falls short of full when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_pipeline_stageMove pipeline stageAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
stageYesThe step to move to, as named on the board.
pipelineYes
contact_idYesThe client, from find_contacts or my_pipeline.
offer_amountNoEuros, for an offer stage. Optional.
property_referenceNoThe listing the offer is on, if the card has none. Optional.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
detailsYes
summaryYesWhat confirming will do, to show the agent.
action_idYesPass to confirm_action to make the change, or cancel_action to drop it.
expires_atYesISO 8601, UTC. After this the preview must be staged again.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare the generic write profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds high-value behavior the annotations cannot convey: nothing changes until confirm_action, a preview plus action_id is returned, and a linked PropertyList account is required because the change is made under the agent's own CRM permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loads the core action and the staging semantics before the exceptions. The three short paragraphs are dense with distinct information (staging flow, alternatives, auth), though the offer-stage and account-requirement notes could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a non-idempotent mutation gated behind confirmation, the description covers the preview/confirm contract, the auth prerequisite, the sibling routing, and the conditional parameters. An output schema exists for the preview and action_id, so return-value detail is correctly left out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 80%, but the description adds genuine meaning: the stage value must match the board's own naming (with my_pipeline as the source), and it explains the conditional pairing of offer_amount with an offer stage and property_reference only when the card has no listing yet.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Stage a move of a client's card to another step on a pipeline board') and immediately scopes it to boards the client is already on. It explicitly distinguishes itself from qualify_lead and from Won/Lost moves done in the CRM, so an agent can separate it from siblings 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-not guidance: adding a client to a board they are not on, or qualifying a lead, is qualify_lead; Won and Lost are done in the CRM. It also documents the required two-step flow (stage, then confirm_action after the agent says yes), which is the single most important usage constraint for this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

my_leadsMy leadsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sinceNoISO date/time - only leads created on or after this. Optional.
property_referenceNoOnly leads about this listing reference. Optional.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
leadsYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, and the description adds context beyond them: an authentication prerequisite (linked PropertyList account or agency API key), tenancy scoping (only ever returns the calling agency's own leads), and result ordering. That is exactly the kind of behavioral detail structured fields cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loaded with the action and ordering, then the trigger, then the sibling contrast and the caveat. Slightly longer than strictly necessary (the CRM/inbox framing is repeated), but every sentence carries information and none is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and annotations cover the safety profile. Combined with the auth requirement, tenancy scope, ordering, and the inbox-vs-pipeline mental model, an agent has everything needed to call this correctly and to interpret an empty result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description says nothing about limit, since, or property_reference. Schema coverage is a middling 67% – since and property_reference are documented in the schema while limit relies on default/min/max alone – so the schema does most of the work and the description neither compensates for nor extends it. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List recent enquiries (leads) for YOUR agency's CRM') plus ordering ('newest first'), and explicitly distinguishes itself from the sibling my_pipeline. An agent can tell it apart from my_pipeline or my_listings without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('Use when the agent asks what has just come in'), names the alternative tool for the other case (my_pipeline), and adds a genuine exclusion-style caveat: an agency working off boards can have a busy CRM and an empty inbox, which is not the same as no leads. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

my_listingsMy listingsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
statusNoListing status. Defaults to 'online'. 'draft' covers listings not yet published (new + in review); 'all' returns every status.online
referenceNoA specific listing reference. Optional.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
listingsYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, closed-world behavior. The description adds genuinely non-structured context: the auth requirement, the agency-only scoping, and newest-first ordering. It stops short of describing result shape or pagination behavior, which is acceptable given an output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Three tight sentences, front-loaded with the core action and scope before the usage examples and prerequisites. No filler, though the parenthetical usage examples add a little bulk.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 an output schema, the description covers what an agent needs: scope, ordering, filters, and the account prerequisite. The unmentioned limit parameter and absence of result-shape notes are minor given the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the status enum is already richly documented in the schema itself. The description only restates that filtering by status or reference is possible and does not explain the limit cap or default, so it adds little beyond the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List YOUR agency's own property listings') with ordering ('newest first') and scope ('only ever returns the calling agency's own properties'). This clearly distinguishes it from sibling search_properties, which covers all properties.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage triggers ('show my listings' / 'is reference X still online?') and a prerequisite (linked PropertyList account or agency API key). It implicitly separates itself from the broad search sibling by scoping to the caller's own properties, though it never names the alternative explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

my_pipelineMy pipelineA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoCards per stage. Counts are always the full stage total, whatever this is set to.
stageNoOnly 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.
pipelineNoWhich board. Omit for a summary of all of them.

Output Schema

ParametersJSON Schema
NameRequiredDescription
boardsNoThe summary of every board, when no pipeline was asked for.
stagesNoThat board's stages, each with its full count and up to `limit` cards, most recently updated first.
pipelineNoThe board asked for.
total_cardsYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds context annotations cannot: the tool returns the WHOLE agency's boards rather than one agent's cards, CRM access belongs to the agency not a person, and only the calling agency's own data is ever returned. It also warns that stage names are agency-renamed and must be read from the reply rather than assumed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

Front-loads the core purpose, then boards/stages, then usage branching, then the sibling alternative, then access scope. Each paragraph carries distinct information with no repetition of the name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the description still covers everything else an agent needs: board enumeration, stage-name variability, the summary vs. filtered call pattern, the my_leads alternative, and the account/auth prerequisite. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, but the description adds real semantics beyond the schema: it explains that stage names are user-renamed and should be read from the response, and reinforces the summary-vs-board behavior of omitting pipeline. It does not elaborate further on limit/stage beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the cards on YOUR agency's CRM pipeline boards (Kanban)') and immediately enumerates the six boards and what each card represents. It clearly distinguishes itself from the sibling my_leads by naming it and the distinct scenario it serves.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use branching: call without pipeline for a summary of every board (with concrete example questions), call with a pipeline for that board's cards. It also names the alternative tool my_leads and the condition ('enquiries that have just arrived and have not been worked yet') that selects it, plus the prerequisite of a linked PropertyList account or agency API key.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qualify_leadQualify leadAInspect

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.

search saves what a buyer or tenant is looking for with the qualification, homes or commercial premises (offices, retail, a bar, a warehouse, a traspaso...), never both in one search.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
boardNoThe board to put them on. Optional.
searchNoOptional: what a buyer or tenant is looking for, saved as their search when the qualification is confirmed.
contact_idYesThe client, from find_contacts or my_pipeline.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
detailsYes
summaryYesWhat confirming will do, to show the agent.
action_idYesPass to confirm_action to make the change, or cancel_action to drop it.
expires_atYesISO 8601, UTC. After this the preview must be staged again.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the two-phase preview/confirm flow, that NOTHING changes or is charged until confirm_action is called, the cost model (free place or one credit on the Buyer board), and the auth requirement (linked PropertyList account, action taken in the agent's own name with CRM permissions, agency API key alone insufficient). This is exactly the behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loads the core action and the preview/confirm constraint, and each paragraph earns its place (inference rules, search persistence, auth prerequisite). It runs long for three parameters, but the density is high and largely justified rather than padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the mutation's prerequisites (account linkage, permissions), the cost consequence, the confirm gate, and the conditional board/search semantics. An output schema exists, so return-value detail is correctly left out; nothing an agent needs to call this safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: the inference rules for `board` when omitted, that `board` places the client at the board's first step, and that `search` is persisted with the qualification but must not mix residential and commercial premises in one search.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (stage qualifying a client) and precisely what happens: tag as buyer/seller/tenant, place on a pipeline board, remove from the Lead board. It also distinguishes itself from siblings like confirm_action and move_pipeline_stage by describing the full board-transition effect.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains conditional behavior clearly: without `board` the type is inferred from CRM knowledge (with a fallback of asking for details), and with `board` the client goes to that board's first step. It also names the mandatory follow-up (confirm_action with the returned action_id), giving a clear call sequence, though it never explicitly contrasts with siblings such as move_pipeline_stage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schedule_viewingSchedule viewingAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoOptional.
starts_atYesISO 8601 date and time, e.g. '2026-10-08T11:00'.
contact_idYesThe client, from find_contacts.
duration_minutesNo
property_referenceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
detailsYes
summaryYesWhat confirming will do, to show the agent.
action_idYesPass to confirm_action to make the change, or cancel_action to drop it.
expires_atYesISO 8601, UTC. After this the preview must be staged again.

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantial context beyond the annotations: nothing is persisted until confirm_action is called with the returned action_id, a preview is returned, times default to Europe/Madrid, and a linked account with the agent's CRM permissions is required. These are real behavioral constraints (write staging, auth model, timezone semantics) that the readOnly/destructive/idempotent hints cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loaded with the core action and the staged-write caveat, then layered caveats (MLS, timezone, account requirement). Each sentence carries real information, though the prose form is drier and slightly longer than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values (preview and action_id) need no further explanation. Combined with the account requirement, timezone default, and confirm workflow, an agent has everything needed to invoke this correctly in sequence with confirm_action.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 60%, and the description compensates by explaining that property_reference may be the agency's own or a shared MLS listing and by clarifying timezone handling for starts_at. It leaves duration_minutes and notes unmentioned, so it adds meaningful but not complete parameter context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Stage a viewing in the agent's own CRM diary') plus the scope ('with the client and the listing on it'), and flags the two-phase nature vs. confirm_action. An agent can distinguish this from sibling tools like confirm_action, cancel_action, and submit_enquiry from the text alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly gives the workflow context: stage now, then call confirm_action after the agent agrees, and notes that MLS listings are not contacted. It also states the prerequisite (linked PropertyList account). No explicit when-not guidance or alternative-tool routing beyond confirm_action, so it stops just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_guidesSearch guidesA
Read-onlyIdempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes1 to 6 keywords work best, e.g. "NIE number" or "IBI".
languageNoLanguage of the guides: en (default) or es.en

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
fallback_languageNoSet when nothing matched in Spanish and these are the English guides.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds behavioral value the annotations do not: the accent-sensitivity of Spanish queries and the search-then-fetch workflow with get_guide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

Three sentences, tightly front-loaded: scope first, then usage plus the alternative, then the accent caveat. The topic enumeration is dense but directly defines search coverage, so every element earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the safety profile. The description still supplies what is genuinely missing: scope, when-to-use, the get_guide follow-up, and the accent requirement.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema documents query and language but not limit (67% coverage). The description compensates by adding a real semantic constraint on the query parameter — Spanish terms must carry accents or they will not match — which goes beyond the schema's keyword-count guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search) and resource (PropertyList's guides), and enumerates the actual scope: Spanish taxes (ITP, IBI, non-resident income tax), NIE, buying process, laws, area guides. It is clearly distinguishable from get_guide, which it names as the follow-up.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it ('how-to, cost and legal questions') and what to do next ('then call get_guide for the page'). It also flags a practical usage precondition: Spanish terms need accents to match (tributación, tasación).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_propertiesSearch propertiesA
Read-onlyIdempotent
Inspect

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

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

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

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

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

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

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
errorNo
totalYes
limitsNo
page_sizeYes
propertiesYes
location_matchNo

TDQS

A4.9/5.0
Behavior5/5

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

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

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

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

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

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

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

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

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search PropertyList's full Spanish property MLS by structured filters') and immediately distinguishes itself from the sibling find_properties_by_description by scope ('queries that translate cleanly to fields' vs 'free-form briefs'). An agent can route between the two search tools without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

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

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_listings_to_contactSend listings to a clientAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesThe email text, in the client's language. The listings are attached below it.
subjectYes
contact_idYesThe client, from find_contacts.
property_referencesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
detailsYes
summaryYesWhat confirming will do, to show the agent.
action_idYesPass to confirm_action to make the change, or cancel_action to drop it.
expires_atYesISO 8601, UTC. After this the preview must be staged again.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that it is a two-phase stage-then-confirm operation, that it returns a preview plus action_id, that nothing is sent until confirmed, the 10-listing cap, that it appears on the client's timeline, and that a linked PropertyList account is required so an agency API key alone is insufficient. This is exactly the behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loaded with the core action and the critical safety constraint (nothing sent until confirm_action). The three-paragraph layout is scannable, though the account-permission paragraph could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still summarizes the return (address, subject, message, listings, action_id), and it covers the prerequisites, limits, and side effects an agent needs. Nothing essential is missing for a 4-parameter mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%, and the description compensates: it clarifies message is written in the client's language, subject/message are authored by the agent, and property_references are the agency's own or shared MLS listings sourced via match_buyer_to_inventory, capped at 10. The exact reference string format is still left to the schema, so not quite a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (stage an email with listings attached to a client) and immediately scopes what it is not: nothing is sent until confirm_action. An agent can distinguish it from confirm_action, match_buyer_to_inventory, and the other siblings from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the workflow condition: stage first, then call confirm_action with the returned action_id after the agent has read it and said yes. It also names match_buyer_to_inventory as the way to source listings, giving a clear alternative path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_listing_statusSet listing statusAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYes
referenceYesThe listing reference.
sale_priceNoAchieved price in euros, for sold. Optional.
hide_sale_priceNoFor sold: do not record the price. Optional.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
detailsYes
summaryYesWhat confirming will do, to show the agent.
action_idYesPass to confirm_action to make the change, or cancel_action to drop it.
expires_atYesISO 8601, UTC. After this the preview must be staged again.

TDQS

A4.6/5.0
Behavior5/5

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

The description carries rich behavior the annotations cannot: this is a two-phase preview/confirm flow where 'NOTHING changes' until confirm_action, publishing runs CRM-equivalent validation (photos, required details, agency listing limit), private listings incur a credit cost shown in the preview, and a linked PropertyList account is required because the change is made in the agent's name, so an agency API key alone is insufficient. This is exactly the kind of auth, cost, and reversibility context that structured fields omit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loads the core action and the preview/confirm contract, then layers validation and auth details in separate paragraphs. Information-dense with no clearly wasted sentence, though the parenthetical asides make it slightly heavier than necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a mutation-style tool with an output schema (the preview), the description supplies everything an agent needs to call it correctly and safely: the two-step commit requirement, the downstream confirm_action contract, validation behavior, cost implications, and the account-linking prerequisite.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, and the description adds real meaning beyond the schema: it clarifies the semantics of each status value (what 'online' actually triggers, when 'sold' is valid) and explains that sale_price is recorded for market statistics unless hide_sale_price is true. It does not, however, add format or range detail for reference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (stage) plus the exact resource and the three target states (online/offline/sold), and distinguishes itself from create_listing by being a status transition on an existing listing ('one of YOUR agency's listings'). An agent can tell immediately what it does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the context of use (staging a listing online/offline/sold) and routes the agent to the mandatory follow-up sibling, confirm_action, with the action_id. It also constrains 'sold' to a sale listing that is online or offline. It lacks an explicit 'do not use this for X, use create_listing instead' exclusion, so it falls short of a 5.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesEnquirer's full name.
emailYesEnquirer's email address.
phoneYesEnquirer's phone number (with country code where possible).
messageNoOptional message / what they want to know or arrange (e.g. a viewing).
languageNoPreferred language for the agency to reply in.en
referenceYesPropertyList listing reference the enquiry is about, e.g. 'PLE-12345'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
agencyNoThe agency that received the enquiry.
statusYes
lead_idYes
referenceYes

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses rate limits (small daily allowance per IP/account; 40 per key per 24h), that the agency receives the lead in their CRM and follows up, and requires explicit user intent and consent. The annotations only cover mutation/openWorld/idempotency, so this added context is genuinely valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Front-loads purpose then flows into usage, transport details, limits, and consent. Most sentences carry useful information, though the rate-limit and consent material runs a little long for the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with an output schema available, the description covers purpose, timing, alternatives, consent prerequisites, and quota behavior. Nothing an agent needs to call it correctly is missing, and return values are delegated to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 all six parameters, establishing a baseline of 3. The description adds only marginal value by noting the reference comes 'from search results' and that both reference and contact details are required, without clarifying the optional message or language fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Submit an enquiry (lead) about a specific listing') plus the actor ('on behalf of a prospective buyer or tenant'). It explicitly distinguishes itself from sibling tools by noting it is the only supported contact path, so an agent can tell it apart without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('once the user has chosen a property and wants the agency to contact them') and names the alternative scenario ('direct phone or email details are not exposed by other tools'). The consent precondition further constrains when it should and shouldn't be called.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verified_valuationVerified valuationA
Read-onlyIdempotent
Inspect

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). The registers price homes only: a commercial listing or segment (office, shop, hotel...) gets no figure, verified false and reason commercial.

ParametersJSON Schema
NameRequiredDescriptionDefault
locationNoMunicipality / city name, e.g. "Marbella". Ignored if a reference is given.
build_sqmNoBuilt size in m² to value. Optional.
referenceNoValue a specific PropertyList listing by reference (uses its municipality, type and size). Optional.
property_typeNoOptional segment slug: apartment, villa, penthouse, townhouse, plot. Defaults to the municipality-wide figure.

Output Schema

ParametersJSON Schema
NameRequiredDescription
reasonNocommercial: the listing or segment is commercial premises, which the registers behind the Oracle do not price.
sourceNo
networkNo
locationYes
on_chainNo
verifiedYes
build_sqmNo
period_endNo
rollup_noteNo
sample_sizeNo
content_hashNo
source_labelNo
price_per_sqmNoEUR per m². Verified only when `verified` is true; otherwise an estimate from the source in source_label.
property_typeNo
requested_areaNo
attestation_urlNo
indicative_rangeNo
municipality_codeNo
transaction_backedNo
valuation_estimateNo
indicative_band_pctNo
verified_price_per_sqmNoDeprecated: the same figure as price_per_sqm, under its old name. Despite the name it is verified only when `verified` is true.
requested_property_typeNo
rolled_up_from_sub_areaNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare read-only/idempotent safety; the description goes well beyond by disclosing source provenance per country (notarial register vs. INE vs. Cyprus Statistical Service), what `verified`/`transaction_backed`/`source_label` mean, the 10-transaction threshold, band widening with thin evidence, and rollup/segment-resolution behavior. This is exactly the extra context that prevents misuse.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Long (~350 words), but front-loaded with what it returns before the caveats, and each paragraph carries distinct, non-redundant guidance (verification, rollup, segment resolution, commercial exclusion). Slightly verbose, yet the length is largely justified by the tool's real complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter tool with no required params, output schema present, and zero annotation constraints on behavior, the description covers sources, verification semantics, geographic limitations, rollup handling, segment fallbacks, and the sibling alternative — nothing material an agent needs to call or cite it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: `reference` pulls municipality/type/size from a listing, `build_sqm` triggers an indicative valuation, `property_type` resolves to the nearest attested segment, and `location` is ignored when a reference is given. Only the enum-free slug semantics are left slightly informal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource (valuation for a property or area) and scopes it by geography and data source ('recorded market data, not asking prices'). It also distinguishes itself from area_market_summary, which it names as the asking-price alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing rules: use area_market_summary when no attestation covers the area, check `verified` before citing, never quote a rolled-up figure as the sub-area's own price, and expect no figure for commercial segments. It states when-not-to-cite conditions rather than leaving them to inference.

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.

  1. 5 tool updates
    • Changedarea_market_summary12 fields changed
      • changedInput schema / properties / property_types / description
        Previous value: -"Optional comma-separated slugs: apartments, villas, penthouses, plots, townhouses."New value: +"Optional comma-separated slugs: apartments, villas, penthouses, plots, townhouses; or commercial, a commercial family (offices, retail, cafes-bars-restaurants, hotels-leisure, industrial-warehouses, garages-storage-rooms, buildings, commercial-land, businesses) or one commercial type (office, shop, bar, warehouse...)."
      • addedInput schema / properties / tenure
        Added value: +{
        +  "description": "Commercial sales only: traspaso narrows the figures to business transfers (the lease and the business taken over).",
        +  "enum": [
        +    "traspaso"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / commercial
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / families
        Added value: +{
        +  "items": {
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / figures_basis
        Added value: +{
        +  "enum": [
        +    "asking_prices"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / median_rent_per_sqm
        Added value: +{
        +  "description": "Commercial lettings: median monthly asking rent per m² of built area.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / min_sample
        Added value: +{
        +  "description": "Fewer priced listings than this and no median is given, only the count.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / per_sqm_area
        Added value: +{
        +  "enum": [
        +    "built",
        +    "plot"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / priced_listings
        Added value: +{
        +  "type": "integer"
        +}
      • addedOutput schema / properties / size_bands
        Added value: +{
        +  "items": {
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / tenure
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "location",
        -  "total_listings",
        -  "oracle"
        -]New value: +[
        +  "location",
        +  "total_listings"
        +]
    • Changedcreate_listing14 fields changed
      • addedInput schema / properties / activity_licence
        Added value: +{
        +  "description": "Commercial only: the activity licence (licencia de actividad): none, in_progress or granted.",
        +  "enum": [
        +    "none",
        +    "in_progress",
        +    "granted"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / ceiling_height_m
        Added value: +{
        +  "description": "Commercial only: ceiling height in metres.",
        +  "type": "number"
        +}
      • addedInput schema / properties / current_use
        Added value: +{
        +  "description": "Commercial only: what the premises are used as now.",
        +  "type": "string"
        +}
      • addedInput schema / properties / extra_guarantee_months
        Added value: +{
        +  "description": "Commercial letting only: months of extra guarantee asked.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / floor
        Added value: +{
        +  "description": "The floor a flat or a unit (office, shop, garage, storage room) is on; 0 is the ground floor.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / frontage_m
        Added value: +{
        +  "description": "Commercial only: street frontage in metres.",
        +  "type": "number"
        +}
      • addedInput schema / properties / lease_years_left
        Added value: +{
        +  "description": "Traspaso only: years left on the lease.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / licensed_activity
        Added value: +{
        +  "description": "Commercial only: the activity the licence is for.",
        +  "type": "string"
        +}
      • addedInput schema / properties / minimum_lease_months
        Added value: +{
        +  "description": "Commercial letting only: the minimum lease term in months.",
        +  "type": "integer"
        +}
      • changedInput schema / properties / property_type / description
        Previous value: -"apartment, villa, penthouse, townhouse, plot or commercial."New value: +"A home: apartment, villa, penthouse, townhouse, country-house or plot. Commercial premises: office, business, cafe, bar, restaurant, retail (premises, a local comercial), shop, hotel, leisure, industrial, warehouse, commercial-land, garage, storage-room or building."
      • addedInput schema / properties / rent_vat_applicable
        Added value: +{
        +  "description": "Commercial letting only: VAT is added to the rent.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / tenure
        Added value: +{
        +  "description": "Commercial sales only: freehold, or traspaso (the lease and the business are taken over).",
        +  "enum": [
        +    "freehold",
        +    "traspaso"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / traspaso_monthly_rent
        Added value: +{
        +  "description": "Traspaso only: the monthly rent the buyer takes over, in euros.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / usable_sqm
        Added value: +{
        +  "description": "Commercial only: usable floor area in square metres.",
        +  "type": "integer"
        +}
    • Changedget_property3 fields changed
      • addedOutput schema / properties / property / properties / commercial
        Added value: +{
        +  "description": "Commercial premises rather than a home.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / property / properties / commercial_facts
        Added value: +{
        +  "description": "Commercial premises only: the facts a buyer or tenant of premises reads first, only those the listing has.",
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / property / properties / tenure
        Added value: +{
        +  "description": "How a commercial sale is sold: freehold, or traspaso (the lease and the business taken over). null for homes and lettings.",
        +  "enum": [
        +    "freehold",
        +    "traspaso",
        +    null
        +  ],
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedqualify_lead1 field changed
      • addedInput schema / properties / search
        Added value: +{
        +  "description": "Optional: what a buyer or tenant is looking for, saved as their search when the qualification is confirmed.",
        +  "properties": {
        +    "beds_min": {
        +      "description": "Homes only.",
        +      "type": "integer"
        +    },
        +    "build_min": {
        +      "description": "Minimum built area in m².",
        +      "type": "integer"
        +    },
        +    "location_ids": {
        +      "description": "Area ids from autocomplete_location.",
        +      "items": {
        +        "type": "integer"
        +      },
        +      "type": "array"
        +    },
        +    "price_max": {
        +      "type": "integer"
        +    },
        +    "price_min": {
        +      "type": "integer"
        +    },
        +    "property_types": {
        +      "description": "Homes (apartment, villa, penthouse, townhouse, country-house, plot) OR commercial premises (commercial, offices, retail, cafes-bars-restaurants, hotels-leisure, industrial-warehouses, garages-storage-rooms, buildings, commercial-land, businesses, or a type such as shop or warehouse).",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "tenure": {
        +      "description": "A buyer of commercial premises who wants a traspaso (the lease and the business taken over).",
        +      "enum": [
        +        "traspaso"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedsearch_properties2 fields changed
      • changedInput schema / properties / property_types / description
        Previous value: -"Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, or commercial (every commercial type; office, shop, restaurant, hotel, warehouse and the other commercial types also work alone). Without it the search covers homes only."New value: +"Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, or commercial (every commercial type; a family such as offices, retail, cafes-bars-restaurants, hotels-leisure, industrial-warehouses, garages-storage-rooms, buildings or commercial-land; office, shop, restaurant, hotel, warehouse and the other commercial types also work alone). Without it the search covers homes only."
      • addedInput schema / properties / tenure
        Added value: +{
        +  "description": "Commercial sales only: traspaso finds business transfers (the lease and the business taken over), freehold the premises sold outright.",
        +  "enum": [
        +    "traspaso",
        +    "freehold"
        +  ],
        +  "type": "string"
        +}
  2. 3 tool updates
    • Changedfind_price_reductions1 field changed
      • changedInput schema / properties / property_types / description
        Previous value: -"Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, commercial."New value: +"Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, or commercial (every commercial type; office, shop, restaurant, hotel, warehouse and the other commercial types also work alone). Without it the search covers homes only."
    • Changedsearch_properties1 field changed
      • changedInput schema / properties / property_types / description
        Previous value: -"Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, commercial."New value: +"Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, or commercial (every commercial type; office, shop, restaurant, hotel, warehouse and the other commercial types also work alone). Without it the search covers homes only."
    • Changedverified_valuation1 field changed
      • addedOutput schema / properties / reason
        Added value: +{
        +  "description": "commercial: the listing or segment is commercial premises, which the registers behind the Oracle do not price.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  3. 5 tool updates
    • Changedfind_price_reductions1 field changed
      • addedOutput schema / properties / limits
        Added value: +{
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Changedfind_properties_by_description1 field changed
      • addedOutput schema / properties / limits
        Added value: +{
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Changedfind_similar_properties2 fields changed
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / limits
        Added value: +{
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Changedget_property4 fields changed
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / limits
        Added value: +{
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / property / properties / photos_total
        Added value: +{
        +  "description": "How many photos the listing has. `photos` holds the first few on the free tier, all of them with MCP Pro.",
        +  "type": "integer"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "property"
        -]
    • Changedmatch_buyer_to_inventory2 fields changed
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / limits
        Added value: +{
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
  4. 2 tool updates
    • Addedget_guide
    • Addedsearch_guides
  5. 1 tool update
    • Changedsearch_properties2 fields changed
      • changedInput schema / properties / features / description
        Previous value: -"Only listings with ALL of these: pool (any pool), private_pool (tagged private or heated pool), sea_view, garden (private, landscaped or communal), parking (garage or parking space), terrace. Results say what each matched on in matched_features."New value: +"Only listings with ALL of these: pool (any pool), private_pool (tagged private or heated pool), communal_pool (tagged communal pool), sea_view, garden (private, landscaped or communal), parking (garage or parking space), terrace. Results say what each matched on in matched_features."
      • changedInput schema / properties / features / items / enum
        Previous value: -[
        -  "pool",
        -  "private_pool",
        -  "sea_view",
        -  "garden",
        -  "parking",
        -  "terrace"
        -]New value: +[
        +  "pool",
        +  "private_pool",
        +  "communal_pool",
        +  "sea_view",
        +  "garden",
        +  "parking",
        +  "terrace"
        +]
  6. 1 tool update
    • Changedfind_properties_by_description2 fields changed
      • addedOutput schema / properties / properties / items / properties / photo
        Added value: +{
        +  "description": "Absolute https URL of the main photo.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / properties / items / properties / url
        Added value: +{
        +  "description": "Absolute https URL of the listing on PropertyList.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  7. 8 tool updates
    • Addedassign_listing
    • Addedcancel_action
    • Addedconfirm_action
    • Addedmove_pipeline_stage
    • Addedqualify_lead
    • Addedschedule_viewing
    • Addedsend_listings_to_contact
    • Addedset_listing_status
  8. 6 tool updates
    • Addedfind_price_reductions
    • Addedfind_similar_properties
    • Addedget_contact
    • Addedlisting_health
    • Addedmatch_buyer_to_inventory
    • Addedmatch_inventory_to_buyers
  9. 14 tool updates
    • Changedarea_market_summary2 fields changed
      • addedOutput schema / properties / oracle / properties / price_per_sqm
        Added value: +{
        +  "description": "EUR per m². Verified only when `verified` is true; otherwise an estimate from the source in source_label.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / oracle / properties / verified_price_per_sqm / description
        Added value: +"Deprecated: the same figure as price_per_sqm, under its old name. Despite the name it is verified only when `verified` is true."
    • Changedautocomplete_location2 fields changed
      • addedInput schema / properties / search_type
        Added value: +{
        +  "description": "Market the listing counts and the ranking are for. Defaults to 'for-sale'.",
        +  "enum": [
        +    "for-sale",
        +    "for-rent",
        +    "holiday-rentals"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "matches": {
        +      "items": {
        +        "properties": {
        +          "areas_in_group": {
        +            "description": "For a group: how many areas it is made of.",
        +            "type": "integer"
        +          },
        +          "id": {
        +            "description": "Area id: pass it to search_properties as location_id.",
        +            "type": "integer"
        +          },
        +          "kind": {
        +            "description": "The raw area level, kept for existing callers; read type instead.",
        +            "type": [
        +              "string",
        +              "integer"
        +            ]
        +          },
        +          "listings": {
        +            "description": "Live listings in it for the search_type asked for.",
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "parent": {
        +            "description": "The area this one sits in.",
        +            "type": "string"
        +          },
        +          "province": {
        +            "type": "string"
        +          },
        +          "type": {
        +            "description": "What kind of place it is; a group is a region or a coast made of other areas.",
        +            "enum": [
        +              "city",
        +              "suburb",
        +              "urbanisation",
        +              "group",
        +              "area"
        +            ],
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "type",
        +          "listings"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "matches"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_contact1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "contact_id": {
        +      "description": "For log_note.",
        +      "type": "integer"
        +    },
        +    "status": {
        +      "description": "exists: a contact with this email was already in the CRM, and nothing was added.",
        +      "enum": [
        +        "created",
        +        "exists"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "contact_id"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_listing1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "location": {
        +      "description": "Where the draft was filed; null when the place name matched no area.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "next_steps": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "property_id": {
        +      "type": "integer"
        +    },
        +    "reference": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "draft_created"
        +      ],
        +      "type": "string"
        +    },
        +    "url": {
        +      "description": "The draft in the CRM, where the agent finishes and publishes it.",
        +      "type": "string"
        +    },
        +    "warning": {
        +      "description": "Advice to pass on to the agent before they publish.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "property_id",
        +    "reference",
        +    "url",
        +    "next_steps"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_contacts1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "contacts": {
        +      "items": {
        +        "properties": {
        +          "company_name": {
        +            "type": "string"
        +          },
        +          "created_at": {
        +            "description": "ISO 8601, UTC.",
        +            "type": "string"
        +          },
        +          "emails": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "id": {
        +            "description": "contact_id, for log_note.",
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "phones": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "pipelines": {
        +            "description": "Board name to the stage this contact is in, in the agency's own stage names.",
        +            "type": "object"
        +          },
        +          "surname": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "count": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "contacts"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_properties_by_description6 fields changed
      • addedOutput schema / properties / allowance
        Added value: +{
        +  "properties": {
        +    "answers_left_today": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "counted_per": {
        +      "type": "string"
        +    },
        +    "daily_answers": {
        +      "type": "integer"
        +    },
        +    "resets": {
        +      "type": "string"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / interpretation / description
        Added value: +"How the brief was read, one pill per constraint."
      • changedOutput schema / properties / interpretation / type
        Previous value: -[
        -  "object",
        -  "null"
        -]New value: +[
        +  "array",
        +  "null"
        +]
      • addedOutput schema / properties / properties / items / properties / location / description
        Added value: +"\"Suburb, City\"."
      • changedOutput schema / properties / properties / items / properties / location / type
        Previous value: -"object"New value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / properties / items / properties / title / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
    • Changedlist_agencies1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "agencies": {
        +      "items": {
        +        "properties": {
        +          "city": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "integer"
        +          },
        +          "listing_count": {
        +            "description": "Active listings it carries in the area.",
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "province": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "The agency's public page.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "listing_count"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "agencies"
        +  ],
        +  "type": "object"
        +}
    • Changedlog_note1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "activity_id": {
        +      "type": "integer"
        +    },
        +    "status": {
        +      "enum": [
        +        "logged"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "activity_id"
        +  ],
        +  "type": "object"
        +}
    • Changedmy_leads1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "count": {
        +      "type": "integer"
        +    },
        +    "leads": {
        +      "items": {
        +        "properties": {
        +          "contact_id": {
        +            "type": "integer"
        +          },
        +          "created_at": {
        +            "description": "ISO 8601, UTC.",
        +            "type": "string"
        +          },
        +          "email": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "integer"
        +          },
        +          "lead_type": {
        +            "type": "string"
        +          },
        +          "message": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "phone": {
        +            "type": "string"
        +          },
        +          "property_reference": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "new, active, closed_converted or closed_not_converted.",
        +            "type": [
        +              "string",
        +              "integer"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "leads"
        +  ],
        +  "type": "object"
        +}
    • Changedmy_listings1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "count": {
        +      "type": "integer"
        +    },
        +    "listings": {
        +      "items": {
        +        "properties": {
        +          "bathrooms": {
        +            "type": "integer"
        +          },
        +          "bedrooms": {
        +            "type": "integer"
        +          },
        +          "build_sqm": {
        +            "type": "integer"
        +          },
        +          "id": {
        +            "type": "integer"
        +          },
        +          "location": {
        +            "type": "object"
        +          },
        +          "monthly_price": {
        +            "type": "integer"
        +          },
        +          "photo": {
        +            "type": "string"
        +          },
        +          "price": {
        +            "description": "Headline price for the listing's transaction type; read with price_period.",
        +            "type": "integer"
        +          },
        +          "price_period": {
        +            "enum": [
        +              "total",
        +              "per_month",
        +              "per_week"
        +            ],
        +            "type": "string"
        +          },
        +          "reference": {
        +            "type": "string"
        +          },
        +          "sale_price": {
        +            "type": "integer"
        +          },
        +          "status": {
        +            "description": "online, offline, sold, new, inreview...",
        +            "type": "string"
        +          },
        +          "updated_at": {
        +            "description": "ISO 8601, UTC.",
        +            "type": "string"
        +          },
        +          "weekly_price_from": {
        +            "type": "integer"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "reference"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "listings"
        +  ],
        +  "type": "object"
        +}
    • Changedmy_pipeline1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "boards": {
        +      "description": "The summary of every board, when no pipeline was asked for.",
        +      "items": {
        +        "properties": {
        +          "pipeline": {
        +            "enum": [
        +              "lead",
        +              "buyer",
        +              "seller",
        +              "tenant",
        +              "nurture",
        +              "property"
        +            ],
        +            "type": "string"
        +          },
        +          "stages": {
        +            "items": {
        +              "properties": {
        +                "count": {
        +                  "type": "integer"
        +                },
        +                "stage": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "stage",
        +                "count"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "total": {
        +            "type": "integer"
        +          }
        +        },
        +        "required": [
        +          "pipeline",
        +          "total",
        +          "stages"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "pipeline": {
        +      "description": "The board asked for.",
        +      "enum": [
        +        "lead",
        +        "buyer",
        +        "seller",
        +        "tenant",
        +        "nurture",
        +        "property"
        +      ],
        +      "type": "string"
        +    },
        +    "stages": {
        +      "description": "That board's stages, each with its full count and up to `limit` cards, most recently updated first.",
        +      "items": {
        +        "properties": {
        +          "cards": {
        +            "items": {
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "closed": {
        +            "type": "boolean"
        +          },
        +          "count": {
        +            "type": "integer"
        +          },
        +          "stage": {
        +            "description": "The agency's own name for the stage.",
        +            "type": "string"
        +          },
        +          "value_of_shown_cards": {
        +            "description": "EUR, buyer, seller and tenant boards only.",
        +            "type": "integer"
        +          }
        +        },
        +        "required": [
        +          "stage",
        +          "count",
        +          "cards"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total_cards": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "total_cards"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch_properties3 fields changed
      • addedInput schema / properties / features
        Added value: +{
        +  "description": "Only listings with ALL of these: pool (any pool), private_pool (tagged private or heated pool), sea_view, garden (private, landscaped or communal), parking (garage or parking space), terrace. Results say what each matched on in matched_features.",
        +  "items": {
        +    "enum": [
        +      "pool",
        +      "private_pool",
        +      "sea_view",
        +      "garden",
        +      "parking",
        +      "terrace"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / location_id
        Added value: +{
        +  "description": "Area id from autocomplete_location. Takes precedence over location. A group id (a region or coast, type group) searches every area in the group.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / properties / items / properties / matched_features
        Added value: +{
        +  "items": {
        +    "properties": {
        +      "feature": {
        +        "type": "string"
        +      },
        +      "parking_spaces": {
        +        "type": "integer"
        +      },
        +      "tags": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "terrace_sqm": {
        +        "type": "integer"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedsubmit_enquiry1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "agency": {
        +      "description": "The agency that received the enquiry.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "lead_id": {
        +      "type": "integer"
        +    },
        +    "reference": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "submitted"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "lead_id",
        +    "reference"
        +  ],
        +  "type": "object"
        +}
    • Changedverified_valuation4 fields changed
      • removedInput schema / properties / build
        Removed value: -{
        -  "description": "Alias of build_sqm.",
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • removedInput schema / properties / build_size
        Removed value: -{
        -  "description": "Alias of build_sqm.",
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • addedOutput schema / properties / price_per_sqm
        Added value: +{
        +  "description": "EUR per m². Verified only when `verified` is true; otherwise an estimate from the source in source_label.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / verified_price_per_sqm / description
        Added value: +"Deprecated: the same figure as price_per_sqm, under its old name. Despite the name it is verified only when `verified` is true."
  10. 4 tool updates
    • Changedarea_market_summary8 fields changed
      • addedOutput schema / properties / oracle / properties / minimum_verified_sample
        Added value: +{
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / oracle / properties / municipality
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / oracle / properties / municipality_code
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / oracle / properties / note
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / oracle / properties / requested_area
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / oracle / properties / rolled_up_from_sub_area
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / oracle / properties / source_label
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / oracle / properties / transaction_backed
        Added value: +{
        +  "type": "boolean"
        +}
    • Changedfind_properties_by_description2 fields changed
      • addedOutput schema / properties / billed
        Added value: +{
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedsearch_properties1 field changed
      • addedOutput schema / properties / limits
        Added value: +{
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Changedverified_valuation4 fields changed
      • addedOutput schema / properties / municipality_code
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / requested_area
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / rolled_up_from_sub_area
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / rollup_note
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  11. 4 tool updates
    • Changedfind_properties_by_description1 field changed
      • changedInput schema / properties / language / enum
        Previous value: -[
        -  "en",
        -  "es"
        -]New value: +[
        +  "en",
        +  "es",
        +  "de",
        +  "fr",
        +  "it",
        +  "nl",
        +  "pt",
        +  "bg",
        +  "el",
        +  "da",
        +  "sv",
        +  "no",
        +  "fi",
        +  "pl",
        +  "ru"
        +]
    • Changedget_property2 fields changed
      • changedInput schema / properties / language / enum
        Previous value: -[
        -  "en",
        -  "es",
        -  "de",
        -  "fr",
        -  "it",
        -  "nl",
        -  "pt",
        -  "bg",
        -  "el",
        -  "da",
        -  "sv",
        -  "no",
        -  "fi"
        -]New value: +[
        +  "en",
        +  "es",
        +  "de",
        +  "fr",
        +  "it",
        +  "nl",
        +  "pt",
        +  "bg",
        +  "el",
        +  "da",
        +  "sv",
        +  "no",
        +  "fi",
        +  "pl",
        +  "ru"
        +]
      • addedOutput schema / properties / property / properties / features_language
        Added value: +{
        +  "type": "string"
        +}
    • Changedsearch_properties1 field changed
      • changedInput schema / properties / language / enum
        Previous value: -[
        -  "en",
        -  "es",
        -  "de",
        -  "fr",
        -  "it",
        -  "nl",
        -  "pt",
        -  "bg",
        -  "el",
        -  "da",
        -  "sv",
        -  "no",
        -  "fi"
        -]New value: +[
        +  "en",
        +  "es",
        +  "de",
        +  "fr",
        +  "it",
        +  "nl",
        +  "pt",
        +  "bg",
        +  "el",
        +  "da",
        +  "sv",
        +  "no",
        +  "fi",
        +  "pl",
        +  "ru"
        +]
    • Changedsubmit_enquiry1 field changed
      • changedInput schema / properties / language / enum
        Previous value: -[
        -  "en",
        -  "es",
        -  "de",
        -  "fr",
        -  "it",
        -  "nl",
        -  "pt",
        -  "bg",
        -  "el",
        -  "da",
        -  "sv",
        -  "no",
        -  "fi"
        -]New value: +[
        +  "en",
        +  "es",
        +  "de",
        +  "fr",
        +  "it",
        +  "nl",
        +  "pt",
        +  "bg",
        +  "el",
        +  "da",
        +  "sv",
        +  "no",
        +  "fi",
        +  "pl",
        +  "ru"
        +]
  12. 1 tool update
    • Addedmy_pipeline
  13. 1 tool update
    • Addedcreate_listing

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    Enables 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.
    14
    3
    MIT
  • F
    license
    Not graded
    quality
    F
    maintenance
    French real estate data platform for AI agents. Identifies property owners likely to sell and tracks behavioral signals on active listings. Coverage: metropolitan France.
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables discovery and evaluation of primary residence housing opportunities in Ibiza, including property scoring, mortgage scenario calculations, and validated submission of candidate listings.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources