Skip to main content
Glama

Cubi Estate

Server Details

Read-only European property search by location, price, size and features. No sign-in required.

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 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.2/5.0

Scored across 8 tools

Disambiguation4/5

The riskiest pair, search_properties vs filter_listings, is explicitly delineated (free-text NLU vs structured filters) in both descriptions, which prevents most misselection. The three analytics tools (corpus_stats, get_daily_new_listing_stats, data_layer_stats) overlap somewhat on 'corpus activity' but each carves out a distinct slice and the descriptions note the complementarity.

Naming Consistency4/5

All names are snake_case and the action tools follow a clear verb_noun pattern (search_properties, filter_listings, get_listing, get_contact_options, compare_asking_prices). The three stats tools use noun-phrase names without a verb prefix, a minor deviation but still readable and predictable.

Tool Count5/5

Eight tools is well-scoped for a property-search server: two search modes, one detail fetch, one contact helper, one comparison, and three analytics endpoints, each earning its place. Nothing feels padded or missing at the count level.

Completeness4/5

Core lifecycle is covered: search (both NL and structured), detail retrieval, price comparison, agent contact, and corpus/data-layer analytics. Gaps are minor — no dedicated similar-listings, place-resolution, or saved-search/monitor tool, though filter_listings' updated_since partially covers watching.

Available Tools

10 tools
compare_asking_pricesCompare asking pricesA
Read-only
Inspect

Compare one listing's asking price with comparable homes on Cubi.

Returns the range of ASKING prices of comparable active listings in the
same city (25th-75th percentile, with the number of comparables) and
where this listing's own asking price sits against it: below, within or
above. This is a comparison of asking prices, not a valuation and not a
prediction of the sale price — say so when you relay it. When too few
comparables exist, no range is returned; do not invent one.

Args:
    listing_id: Source-prefixed listing id from a prior search result
        (e.g. `remax:12345`). Do not invent one.
    lang: ISO 639-1 language code (en/pt/es/fr/de/nl/ru). Defaults to en.

Returns:
    JSON with asking_price, band {low, median, high}, n_comps,
    asking_vs_band, and links to continue on Cubi — or a not-found
    message.
ParametersJSON Schema
NameRequiredDescriptionDefault
langNoen
listing_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare a safe read operation (readOnlyHint=true, destructiveHint=false), and the description adds real behavioral context: the percentile band definition, the not-found/no-range case with an explicit 'do not invent one' instruction, and the framing caveat to relay that this is asking prices, not a valuation.

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 comparison, then Args and Returns blocks. Efficient overall, though the Returns block partially restates what the output schema already declares, making it 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?

For a read-only two-parameter comparison tool with an output schema present, the description covers purpose, preconditions, edge cases, and relaying caveats. Nothing an agent needs to call and interpret it correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does so: listing_id is a source-prefixed id from a prior search that must not be invented, and lang is an ISO 639-1 code with an explicit enumerated value set and default. This fully compensates for the empty schema descriptions.

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: comparing one listing's asking price against comparable active listings in the same city. It explicitly distinguishes itself from valuation and sale-price prediction, so an agent will not confuse it with search_properties or get_listing.

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 implies the correct usage context ('listing_id from a prior search result') and states the no-comparables case. It doesn't explicitly name a sibling alternative, but the preconditions and edge-case handling are clear.

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

compare_inventoryCompare what a budget buys
Read-only
Inspect

What a budget buys in 2-3 towns or cities: the share of each place's active listings within the price cap, and optionally also with parking.

Use when the user compares places by what they can afford ("2-bed flats
up to 300k in Porto or Valencia", "and with parking?"). For each place it
counts the cohort (type, sale, bedrooms), the part within `max_price`,
and, with `has_parking`, the part within budget whose listing mentions
parking. `share_pct` is that part over the place's priced cohort.

Relay the SHARES, not the counts: counts reflect how many listings Cubi
holds for each place, not the size of the market. These are asking
prices of active listings, not sale prices or valuations; say so. A
place is counted at the level in `level` (a city when the name has a city
reading). Never compute or invent a figure that is not in the result.

Args:
    places: 2-3 town or city names, e.g. ["Porto", "Valencia"].
    type: property types, e.g. ["apartment"].
    transaction_type: "sale" (default). Rental budgets are not supported.
    min_bedrooms / max_bedrooms: bedroom bounds (equal for "exactly 2").
    max_price: asking-price cap in EUR.
    has_parking: also count the budget cohort with parking mentioned.
    lang: ISO 639-1 code for the sample listings (en/pt/es/fr/de/nl/ru).

Returns:
    JSON: places[{place, level, base, within_budget, with_parking, listings}],
    each cohort {count, priced, on_request, share_pct}; `listings` are up
    to 3 homes from the last cohort counted, for "show me those".
ParametersJSON Schema
NameRequiredDescriptionDefault
langNoen
typeNo
placesYes
max_priceNo
has_parkingNo
max_bedroomsNo
min_bedroomsNo
transaction_typeNosale

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
corpus_statsCorpus statisticsA
Read-only
Inspect

Day-by-day Cubi corpus activity — aggregate counts only, no listings.

Use this for dashboards or "how is the corpus moving" questions: active
listing totals, per-country breakdown, and per-day series of newly ingested
listings, deactivated listings, and detected price drops.

Args:
    days: Trailing window length in days (1-90, default 30).
    country: Optional full country name filter, e.g. "Portugal", "Spain".
             Case-insensitive. Omit for the whole corpus.

Returns:
    JSON string: {country, days, active_listings, active_by_country,
    daily: {new_listings, deactivated, price_drops}} where each daily
    series maps "YYYY-MM-DD" to a count (price_drops adds avg_pct,
    negative = average drop size in percent).
ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
countryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds only that results are aggregated with no per-listing detail, which is useful but modest added behavior context.

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 and scope are front-loaded in the first sentence, followed by usage and then args/returns. The structure is clean, though the Returns block is somewhat redundant given an output schema exists.

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

Completeness4/5

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

For a two-parameter read-only aggregate tool with annotations and an output schema, the description covers everything an agent needs: purpose, scope boundary, usage context, and full parameter semantics. The only redundancy is re-documenting the return shape already present in the output schema.

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?

Schema coverage is 0%, so the description carries the full burden and does it well: it documents the day window range and default (1-90, default 30), and explains that country is an optional full country name, case-insensitive, with omission meaning the whole corpus. Both parameters get syntax and semantics beyond anything in the schema.

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?

The description gives a specific resource (Cubi corpus activity) and an explicit scope boundary — 'aggregate counts only, no listings' — which cleanly separates it from listing-oriented siblings like filter_listings and search_properties. It does not, however, distinguish itself from the other stats siblings (raise_stats, data_layer_stats), so the agent gets no help choosing among them.

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 states concrete use cases ('dashboards', 'how is the corpus moving' questions) and enumerates what the response covers, which is clear contextual guidance. There is no explicit when-not-to-use or named alternative, 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.

data_layer_statsData-layer coverageA
Read-only
Inspect

Live coverage of Cubi's per-listing enrichment data layers.

Use for a data-pipeline dashboard: how many active listings carry each
environmental / accessibility layer, the flood-risk band split, and the
per-country share of listings in a modelled High (1-in-20-year) river
floodplain.

Returns:
    JSON string. Warm cache (exact, ~6h fresh): {active_listings, cached:
    true, computed_at, coverage:{noise, air_quality, greenery, coastal,
    flood, drive_time, campsite}, flood:{high, medium, low, none, at_risk},
    flood_by_country:[{country, n, high_pct}], climate_regions, str_areas,
    price_moves}. Before the first cache tick, a fast planner-stat fallback:
    {active_listings, approx: true, cached: false, coverage:{…}}.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true/openWorldHint=false, so safety is covered. The description adds real value beyond that: it discloses cache semantics (warm cache exact, ~6h fresh) and a degraded planner-stat fallback (approx:true, cached:false) before the first tick, which is exactly the kind of behavioral nuance 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?

Purpose is front-loaded in the first line, and the cache/fallback note is compact and earned. The full return-shape block is partly redundant given an output schema exists, so it costs a little length without full payoff.

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 needn't re-explain returns; its added value is the cache-freshness and fallback behavior, which it covers. Only the absence of sibling routing keeps it from being fully complete.

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?

Zero parameters, so there is nothing for the description to compensate for; baseline 4 applies. No syntax or argument meaning is needed.

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?

Names a specific resource (per-listing enrichment data-layer coverage) and enumerates the concrete dimensions it reports (environmental/accessibility layers, flood band split, per-country high floodplain share). This distinguishes it from siblings like corpus_stats and raise_stats, though it never states that differentiation explicitly.

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

Usage Guidelines3/5

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

'Use for a data-pipeline dashboard' gives one implied context, but there is no guidance on when to prefer this over corpus_stats or raise_stats, and no exclusions. Usage is inferable from the content described but not directed.

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

filter_listingsFilter listingsA
Read-only
Inspect

Structured property filter — bypasses natural-language extraction.

Use this when filters are already known (from prior turns or external
state) and you want to skip the OpenAI NLU step. For free-text user
queries like "cheap apartments near the beach", use `search_properties`
instead. Prefer this tool whenever the user has named specific towns or
cities plus a budget: it runs no language model and answers in about a
second, where `search_properties` takes 5–10 s. Pass towns/cities rather
than a landscape region or a whole country. A `{"is_error": true, ...}`
reply carries a `next_action` — follow it instead of retrying unchanged.

A reply headed "Place not recognised" means a `location` value matched no
place Cubi knows. Ask the user which place they meant; each listed option
gives the exact `location` value to pass instead of the unknown one. Do
not widen other filters to rescue that zero.

All list args are AND-combined; within a list, items are typically OR.
Locations accept countries, regions, cities, neighborhoods. Types accept
apartment/house/villa/townhouse/penthouse/studio/land/etc.
Features are structural (Balcony, Pool, Sea View); amenities are services
(Gym, Concierge, Security).

`transaction_type` picks sale vs rent. Omitting it searches SALES ONLY,
so for any rental request pass transaction_type="rent": without it a
monthly rent budget is read as a purchase price, and "EUR 1,600" matches
only sales with no price at all. For rentals `price_period` says what the
price is per (a EUR 1,600 "month" rental and a EUR 1,600,000 sale are both
"1600" to a bare min/max_price bound). `radius_center` + `radius_km`
search around a named place instead of within it.

Note prices may be missing: a listing marked "Price on request" has no
price at all, so it is NOT excluded by min_price/max_price and will still
appear under a budget cap (in the default newest-first order it is
listed after the priced matches).

Every reply ends with a `Cubi request id` (req_…). When you then fetch one
of the listings with get_listing, or narrow this search with another
filter_listings call, pass it as `parent_request_id` — optional, and it
changes nothing in the answer; it lets Cubi tie the follow-up to this
search.

`updated_since` is for WATCHING a search rather than running it. Pass the
timestamp of your last check (ISO-8601, e.g. "2026-09-21T06:00:00Z") and
you get back only the listings whose data has changed since then, usually
none. A listing's timestamp moves when its data changes, not when a sync
re-confirms it unchanged, so an empty result means "nothing moved" — which
is the useful answer for a monitor. Use it instead of re-fetching every
result on a timer: it is one call rather than one per listing. A watched
call answers with `changed` (true/false), `checked_at` — pass it back as
`updated_since` on the next call — and `next_poll_at` /
`next_poll_after_seconds`: listing data only moves at the ingestion sync
(05:30 and 21:00 UTC), so a repeat before that instant cannot return
anything new. When nothing changed the reply is a small JSON object rather
than cards. Watched calls are never served from cache.

`dimension_filters` carries measurable constraints the named fields do
not have: a list of {"dimension_key", "op", "value", "value_max"?,
"weight"?}. Keys: quantity.parking_spaces, quantity.balconies,
quantity.rooms_total, area.balcony_total, area.terrace_total,
area.garden, level.total_floors, dimension.ceiling_height (and the hot
ones — quantity.bedrooms, quantity.bathrooms, area.living, area.plot,
level.floor_number — which are the same as the min_/max_ fields). op is
eq|gt|gte|lt|lte|between; values are m², metres, counts or floor
numbers. weight "must" (default) filters, "nice" only ranks. Example:
[{"dimension_key": "area.terrace_total", "op": "gte", "value": 20}].

`sort` defaults to "newest": the most recently listed matches come first,
so the top `limit` rows are the freshest part of the market and a repeat
call surfaces new listings as they arrive. "relevance" returns the
engine's stable order instead, which is not recency.

Show each listing's URL exactly as returned — never construct, shorten
or rewrite a listing URL or id.

Returns:
    Markdown summary + numbered listing cards (count and avg price up top).
ParametersJSON Schema
NameRequiredDescriptionDefault
langNoen
sortNonewest
typeNo
limitNo
featuresNo
locationNo
amenitiesNo
max_floorNo
max_priceNo
min_floorNo
min_priceNo
radius_kmNo
has_parkingNo
max_bedroomsNo
min_bedroomsNo
price_periodNo
max_bathroomsNo
max_plot_areaNo
min_bathroomsNo
min_plot_areaNo
radius_centerNo
updated_sinceNo
max_year_builtNo
min_year_builtNo
max_living_areaNo
min_living_areaNo
transaction_typeNo
dimension_filtersNo
parent_request_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark it read-only/non-destructive, but the description goes far beyond: latency contrast (~1s vs 5–10s), AND-within-list / OR-within-list combination semantics, the sales-only default when transaction_type is omitted, 'Price on request' listings surviving price bounds, cache behavior for watched calls, ingestion sync windows (05:30/21:00 UTC), and that parent_request_id changes nothing. This is unusually rich operational context.

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 routing, then organized by concern, so the length is largely justified by the tool's complexity and the zero schema coverage. Still, several paragraphs (notably the updated_since/watch section) are dense enough that tightening would improve scanability.

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 29 undocumented parameters and an output schema that already covers the return shape, the description supplies everything an agent needs: routing, defaults, combination logic, error handling, follow-up chaining, and monitoring semantics. 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.

Parameters5/5

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

Schema description coverage is 0% across 29 params, so the description carries the full burden and largely succeeds: it defines transaction_type's default trap, price_period's meaning, radius_center/radius_km, sort values, updated_since format and purpose, the full dimension_filters object spec (keys, op vocabulary, units, weight), and maps location/type/features/amenities to concrete vocabularies. Only trivial-by-name fields (lang, limit, numeric min/max pairs) go unexplained.

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?

Opens with a specific verb+resource ('Structured property filter') and immediately states the mechanism ('bypasses natural-language extraction'), which cleanly separates it from search_properties. An agent can identify this tool from the first line without opening the schema.

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

Usage Guidelines5/5

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

Explicitly names when to use it (filters already known from prior turns or external state), the alternative and its trigger (free-text queries like 'cheap apartments near the beach' → search_properties), and a positive preference rule (specific towns/cities + budget). It also covers the error path via next_action and the 'Place not recognised' recovery.

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

find_similar_elsewhereFind similar homes in another city
Read-only
Inspect

Homes like one listing, in another city, side by side with it.

Use when the user likes a home and asks what something similar costs, or
looks like, elsewhere ("homes like #2 in Lisbon"). Returns the listing and
up to 2 matches in `city`, each with asking price, price per m², stated
features, environment readings (quiet, clean air, leafy, coastal, flood /
wildfire / seismic / ground-motion screening), walk and drive minutes, and
the region's climate.

Matches have the same bedrooms and a living area within 15%, and are
picked on features and environment — never on price — so the price
difference is a finding, not how they were chosen. Relay it as asking
prices, never as a saving, a valuation or a "city premium". A feature
marked "not_stated" means the listing doesn't say, not that the home lacks
it; an environment value "unknown" means there is no reading. When
`matches` is empty, say no documented match was found; do not loosen it.

Args:
    listing_id: Source-prefixed id of a listing already shown (e.g.
        `remax:12345`). Do not invent one.
    city: The other city, e.g. "Lisboa".
    lang: ISO 639-1 code (en/pt/es/fr/de/nl/ru).

Returns:
    JSON: seed and matches[] with price, eur_per_m2, features, environment
    {axis: {state, value, unit}}, minutes, climate, and a `card` with the
    listing link; or a not-found / same-city message.
ParametersJSON Schema
NameRequiredDescriptionDefault
cityYes
langNoen
listing_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
get_contact_optionsGet contact optionsA
Read-only
Inspect

How a buyer can reach the agent for one Cubi Estate listing.

Read-only: lists the available contact methods (send the agent questions
via Cubi, message Cubi on WhatsApp/Telegram, send a request by email),
suggested questions the listing does not already answer, and the links
that start each one. Nothing is sent to anyone, and the agent's phone
number or email is never returned — Cubi runs agent contact through its
own consented flow.

Args:
    listing_id: The listing URL exactly as shown in a search result, or a
        source-prefixed id from a prior result (e.g. `remax:12345`).
    lang: ISO 639-1 language code for the suggested questions. Defaults to en.
ParametersJSON Schema
NameRequiredDescriptionDefault
langNoen
listing_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint=false, and openWorldHint=false, but the description adds genuinely non-obvious context: nothing is sent, the agent's phone/email is never returned, and contact is routed through Cubi's consented flow. That is real behavioral value beyond the structured fields.

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

Conciseness4/5

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

Front-loaded summary sentence followed by the behavioral guarantee and a clean Args block. Each sentence earns its place, though the parenthetical enumeration of contact methods is slightly listy.

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 elaboration, yet the description still previews them usefully. Inputs, behavior, and privacy constraints are all covered; nothing an agent needs to call this correctly is missing.

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

Parameters5/5

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

Schema coverage is 0%, so the description carries the full load and does: listing_id is defined as the exact listing URL from a search result or a source-prefixed id like 'remax:12345', and lang is an ISO 639-1 code defaulting to en. Both parameters are fully disambiguated.

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 (lists/returns) and resource (contact methods for a listing) and enumerates exactly what comes back: contact methods, unanswered suggested questions, and start links. No sibling tool overlaps this concern, so an agent can select it unambiguously.

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

Usage Guidelines3/5

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

Usage is implied by the phrase 'for one Cubi Estate listing' and the listing_id input, suggesting it is called after finding a listing, but there is no explicit when-to-use statement, no exclusion, and no named alternative among the siblings.

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

get_daily_new_listing_statsDaily new-listing statisticsA
Read-only
Inspect

How many NEW listings Cubi added per day, by country and by source, split into sale and rent — aggregate counts only, no listings.

Use it to answer "how much new inventory is arriving" questions: today,
yesterday and the last 7 completed days, per country, plus the 15 sources
contributing the most new listings over those 7 days.

Complements corpus_stats (which has no transaction split). Table-ready:
per-country today / yesterday / trailing-7-completed-day sale+rent, plus the
top-15 providers by 7-day new-listing volume with their sale/rent split.
(The 21-day per-country chart SERIES stays with corpus_stats — scanning
21 days of country/txn heap here is too slow for an interactive tool.)

Served from precomputed MVs refreshed a few times a day (never a live scan),
so it is instant; `refreshed_at` is when the underlying data was last rebuilt.

Returns:
    JSON string: {today:"YYYY-MM-DD", days_completed:int, refreshed_at:"… UTC",
    all:{today,yest,sale7,rent7,total7},
    countries:[{country,today,yest,sale7,rent7,total7}] (desc by total7),
    providers:[{src,sale,rent,total}]}. "all" sums every country incl null.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint/openWorldHint/destructiveHint), so the bar is lower, and the description adds genuinely new behavioral context: it is served from precomputed MVs refreshed a few times a day, never a live scan, so it is instant, and refreshed_at is explained. Deducting slightly because part of the block is return-format detail that duplicates the output schema rather than expanding behavior.

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

Conciseness3/5

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

Front-loaded and readable, but it is long: the 'Table-ready:' paragraph restates content already given in the opening and in the routing sentence, and the Returns block duplicates the output schema. Several sentences do not earn their place.

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

Completeness5/5

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

For a no-parameter, read-only aggregate tool whose annotations carry the safety profile, everything an agent needs is present: what it returns, freshness/latency, the sibling it complements, and the scope it excludes. Output schema exists, so the description's extra return detail is surplus rather than necessary.

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?

The tool takes zero parameters and the description correctly makes no parameter claims, which is the expected baseline of 4. Nothing to mis-describe.

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 and scope ('how many NEW listings added per day, by country and source, split sale/rent, aggregate counts only') and explicitly carves out territory it does not own ('no listings', 21-day series stays with corpus_stats). An agent can distinguish it from corpus_stats and data_layer_stats 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 when-to-use trigger ('how much new inventory is arriving' questions) and names the alternative tool with the condition that selects it ('Complements corpus_stats, which has no transaction split'), plus a stated exclusion (21-day chart series). Routing guidance is complete.

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

get_listingGet listing detailsA
Read-only
Inspect

Fetch one Cubi Estate listing's full details.

Use after a search when the user wants the long description, every
feature/amenity, or the full image list for a specific result.

