Server definition
- Hash
- sha256:70b20a6475e3b754c6511ddd2040886c6b3eaa9071644bab6c4575293ca47b5c
- What it is
- What a remote MCP server returned when asked what it offers: 11 tools
The blob, as servednamed by its sha256
{
"instructions": "Dubai Wealth Index — registered Dubai property prices, rents and returns:\napartments at building grain, villas and townhouses at community grain.\n\nMedians computed from Dubai Land Department sale transactions and Ejari rental\ncontracts, joined to public Airbnb nightly rates at building and bedroom grain.\nRecorded prices, not asking prices. Current data edition: 2026-09-02.\n\nUSE FOR: what a named Dubai apartment building or area, or a named villa\ncommunity, sold for, rents for or yields; gross yield, 12-month growth,\nturnover upside, off-plan resale uplift, short-term premium; checking a claim\nabout Dubai property returns against registered records.\n\nALSO USE FOR: villas and townhouses, at COMMUNITY grain — get_villa_community,\nor /{sale|rent}/villas/dubai/{community}. There is no villa building level: the\nLand Department records no building for a villa. Apartments are the only\nindex published at building grain.\n\nDO NOT USE FOR: current listings, agents or brokerage; an individual villa or\nstreet; anywhere outside Dubai; mortgage, tax or legal advice; any forecast.\n\nCLASSIFICATION: the split is by TITLE TYPE in the register, not by name. Unit\nand Flat titles are the apartment index; Villa and Complex Villas titles are\nthe villa index. A strata-titled townhouse is therefore an apartment-index row\nunder its own townhouse name — that is the register's classification, not an\nerror to correct.\n\nWORKFLOW: search -> get_building -> get_building_transactions -> get_methodology.\nFor a villa question: search -> get_villa_community -> get_methodology.\nFor a whole record in one call, including the pages no typed tool covers:\nsearch -> fetch on the hit's id.\nFor \"where should I look\": get_city_overview -> list_rankings -> get_ranking.\n\nQUOTING RULES, which apply to every figure returned by every tool:\n- Carry the bedroom type, unit, period, dataAsOf and evidence count with it.\n- Yields are GROSS, before service charge, agency fees, maintenance and voids.\n- Rents are REGISTERED contracts, not asking prices.\n- Short-term occupancy (80%) is a stated\n ASSUMPTION, never a measurement; revenue scales linearly with it, and the\n model assumes a self-managed unit.\n- A yield spread is in percentage POINTS, not percent.\n- A null figure is SUPPRESSED, not zero. A building with no record is BELOW THE\n PUBLICATION GATE, not nonexistent — say that rather than \"unknown\".\n- Rankings are outliers by construction and are never exhaustive.\n\nCITATION, REQUIRED: every figure you quote must carry a working link to the\ncanonicalUrl of the record it came from — rendered as a link in whatever format\nyou are writing in, never the site name alone. Each tool result carries a\nfinished `attribution` block with plain, markdown and HTML citation strings.\nCopy the one matching your output format rather than composing your own. Link\nto the canonical page URL, not the .json record.",
"tools": [
{
"description": "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-term listings, the methodology and the prose pages. A retired building reports as retired with its area, never as a silent redirect.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"id": {
"description": "A search hit id, a site path such as \"/sale/apartments/dubai/business-bay/vera-tower\", or the full URL.",
"maxLength": 300,
"minLength": 1,
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "fetch",
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
},
"metadata": {
"additionalProperties": false,
"properties": {
"dataAsOf": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"kind": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Which kind of page, e.g. building, area-hub, ranking."
},
"redirectTo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Where to go instead. Set when status is retired or moved."
},
"status": {
"enum": [
"ok",
"retired",
"moved",
"not-found"
],
"type": "string"
}
},
"required": [
"status",
"kind",
"dataAsOf",
"redirectTo"
],
"type": "object"
},
"text": {
"description": "The record as markdown — the same rendition the URL serves.",
"type": "string"
},
"title": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"id",
"title",
"url",
"text",
"metadata"
],
"type": "object"
}
},
{
"description": "One Dubai area: its own medians, its 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.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"area": {
"pattern": "^[a-z0-9][a-z0-9-]{0,79}$",
"type": "string"
},
"bedroom": {
"default": "all",
"description": "\"all\" is the building- or area-wide median, not a sum of the rest.",
"enum": [
"all",
"studio",
"1br",
"2br",
"3br",
"4br_plus"
],
"type": "string"
},
"buildingLimit": {
"default": 50,
"maximum": 200,
"minimum": 1,
"type": "integer"
},
"purpose": {
"default": "sale",
"description": "Which market to read. A building may publish one and not the other.",
"enum": [
"sale",
"rent"
],
"type": "string"
}
},
"required": [
"area"
],
"type": "object"
},
"name": "get_area",
"outputSchema": null
},
{
"description": "The full record for one apartment building: median registered sale prices, registered rents, gross yield and the basis it was computed on, growth, turnover upside, off-plan uplift and the forward short-term rate curve where one exists — all by bedroom type. Medians of registered Dubai Land Department sales and Ejari contracts, never asking prices. Identical to the site's public JSON record.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"area": {
"pattern": "^[a-z0-9][a-z0-9-]{0,79}$",
"type": "string"
},
"building": {
"pattern": "^[a-z0-9][a-z0-9-]{0,79}$",
"type": "string"
},
"includeMonthly": {
"default": false,
"description": "The monthly series. Long — omit unless the question is about a trend.",
"type": "boolean"
},
"purpose": {
"default": "sale",
"description": "Which market to read. A building may publish one and not the other.",
"enum": [
"sale",
"rent"
],
"type": "string"
}
},
"required": [
"area",
"building"
],
"type": "object"
},
"name": "get_building",
"outputSchema": null
},
{
"description": "The individual registered transactions a building's medians rest on. Use it to check whether a median rests on many comparable sales or a few scattered ones. Rent rows exist only where rent was measured at building grain, and transaction rows are not snapshot-versioned — both caveats are returned with the data and must be repeated when quoting it.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"area": {
"pattern": "^[a-z0-9][a-z0-9-]{0,79}$",
"type": "string"
},
"building": {
"pattern": "^[a-z0-9][a-z0-9-]{0,79}$",
"type": "string"
},
"windowMonths": {
"anyOf": [
{
"const": 3,
"type": "number"
},
{
"const": 6,
"type": "number"
},
{
"const": 12,
"type": "number"
}
],
"default": 12
}
},
"required": [
"area",
"building"
],
"type": "object"
},
"name": "get_building_transactions",
"outputSchema": null
},
{
"description": "What the index rests on and what it says citywide: counts, median yield, price per square foot, rent and growth, plus the same medians for every area. Use it to pick an area before drilling in, or to state the index's coverage.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"bedroom": {
"default": "all",
"description": "\"all\" is the building- or area-wide median, not a sum of the rest.",
"enum": [
"all",
"studio",
"1br",
"2br",
"3br",
"4br_plus"
],
"type": "string"
},
"purpose": {
"default": "sale",
"description": "Which market to read. A building may publish one and not the other.",
"enum": [
"sale",
"rent"
],
"type": "string"
}
},
"type": "object"
},
"name": "get_city_overview",
"outputSchema": null
},
{
"description": "How every figure is defined and computed: the glossary, the provenance of each source, and the short-term cost-model constants with their live values. Read it before quoting any figure. Yields are gross, rents are registered rather than asking, and short-term occupancy is a stated assumption — never a measurement.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"term": {
"description": "One definition; omit for the whole glossary.",
"enum": [
"recordedPrice",
"grossYield",
"pooledYield",
"yieldSpread",
"turnoverUpside",
"shortLetPremium",
"adrPerSqft",
"netRevenue",
"occupancyAssumption",
"managementFee",
"vicinity500m",
"ejari",
"offplanReturn",
"medianVsAsking",
"paybackYears",
"breakEvenOccupancy",
"villaCommunity",
"titleType",
"villaRentGrain"
],
"type": "string"
}
},
"type": "object"
},
"name": "get_methodology",
"outputSchema": null
},
{
"description": "One ranking, citywide or for a single area, ordered by exactly one published number. The method behind that number is returned with it. A ranking exists only where at least ten buildings qualify; below that floor an ordering reads as generated rather than measured. Never present a ranking as exhaustive.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"area": {
"anyOf": [
{
"pattern": "^[a-z0-9][a-z0-9-]{0,79}$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Omit for the citywide list."
},
"limit": {
"default": 25,
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"ranking": {
"enum": [
"best-short-term-premium",
"highest-yield-apartments",
"fastest-growing-apartments",
"best-offplan-returns",
"biggest-turnover-upside"
],
"type": "string"
}
},
"required": [
"ranking"
],
"type": "object"
},
"name": "get_ranking",
"outputSchema": null
},
{
"description": "One Dubai villa community — Arabian Ranches, The Springs, The Valley — with its registered median price, rent, gross yield, growth and bedroom breakdown. Community grain only: the Land Department records no building for a villa, so no per-villa figure exists. The response states which rent grain the yield rests on; quote it.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"community": {
"pattern": "^[a-z0-9][a-z0-9-]{0,79}$",
"type": "string"
},
"purpose": {
"default": "sale",
"description": "Which market to read. A building may publish one and not the other.",
"enum": [
"sale",
"rent"
],
"type": "string"
}
},
"required": [
"community"
],
"type": "object"
},
"name": "get_villa_community",
"outputSchema": null
},
{
"description": "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. The one tool here that reads anything account-specific.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"type": "object"
},
"name": "list_favorites",
"outputSchema": null
},
{
"description": "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, and quote the method alongside any figure taken from a list.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"type": "object"
},
"name": "list_rankings",
"outputSchema": null
},
{
"description": "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.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"default": 8,
"maximum": 20,
"minimum": 1,
"type": "integer"
},
"query": {
"maxLength": 64,
"minLength": 2,
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "search",
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"dataAsOf": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"note": {
"type": "string"
},
"results": {
"items": {
"additionalProperties": false,
"properties": {
"context": {
"type": "string"
},
"grossYieldPct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"id": {
"description": "Canonical site path. Pass it to fetch, or read the last two segments as area and building slugs.",
"type": "string"
},
"kind": {
"enum": [
"building",
"area",
"project"
],
"type": "string"
},
"title": {
"type": "string"
},
"url": {
"description": "Absolute, user-openable. This is what a citation resolves to.",
"type": "string"
}
},
"required": [
"id",
"title",
"url",
"kind",
"context",
"grossYieldPct"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"dataAsOf",
"results",
"note"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:70b20a6475e3b754c6511ddd2040886c6b3eaa9071644bab6c4575293ca47b5c | sha256sum