The index as tools
Read-only tools over registered Dubai apartment prices, rents and returns. Free, and the same data the pages are built from.
- Edition DWI-DOCS-MCP
- Transport
- Streamable HTTP
- Rate limit
- 120/min
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.
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"
}
}
}For a stdio-only client, bridge it: npx mcp-remote https://dubaiwealthindex.com/api/mcp.
Authorization
OAuth 2.1, following the MCP authorization specification. The endpoint is a resource server; this site is also the authorization server.
Discovery needs no token. A client may initialize and list the tools, resources and prompts anonymously, so it can see what this server offers before deciding whether to authorize. The first tools/call answers 401 with a WWW-Authenticate challenge naming the metadata document, which is where authorization starts. Registration is dynamic and open, so a client registers itself; the only human step is approving the consent screen.
- 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.
Clients start with mcp:read and step up to favorites only if they call that tool. Revoke any connected application from your account.
Tools
- searchmcp:read
- Find a building, area or project by name. Matching is trigram-based, so a half-remembered or misspelled name still resolves. Every hit links to a page that exists — buildings below the publication gate are never returned. Call this first when a question names a place, then pass a hit's id to fetch for the whole record, or its slugs to get_building or get_area for the figures alone.
- querystring, 2–64 charsPart of a building, area or project name.limit1–20, default 8How many hits to return.
- 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. Use it after search when the question needs the whole record rather than one figure, and for the pages no typed tool covers: rankings, off-plan and short-let listings, the methodology and the prose pages. A retired building reports as retired with its area, never as a silent redirect.
- idstring, 1–300 charsA search hit id, a site path such as "/sale/apartments/dubai/business-bay/vera-tower", or the full URL.
- get_buildingmcp:read
- The full record for one apartment building: median registered sale prices, registered rents, gross yield and the basis it was computed on, 12-month and multi-year growth, turnover upside, off-plan uplift, and the forward short-let rate curve where one exists — all by bedroom type. Figures are medians of registered Dubai Land Department sales and Ejari contracts, not asking prices. Identical to the site's public JSON record, so a citation from either resolves the same way.
- areaslugArea slug from a canonical URL, e.g. "business-bay".buildingslugBuilding slug, e.g. "vera-tower".purpose"sale" | "rent"Which page's eligibility gate to apply. A building may publish one and not the other.includeMonthlyboolean, default falseMonthly series. Long — omit unless the question is about a trend.
- get_building_transactionsmcp:read
- The individual registered transactions a building's medians rest on: ready resales, off-plan sales and Ejari contracts, with date, bedroom type, price and floor area. Use it to check whether a median rests on many comparable sales or a few scattered ones. Two caveats travel with every response and must be repeated when quoting: rent rows exist only where rent was measured at building grain, and transaction rows are not snapshot-versioned, so they can be one refresh ahead of the medians on the same building.
- areaslugArea slug.buildingslugBuilding slug.windowMonths3 | 6 | 12, default 3Lookback. 3 is the default: a fair-price read wants the freshest evidence.
- get_areamcp:read
- One Dubai area: its own median yield, price per square foot, rent and 12-month growth, medians by bedroom type, and every building it publishes, ordered by gross yield with 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.
- areaslugArea slug.purpose"sale" | "rent"Which market to read.bedroom"all" | "studio" | "1br" | …"all" is the area hub; a specific bedroom is the category-page grain.buildingLimit1–200, default 50The largest area publishes 362 buildings; uncapped this exhausts a context window.
- get_villa_communitymcp:read
- One Dubai villa community: median registered sale price or rent, price per square foot, 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. search returns villa communities as hits of kind "villa".
- communityslugCommunity slug, e.g. "arabian-ranches".purpose"sale" | "rent"Which market to read.
- get_city_overviewmcp:read
- What the index rests on and what it says citywide: how many buildings, registered transactions and rent contracts, the median yield, price per square foot, rent and growth, and the same medians for every area ordered by how many buildings each publishes. Use it to pick an area before drilling in, or to state the index's coverage.
- purpose"sale" | "rent"Which market to read.bedroombedroom, default "all"Cut the whole city to one unit size.
- get_rankingmcp:read
- One ranking, citywide or for a single area: highest gross yields, fastest price growth, best off-plan resale returns, biggest turnover upside, or biggest short-let premium. Each list is ordered by exactly one published number, and the method behind that number is returned with it. A ranking exists only where at least ten buildings qualify — below that an ordering reads as generated rather than measured. Never present a ranking as exhaustive.
- rankinghighest-yield-apartments | fastest-growing-apartments | best-offplan-returns | biggest-turnover-upside | best-short-let-premiumWhich list.areaslug, optionalOmit for the citywide list.limit1–50, default 25How many rows.
- list_rankingsmcp:read
- Every ranking this index publishes, with the exact method behind each and the areas an area-level version exists for. Read it before get_ranking to pick the right list, and to quote the method alongside any figure taken from one.
- get_methodologymcp:read
- How every figure on this index is defined and computed: the full glossary, the provenance of each source, and the short-let cost-model constants with their live values. Read it before quoting any figure. In particular: yields are gross, rents are registered rather than asking, and short-let occupancy is a stated modelling assumption — never a measurement.
- termglossary key, optionalOne definition; omit for the whole glossary.
- list_favoritesmcp:favorites
- The buildings saved on the signed-in account, with their current figures. Buildings that have fallen below the publication gate since being saved are reported as such rather than dropped silently. This is the one tool that reads anything account-specific; everything else here is public data.
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-let 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.
- dwi://area/{area}
- An area's medians and published buildings. Listable: the area slugs are enumerated.
- dwi://building/{area}/{building}
- A building's full record. Not enumerated — roughly 4,700 buildings would make a resources/list response useless.
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-let occupancy is an assumption, not a measurement; a null is suppressed, not zero. In full at /skill.md.