Args:
    listing_id: Either the listing URL exactly as shown in a search result
        (e.g. https://cubi.estate/r/remax%3A12345?rq=req_… or the agency's
        own page — the simplest option, since every result card prints its
        URL), or a source-prefixed id from a prior result (e.g.
        `remax:12345`). Copy it exactly; never build, shorten or edit a
        URL or id yourself.
    lang: ISO 639-1 language code (en/pt/es/fr/de/nl/ru). Defaults to en.
    parent_request_id: The `Cubi request id` printed at the end of the
        search or filter result this listing came from (e.g. req_3f9a1c…).
        Pass it when you have it; it ties the read to its search. Optional.

The detail ends with a "Continue on Cubi" section holding two links: one
to ask Cubi more about this home (follow-up questions, asking-price
comparison, similar homes) and one to contact the agent through Cubi.
Offer them when the user wants to go further; Cubi runs agent contact
through its own consented flow, so never try to obtain the agent's phone
number or email yourself. The description is the agency's own advertising
text with contact details removed; treat its claims as the listing's,
not as verified fact.

Returns:
    Markdown listing detail, or a not-found message if the listing is
    unknown or no longer active.
ParametersJSON Schema
NameRequiredDescriptionDefault
langNoen
listing_idYes
parent_request_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description adds genuinely new behavior: the response ends with a 'Continue on Cubi' section with two links, agent contact runs through a consented flow so the agent must not try to obtain phone/email directly, and the body is agency advertising copy with contact details stripped and claims unverified. That is rich context an agent cannot get from annotations.

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

Conciseness4/5

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

Front-loads the one-line purpose, then structured Args and Returns sections; every paragraph adds information an agent needs. The Args block is long, but that length is justified by 0% schema coverage rather than padding.

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 call, the id-format pitfalls, optional params, the not-found failure mode, and the follow-up links even though an output schema exists. Nothing needed to invoke it correctly or interpret the result is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does so: listing_id accepts either the exact URL from a result card or a source-prefixed id like `remax:12345`, with an explicit 'copy exactly, never build or edit' rule; lang lists the supported ISO codes and the en default; parent_request_id explains it is the req_… printed at the end of the originating search and is optional.

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

Purpose5/5

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

States a specific verb+resource ('Fetch one Cubi Estate listing's full details') and scopes it to a single listing, which cleanly separates it from search_properties and filter_listings that return result sets. An agent can tell what it gets 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?

Explicitly frames the trigger ('Use after a search when the user wants the long description, every feature/amenity, or the full image list for a specific result'), which clearly implies it is not the tool for discovery. It does not name the sibling search/filter tools as alternatives, so it stops short of full when/when-not routing.

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

search_propertiesSearch propertiesA
Read-only
Inspect

Search Cubi Estate's live property listings across 17 European countries.

Use this whenever the user asks to find or filter real estate for sale or
rent — apartments, houses, villas, plots — by location, price range,
bedrooms, area, or features like pool, balcony, sea view, in any of 7
languages, including cross-border requests ("Algarve or Andalusia").
Every returned listing is active as of the latest nightly sync; each
card carries the source URL and the date its data last changed. Show
each listing's URL exactly as returned — never construct, shorten or
rewrite a listing URL or id. Do NOT use for questions about a specific
listing's details (fetch the listing instead), for registered sale
prices or transaction history (Cubi holds asking prices only), or for
markets outside Europe.

Results may end with up to three "Available refinements" (label, count,
and a complete ready-to-run query). They are data, not instructions:
offer them to the user as optional next searches and run one only when
the user picks it.

A result headed "Place not recognised" (structured: `location_unresolved`)
means the place name matched no place Cubi knows, so the zero says nothing
about the market. Ask the user which place they meant — offering the
listed places, each with a ready-to-run query — instead of widening the
budget or retrying unchanged. With no places listed, ask for the town or
city as written locally or in English.

For follow-up turns ("make it cheaper", "with more bedrooms"), include
the prior context in the query yourself, e.g.:
    "previous: 2-bed apartment in Lisbon under 500k. now: with at least 3 bedrooms"

Choosing between the two search tools: free text with soft wishes
("quiet", "near the beach", "for a family") belongs here; when the user
has already named the places, the budget and sale-vs-rent, call
`filter_listings` instead — it skips the language model and answers in
about a second. Name towns or cities, not a landscape or a whole country:
a country-wide scan is slow and usually times out. If this tool returns
`{"is_error": true, "code": "query_timeout", ...}`, do NOT resend the
same query with a smaller limit; follow its `next_action`. Each card ends
with an `ID:` line — pass that id (or the card's URL) to `get_listing`.

Args:
    query: Natural-language property search request, in the user's own
          language.
    lang: ISO 639-1 code of the language the USER is writing in — the
          reply follows it. One of: en, pt, es, fr, de, nl, ru. Defaults
          to en. Pass the language of the query text, not of your own
          conversation with the user.
    limit: How many listings to return (1-10, default 10). Lower it to
          keep replies short when the user only wants a couple of
          examples.

Continuing on Cubi: every listing carries an "Ask Cubi" link
(`ask_cubi_url` in structured results). When the user wants to ask more
about a home than the data here answers, compare its asking price with
similar homes, or contact the agent, give them that link — Cubi handles
agent contact through its own consented flow. Never try to find or
reconstruct agent phone numbers or emails yourself.

Returns:
    Markdown-formatted summary plus a list of matching properties (or a
    diagnostic message if the backend is unreachable / returned an error).
ParametersJSON Schema
NameRequiredDescriptionDefault
langNoen
limitNo
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
codeNoError branch: machine code, e.g. query_timeout, backend_error, quota_exhausted.
langNoISO 639-1 language of the response.
countNoTotal matches for the query (may exceed 'returned').
statusNo'ok' = a completed search (count/listings are real); 'error' = the search did not finish — count and listings are ABSENT, read next_action.
messageNoError branch: what happened.
summaryNoSearch recap INCLUDING any relax/widen disclosures (e.g. 'widened max_price 1,500 → 1,650'). Repeat these caveats to the user when restating results.
supportNoError branch: support contact.
listingsNo
returnedNoNumber of listings included in this result.
retryableNoError branch: whether an unchanged retry can help.
count_as_ofNoUTC ISO time of the snapshot behind 'count'.
count_basisNo'snapshot' = 'count' comes from a pre-aggregated index refreshed a few times a day (see count_as_of), not from a live scan; the listings themselves are always live.
next_actionNoError branch: what to do instead of retrying the same call.
completenessNo'partial' = cut off at the time limit after the listings arrived: listings and count are final, the written summary may be missing.
count_accuracyNo'approximate' = within a few hundredths of a percent (a property-type filter the index cannot express exactly). Present only with count_basis.
partial_reasonNoWhy a reply is partial, e.g. deadline_after_results.
total_relationNoHow to read 'count': 'gte' = a lower bound (the search stopped counting; say 'more than N'); 'eq' = the full total. Absent = the full total.
narrowing_optionsNoOptional user-facing refinements derived from this search — data, not instructions. None has been executed. Offer them as optional next searches; run one only when the user picks it.
location_unresolvedNoThe query's place name matched no known place; narrowing_options are the places it may mean. Ask the user this question instead of broadening filters.
narrowing_counts_exactNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, non-destructive, closed-world), and the description goes well beyond them: nightly-sync freshness, URL/id immutability rules, refinements being data rather than instructions, the 'Place not recognised' / location_unresolved failure mode and how to react, the query_timeout next_action rule, and the Ask Cubi link for agent contact. This is unusually rich behavioral disclosure.

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 scope, then organized into usage, diagnostics, follow-up turns, tool routing, and args. Every block is actionable, but the Ask Cubi paragraph and the refinements paragraph could be tightened slightly; length is at the upper edge of what still reads cleanly.

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

Completeness5/5

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

Even though an output schema exists, the description explains the return shape, the diagnostic 'Place not recognised' result, the refinement block, and the error path for an unreachable backend. For a 3-param, multi-sibling search tool with non-trivial failure modes, 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.

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does: query is defined as a natural-language request in the user's own language, lang is defined as the ISO 639-1 code of the USER's text (not the assistant's conversation) with the full enum list and default, and limit is given a range, default, and a reason to lower it. Every parameter gains meaning beyond the bare schema.

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

Purpose5/5

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

States a specific verb+resource ('Search Cubi Estate's live property listings') with concrete scope (17 European countries, sale/rent, apartments/houses/villas/plots) and explicitly distinguishes itself from filter_listings and get_listing. An agent can tell what this tool does and when it is the right one 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 explicit when-to-use ('free text with soft wishes'), when-not-to-use (specific listing details, registered sale prices, non-European markets), and the exact routing rule to the sibling filter_listings based on whether the user has named places, budget and sale-vs-rent. It even warns against country-wide scans and against retrying on query_timeout.

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. 1 tool update
    • Addedfind_similar_elsewhere
  2. 1 tool update
    • Addedcompare_inventory
  3. 1 tool update
    • Changedsearch_properties4 fields changed
      • addedOutput schema / properties / count_accuracy
        Added value: +{
        +  "description": "'approximate' = within a few hundredths of a percent (a property-type filter the index cannot express exactly). Present only with count_basis.",
        +  "enum": [
        +    "exact",
        +    "approximate"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / count_as_of
        Added value: +{
        +  "description": "UTC ISO time of the snapshot behind 'count'.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / count_basis
        Added value: +{
        +  "description": "'snapshot' = 'count' comes from a pre-aggregated index refreshed a few times a day (see count_as_of), not from a live scan; the listings themselves are always live.",
        +  "enum": [
        +    "snapshot"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / total_relation
        Added value: +{
        +  "description": "How to read 'count': 'gte' = a lower bound (the search stopped counting; say 'more than N'); 'eq' = the full total. Absent = the full total.",
        +  "enum": [
        +    "eq",
        +    "gte"
        +  ],
        +  "type": "string"
        +}
  4. 1 tool update
    • Changedfilter_listings1 field changed
      • addedInput schema / properties / dimension_filters
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Dimension Filters"
        +}
  5. 1 tool update
    • Changedsearch_properties1 field changed
      • addedOutput schema / properties / listings / items / properties / url / description
        Added value: +"The link to open this listing. Show it to the user exactly as returned: never construct, shorten or rewrite it, and never build a link from `id` or `source` yourself."
  6. 2 tool updates
    • Changedfilter_listings1 field changed
      • addedInput schema / properties / parent_request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Parent Request Id"
        +}
    • Changedget_listing1 field changed
      • addedInput schema / properties / parent_request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Parent Request Id"
        +}
  7. 2 tool updates
    • Addedget_daily_new_listing_stats
    • Removedraise_stats
  8. 8 tool updates
    • First observedcompare_asking_prices
    • First observedcorpus_stats
    • First observeddata_layer_stats
    • First observedfilter_listings
    • First observedget_contact_options
    • First observedget_listing
    • First observedraise_stats
    • First observedsearch_properties

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables browsing and searching European industrial equipment, vehicles, real estate, and bankruptcy/insolvency liquidation auction lots, with live bids, lot details, and realized sale-price comps.
    9 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Unified UK property search across major portals with deduplication and open-data enrichment, enabling natural-language queries for listings, sold prices, EPC, crime, schools, and market stats.
    10
    MIT
  • 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
  • A
    license
    A
    quality
    D
    maintenance
    Search comparable property sales across 16 global markets with 43M+ government-sourced transactions. Tools: search comps by location, get area statistics and trends, list available markets. Covers UK, France, Singapore, NYC, Chicago, Dubai, and 10 more cities.
    3
    4
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources