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.
托管 MCP 服务器
npx add-mcp 'https://prices.brainy.ae/mcp/v2'可安装到 Claude Code、Codex、Cursor 等客户端
文档
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/v2 | Scope |
|---|---|
| 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/comparisons | Admitted 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-reports | Separate 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-items | Historical 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/sales | DLD 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/family | Partial 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/commutes | Monthly 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-zones | Health 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/estimates | Supported 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; inspectRateLimitandRateLimit-Policyheaders. - 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 / route | v2 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 /compare | grocery_compare_list · POST /grocery/comparisons |
list_stores · GET /stores | grocery_stores · GET /grocery/stores, /grocery/stores/{store_id} |
get_school_fees · GET /schools | schools · GET /schools, /schools/{school_id} |
get_school_uniforms · GET /school-uniforms | schools (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 /areas | costs_by_area · GET /costs/areas |
get_cost_of_living · GET /cost-of-living | fixed_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-fares | transport_fares (mode=taxi) · GET /transport/taxi-fares |
estimate_commute_cost · GET /commute | commute_cost · GET /transport/commute-estimate, /transport/commutes |
get_dewa_tariff · GET /dewa | dewa · GET /utilities/dewa/tariff; POST /utilities/dewa/bill-estimates |
get_mobile_internet_plans · GET /mobile-internet-plans | mobile_internet_plans · GET /telecom/plans, /telecom/plans/{plan_id} |
get_health_insurance · GET /health-insurance | health_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 /move | move_to_dubai · POST /relocation/estimates; GET /tax/country-models |
get_today · GET /today | today · 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
- REST v2 OpenAPI 3.1 and service metadata
- MCP v2 endpoint:
https://prices.brainy.ae/mcp/v2(POST only) - API catalogue: Linkset discovery for REST and MCP versions
- llms.txt: plain-text documentation for language models
- Deprecated v1 OpenAPI and v1 service metadata
- The website: same admitted data, for people