Skip to content
Dubai Wealth Index
Search
Search areas, projects and buildings by name.

The index as tools

Tools over registered Dubai prices, rents and returns: apartments by building and area, villas by community, the same data the pages are built from. A free account gets 50 calls a day; Pro has no daily cap. Every tool reads, except request_info, which sends an enquiry you confirmed to the partner brokerage.

Transport
Streamable HTTP
Rate limit
120/min

Connecting

Give your client this URL. It discovers the authorization server from the endpoint’s protected-resource metadata, registers itself, and sends you here to sign in and approve.

https://dubaiwealthindex.com/api/mcp

For a client that takes a JSON config:

{
  "mcpServers": {
    "dubai-wealth-index": {
      "type": "http",
      "url": "https://dubaiwealthindex.com/api/mcp"
    }
  }
}

In Claude Code: claude mcp add --transport http dubai-wealth-index https://dubaiwealthindex.com/api/mcp.

For a stdio-only client, bridge it: npx mcp-remote https://dubaiwealthindex.com/api/mcp.

Everything these tools return is public. Authorisation is not gatekeeping — it makes the caller a real identity, which is what lets the endpoint be rate limited fairly and what lets one tool read the buildings you have saved.

Authorization

OAuth 2.1, following the MCP authorization specification. The endpoint is a resource server; this site is also the authorization server.

Every request needs a token, the initialize handshake included. A request without one answers 401 with a WWW-Authenticate challenge naming the metadata document, so a client authorizes once, when it connects, and every tool works from the first call. Registration is dynamic and open, so a client registers itself; the only human step is signing in and approving the consent screen. The tool schemas are listed below for anyone reading without a client.

Protected resource metadata
https://dubaiwealthindex.com/.well-known/oauth-protected-resource
Authorization server metadata
https://dubaiwealthindex.com/.well-known/oauth-authorization-server
Resource identifier
https://dubaiwealthindex.com/api/mcp

Scopes

mcp:read
Read the index. Look up buildings, areas, rankings and the methodology. Public data only — the same figures anyone can read on the site.
mcp:favorites
Read your saved buildings. See the buildings you have saved on this account, with their current figures. Read-only: it cannot save or remove anything.
offline_access
Stay connected. Keep this app connected between conversations without signing in again. Disconnect it any time from your account page.

The challenge names both scopes, so a client asks for everything it can use in one consent; what you approve there is what the token carries. Revoke any connected application from your account.

Tools

get_service_charge_budgetsmcp:read
Search official residential property-group service-charge budget categories by name, budget year or exact group ID. A search with no year uses the latest budget year in the newest source edition. An exact group ID with no year returns that group's own latest budget in the same edition, which can be earlier than the edition-wide year. Returns signed source values labelled with their ADR-0004 unit (lines within ±100 are AED/sqft/year; Parking and Meter Installation are AED/year; Income unlabelled) and each group's perSqftTotal, with source dates and links. A name match is not a verified building match: for a building's matched charge and the yield after it, use get_building (afterServiceCharge on sale rows).
query?string, 0–80, default ""
groupId?string, 0–30
year?integer, 1990–2100
offset?integer, 0–100000, default 0
limit?integer, 1–9007199254740991, default 25Page size. At most 100; a larger value returns 100.
get_market_activitymcp:read
Compare Dubai apartment localities by registered sales activity, transaction value and the middle half of price-per-square-foot observations. Filter by area name, bedroom, ready/off-plan sale and minimum sales; paginate with offset. Current and prior disjoint trailing-year counts and price medians accompany changes. A minimum of five valid observations in each period gates growth. This is not days on market, vacancy, an individual valuation or a forecast. The linked website restores the same filters.
query?string, 0–80, default ""
area?string, 0–80, default ""
bedroom?"all" | "studio" | "1br" | "2br" | "3br" | "4br_plus"
saleKind?"all" | "ready" | "offplan"
minSales?integer, 0–1000000, default 5
sort?"sales" | "volume" | "growth" | "price"
offset?integer, 0–100000, default 0
limit?integer, 1–9007199254740991, default 25Page size. At most 100; a larger value returns 100.
get_market_signalsmcp:read
Two area signals a median cannot give. (1) Planned apartment completions for this year and the next two as a share of the homes let in the area today (supply.shareOfLet, the figure the website prints; withheld below 100 homes let), and as a multiple of every registered lease over the last 12 months; overdue and undated projects are counted separately. (2) Which way ready prices per sqft and new-lease rents moved inside the same buildings (each building counted once per bedroom type with five records in both years), against the pooled median; a large gap means the headline moved because different buildings traded. Filter by area or bedroom, sort by supply multiple, share of buildings down, mix gap or leases. Also returns homes let today (registered tenancies in force) and planned supply as a share of them (supply.shareOfLet), and supplyPageUrl: the area's page with handovers by quarter and every pending project. Use it for "is this area oversupplied", "will I find tenants", "how much is being built", "when are the handovers", "are prices really rising here". Not a vacancy rate, price index or forecast.
query?string, 0–80, default ""
area?string, 0–80, default ""
bedroom?"all" | "studio" | "1br" | "2br" | "3br" | "4br_plus"
sort?"supply_multiple" | "price_down_share" | "rent_down_share" | "mix_gap" | "leases"
offset?integer, 0–100000, default 0
limit?integer, 1–9007199254740991, default 25Page size. At most 100; a larger value returns 100.
get_supply_pipelinemcp:read
Search published Dubai projects and inspect pending registered units by locality, property type, progress and planned-date horizon. Completed and cancelled projects are excluded. Horizons start at the source register date, not today; overdue and unknown dates are separate. Counts cover the published named-project cohort, not all Dubai homes; planned dates are not delivery forecasts. Return pagination, coverage and the matching website URL. Use this for planned supply questions instead of inferring supply from sale volumes.
query?string, 0–80, default ""
area?string, 0–80, default ""
propertyType?"all" | "apartment" | "villa"
horizon?"all" | "12m" | "60m" | "overdue" | "undated"
minProgress?number, 0–100
maxProgress?number, 0–100
sort?"planned" | "units" | "progress" | "name"
offset?integer, 0–100000, default 0
limit?integer, 1–9007199254740991, default 25Page size. At most 100; a larger value returns 100.
fetchmcp:read
Retrieve a full document by the id a search hit returned, or by any canonical URL on this site. Returns the record as markdown — the same rendition the URL itself serves, so a quote from it and a quote from the page cannot differ. Any dubaiwealthindex.com page an answer or a suggestion links to is readable here, so there is no need to leave this server for the website. It is the only way in to the families no typed tool covers: the bedroom-cut category pages, the rankings index, the methodology and the prose pages. A retired building reports as retired with its area, never as a silent redirect.
idstring, 1–300A search hit id, a site path such as "/sale/apartments/dubai/business-bay/vera-tower", or the full URL.
get_buildingmcp:read
What a Dubai apartment building sells for, rents for and yields: median registered sale price and price per sq ft, registered rent, gross rental yield with the price it was computed on, price and rent growth with both comparison windows, turnover upside, off-plan uplift and the modelled short-term (Airbnb) return, each with its sample size. Medians of Dubai Land Department sales and Ejari contracts, never asking prices. Three sizes: "compact" (default) answers ONE bedroom type; "report" answers the whole building in one call — every publishable bedroom type, growth evidence, area benchmark, trend, and each suppressed figure with the gate it missed; "full" is the raw public JSON record including ineligible rows. Accepts a plain or marketing name; `resolved` says what it matched and how confidently.
areastring, 1–120A slug from a canonical URL ("business-bay"), or the plain name ("Business Bay") — names are folded server-side. Call search first if the name is uncertain.
buildingstring, 1–120A slug from a canonical URL ("business-bay"), or the plain name ("Business Bay") — names are folded server-side. Call search first if the name is uncertain.
purpose?"sale" | "rent"Which market to read. A building may publish one and not the other.
bedroom?"all" | "studio" | "1br" | "2br" | "3br" | "4br_plus""all" is the building- or area-wide median, not a sum of the rest.
detail?"compact" | "report" | "full""compact": one bedroom type and a headline sentence. "report": the whole building in one answer — every page-eligible bedroom type with sale, rent, short-term and off-plan figures, growth with both windows' medians and counts, area benchmark, annual trend, and every suppressed figure with the gate it missed. "full": the site's public JSON record field for field, ineligible rows included (isPageEligible: false), which is long.
includeYearly?boolean, default falseInclude the annual trend in compact responses. Report and full always include it.
includeMonthly?boolean, default falseThe monthly series. Long, and only returned with detail "full".
includeShortLetCurve?boolean, default falseThe forward nightly-rate curve, twelve months per bedroom type. Only returned with detail "full".
get_building_transactionsmcp:read
The individual registered transactions a building's medians rest on — ready resales, off-plan sales and Ejari rent contracts with date, bedroom type, price and floor area. Use it to check whether a median rests on many comparable deals or a few scattered ones, or to show the evidence behind a headline. Rows are cut off at the data date of the edition quoted (pass `edition` for an earlier one); `factsEdition` and `metricsEdition` say whether the rows and the medians come from the same load. Rent rows exist only where rent was measured at building grain — an empty list with a non-zero rent count means pooled rent, not no contracts. A building that publishes only a rent page is read there rather than reported missing.
areastring, 1–120A slug from a canonical URL ("business-bay"), or the plain name ("Business Bay") — names are folded server-side. Call search first if the name is uncertain.
buildingstring, 1–120A slug from a canonical URL ("business-bay"), or the plain name ("Business Bay") — names are folded server-side. Call search first if the name is uncertain.
windowMonths?3 | 6 | 12, default 12Lookback. 12 matches the window the published medians are computed over; 3 and 6 are narrower views of the same rows.
edition?stringAn earlier edition date from whats_new: rows are cut off at that edition's data date, to reconcile with medians quoted from it. Omit for the current edition.
get_areamcp:read
One Dubai APARTMENT area (Business Bay, Dubai Marina, JVC…): its median gross yield, price per sq ft, rent and 12-month growth, medians by bedroom type, and every building it publishes ordered by the number you choose — unpublishable yields last rather than hidden. Also lists buildings that trade but sit below the publication gate, so the set is never mistaken for the whole market. view "developments" compares every multi-tower development at a bedroom instead, pooled across its towers and grouped into name families, with the newest sales and new leases: use it where rents are filed for the project, not the tower. `shortTerm` summarises the area's modelled short-term returns and names the get_ranking call that lists them per building. Area aliases and DLD registration names resolve. Villa communities are not areas: they publish through get_villa_community, and a community handed here says so.
areastring, 1–120A slug from a canonical URL ("business-bay"), or the plain name ("Business Bay") — names are folded server-side. Call search first if the name is uncertain.
purpose?"sale" | "rent"Which market to read. A building may publish one and not the other.
bedroom?"all" | "studio" | "1br" | "2br" | "3br" | "4br_plus""all" is the building- or area-wide median, not a sum of the rest.
view?"buildings" | "developments""developments": every multi-tower development (project) at the bedroom, pooled across its towers, grouped into name families such as "Port de La Mer", with the newest sales and new leases. Use it where Ejari files leases under the project, so building rents repeat one pool.
sort?"yield" | "price" | "psf" | "growth" | "sales"Which published number orders the buildings.
buildingLimit?integer, 1–9007199254740991, default 50Page size. At most 200; a larger value returns 200.
get_villa_communitymcp:read
One Dubai villa or townhouse community (Arabian Ranches, The Springs, The Valley…): median registered sale price or rent, price per sq ft, gross yield with the rent grain it rests on, 12-month growth, and the same by bedroom count. Community grain only — the Land Department records no building for a villa, so nothing finer exists; that is the register's classification, not a gap. To compare communities, call this once per community on the same purpose and bedroom. detail "full" adds the yearly and monthly series and the plot register.
communitystring, 1–120A slug from a canonical URL ("business-bay"), or the plain name ("Business Bay") — names are folded server-side. Call search first if the name is uncertain.
purpose?"sale" | "rent"Which market to read. A building may publish one and not the other.
detail?"compact" | "full""compact" is the figures for one bedroom type and a headline sentence; "full" is the site's public JSON record, which is long.
includeMonthly?boolean, default falseThe monthly series. Long — measured at 40KB on one community. Only returned with detail "full".
get_city_overviewmcp:read
Dubai citywide: how many buildings, registered transactions and rent contracts the index rests on, the median yield, price per sq ft, rent and growth, and the same medians for every area — or every villa community with propertyType "villa". Ordered and capped: by building count for coverage, by yield or growth to pick where to look. Use it to answer "where in Dubai" questions, choose an area before drilling in, or state the index's coverage.
purpose?"sale" | "rent"Which market to read. A building may publish one and not the other.
bedroom?"all" | "studio" | "1br" | "2br" | "3br" | "4br_plus""all" is the building- or area-wide median, not a sum of the rest.
propertyType?"apartment" | "villa"Apartments publish per building, villas per community — the register decides which, by title type, never the name.
sort?"buildings" | "yield" | "psf" | "growth"How the areas are ordered. Counts first, so coverage reads before outliers.
minBuildings?integer, 1–9007199254740991, default 5Drop areas publishing fewer than this many buildings or communities.
limit?integer, 1–9007199254740991, default 25Page size. At most 200; a larger value returns 200.
check_propertymcp:read
Is this a good price? Judges an asking price against registered sales of the same bedroom type and similar size — in the same building for an apartment (area + building), in the same community for a villa or townhouse (community, optionally project for the phase) — and says whether it is below, inside or above the fair range, by how much, and how confident the range is (graded high, medium or low, with the grade's backtested accuracy). Use when a user has a listing, an offer or a price in mind for a unit in a named building or a villa in a named community: "is AED 2.35M fair for a 2-bed in Executive Tower G", "is AED 5.6M fair for a 3-bed villa in Arabian Ranches", "is this overpriced", "what should I offer", "what is this apartment worth". Also returns the comparable sales and the ones set aside with the reason, the total cash to buy (DLD 4%, trustee, agency), expected rent, running costs, gross and net yield and return on cash, off-plan progress and handover where the building is unfinished, what to confirm and what to ask the seller. Without a size it checks the typical unit; without a price it returns the fair range alone. Also checks claims: pass claimedRent or claimedYieldPct ("8% ROI", "rents for 120k") to test a quoted rent or yield against the evidence; every result positions the price per sq ft against the area's ready and off-plan medians, counts the months of rent that repay the purchase costs, and adds the area's planned supply against leasing. Returns a shareUrl an agent can send a client to back up a price. A free account gets one unit type a UTC day (any number of prices on it); a second returns reason "plan-limit" with the unit already checked, the reset time and the upgrade link — ask which property to check when several are in play.
area?string, 1–120Apartments: the building's area ("Business Bay"). Call search first if unsure.
building?string, 1–120Apartments: the building, registered or marketing name ("Executive Tower G", "Vera Residences").
community?string, 1–120Villas and townhouses: the community ("Arabian Ranches", "The Valley") instead of area and building.
project?string, 0–80Villas: the phase or sub-community to compare within first ("Palmera 2", "Bahamas"). Falls back to the whole community when it has too few sales.
bedroom"studio" | "1br" | "2br" | "3br" | "4br_plus" | "4br" | …The bedroom type. Apartments: studio to 4br_plus. Villas: 1br to 6br_plus (4br_plus reads as 4br).
sizeSqft?number, 0–50000Built-up area in sq ft, from the listing or title deed (sq m × 10.7639); for a villa the built-up area, not the plot. Omit to check the typical unit of this type.
askingPrice?number, 0–1000000000Asking price in AED. Omit to get the fair range alone.
status?"ready" | "offplan"Ready (completed) or off-plan. Omitted: the project register decides for a building; for a villa, the side most of the last year's sales were on.
serviceChargePsf?number, 0–200Service charge in AED per sq ft per year, if the user has the invoice. Overrides the building's matched budget; villas have none on file.
currentRent?number, 0–10000000Annual rent the property is let at today, if tenanted. Replaces the rent estimate.
includeAgencyFee?boolean, default trueInclude the 2% buyer's agency fee + VAT. False for a direct developer purchase.
managementPct?number, 0–30Letting-agent fee, percent of rent. Omitted: self-managed (0%).
claimedRent?number, 0–10000000A rent a listing, seller or agent quotes for this unit, AED a year. Checked against the middle half of new leases; does not replace the rent estimate.
claimedYieldPct?number, 0–50A quoted yield or "ROI", percent a year ("8% ROI"). Returns the rent the price needs for it to hold, beside the rent the evidence supports.
claimedYieldBasis?"gross" | "net" | "unstated"Whether the quote says gross or net. Most adverts say neither; unstated is read as gross.
get_projectmcp:read
One Dubai development project by name ("Azizi Venice", "Binghatti Phantom", "The Wings") — area optional. The registered off-plan record: developer, construction progress and its history, start, planned and recorded completion dates, overdue status and slippage, units and how many are registered, escrow agent, unit mix by bedroom with sizes, and registered launch (off-plan) sale prices. Plus the project's towers that already resell, with price per sq ft and gross yield. Use it for any "is this off-plan project on track / what did it launch at / who is the developer" question. For a built or resale development, `development` answers "what does a 2-bed cost in X, compare the towers": the project pooled across its towers at one bedroom type (median rent and price with counts and latest date, gross yield), each tower's own figures (towers whose leases Ejari files under the project share one rent, said once), the newest sales and new leases, and its name family. A shared name such as "Port de La Mer" answers as the family: every development side by side.
projectstring, 1–120A project name or slug — registered or marketing ("Azizi Venice", "the-wings"). Phases resolve: "azizi-venice" lists its numbered phases.
area?string, 1–120Optional. Narrows a name that exists in several areas.
purpose?"sale" | "rent"Which market to read. A building may publish one and not the other.
bedroom?"all" | "studio" | "1br" | "2br" | "3br" | "4br_plus"Pass it to get `development`: the unit type: the project pooled across its towers, each tower, the newest sales and leases, and its name family ("Port de La Mer"). "2br" answers "what does a 2-bed cost in X".
get_offplanmcp:read
Dubai off-plan, citywide or for one area: which areas and buildings show the largest launch-to-resale uplift (registered launch price against today's resale, with counts and hold years), an area's developments at one bedroom type (bedroom: launch against resale per sq ft pooled across each development's towers, the towers under it, phases sharing a name such as "Port de La Mer" grouped, and each development's register state — built %, planned or recorded handover), its live projects with progress and planned dates, its pending supply, and view "handovers" for projects at or past their planned handover date. propertyType "villa" for villa communities. Use it for "best area to buy off-plan", "does off-plan pay off in JVC", "which projects are late". For one project, get_project; for unit counts by planned date, get_supply_pipeline.
area?string, 1–120Omit for the citywide off-plan market; pass an area for its live projects, launch-to-resale uplift and pending supply.
propertyType?"apartment" | "villa"
view?"market" | "handovers""handovers": projects around their planned handover date, most overdue first.
bedroom?"all" | "studio" | "1br" | "2br" | "3br" | "4br_plus"With an area: the unit type for `developments`, launch against resale per sq ft by development and its towers, phases sharing a name ("Port de La Mer") grouped. "2br" answers "did 2-bed launch buyers in X gain".
minBuildings?integer, 1–9007199254740991, default 5Citywide: drop areas with fewer buildings from the area ordering.
limit?integer, 1–9007199254740991, default 25Page size. At most 100; a larger value returns 100.
get_developermcp:read
Dubai developers ranked on delivery — the share of live projects already past their registered planned date — or one developer ("Emaar", "Azizi", "Binghatti", "Sobha") with that record, completed and cancelled counts, median slippage, every live project with progress and planned date, and its completed towers' resale price per sq ft and yield. Use it for "is this developer reliable / on time" and "best developers in Dubai".
developer?string, 1–120Omit for every developer ranked on delivery; pass a name or slug ("Emaar", "azizi-developments") for one.
limit?integer, 1–9007199254740991, default 25Page size. At most 100; a larger value returns 100.
get_price_indexmcp:read
The citywide Dubai apartment price index: median registered sale price per sq ft by month, rebased to 100, with year-on-year change, peak and trough, yearly rows and sales volume — for all sales, ready resales or off-plan. Use it for "are Dubai prices still rising", "how far from the peak", or market-cycle questions. For one area's activity, get_market_activity; for one building's trend, get_building.
segment?"all" | "ready" | "offplan"All apartment sales, ready resales only, or off-plan only.
months?integer, 1–9007199254740991, default 24Monthly points to return, most recent last. At most 120.
get_commercialmcp:read
Dubai commercial property — offices and shops (retail) — by area: achieved sale price per sq ft, registered new-lease rent per sq ft, gross yield and the yield after approved service charge, registered sales and new leases in 12 months, leasing-demand change, liquidity (share of stock sold) and evidence confidence. Without an area: every commercial area ranked by yield, sales, price, demand or liquidity, with the citywide office and shop medians — the answer to "best area to buy an office / shop". With an area: its office and shop records, source dates and the towers that publish. With a building ("Sobha Sapphire"): that tower's own office or shop record — rent only where Ejari names a single-building project. Pass size ("750-1500" for a ~1,000 sq ft office; under-750, 1500-3000, 3000-plus) to answer at one unit size: the area's medians at that size, tower by tower with sales, leases and the latest deal, and the newest registered sales and leases. Apartments are get_area; villas get_villa_community.
area?string, 1–120Omit for every commercial area ranked; pass one ("Business Bay", "jlt") for its office and shop records with source dates.
building?string, 1–120One office or shop tower by name or slug ("Sobha Sapphire"), with or without its area: its own sale price, rent, yield and evidence.
assetClass?"all" | "office" | "shop"Offices, shops (retail), or both.
sort?"yield" | "sales" | "price" | "demand" | "liquidity"Area list order: gross yield, registered sales, sale price per sq ft, leasing-demand change, or share of stock sold.
minYield?number, 0–50Gross yield floor, percent. Areas with a withheld yield drop out.
minSales?integer, 1–9007199254740991Minimum registered sales in 12 months.
includeMonthly?boolean, default falseWith an area: the monthly sale-price, rent and new-lease series.
size?"all" | "under-750" | "750-1500" | "1500-3000" | "3000-plus"Unit size by registered floor area, sq ft: "750-1500" for a ~1,000 sq ft office. With an area: the area's price, rent and yield at that size, every tower at that size (price and rent per sq ft, sales, leases, latest deal) and the newest sales and leases. With a building: the tower's own figures at that size against its area. Without either: every area's figures at that size, and sort/minYield/minSales read them.
limit?integer, 1–9007199254740991, default 25Page size. At most 100; a larger value returns 100.
get_rankingmcp:read
One published league table, citywide or for one area: highest gross rental yields, fastest price growth, best off-plan resale returns, biggest turnover upside, or short-term rental (Airbnb, holiday home) returns. For any "best for short term in <area>" or "short-term vs long-term" question, call best-short-term-premium with the area: every qualifying building with nightly rate, listings behind it, net revenue, surplus over the registered lease, break-even occupancy, and net short-term yield beside the long-let gross yield on the same price, plus developments (towers sharing a project, e.g. the Port de La Mer phases) pooled per bedroom with their towers; pass bedroom to compare them at one type. The four registered families publish where at least ten buildings qualify and list outliers, not the whole market. For your own thresholds (budget, minimum yield, minimum evidence) call screen_buildings instead.
ranking"best-short-term-premium" | "highest-yield-apartments" | "fastest-growing-apartments" | "best-offplan-returns" | "biggest-turnover-upside"
area?string, 1–120Omit for the citywide list. With best-short-term-premium, an area returns every qualifying building there — the answer to "best for short term (Airbnb, holiday home) in <area>".
limit?integer, 1–9007199254740991, default 25Page size. At most 50; a larger value returns 50.
sort?"yield" | "premium"best-short-term-premium only. "yield": modelled net short-term yield on the purchase price (buy-to-let). "premium": net short-term revenue over the registered lease (let vs lease, or rental arbitrage). Defaults to premium with an area, yield citywide.
bedroom?"all" | "studio" | "1br" | "2br" | "3br" | "4br_plus"best-short-term-premium only. Restrict to one bedroom type. With an area, `developments` then compares the developments (towers sharing a project, phases sharing a name) at that type.
list_rankingsmcp:read
Every ranking this index publishes, with the exact method behind each and the areas an area-level version exists for. Each entry names the ranking get_ranking returns and the method behind its figures.
get_methodologymcp:read
How every figure is defined and computed: the glossary (gross yield, yield price, turnover upside, off-plan uplift, growth windows, publication gates), the provenance of each source, and the short-term cost-model constants with their live values. Yields are gross, rents are registered rather than asking, and short-term occupancy is a stated assumption — never a measurement.
term?"recordedPrice" | "grossYield" | "pooledYield" | "yieldSpread" | "turnoverUpside" | "shortLetPremium" | …One definition; omit for the whole glossary.
screen_buildingsmcp:read
Shortlist Dubai buildings on your own thresholds, citywide or across chosen areas: price band, minimum gross yield, minimum registered evidence, bedroom type, own-rent-evidence only, let buildings only, name match — e.g. "Business Bay 1-beds under AED 1.5m above 6.5% with at least 10 sales". Thresholds apply to registered medians, not to listings for sale. Runs the same predicate as the site's screener, CSV export and saved-view alerts, so an agent and a reader get the same set. A building below the publication gate cannot appear at any threshold, because the evidence for its median does not exist. A free account gets the first 10 results; Pro returns every match.
purpose?"sale" | "rent"Which market to read. A building may publish one and not the other.
bedroom?"all" | "studio" | "1br" | "2br" | "3br" | "4br_plus""all" is the building- or area-wide median, not a sum of the rest.
minPrice?number, 0–∞AED. Median registered sale price.
maxPrice?number, 0–∞
minYield?number, 0–50Gross yield, percent.
minEvidence?integer, 1–9007199254740991, default 5Minimum registered sales behind the median. Below 5 a median moves on one trade.
areas?arrayRestrict to these areas. Omit for the whole city.
buildingRentOnly?boolean, default falseOnly buildings whose rent was measured in the building itself, not pooled.
letOnly?boolean, default falseOnly buildings with a registered tenancy — excludes pre-handover stock.
query?string, 0–64Substring of the building or area name.
sort?"yield" | "price" | "psf" | "growth" | "sales"
limit?integer, 1–9007199254740991, default 25Page size. At most 100; a larger value returns 100.
compare_buildingsmcp:read
Two to four apartment buildings on the same rows: price, price per sq ft, gross yield with its denominator and sample, growth, rent movement, turnover upside, nightly rate and area rank. Returns only the bedroom grains every one of them publishes, because comparing one building's 1-bed with another's 2-bed is the easiest wrong answer here. A building that cannot be read is reported with the reason rather than dropped. For villa communities, call get_villa_community for each instead. A free account compares the first two buildings; Pro compares up to four.
buildingsarrayTwo to four buildings, each as its area and building slug or name.
purpose?"sale" | "rent"Which market to read. A building may publish one and not the other.
bedroom?"all" | "studio" | "1br" | "2br" | "3br" | "4br_plus""all" is the building- or area-wide median, not a sum of the rest.
includeAllBedrooms?boolean, default falseInclude all bedroom rows as well as the selected row.
whats_newmcp:read
Which data edition is current and every edition published. With `since`: which buildings entered or left the published index between that edition and now, on the sale and the rent side. Add `buildings` for how up to ten buildings' median price, rent and yield moved between the two editions. A building that disappears has NOT stopped existing — it fell below the publication gate. The data refreshes roughly monthly and every payload states its date, so this shows whether a record already held is still current. Also lists the monthly market reports (reports[]), each at a permanent URL that fetch reads as markdown: sales, new-lease rents, yields, same-building moves and supply against leasing for that month.
since?stringA data edition date. Omit for the editions list alone.
buildings?arrayUp to ten buildings to compare between `since` and the current edition: median price, rent, gross yield and counts in each, with the change.
whoamimcp:read
What this token may do: the account's plan (free or Pro), tool calls left today on a free account, the scopes it carries, how many buildings the account has saved, the rate limit and the account page. Cheap, never counted against the daily quota, and the way to learn a scope or plan is missing before a tool refuses for want of it.
request_infomcp:read
Put the user in touch with a licensed agent about a property: available units, prices, payment plans, a viewing or an offer. Use when the user wants to buy, rent, view, make an offer or talk to an agent about a building, off-plan project or villa community. Sends the signed-in account's name and email (plus a phone number if given) to Dubai Wealth Index, which replies by phone, WhatsApp or email and introduces a licensed agent. Confirm with the user before calling, and pass consent: true. Returns a reference and a WhatsApp link.
property?string, 0–300The property: a building, project or villa community name ("Binghatti Ivory"), or a page url from another tool's result (most precise). Omit for a general enquiry.
area?string, 1–120Area or community, to narrow a name that exists in more than one place.
bedroom?"all" | "studio" | "1br" | "2br" | "3br" | "4br_plus"Unit type the user wants, if they said.
message?string, 0–2000What the user wants, in their words. Defaults to "I'm interested in <property>".
name?string, 0–120The user's name, if different from the account's.
phone?string, 0–40Phone or WhatsApp number with country code, if the user wants a call. The account email is always included.
consentbooleanThe user agreed to be contacted about this enquiry by Dubai Wealth Index and the licensed agents it works with. Confirm with them before calling.
list_favoritesmcp:favorites
The buildings saved on the signed-in Dubai Wealth Index account, with their current figures and a comparison link. Saved buildings with no current figure are named in belowGate, not dropped. Pass `since` (an edition date from whats_new) for how each one's price, rent and yield moved since then. Read-only: it cannot save or remove anything. With everything else reading public data, this and whoami are the only account-specific tools.
since?stringAn edition date from whats_new. Adds how each saved building's price, rent and yield moved between that edition and this one.

When a record is not there

Every typed tool answers a miss in one shape: found: false with a reason, what was asked for, and suggestions — the call that would have worked, with its arguments filled in. The reason is the part to read: a place below the publication gate is not a place that does not exist.

unknown-area
No area publishes under that slug for this purpose.
unknown-building
No building publishes under that slug in that area.
unknown-community
No villa community publishes under that slug.
below-gate
The place trades but has too few registered transactions to support a median. It exists; the evidence for a figure does not.
retired
The record published at an earlier edition and fell below the publication gate at the latest refresh.
moved
The record now publishes at a different address — a community promoted out of its area, or a locality alias.
wrong-index
The name belongs to the other index: villas publish per community, apartments per building. The suggestion names the tool that holds it.
not-published-for-purpose
It publishes, but on the other market. A building or community may publish sale and not rent, or the reverse.
not-published-at-grain
It publishes, but not at the grain asked for: a bedroom size with too few records. Unlike below-gate, a bigger sample would not change this.
unknown-ranking
No ranking family under that slug.
below-ranking-floor
Fewer than the floor of qualifying buildings, so no ordering is published: below it a list reads as generated rather than measured.
unknown-edition
No data edition on that date. whats_new lists every edition the index published; editions are identified by their data date.

Resources

dwi://snapshot
The current data date and the headline counts behind it. The cheapest way to check whether the index has refreshed since you last read it.
dwi://methodology
Every definition and every short-term cost-model constant, as markdown.
dwi://data-dictionary
Every field in a record: unit, grain, definition and what an absent value means.
dwi://rankings/catalog
The ranking families with their method strings and area lists.
dwi://skill
When to reach for this index, how to call it, and the rules for quoting a figure.

Prompts

evaluate_building
Reads the record, the transactions behind it and the method, then reports each figure with its bedroom type, unit, period, data date and evidence count.
area, building
compare_areas
Reads several areas on the same purpose and bedroom grain, and refuses to compare a sale figure against a rent one.
areas, purpose
find_high_yield
Works from the ranking catalogue rather than a scan, and states the floor and cap so the list is never presented as exhaustive.
area, bedroom
short_let_vs_lease
The highest-risk comparison on the site. Forces the occupancy assumption, the platform fee and the self-managed assumption to be stated before any premium is quoted.
area, building, bedroom
cite_figure
Emits the citation format this index publishes.
url

Rate limits and etiquette

120 requests per minute per account. Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset, so a well-behaved client throttles itself before it is ever refused. A refusal is a JSON-RPC error with Retry-After, not a bare 429 body, so it does not break a session.

This runs on one small server. The data changes roughly monthly and every payload states its date — cache accordingly rather than re-reading the same building every turn.

Quoting what it returns

The server sends its quoting rules as instructions at initialization, and every tool result repeats the ones that bear on it. The short version: carry the bedroom type, unit, period, data date and evidence count; yields are gross; rents are registered contracts; short-term occupancy is an assumption, not a measurement; a null is suppressed, not zero. In full at /skill.md.