Koskamo

Heart Homes MCP

A public, read-only MCP server providing access to official Dubai Land Department (DLD) property data, including registered sale prices, rents, and market trends. It allows agents to search locations, get market overviews, check asking prices against registered records, and analyze community or building statistics without requiring authentication.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Heart Homes MCP logo, by Heart HomesVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by Heart Homes
MCP endpoint (Streamable HTTP)
https://heart.homes/mcp
Vendor documentation

What its tools do

13 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

13 of 13 have a description · 13 of 13 declare behavior hints · 4 of 12 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to heart.homes ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search for Dubai locations and communities
  • Get market overviews and trend movers
  • Check asking prices against registered DLD sales
  • Retrieve building statistics and recent transactions

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
heart-homes 1.0.2
MCP protocol negotiated in check
2025-11-25
Tools
13 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Read-only Dubai residential real-estate data based on Dubai Land Department open data (registered sales and Ejari rent contracts), aggregated nightly by Heart Homes. Heart Homes is independent: not affiliated with the Dubai Land Department or the Government of Dubai. Call search_locations first to resolve place names to slugs; prices are in AED; rent figures are annual contract values. check_asking_price and check_asking_rent compare against registered records: they show negotiation room, not a valuation, and are not financial or legal advice. Each check result states how many registered records it rests on and carries a disclaimer. Results include a `url` (and, for the checks, `nextStep`) pointing at the heart.homes page with the full detail.

Tools

13 advertised

search_locations — Search locations
Advertised by the server during the last successful anonymous check.
Advertised read-only

Resolve a free-text Dubai location name (community, area, or building) to canonical slugs. Always call this first when the user names a place; other tools take the returned slugs.

search_locations input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "query"
  ],
  "properties": {
    "kind": {
      "enum": [
        "community",
        "area",
        "building"
      ],
      "type": "string",
      "description": "Restrict results to one kind"
    },
    "query": {
      "type": "string",
      "maxLength": 80,
      "minLength": 2,
      "description": "Location name to search for"
    }
  }
}
search_locations annotations
{
  "title": "Search locations",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_market_overview — Dubai market overview
Advertised by the server during the last successful anonymous check.
Advertised read-only

City-wide Dubai sales KPIs over the last 12 months (transaction count, total value, median price, median price per sqm) plus data freshness. Good first call for broad questions.

get_market_overview input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
get_market_overview annotations
{
  "title": "Dubai market overview",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_location_stats — Location statistics
Advertised by the server during the last successful anonymous check.
Advertised read-only

Headline stats for one community or area slug: 12-month sales volume, median price, price per sqm, 12-month trend, plus a property-class mix for sales and rents. When propertyClass is set for a community, also returns per-bedroom sales and rent breakdowns; rent bedroom coverage is partial and must be reported as approximate using rentBedroomCoveragePct and rentBedroomNote. Per-bedroom rent for a single building is not available.

get_location_stats input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1,
      "description": "Location slug (community or area) as returned by search_locations"
    },
    "propertyClass": {
      "enum": [
        "apartment",
        "villa",
        "building",
        "land"
      ],
      "type": "string",
      "description": "When set, also return the per-bedroom sales breakdown and, where attributable, a per-bedroom rent breakdown with partial-coverage figure (communities only)"
    }
  }
}
get_location_stats annotations
{
  "title": "Location statistics",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_ready_vs_offplan — Ready vs off-plan (secondary market) split
Advertised by the server during the last successful anonymous check.
Advertised read-only

Sales split between the secondary (ready / resale) market and the off-plan (pre-completion developer) market for one community or area over the last 12 months - transaction count, total value, and median price for each. "ready" = completed homes resold on the secondary market; "off-plan" = pre-completion developer sales. Property flipping, reselling, and "resale market" questions are READY / secondary-market questions: report the ready row here and do not present off-plan figures as flipping or resale figures. Optionally filter to one property class.

get_ready_vs_offplan input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1,
      "description": "Location slug (community or area) as returned by search_locations"
    },
    "propertyClass": {
      "enum": [
        "apartment",
        "villa",
        "building",
        "land"
      ],
      "type": "string",
      "description": "Property class filter"
    }
  }
}
get_ready_vs_offplan annotations
{
  "title": "Ready vs off-plan (secondary market) split",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_price_history — Monthly price history
Advertised by the server during the last successful anonymous check.
Advertised read-only

Monthly transaction counts and median prices for a community/area slug (or city-wide when slug is omitted), for sales or rents, optionally filtered to one property class. Rent medians are annual contract values in AED/year.

get_price_history input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "kind"
  ],
  "properties": {
    "kind": {
      "enum": [
        "sale",
        "rent"
      ],
      "type": "string",
      "description": "'sale' = DLD sales transactions, 'rent' = Ejari rent contracts"
    },
    "slug": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1,
      "description": "Omit for city-wide history"
    },
    "months": {
      "type": "integer",
      "default": 24,
      "maximum": 60,
      "minimum": 3
    },
    "propertyClass": {
      "enum": [
        "apartment",
        "villa",
        "building",
        "land"
      ],
      "type": "string",
      "description": "Property class filter"
    }
  }
}
get_price_history annotations
{
  "title": "Monthly price history",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_building_stats — Building statistics
Advertised by the server during the last successful anonymous check.
Advertised read-only

Stats for one building: 12-month sales, median price, trend, recent sales, property-type mix, and - where rent contracts can be attributed to the building - median annual rent and recent rent contracts, and a per-bedroom rent breakdown where enough contracts resolve a bedroom. Takes the communitySlug + buildingSlug pair returned by search_locations.

get_building_stats input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "communitySlug",
    "buildingSlug"
  ],
  "properties": {
    "buildingSlug": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1
    },
    "communitySlug": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1
    }
  }
}
get_building_stats annotations
{
  "title": "Building statistics",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
rank_buildings — Rank buildings within a community
Advertised by the server during the last successful anonymous check.
Advertised read-only

Buildings in one community ranked by 12-month median sale price or median annual rent - answers 'cheapest/most expensive buildings in X'. Rent coverage is partial: Ejari records carry no building name, so only buildings whose project name identifies them uniquely have rent stats. Buildings with fewer than 5 records are excluded.

rank_buildings input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "communitySlug",
    "metric",
    "order"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 15,
      "minimum": 3
    },
    "order": {
      "enum": [
        "cheapest",
        "most_expensive"
      ],
      "type": "string"
    },
    "metric": {
      "enum": [
        "sale_price",
        "annual_rent"
      ],
      "type": "string"
    },
    "communitySlug": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1,
      "description": "Community slug from search_locations"
    }
  }
}
rank_buildings annotations
{
  "title": "Rank buildings within a community",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
list_recent_transactions — Recent transactions
Advertised by the server during the last successful anonymous check.
Advertised read-only

Most recent registered DLD sales or rent contracts for a community or area slug - real records to ground price talk in.

list_recent_transactions input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "slug",
    "kind"
  ],
  "properties": {
    "kind": {
      "enum": [
        "sale",
        "rent"
      ],
      "type": "string",
      "description": "'sale' = DLD sales transactions, 'rent' = Ejari rent contracts"
    },
    "slug": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1,
      "description": "Location slug (community or area) as returned by search_locations"
    },
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 15,
      "minimum": 1
    }
  }
}
list_recent_transactions annotations
{
  "title": "Recent transactions",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
compare_buy_vs_rent — Buy vs rent comparison
Advertised by the server during the last successful anonymous check.
Advertised read-only

Compare buying vs renting in one community or area: 12-month weighted median sale price, median annual rent, and the implied gross rental yield. Optionally filter to one property class.

compare_buy_vs_rent input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1,
      "description": "Location slug (community or area) as returned by search_locations"
    },
    "propertyClass": {
      "enum": [
        "apartment",
        "villa",
        "building",
        "land"
      ],
      "type": "string",
      "description": "Property class filter"
    }
  }
}
compare_buy_vs_rent annotations
{
  "title": "Buy vs rent comparison",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
rank_communities — Rank communities by price or rent
Advertised by the server during the last successful anonymous check.
Advertised read-only

Communities ranked by 12-month median sale price or median annual rent - the direct answer to 'cheapest areas', 'most expensive communities', 'most affordable rents'. Only communities with 30+ transactions are ranked; without a propertyClass filter, only residential classes (apartments + villas) count, so whole-building leases and land deals don't skew the medians.

rank_communities input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "metric",
    "order"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 15,
      "minimum": 3
    },
    "order": {
      "enum": [
        "cheapest",
        "most_expensive"
      ],
      "type": "string"
    },
    "metric": {
      "enum": [
        "sale_price",
        "annual_rent"
      ],
      "type": "string",
      "description": "Rank by sale prices or by annual rents"
    },
    "propertyClass": {
      "enum": [
        "apartment",
        "villa",
        "building",
        "land"
      ],
      "type": "string",
      "description": "Property class filter"
    }
  }
}
rank_communities annotations
{
  "title": "Rank communities by price or rent",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_trends_movers — Trending communities
Advertised by the server during the last successful anonymous check.
Advertised read-only

Communities with the biggest 12-month price moves (direction 'up' = risers, 'down' = fallers). Only communities with 30+ sales are included, so thin-volume noise is excluded.

get_trends_movers input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "direction"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 5,
      "maximum": 10,
      "minimum": 1
    },
    "direction": {
      "enum": [
        "up",
        "down"
      ],
      "type": "string"
    }
  }
}
get_trends_movers annotations
{
  "title": "Trending communities",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
check_asking_price — Check an asking price
Advertised by the server during the last successful anonymous check.
Advertised read-only

Is an asking price fair? Compares it against registered DLD sales of the same layout (bedroom count) in the same building over the last 24 months: verdict vs the median, approximate percentile, resale-only median, and recent sales. No verdict when fewer than 5 sales back it. A negotiation guide, not a valuation. Takes the communitySlug + buildingSlug pair returned by search_locations.

check_asking_price input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "communitySlug",
    "buildingSlug",
    "bedrooms",
    "askingAed"
  ],
  "properties": {
    "bedrooms": {
      "type": "integer",
      "maximum": 7,
      "minimum": 0,
      "description": "Bedrooms: 0 = studio, 1-7 = that many bedrooms"
    },
    "askingAed": {
      "type": "number",
      "maximum": 10000000000,
      "description": "Asking price in AED",
      "exclusiveMinimum": 0
    },
    "buildingSlug": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1
    },
    "communitySlug": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1
    }
  }
}
check_asking_price annotations
{
  "title": "Check an asking price",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
check_asking_rent — Check a rent
Advertised by the server during the last successful anonymous check.
Advertised read-only

Is a rent fair, and how much can a landlord raise it? Compares a quoted annual rent against registered Ejari contracts in the same building over the last 12 months (per bedroom where enough contracts resolve one), and estimates the maximum renewal increase under Dubai's rent-increase slabs (Decree 43 of 2013) from the current rent. Give quotedAnnualAed, currentAnnualAed, or both. No verdict when fewer than 5 contracts back it. Takes the communitySlug + buildingSlug pair returned by search_locations.

check_asking_rent input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "communitySlug",
    "buildingSlug"
  ],
  "properties": {
    "bedrooms": {
      "type": "integer",
      "maximum": 7,
      "minimum": 0,
      "description": "Bedrooms: 0 = studio, 1-7 = that many bedrooms"
    },
    "buildingSlug": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1
    },
    "communitySlug": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1
    },
    "quotedAnnualAed": {
      "type": "number",
      "maximum": 100000000,
      "description": "Rent asked for a new lease or at renewal, AED per year",
      "exclusiveMinimum": 0
    },
    "currentAnnualAed": {
      "type": "number",
      "maximum": 100000000,
      "description": "Rent paid today, AED per year (renewal cap estimate)",
      "exclusiveMinimum": 0
    }
  }
}
check_asking_rent annotations
{
  "title": "Check a rent",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-06: 1 of 1 checks answered
  2. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
767 ms
95th percentile latency
767 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 767 ms · metadata changed · 13 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http heart-homes-mcp https://heart.homes/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add heart-homes-mcp --url https://heart.homes/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable heart-homes-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "heart-homes-mcp": {
      "url": "https://heart.homes/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "heart-homes-mcp": {
      "type": "streamableHttp",
      "url": "https://heart.homes/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start heart-homes-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "heart-homes-mcp": {
      "type": "http",
      "url": "https://heart.homes/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http heart-homes-mcp https://heart.homes/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://heart.homes/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "heart-homes-mcp": {
      "serverUrl": "https://heart.homes/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Heart Homes MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Heart Homes MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing