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
100.0% over the last 24 hours
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A4.1/5.0

Scored across 31 tools

Disambiguation4/5

Most tools have clearly distinct purposes and the descriptions actively cross-reference siblings to draw boundaries (search_properties vs find_properties_by_description vs find_similar_properties; my_leads vs my_pipeline; area_market_summary vs verified_valuation). The main soft spot is the inverse pair match_buyer_to_inventory / match_inventory_to_buyers, whose names are easy to swap at a glance, and get_property vs my_listings for looking up a reference, which overlap slightly despite being explained.

Naming Consistency4/5

The dominant pattern is snake_case verb_noun (search_properties, create_listing, set_listing_status, assign_listing), applied consistently across both the public MLS and CRM surfaces. The deviations are a small, coherent set of noun-style names — the my_* family (my_listings, my_leads, my_pipeline) and report tools (area_market_summary, listing_health, verified_valuation) — which read as intentional groupings rather than chaos.

Tool Count3/5

31 tools is heavy, driven by two full domains (public MLS search/valuation and an agency CRM) plus a staging layer of five action tools sharing confirm_action/cancel_action. The two surfaces are well separated and few tools feel redundant, but the count sits above the comfortable band and an agent must hold a large surface in mind.

Completeness4/5

Coverage is unusually broad: location resolution, structured and free-form search, valuation, market stats, guides, agencies, enquiries, plus CRM contacts, listings, pipeline, lead qualification, viewings and client emails, with a safe preview/confirm lifecycle. Remaining gaps are modest — no update/edit-listing or update-contact operation, and viewings can be booked but not listed afterwards — which agents can work around.

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.

If several places share the name and one of them holds at least 80% of their live listings, the figures are for that place alone, and location_match.other_places names the others (id, municipality, province, listings). If the listings are split between them, or none has any, the response says so (error: ambiguous_location, location_match.ambiguous: true), lists them in location_match.candidates and returns no figures. Either way, ask again with the chosen id as location_id, or with the town or province after a comma ('El Limonar, Mijas'). A town that holds no area of that name is answered as location_not_found, with the areas of that name we do hold in location_match.candidates.

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.

The oracle figure follows property_types where the source has one for that kind of home: oracle.segment is apartments (flats and penthouses) or houses (villas, townhouses, country houses). Otherwise it is the figure for every home in the area, oracle.segment is all_homes, oracle.covers_all_homes is true and oracle.note says so: never quote it as the figure for the type asked for.

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.

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'. Add the town or province after a comma when several places share the name: 'El Limonar, Mijas'.
location_idNoArea id from autocomplete_location or from location_match.candidates. Takes precedence over location.
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

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.7/5.0
Behavior5/5

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

The description discloses extensive behavior beyond the annotations, including location resolution failures, ambiguity handling, price-unit semantics, oracle verification rules, sub-area roll-up behavior, and commercial-property restrictions. These are precisely the operational details an agent needs to avoid misrepresenting the returned figures.

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 it is front-loaded with purpose, metrics, filters, and usage before moving into edge cases. Most sentences carry operational value, though the length is near the upper bound for a tool description and could be tightened in places 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?

Given the tool's complexity, the description is complete: it covers metric semantics, location-resolution outcomes, oracle caveats, sub-area behavior, and commercial-versus-residential separation. An output schema and annotations also exist, but the description still supplies the interpretation rules an agent needs to use the tool correctly.

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?

Although schema coverage is already 80%, the description adds substantial meaning: it explains how search_type affects price units, how location_id takes precedence after ambiguous matches, and how property_types separates homes from commercial figures. The schema alone would not make those behavioral consequences clear.

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 opens with a precise verb and resource: return aggregate market context for a Spanish area, listing the exact metrics provided. It also clarifies that this is a market-context tool rather than a listing search or individual valuation, which differentiates it from siblings such as search_properties and verified_valuation.

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 a clear usage context: use this before recommending a price or commenting on whether a listing is good value. However, it does not explicitly state when to prefer a sibling tool, such as verified_valuation for a specific property valuation, or when not to use this tool.

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.

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

Output 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. A country or region name (Portugal, Algarve) is answered by the group of that name, never by villages that only share its letters. Each match names the municipality it sits in, which tells apart places that share a name (El Limonar in Mijas, Málaga and in Torrevieja, Alicante). 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.

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

NameRequiredDescription
matchesYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/openWorld safety, and the description adds genuine behavior beyond them: max 10 results, ordering 'biggest first', the rule that a group covering a region precedes a same-named city, the exact-name matching rule for country/region queries, and municipality-based disambiguation of duplicate names. These ranking and matching semantics are not derivable from annotations or schema.

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 return shape, then usage, then routing guidance — good ordering. Some sentences (the two disambiguation examples) overlap in intent and could be trimmed slightly, but each 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?

Output schema exists so return-field enumeration is optional, and annotations cover the safety profile; the description still supplies the ordering rules, matching behavior, and downstream integration with search_properties that an agent needs to call and use the tool correctly. 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; the description adds that the count and ranking depend on the market, which implicitly explains the meaning of search_type, and clarifies query as a place name rather than a free-form search string. It does not elaborate on the provinces parameter, so it falls short of full semantic 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?

States a specific verb and resource — looking up property areas (city, suburb, urbanisation, region/coast groups) by free-text name — and defines the scope, including the different area types returned. An agent can immediately distinguish this resolver from search_properties in the sibling list.

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: resolve place names before calling search_properties, pass the chosen id as location_id, and calls out common spelling cases ('Nueva Andalucia' vs 'Nueva Andalucía'). The alternative tool and the hand-off contract are both named.

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.

NameRequiredDescriptionDefault
action_idYesThe action_id from the preview.

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

NameRequiredDescriptionDefault
action_idYesThe action_id from the preview.

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

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

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.

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.
buildable_sqmNoLand only (a plot or commercial land): how many square metres may be built on it (edificabilidad).
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

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.7/5.0
Behavior5/5

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

Beyond the annotations, it discloses important behavior: the result is only a draft, it never appears on the portal, the response includes a direct link, and a linked PropertyList account or agency API key is required. It also explains that location is resolved against the real area tree and that commercial facts are validated as the CRM validates them.

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?

The description is front-loaded with the core action and usage condition, then moves to draft behavior and commercial-specific rules. Despite its length, each paragraph addresses useful context for a 25-parameter tool and contains no obvious 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?

Given the tool's complexity and the presence of an output schema, the description is complete enough to guide invocation. It covers the create-draft scope, account requirement, location resolution, publication behavior, and commercial-property validation rules.

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 already 92%, so the schema does most parameter-level work. The description still adds meaningful guidance by explaining that commercial premises take a commercial property_type, no bedrooms, and their own facts such as usable area, activity licence, tenure, rent, and lease terms.

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: starts a new property listing draft in the agency CRM from a description. It clearly distinguishes this from publishing tools by saying the listing is created as a draft and is never published or shown on the portal from here.

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 a clear usage condition: use when the agent has taken on a property and wants it in the system. It also clarifies the downstream workflow, where the agent adds photos and the energy rating and publishes separately. It does not name explicit alternatives or when-not-to-use cases, 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.

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.

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

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

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

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

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover the safety profile (read-only, idempotent, non-destructive), so the description's job is to add operational detail — and it does: result ordering, the per-listing return fields, the location_not_found error contract, and the exclusion of price-on-application listings. It doesn't mention corpus freshness or pagination, but the essential behaviors are disclosed.

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 defining sentence, then example queries, then filter/error/exclusion notes. Slightly dense and the line breaks are odd, but every sentence carries information.

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 needn't be explained — and yet the description still names the key fields, which helps. The filter model is delegated to a sibling and the error contract is stated, leaving only minor gaps around defaults and result caps.

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 schema covers 67% of parameters, and the description adds the useful rule that filters behave like search_properties and that an unknown location returns an error. However, it says nothing about days, limit, language, or min_percent beyond the schema, and those undocumented parameters remain undocumented in both places.

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 resource and a specific cut of the data: live listings with a reduced asking price, sorted biggest reduction first. This is clearly distinguishable from search_properties, which it explicitly references only for filter semantics.

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 two concrete use cases ('what has dropped in price in Estepona this month?' and spotting motivated sellers) and points to search_properties for the general filter model. It doesn't explicitly say when not to use this tool (e.g. for unsold inventory without a cut), but the intent is clear enough.

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.

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

Output Schema

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

TDQS

A4.4/5.0
Behavior5/5

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

Annotations cover safety (readOnly, non-destructive, idempotent) but the description adds the traits that matter operationally: a daily free allowance without an API key, that empty results don't consume it, the specific error when exhausted, a cap of 9 listings, and that commercial premises are never mixed with homes. That is real behavioral disclosure 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-loaded with the purpose and the qualifying brief type before mechanism and quota details. It runs long, and the commercial-premises sentence and the parenthetical quota note are slightly tangential, but nearly every sentence carries information an agent needs.

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-format explanation is not required, and the description still covers scope, ranking, quota, and failure behavior. The one real hole is the undescribed language parameter, which leaves the agent guessing about a non-default input.

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%: 'brief' is documented in the schema, but the 'language' enum parameter has no description anywhere. The description never mentions language handling, so it fails to compensate for the gap, and its notes on features-as-filters describe matching behavior rather than parameter syntax.

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 (match Spanish properties from a free-form description) plus the mechanism (translate into 1-3 parallel structured searches over the full MLS, merge and rank). It also implicitly differentiates from search_properties by naming that sibling as the structured alternative, so an agent can pick 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?

Explicitly says when to use it (vague, conditional, lifestyle-heavy briefs, with a concrete example) and names the alternative for the other case: search_properties for structured queries. The fallback when the allowance is exhausted is stated, so the agent knows exactly what to do when this tool errors.

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.

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

Output Schema

NameRequiredDescription
errorNo
limitsNo
referenceYes
propertiesYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover read-only/idempotent safety, and the description adds genuinely new behavior: the ~25% price tolerance, the matching dimensions, the 'closest in price first' ordering, and the presence of oracle_verified/oracle_attestation_url on results. It does not discuss result-count behavior or what happens when few matches exist, which is the main remaining gap.

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 core similarity rule and ranking are front-loaded in one dense sentence, followed by usage examples and a short note on result fields. No filler, though the trailing oracle paragraph is a slight afterthought that could be tighter.

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 shape need not be explained, yet the description still flags the oracle fields. The matching heuristic is exactly what an agent needs to interpret why certain listings appear, and only the limit default/cap is left implicit.

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%: reference and language are documented in the schema, but limit is undocumented in both places. The description's matching criteria describe filtering behavior, not the parameters, so it adds no meaning about limit or language. Baseline 3 for mid coverage 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 ('listings similar to one property') and enumerates the similarity axes — market, town, property type, bedrooms, price band. An agent can distinguish this from search_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?

Provides two concrete trigger phrases ('show me alternatives to PL12345', 'anything like this but cheaper?') that map directly to intent. It stops short of explicitly naming search_properties as the alternative or stating when not to use this tool, 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.

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.

NameRequiredDescriptionDefault
contact_idYesThe contact id, from find_contacts or my_pipeline.

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

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

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.3/5.0
Behavior4/5

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

Annotations already establish that this is a read-only, idempotent, non-destructive, open-world tool. The description adds meaningful behavioral context beyond annotations: how to handle last_reviewed, what to do when truncated is true, and the legal-information disclaimer.

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?

The description is four compact sentences with no wasted text, and the core purpose is front-loaded before the handling instructions. Each sentence carries operational value for correct invocation or interpretation.

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 rich schema coverage, existing output schema, and annotations, the description is complete enough for an agent to call and use the tool correctly. It covers pagination continuation, review-date handling, and the legal disclaimer without redundantly restating schema details.

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 url, offset, and max_chars. The description reinforces the offset continuation semantics but does not mention max_chars, so it adds only modest value beyond the structured 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?

The description states a specific verb and resource: "Read one PropertyList guide." The word "one" clearly distinguishes this tool from the sibling search_guides tool, so an agent can identify its role 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 Guidelines4/5

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

The description gives clear usage context and explicitly tells the agent how to continue when a page is truncated via offset and next_offset. It does not explicitly name search_guides as the alternative for discovering guides, but the schema's url description supplies that routing context.

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

get_propertyGet property details
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 can place the listing; 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 or neighbourhood, not the building: a listing whose agent placed no map pin carries the centre of its area, shared by its neighbours), unknown is a pin we hold no precision record for.

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

Output Schema

NameRequiredDescription
errorNo
limitsNo
propertyNo
list_agenciesList agenciesA
Read-onlyIdempotent
Inspect

Find PropertyList agencies (estate agents) in a given area, ranked by how many active listings they carry there. Returns up to 10 agencies with name, location, listing count, and url: the agency's page on PropertyList, listing its properties, in the language asked for. url is null for the few agencies PropertyList shows no page for. Use this after a buyer has narrowed in on an area and wants to know which agencies dominate it.

NameRequiredDescriptionDefault
limitNo
languageNoLanguage of the agency pages linked in url.en
locationYesPlace name (city, suburb, or urbanisation). e.g. 'Estepona'.

Output Schema

NameRequiredDescription
agenciesYes

TDQS

A4.1/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, openWorld), and the description adds real value: a ranking rule, a nullable `url` edge case for agencies with no page, and a language-dependent link. The only blemish is 'Returns up to 10 agencies', which sits awkwardly against a `limit` parameter that allows up to 25.

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 ranking rule, and every sentence carries information. Slightly long for a three-parameter read tool, and the described 10-result cap duplicates and muddies the `limit` parameter.

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 enumerated, yet the description still summarizes the main fields and the null case. For a read-only, single-required-parameter lookup this is essentially complete; only the `limit` semantics remain unaddressed.

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% – `location` and `language` are documented, `limit` is not. The description clarifies that `language` controls the language of the linked agency page and that `url` may be null, but it never explains `limit` or reconciles it with the stated cap of 10, so it neither compensates for the gap nor misleads badly.

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 agencies in an area), the ranking basis (active listing count), and the payload returned (name, location, listing count, url). An agent can distinguish this from area_market_summary 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?

Gives an explicit situational trigger: use it after a buyer has narrowed in on an area and wants to know which agencies dominate it. It does not name a competing sibling (e.g. area_market_summary) or state when not to use it, so it stops 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.

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.

NameRequiredDescriptionDefault
issueNoOnly listings with this problem. Optional.
limitNo
statusNoonline

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

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

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.

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

Output 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?

Goes well beyond the readOnly/idempotent annotations: it discloses the result ordering (own listings first, then shared MLS, newest first), a per-listing ownership flag, the no-search behavior (explanation, not a guess), and the auth prerequisite (linked PropertyList account or agency API key). Only missing detail is what happens with the limit cap and whether partial results are common.

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?

Well front-loaded with scope and ordering in the first sentence, then prerequisites and fallbacks in descending priority. Slightly verbose in places ('the same search the CRM runs for that client' repeats the prior clause), but every paragraph carries distinct information.

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, the description correctly omits return-value structure while still covering ordering, ownership flagging, and auth requirements. The only real gap is the limit parameter's effect on result completeness.

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 description only adds sourcing guidance for contact_id ('from find_contacts'). The limit parameter (default 5, max 20) is not explained in either the schema or the description, so truncation behavior is left implicit.

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 ('listings that fit one client's search') and pins the scope to the caller's agency CRM with an explicit ordering rule. It is clearly distinguishable from match_inventory_to_buyers (reverse direction) and search_properties (used when no saved search exists).

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?

Explains the saved-search input, the fallback to the latest debrief, and the exact failure mode when neither exists, with the named alternative (search_properties) to use instead. Also routes the agent to find_contacts for contact_id and get_contact to check sending history.

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.

NameRequiredDescriptionDefault
limitNo
property_referenceYesListing reference, e.g. PL12345.

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

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

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.

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

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

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

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.

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

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.

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

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.

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

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

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

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 readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral detail about Spanish-language queries requiring accents, though it does not discuss ranking, result volume, or error behavior.

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?

The description is compact and front-loaded: it establishes the guide corpus, lists relevant question types, names the follow-up tool, and ends with the accent rule. Every sentence contributes useful selection or invocation guidance.

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, annotations cover safety and openness, and the description supplies the topic scope, intended question types, next-step tool, and language-query nuance. Nothing essential for selecting or calling this tool 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 67%, and the schema already explains query keyword guidance and the language enum. The description adds meaningful query semantics by noting that Spanish words need accents, with examples like tributación and tasación, compensating for the remaining coverage 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?

The description states a specific verb and resource: searching PropertyList's Spain property guides. It also names concrete covered topics (ITP, IBI, NIE, buying process, laws, area guides), making it easy to distinguish from generic property search siblings.

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 explicitly says to use this for how-to, cost, and legal questions, then call get_guide for the page. That gives both the appropriate use case and the follow-up alternative, leaving little to inference.

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

search_propertiesSearch properties
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. When several places share the name, the results are for the one holding at least 80% of their live listings, and location_match.other_places names the others; when the listings are split, the results cover all of them and location_match.ambiguous is true, with the places in location_match.candidates (id, municipality, province). Pass one as location_id, or add the town after a comma ('El Limonar, Mijas').

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 can place the listing; 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 or neighbourhood, not the building: a listing whose agent placed no map pin carries the centre of its area, shared by its neighbours), unknown is a pin we hold no precision record for.

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.
rent_to_buyNoOnly rent-to-buy listings (alquiler con opcion a compra): homes for sale AND let long term, whose tenant may buy at the sale price. Works with for-sale or for-rent. Results carry rent_to_buy with the years and the share of the price paid up front.
search_typeNoListing market. Defaults to 'for-sale'.
bedrooms_maxNo
bedrooms_minNo
bathrooms_minNo
buildable_minNoLand only: the least floor area in m² a plot may be built to (edificabilidad, m² edificables, m² de techo). Use with property_types plots or commercial-land. Listings that do not state a buildable figure cannot be known to qualify and are left out; buildable_unstated in the response says how many plots were left out for that reason.
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

NameRequiredDescription
pageYes
errorNo
totalYes
limitsNo
page_sizeYes
propertiesYes
location_matchNo
buildable_unstatedNoWith buildable_min: how many plots meet every other filter but state no buildable m², so were left out.
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.

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

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.

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

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 enquiryA
Destructive
Inspect

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 name and email. A phone number is optional: pass it only when the person gives it and wants to be called; email alone is enough. Only submit with the person's clear intent and consent - this sends their details to a real estate agency, and an enquiry cannot be recalled.

NameRequiredDescriptionDefault
nameYesEnquirer's full name.
emailYesEnquirer's email address.
phoneNoOptional. The enquirer's phone number (with country code where possible), only if they give it and want a call. Email alone is enough.
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

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?

Beyond annotations (destructiveHint=true, openWorldHint=true, idempotentHint=false) it reveals what technically happens downstream (enquiry lands in the agency's CRM, agency follows up), the rate-limit model for anonymous vs account vs API-key callers, and that the action cannot be recalled. This is substantive context an agent could not derive from annotations alone.

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?

Purpose is front-loaded and the paragraphs each cover a distinct concern (what, when, limits, params, consent). It is slightly longer than needed, with the phone-number guidance repeated from the schema, which keeps it from a 5.

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 no explanation, and the description fills the remaining gaps: consent, irreversibility, rate limits, API-key behavior, and which parameter values to supply. Nothing an agent needs to call this destructive tool 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 description coverage is 100%, so the schema already documents all six parameters, and the description largely restates the phone/email guidance. It adds only marginal value, such as noting the `reference` comes from search results and the message can mention a viewing, which is why it sits at the baseline rather than above it.

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 first sentence states a specific verb (submit), a specific resource (enquiry/lead), and the exact object it concerns ('about a specific listing on behalf of a prospective buyer or tenant'). This lets an agent distinguish it from siblings like create_contact or schedule_viewing 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?

It explicitly states the trigger condition ('once the user has chosen a property and wants the agency to contact them') and rules out alternatives by noting that direct phone or email details are not exposed by other tools. The consent/irreversibility note functions as an additional when-to-use guard.

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

verified_valuationMarket price estimateA
Read-onlyIdempotent
Inspect

Estimate the market price of 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 price estimate when you give a size (build_sqm) or a listing reference, and a content-hashed attestation URL the figure can be cited from. It is an estimate, for guidance.

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

NameRequiredDescriptionDefault
locationNoMunicipality / city name, e.g. "Marbella". Ignored if a reference is given.
build_sqmNoBuilt size in m² to estimate the price for. Optional.
referenceNoEstimate the market price of 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

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_estimateNoThe estimated market price for build_sqm: price_per_sqm times the size. An estimate, for guidance.
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.6/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 goes well beyond them: what `verified` actually gates, why transaction_backed is false outside Spain, that only two segment attestations exist per municipality, that commercial requests return reason=commercial. It does not state rate limits or latency, so it stops short of a 5, but the disclosure of failure modes and data provenance is unusually rich.

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 decision rule ('Check `verified` before citing') before the country and rollup details, and each paragraph covers one concern. It runs long, and the sub-area enumeration (Sotogrande, Puerto Banus, Nueva Andalucia, Orihuela Costa) is illustrative padding that 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-key explanation was optional — yet the description still explains the fields that determine correct downstream wording (verified, transaction_backed, source_label, rollup_note, requested_area, indicative_band_pct). For a multi-country, zero-required-param estimation tool, nothing an agent needs to call it or cite it responsibly 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 baseline is 3, and the description still adds real meaning: build_sqm triggers an indicative price, reference reuses the listing's municipality/type/size (and location is ignored), and property_type resolves to the nearest attested segment with a requested_property_type echo. Minor tension: the schema lists 'plot' as a valid slug while the text says only homes are priced, which leaves plot handling slightly ambiguous.

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?

Specific verb ('Estimate the market price') plus resource (property or area) plus explicit scope (Spain, Portugal, Cyprus) and source qualifier ('recorded market data, not asking prices'). The closing pointer to area_market_summary for asking-price stats distinguishes it from the most confusable sibling without either schema being opened.

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 routes the agent: use area_market_summary when no attestation exists, check `verified` before citing, never describe index-based PT/CY figures as notary-verified, never quote a rolled-up figure as the sub-area's own price. When-not conditions and alternatives are both named.

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. 2 tool updates
    • Changedget_property1 field changed
      • addedOutput schema / properties / property / properties / rent_to_buy
        Added value: +{
        +  "description": "Rent to buy (alquiler con opcion a compra) terms, null without the option: years (rental duration), down_payment_percent and down_payment_amount (the share of the sale price paid up front), sale_price, monthly_rent.",
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Changedsearch_properties2 fields changed
      • addedInput schema / properties / rent_to_buy
        Added value: +{
        +  "description": "Only rent-to-buy listings (alquiler con opcion a compra): homes for sale AND let long term, whose tenant may buy at the sale price. Works with for-sale or for-rent. Results carry rent_to_buy with the years and the share of the price paid up front.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / properties / items / properties / rent_to_buy
        Added value: +{
        +  "description": "Rent to buy terms: years (rental duration), down_payment_percent and down_payment_amount (the share of the sale price paid up front), sale_price, monthly_rent. Absent when the listing has no option to buy.",
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
  2. 1 tool update
    • Changedget_property2 fields changed
      • addedOutput schema / properties / property / properties / description_machine_translated
        Added value: +{
        +  "description": "True when PropertyList translated the description automatically from the listing's main language; false when it is the agency's own text.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / property / properties / description_translated_from
        Added value: +{
        +  "description": "The language the description was translated from, when it was.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  3. 5 tool updates
    • Changedarea_market_summary2 fields changed
      • addedOutput schema / properties / oracle / properties / covers_all_homes
        Added value: +{
        +  "description": "True when price_per_sqm is the figure for every home in the area, whatever property_types asked for.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / oracle / properties / segment
        Added value: +{
        +  "description": "The homes price_per_sqm describes: apartments (flats and penthouses), houses (villas, townhouses, country houses), or all_homes when the source has no figure for the types asked for.",
        +  "enum": [
        +    "apartments",
        +    "houses",
        +    "all_homes"
        +  ],
        +  "type": "string"
        +}
    • Changedget_property1 field changed
      • addedOutput schema / properties / property / properties / url
        Added value: +{
        +  "description": "The listing's page on PropertyList, in the language asked for. null when the listing is not shown on the portal.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedlist_agencies3 fields changed
      • addedInput schema / properties / language
        Added value: +{
        +  "default": "en",
        +  "description": "Language of the agency pages linked in url.",
        +  "enum": [
        +    "en",
        +    "es",
        +    "de",
        +    "fr",
        +    "it",
        +    "nl",
        +    "pt",
        +    "bg",
        +    "el",
        +    "da",
        +    "sv",
        +    "no",
        +    "fi",
        +    "pl",
        +    "ru"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / agencies / items / properties / url / description
        Previous value: -"The agency's public page."New value: +"The agency's page on PropertyList, in the language asked for; null when PropertyList shows no page for it."
      • changedOutput schema / properties / agencies / items / properties / url / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
    • Changedsubmit_enquiry2 fields changed
      • changedInput schema / properties / phone / description
        Previous value: -"Enquirer's phone number (with country code where possible)."New value: +"Optional. The enquirer's phone number (with country code where possible), only if they give it and want a call. Email alone is enough."
      • changedInput schema / required
        Previous value: -[
        -  "reference",
        -  "name",
        -  "email",
        -  "phone"
        -]New value: +[
        +  "reference",
        +  "name",
        +  "email"
        +]
    • Changedverified_valuation3 fields changed
      • changedInput schema / properties / build_sqm / description
        Previous value: -"Built size in m² to value. Optional."New value: +"Built size in m² to estimate the price for. Optional."
      • changedInput schema / properties / reference / description
        Previous value: -"Value a specific PropertyList listing by reference (uses its municipality, type and size). Optional."New value: +"Estimate the market price of a specific PropertyList listing by reference (uses its municipality, type and size). Optional."
      • addedOutput schema / properties / valuation_estimate / description
        Added value: +"The estimated market price for build_sqm: price_per_sqm times the size. An estimate, for guidance."
  4. 6 tool updates
    • Changedcreate_listing1 field changed
      • addedInput schema / properties / buildable_sqm
        Added value: +{
        +  "description": "Land only (a plot or commercial land): how many square metres may be built on it (edificabilidad).",
        +  "type": "integer"
        +}
    • Changedfind_price_reductions1 field changed
      • addedOutput schema / properties / properties / items / properties / buildable_sqm
        Added value: +{
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
    • Changedfind_similar_properties1 field changed
      • addedOutput schema / properties / properties / items / properties / buildable_sqm
        Added value: +{
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
    • Changedget_property1 field changed
      • addedOutput schema / properties / property / properties / buildable_sqm
        Added value: +{
        +  "description": "Land only: how many m² may be built on the plot (edificabilidad), when the listing says. Null when it does not.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
    • Changedmatch_buyer_to_inventory1 field changed
      • addedOutput schema / properties / properties / items / properties / buildable_sqm
        Added value: +{
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
    • Changedsearch_properties3 fields changed
      • addedInput schema / properties / buildable_min
        Added value: +{
        +  "description": "Land only: the least floor area in m² a plot may be built to (edificabilidad, m² edificables, m² de techo). Use with property_types plots or commercial-land. Listings that do not state a buildable figure cannot be known to qualify and are left out; buildable_unstated in the response says how many plots were left out for that reason.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / buildable_unstated
        Added value: +{
        +  "description": "With buildable_min: how many plots meet every other filter but state no buildable m², so were left out.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / properties / items / properties / buildable_sqm
        Added value: +{
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
  5. 3 tool updates
    • Changedarea_market_summary5 fields changed
      • changedInput schema / properties / location / description
        Previous value: -"Place name (city, suburb, or urbanisation). e.g. 'Marbella'."New value: +"Place name (city, suburb, or urbanisation). e.g. 'Marbella'. Add the town or province after a comma when several places share the name: 'El Limonar, Mijas'."
      • addedInput schema / properties / location_id
        Added value: +{
        +  "description": "Area id from autocomplete_location or from location_match.candidates. Takes precedence over location.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / location_match / properties / ambiguous
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / location_match / properties / candidates
        Added value: +{
        +  "items": {
        +    "properties": {
        +      "id": {
        +        "description": "Pass it as location_id.",
        +        "type": "integer"
        +      },
        +      "listings": {
        +        "type": "integer"
        +      },
        +      "municipality": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "municipality_code": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "parent": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "province": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / location_match / properties / other_places
        Added value: +{
        +  "items": {
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedautocomplete_location2 fields changed
      • addedOutput schema / properties / matches / items / properties / municipality
        Added value: +{
        +  "description": "The municipality it is part of; absent when we cannot place it, never guessed.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / matches / items / properties / municipality_code
        Added value: +{
        +  "description": "INE code of that municipality.",
        +  "type": "string"
        +}
    • Changedsearch_properties3 fields changed
      • addedOutput schema / properties / location_match / properties / ambiguous
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / location_match / properties / candidates
        Added value: +{
        +  "items": {
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / location_match / properties / other_places
        Added value: +{
        +  "items": {
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  6. 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"
        +}
  7. 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"
        +  ]
        +}
  8. 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"
        +  ]
        +}
  9. 2 tool updates
    • Addedget_guide
    • Addedsearch_guides
  10. 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"
        +]
  11. 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"
        +  ]
        +}
  12. 8 tool updates
    • Addedassign_listing
    • Addedcancel_action
    • Addedconfirm_action
    • Addedmove_pipeline_stage
    • Addedqualify_lead
    • Addedschedule_viewing
    • Addedsend_listings_to_contact
    • Addedset_listing_status
  13. 6 tool updates
    • Addedfind_price_reductions
    • Addedfind_similar_properties
    • Addedget_contact
    • Addedlisting_health
    • Addedmatch_buyer_to_inventory
    • Addedmatch_inventory_to_buyers
  14. 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."
  15. 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"
        +  ]
        +}

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
    D
    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.
    -
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI agents to search, compare, save, and track real-estate listings, monitor price changes, and export broker contacts by working within a user's own account.
    Elastic 2.0
  • 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.
    -
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources