Brainy Prices — UAE Cost of Living

Source-backed UAE costs: groceries, schools, housing, transport, utilities, telecom and relocation. Read-only; every answer carries its source and date.

Serveur MCP hébergé

npx add-mcp 'https://prices.brainy.ae/mcp/v2'

S’installe dans Claude Code, Codex, Cursor et plus

Documentation

REST API v2

Base URL: https://prices.brainy.ae/api/v2. Start with service metadata and the OpenAPI 3.1 description. The JSON schema documents each route, input, response and source condition. CORS is enabled.

Routes below /api/v2Scope
GET /grocery/products?q=… GET /grocery/products/{product_id} GET /grocery/products/{product_id}/offers GET /grocery/stores GET /grocery/stores/{store_id} POST /grocery/comparisonsAdmitted grocery catalogue, pack and unit prices, exact/equivalent offers, store delivery rules and a supplied list of up to 40 items (120 characters each). Delivery, availability and final checkout totals may be unknown; a partial basket is explicit.
GET /grocery/official-prices GET /grocery/shopper-reportsSeparate Ministry of Economy and Tourism (MOET) reference prices and moderated public buyer observations. Neither is a current checkout offer. Select a product, category, chain or documented query for reference prices; a product or store for reports.
GET /schools GET /schools/{school_id} GET /schools/{school_id}/uniform-itemsHistorical KHDA tuition with original Year/Grade labels, approximate straight-line distances and separately sourced bus information. Search with q, area, curriculum, grade, max_annual_fee_aed, rating or near; radius_km requires near. Uniform items are paused.
GET /housing/zones?q=… GET /housing/zones/{zone_id} GET /housing/rents GET /housing/salesDLD zone discovery and registered contractual rent/sale medians, quartiles, sample counts and reference periods. Select a zone_id, or both property_type and bedrooms. Rents and sales are separate resources; these are historical registered figures, not asking prices or listings.
GET /costs/areas GET /costs/households GET /costs/emirates GET /costs/emirates/{emirate_id} GET /indices/familyPartial household cost components, area comparisons, emirate coverage and dated tax-savings scenarios. Unknown rent outside Dubai stays null. Preserve assumptions, currencies, tax years and exclusions; totals are not full budgets or guaranteed savings.
GET /transport/fuel-prices GET /transport/fuel-prices/history GET /transport/taxi-fares GET /transport/public-transport GET /transport/parking GET /transport/tolls GET /transport/commute-estimate GET /transport/commutesMonthly fuel in AED/litre; taxi, fare, parking and toll rules with per-component pauses; car estimates and selected published commute routes. Supply all required car-estimate inputs, or filter routes by emirate_id, from_area or to_hub_id.
GET /utilities/dewa/tariff POST /utilities/dewa/bill-estimates GET /telecom/plans GET /telecom/plans/{plan_id}DEWA slabs and dated fuel surcharges, bill estimates and VAT-inclusive mobile/home internet plans. Bill inputs are JSON body fields: kwh, either water_m3 or imperial water_gallons, and optional annual_rent_aed. Keep excluded bill components explicit.
GET /health-insurance/rules GET /residence/routes GET /residence/routes/{route_id} GET /residence/common-fees GET /companies/free-zonesHealth insurance payer/coverage rules, residence requirements and fees, and separately scoped company packages. Not insurer quotes; a licence price is not an all-in relocation cost. Source conditions and paused steps remain explicit.
GET /tax/country-models GET /references/fx-rates POST /relocation/estimatesSupported country tax models, dated CBUAE exchange rates and a supplied salary/household scenario. Estimate, not tax advice. Personal inputs belong in the POST body; they are not stored.
GET /today GET /sources GET /sources/{source_id}Dated highlights and source metadata, licences, conditions and pause reasons. No dataset download.
GET /grocery/online-references?q=… GET /electronics/models?q=…Paused resources with empty data and a notice. They have no v2 tools. Check source metadata; do not retry paused sources.

Read the envelope before using a figure

Successful data responses contain meta, data and links. meta.dataset identifies the dataset and its dates, reference period, sources[] and availability:

  • ok: the requested dataset is available.
  • partial: some components or sources are paused or unavailable; inspect row-level status and preserve the notice.
  • paused: deliberately withheld; HTTP 200, empty data, no retry instruction. Never use a previous copy of excluded prices.
  • not_published: not published yet; HTTP 200 with empty data. A temporary fetch/service failure is instead an HTTP 503 problem.

historical describes the source's reference period, such as KHDA tuition for 2024–2025. stale describes our cache: a previous admitted copy served after a failed refresh. They are independent. Observation, publication and compilation dates have their stated precision; an unknown date or amount is null, never invented.

Rows carry provenance. Resolve each source_id and license_id in meta.dataset.sources to retain the publisher, URL, dates, licence, conditions and required attribution. Preserve links.open_in_browser and row links where present.

Pagination and selective queries

For paginated lists, page_size defaults to 20 and must be 1–50. meta.page contains returned, total (matches for this query), result_window (200), has_more, next_cursor, snapshot_id and cursor_ttl_s. Pass the opaque cursor unchanged as cursor, with the same filters, sorting, language and page size. Stop when next_cursor is null.

The window is at most 200 rows across all pages, even when total is higher. At the window boundary has_more is false; refine the question instead of splitting queries to enumerate a dataset. HTTP 400 filter_required means a substantive documented filter is missing: this applies to product and zone searches, schools, housing rents/sales, reference prices, buyer reports and commute routes. These routes cannot be used to list the entire inventory.

Errors, validators and privacy

Errors use application/problem+json (RFC 9457), with type, title, HTTP status, stable code, detail, request_id, invalid_params and retry information. Check the code, not message text. Invalid filters return 400; unavailable resources return 404; unsupported methods return 405; oversized bodies return 413; quota limits return 429 and transient failures 503. Respect Retry-After.

An invalid/mismatched cursor returns 400 cursor_invalid. An expired cursor or changed snapshot returns 409 cursor_expired or snapshot_changed: start again without a cursor. GET data responses include an ETag; send If-None-Match to receive HTTP 304 when the representation is unchanged. Conditional requests still count toward quota. GET data uses private caching; POST calculations and MCP responses use Cache-Control: no-store.

Relocation and DEWA calculations require POST JSON. Salary, household and consumption inputs are not persisted by the service. Never put them in URL parameters.

curl examples

# Current monthly fuel
curl -s 'https://prices.brainy.ae/api/v2/transport/fuel-prices'

# Select products and a school shortlist
curl -s 'https://prices.brainy.ae/api/v2/grocery/products?q=milk&page_size=20'
curl -s 'https://prices.brainy.ae/api/v2/schools?near=Jumeirah%20Park&grade=YEAR%207&radius_km=10&page_size=50'

# Registered 1-bedroom apartment rents in Dubai Marina; discover zone ids separately
curl -s 'https://prices.brainy.ae/api/v2/housing/rents?zone_id=dubai-marina&property_type=apartment&bedrooms=1&page_size=20'
curl -s 'https://prices.brainy.ae/api/v2/housing/zones?q=Dubai%20Marina'

# Supplied grocery list (POST only)
curl -s 'https://prices.brainy.ae/api/v2/grocery/comparisons' \
  -H 'Content-Type: application/json' \
  -d '{"items":["milk","eggs"],"area":"JLT"}'

# Monthly DEWA estimate; water_m3 and water_gallons are alternatives
curl -s 'https://prices.brainy.ae/api/v2/utilities/dewa/bill-estimates' \
  -H 'Content-Type: application/json' \
  -d '{"kwh":1000,"water_m3":15}'

# Supplied example, not personal data: estimate, not tax advice
curl -s 'https://prices.brainy.ae/api/v2/relocation/estimates' \
  -H 'Content-Type: application/json' \
  -d '{"country":"GB","gross_annual":80000,"currency":"GBP","household":{"status":"single","children":0},"area":"Dubai Marina","bedrooms":1}'

To paginate, reuse a response's actual meta.page.next_cursor, retaining the original query. To validate a cached result, use that response's actual ETag in If-None-Match. Do not fabricate cursors or validators.

MCP v2

Remote endpoint: https://prices.brainy.ae/mcp/v2, Streamable HTTP, stateless JSON responses, no authentication. Supported protocol versions: 2025-11-25, 2025-06-18 and 2025-03-26. Application version 2.0.0 is separate from the MCP protocol version.

24 read-only tools, grouped below from the service catalogue. Input and output schemas are returned by tools/list. List tools support page_size up to 50 where their selected operation is paginated; the REST window and shared quota apply.

Groceries

  • grocery_products — products, pack/unit offers/dates; product_id: history. Not MOET/reports.
  • grocery_compare_list — proposed items, subtotals, delivery/minimums. Not MOET/reports.
  • grocery_stores — stores, delivery fees/free thresholds/minimums. Not prices.
  • official_shop_prices — unaltered MOET Dubai pack prices/branch counts. Not live offers.
  • shopper_price_reports — moderated prices/store/date/promos. Not MOET/live offers.

Schools

  • schools — historical KHDA grade tuition, bus fees/year, distances. q: school name/part; near: zone; school_id: detail. Year ≠ Grade; uniforms paused.

Housing and household costs

  • housing_rents — registered annual/monthly rent medians, contracts and zone sales. Not listings.
  • housing_sales — ready/off-plan registered medians/counts and rent context. Not listings.
  • costs_by_area — area ranks, rent/shared costs and tuition. Not full budgets.
  • fixed_monthly_costs — profile monthly costs/assumptions; separate basket. Not full budgets.
  • costs_by_emirate — emirate rent/utilities/school costs. Non-Dubai rent unknown.
  • tax_savings_by_country — country household income/tax savings/years. Not tax advice.

Transport and utilities

  • fuel_prices — current/previous grades, changes, 50/70 L tank costs, transport context/history.
  • transport_fares — taxi tariffs/trip estimate or public/parking/tolls plus fuel. Not app quotes.
  • commute_cost — monthly/annual fuel+Salik inputs/rates or routes. Excludes parking/ownership.
  • dewa — slabs/surcharges/examples; kwh: water/VAT/housing-fee estimate. Not full bill.
  • mobile_internet_plans — VAT-inclusive mobile/home prices, promo then regular, data and contracts.

Health and relocation

  • health_insurance — payer rules, EBP band/benefits, fines/legal citations. Not insurer quotes.
  • residence_visas — route payer/requirements, fees, common medical/insurance bands and paused steps.
  • free_zone_companies — setup packages, annual/monthly prices/visas and paused zones. Not visa routes.
  • move_to_dubai — home/Dubai net, taxes, FX, costs/savings; omit country: models. Not tax advice.
  • fx_rates — dated CBUAE AED rates. Not bank quotes.

Highlights and sources

  • today — dated highlights, sources/figures/caveats. Not live.
  • data_sources — publishers/links, licence conditions/dates and pause reasons. Not dataset rows.

Every successful tool returns the v2 envelope as structuredContent, with a compact content[].text summary that preserves numbers, units, source, date, warnings and a browser link. A text summary can show fewer rows than structured content: use the declared total and continuation instruction. A deliberate pause is a normal result (isError: false), never an instruction to retry; invalid input is isError: true.

Resources and prompts

resources/list advertises nine static metadata/method resources; resources/templates/list advertises brainy-prices://datasets/{dataset_id}/metadata for allowlisted dataset IDs. They explain scope, sources, licences, dates and pauses; they do not expose dataset rows or bulk exports.

  • brainy-prices://catalog/datasets — Metadata-only catalogue of dataset cards and tools, no rows.
  • brainy-prices://methodology/groceries — Observed offers, units, exact/equivalent, cohort, delivery and single-store methodology.
  • brainy-prices://methodology/schools — Historical KHDA Year/Grade tuition, OSM straight-line distance, bus/uniform scope and rights.
  • brainy-prices://methodology/housing — Registered DLD rents/sales, samples, quartiles, period and license.
  • brainy-prices://methodology/costs — Fixed partial costs, component assumptions and missing emirate coverage.
  • brainy-prices://methodology/relocation — Dated tax/FX calculations, residency assumptions, exclusions, no personal input storage.
  • brainy-prices://policies/sources — Rights metadata and deliberate pauses by source, not the underlying datasets.
  • brainy-prices://policies/access — Anonymous/free-key quotas, double opt-in and no bulk access policy.
  • brainy-prices://changes/current — Latest20 metadata-only changes, no row diffs.

The current changes resource states when no dated change ledger is available; do not infer a publication history from its name. prompts/list advertises five optional templates. prompts/get prepares messages from supplied arguments; it does not execute tools:

  • compare_moving_from — Compare a supplied home-country salary scenario with Dubai, using dated tax, FX and partial costs; ask for missing personal assumptions.
  • school_shortlist — Shortlist nearby schools by the exact published Year/Grade label, historical tuition and approximate straight-line distance.
  • compare_grocery_list — Compare only the grocery items a user actually supplied; distinguish observed offers, official reference prices and buyer reports.
  • compare_areas — Compare fixed cost components for a supplied housing scenario without inventing rental coverage outside Dubai.
  • check_sources — Inspect metadata, methods and source permissions for a topic without downloading its dataset.

Connect a client

Claude Code: add a remote HTTP server in the terminal (connection guide).

claude mcp add --transport http brainy-prices-v2 https://prices.brainy.ae/mcp/v2

Claude Desktop: add a custom remote connector in Connectors with https://prices.brainy.ae/mcp/v2. Availability depends on your plan and administrator settings (connection guide).

Cursor: add this to your project's .cursor/mcp.json (connection guide):

{
  "mcpServers": {
    "brainy-prices-v2": { "url": "https://prices.brainy.ae/mcp/v2" }
  }
}

VS Code: add this to .vscode/mcp.json and start the server from the editor's MCP controls (connection guide):

{
  "servers": {
    "brainy-prices-v2": {
      "type": "http",
      "url": "https://prices.brainy.ae/mcp/v2"
    }
  }
}

Other clients: choose a remote Streamable HTTP server, paste the endpoint and select no authentication. The client must support one of the protocol versions above; MCP discovery supplies the schemas, resources and prompts.

Raw JSON-RPC session with curl

# 1. initialize
curl -s 'https://prices.brainy.ae/mcp/v2' \
  -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0"}}}'

# 2. acknowledge initialization (HTTP 202, no body)
curl -s 'https://prices.brainy.ae/mcp/v2' \
  -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-11-25' \
  -d '{"jsonrpc":"2.0","method":"notifications/initialized"}'

# 3. discover tools
curl -s 'https://prices.brainy.ae/mcp/v2' \
  -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-11-25' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

# 4. call a tool
curl -s 'https://prices.brainy.ae/mcp/v2' \
  -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-11-25' \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"grocery_compare_list","arguments":{"items":["milk","eggs"],"area":"JLT"}}}'

No Mcp-Session-Id is issued. POST only: GET and DELETE return 405. JSON-RPC batches are rejected. Discovery and initialization have a separate request-rate control; each tool call consumes the shared data quota.

Limits and fair use

  • Anonymous v2 access: 30 requests per minute and 500 per UTC day per verified network identity (IPv6 /64). REST v2 requests and MCP v2 tool calls share the same quota across service instances.
  • HTTP 304, validation errors and paused data results still consume data quota. HTTP 429 includes Retry-After; inspect RateLimit and RateLimit-Policy headers.
  • Cache responses privately, retain their source/date/status and revalidate using ETag when supported. Different datasets refresh on different schedules; consult their metadata.
  • No mass downloads, systematic enumeration or open dataset is offered. Free access and metadata resources do not expand a source licence.

Attribution and source licences

When displaying a result, cite the original source and its date or reference period, plus “Source: Brainy Prices, prices.brainy.ae, <date>” and the browser link. Retain source-specific attribution, notices, exclusions and licence conditions. There is no blanket licence over all responses.

  • KHDA: unaltered, not for profit. Tuition data is for non-commercial use and must not be altered. Keep the original published Year/Grade labels and academic year; do not sell, monetise or modify the data.
  • Dubai Land Department: Dubai Open Data Licence. Retain the DLD attribution and the reference period; contractual medians are not listings.
  • OpenStreetMap: ODbL. Credit © OpenStreetMap contributors; locations are approximate and school distances are straight-line distances.
  • Store, operator and other sources have their own permissions and conditions, supplied in meta.dataset.sources. Public accessibility is not permission to collect or redistribute them.
  • No bulk downloads or open dataset. The API serves selective queries. Source metadata and free anonymous access are not an export or redistribution licence.
  • Excluded sources: never. Their prices must not appear in responses, nested content or cached fallback. Paused sources remain empty until their permission/source review permits publication.

Store offers can change during the day and at checkout. Unknown delivery stays unknown, never free; missing items and assumptions remain explicit. A comparison ranks only the common comparable subset, and a single-store result is not a store ranking.

See methodology, source conditions and privacy. Do not strip their warnings when reusing a figure.

Deprecated: API v1 and the legacy MCP endpoint (/mcp)

API v1 and https://prices.brainy.ae/mcp remain available. No removal date has been set; removal will be announced with notice. Existing v1 integrations continue to work. New integrations should use v2. The table maps the legacy tool names and routes to the v2 design; use v2 input schemas rather than copying old parameter names.

Legacy tool / routev2 tool / route
search_products · GET /products?q=grocery_products · GET /grocery/products?q=
get_product · GET /products/{id}grocery_products · GET /grocery/products/{product_id}, /grocery/products/{product_id}/offers
compare_grocery_list · GET/POST /comparegrocery_compare_list · POST /grocery/comparisons
list_stores · GET /storesgrocery_stores · GET /grocery/stores, /grocery/stores/{store_id}
get_school_fees · GET /schoolsschools · GET /schools, /schools/{school_id}
get_school_uniforms · GET /school-uniformsschools (uniform status) · GET /schools/{school_id}/uniform-items (paused)
get_rent_prices · GET /rent (rents)housing_rents · GET /housing/rents, /housing/zones?q=…, /housing/zones/{zone_id}
get_rent_prices · GET /rent (sales)housing_sales · GET /housing/sales
compare_areas_cost_of_living · GET /areascosts_by_area · GET /costs/areas
get_cost_of_living · GET /cost-of-livingfixed_monthly_costs · GET /costs/households
get_fuel_prices · GET /fuel (fuel)fuel_prices · GET /transport/fuel-prices, /transport/fuel-prices/history
get_fuel_prices · GET /fuel (tolls, parking, public fares)transport_fares · GET /transport/tolls, /transport/parking, /transport/public-transport
get_taxi_fares · GET /taxi-farestransport_fares (mode=taxi) · GET /transport/taxi-fares
estimate_commute_cost · GET /commutecommute_cost · GET /transport/commute-estimate, /transport/commutes
get_dewa_tariff · GET /dewadewa · GET /utilities/dewa/tariff; POST /utilities/dewa/bill-estimates
get_mobile_internet_plans · GET /mobile-internet-plansmobile_internet_plans · GET /telecom/plans, /telecom/plans/{plan_id}
get_health_insurance · GET /health-insurancehealth_insurance · GET /health-insurance/rules
get_visa_and_company_costs · GET /visas (residence)residence_visas · GET /residence/routes, /residence/routes/{route_id}, /residence/common-fees
get_visa_and_company_costs · GET /visas (companies)free_zone_companies · GET /companies/free-zones
estimate_move_to_dubai · POST /movemove_to_dubai · POST /relocation/estimates; GET /tax/country-models
get_today · GET /todaytoday · GET /today
find_price_online · GET /search (paused)No v2 tool · GET /grocery/online-references?q=… (paused); data_sources for status
get_electronics_prices · GET /electronics (paused)No v2 tool · GET /electronics/models?q=… (paused); data_sources for status

official_shop_prices, shopper_price_reports, costs_by_emirate, tax_savings_by_country, fx_rates and data_sources are new tools without a direct legacy equivalent. Online references and electronics have no v2 tool; their paused REST resources and metadata remain available. School uniform status is included in schools.

Parameter changes include q for REST product searches, max_annual_fee_aed for REST tuition filtering, zone_id for REST housing (resolve names with /housing/zones?q=…), profile_id for household costs, and category / max_aed_per_month for telecom. MCP tools retain their own documented inputs, including housing zone names/aliases. Grocery comparisons, DEWA estimates and relocation estimates use POST JSON.

Links