Servidor MCP

Dubai Grocery Prices

ae.brainy/grocery-prices
Comercio y retail Público y accesible MCP 2025-11-25

Qué hace este MCP

Compares Dubai grocery prices, products, stores, delivery rules, and indicative online offers.

compare_grocery_list
Compare the total cost of a grocery list across Dubai supermarkets. Uses observed catalogue prices and published delivery rules; unknown delivery stays unknown. Product and quantity matches are explicit proposals. A single product is ranked by product price; minimum order is shown without excluding stores.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['items'], 'properties': {'area': {'type': 'string', 'maxLength': 80}, 'items': {'type': 'array', 'items': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'maxItems': 40, 'minItems': 1}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['currency', 'observed_at', 'stale', 'attribution', 'open_in_browser', 'catalog_date', 'single_product_mode', 'outcome', 'confidence', 'area', 'recommended_store', 'ranking', 'items', 'compared', 'not_compared', 'not_found', 'below_minimum_stores', 'advice', 'browser_handoff_truncated'], 'properties': {'area': {'type': 'object', 'required': ['ok', 'reason', 'value'], 'properties': {'ok': {'type': 'boolean'}, 'value': {'type': 'string', 'maxLength': 80}, 'reason': {'anyOf': [{'type': 'string', 'maxLength': 120, 'minLength': 1}, {'type': 'null'}]}}, 'additionalProperties': False}, 'items': {'type': 'array', 'items': {'type': 'object', 'required': ['text', 'status', 'match', 'product', 'quantity', 'at_recommended_store', 'cheapest_seen', 'unresolved_reason', 'candidates', 'next_step'], 'properties': {'text': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'match': {'anyOf': [{'type': 'string', 'maxLength': 120, 'minLength': 1}, {'type': 'null'}]}, 'status': {'enum': ['compared', 'not_compared', 'unresolved']}, 'product': {'anyOf': [{'type': 'object', 'required': ['id', 'name', 'comparison', 'unit'], 'properties': {'id': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'unit': {'enum': ['each', 'kg', 'l']}, 'comparison': {'enum': ['exact', 'equivalent']}}, 'additionalProperties': False}, {'type': 'null'}]}, 'quantity': {'anyOf': [{'type': 'object', 'required': ['value', 'unit', 'source', 'assumed'], 'properties': {'unit': {'enum': ['each', 'kg', 'l']}, 'value': {'type': 'number'}, 'source': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'assumed': {'type': 'boolean'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'next_step': {'anyOf': [{'type': 'string', 'maxLength': 300, 'minLength': 1}, {'type': 'null'}]}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name'], 'properties': {'id': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200, 'minLength': 1}}, 'additionalProperties': False}}, 'cheapest_seen': {'anyOf': [{'type': 'object', 'required': ['store_id', 'store', 'cost_aed'], 'properties': {'store': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'cost_aed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'store_id': {'type': 'string', 'maxLength': 80, 'minLength': 1}}, 'additionalProperties': False}, {'type': 'null'}]}, 'unresolved_reason': {'anyOf': [{'type': 'string', 'maxLength': 120, 'minLength': 1}, {'type': 'null'}]}, 'at_recommended_store': {'anyOf': [{'type': 'object', 'required': ['store_id', 'store', 'title', 'pack_quantity', 'unit', 'packs', 'sale_mode', 'price_aed', 'cost_aed', 'purchased_quantity', 'unit_price_aed', 'estimated', 'observed_at', 'url'], 'properties': {'url': {'anyOf': [{'type': 'string', 'format': 'uri'}, {'type': 'null'}]}, 'unit': {'enum': ['each', 'kg', 'l']}, 'packs': {'anyOf': [{'type': 'integer'}, {'type': 'null'}]}, 'store': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'title': {'type': 'string', 'maxLength': 300, 'minLength': 1}, 'cost_aed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'store_id': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'estimated': {'type': 'boolean'}, 'price_aed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'sale_mode': {'enum': ['pack', 'weight']}, 'observed_at': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'pack_quantity': {'type': 'number', 'description': 'Size of ONE pack in `unit` (e.g. 0.2 kg). Explicit even when the store title omits it.'}, 'unit_price_aed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'purchased_quantity': {'type': 'number'}}, 'additionalProperties': False}, {'type': 'null'}]}}, 'additionalProperties': False}, 'description': 'One entry per requested item, in request order: chosen product and quantity, pack and price at the recommended store, or why it is unresolved and what to try next.'}, 'stale': {'type': 'boolean'}, 'advice': {'type': 'object', 'description': 'Site advisor export: monetary field suffix Fils replaced with Aed and divided by 100. Contains explicit assumptions, coverage, provisional outcomes and shipping uncertainty.'}, 'outcome': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'ranking': {'type': 'array', 'items': {'anyOf': [{'type': 'object', 'required': ['retailerId', 'label', 'subtotalAed', 'feeKnown'], 'properties': {'of': {'type': 'integer'}, 'label': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'covered': {'type': 'integer'}, 'feeKnown': {'type': 'boolean'}, 'feeMaxAed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'feeMinAed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'retailerId': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'shipReason': {'anyOf': [{'type': 'string', 'maxLength': 120, 'minLength': 1}, {'type': 'null'}]}, 'subtotalAed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'totalMaxAed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'totalMinAed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}}, 'additionalProperties': True}, {'type': 'null'}]}, 'description': 'Stores priced on the same product set. In single-product mode every row also carries unit_price_aed, unit and the chosen offer (title, pack size, packs).'}, 'compared': {'type': 'array', 'items': {'type': 'object'}}, 'currency': {'const': 'AED'}, 'not_found': {'type': 'array', 'items': {'type': 'object'}}, 'confidence': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'attribution': {'type': 'string'}, 'observed_at': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'catalog_date': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'not_compared': {'type': 'array', 'items': {'type': 'object'}}, 'open_in_browser': {'type': 'string', 'format': 'uri'}, 'recommended_store': {'anyOf': [{'type': 'object', 'required': ['retailerId', 'label', 'subtotalAed', 'feeKnown'], 'properties': {'of': {'type': 'integer'}, 'label': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'covered': {'type': 'integer'}, 'feeKnown': {'type': 'boolean'}, 'feeMaxAed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'feeMinAed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'retailerId': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'shipReason': {'anyOf': [{'type': 'string', 'maxLength': 120, 'minLength': 1}, {'type': 'null'}]}, 'subtotalAed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'totalMaxAed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'totalMinAed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}}, 'additionalProperties': True}, {'type': 'null'}]}, 'single_product_mode': {'type': 'boolean'}, 'below_minimum_stores': {'type': 'array', 'items': {'type': 'object'}}, 'browser_handoff_truncated': {'type': 'boolean', 'description': 'The website can preload up to 4000 characters; true if the supplied list exceeds that limit.'}}, 'additionalProperties': False}
find_price_online
Find indicative online prices from Google Shopping UAE. New searches have strict daily limits. If queued, wait retry_after_s before calling again. Delivery is excluded; check product variants, stock and final price at the store.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'maxLength': 200, 'minLength': 1}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['currency', 'observed_at', 'stale', 'attribution', 'open_in_browser', 'query', 'state', 'results', 'retry_after_s', 'cached_at', 'shipping', 'note'], 'properties': {'note': {'type': 'string', 'maxLength': 500, 'minLength': 1}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'message': {'type': 'string', 'maxLength': 1000, 'minLength': 1}}, 'additionalProperties': False}, 'query': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'stale': {'type': 'boolean'}, 'state': {'enum': ['ready', 'queued', 'rejected', 'capped']}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'merchant', 'price_aed', 'url', 'relevance'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'title': {'type': 'string', 'maxLength': 300, 'minLength': 1}, 'merchant': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'price_aed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'relevance': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}}, 'currency': {'const': 'AED'}, 'shipping': {'type': 'null'}, 'cached_at': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'attribution': {'type': 'string'}, 'observed_at': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'retry_after_s': {'type': 'number', 'minimum': 0}, 'open_in_browser': {'type': 'string', 'format': 'uri'}}, 'additionalProperties': False}
get_product
Get a catalogue product, observed store offers and product history where available. Basket-total history is never presented as product history.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['product_id'], 'properties': {'product_id': {'type': 'string', 'maxLength': 80, 'minLength': 1}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['currency', 'observed_at', 'stale', 'attribution', 'open_in_browser', 'product', 'history', 'history_note'], 'properties': {'stale': {'type': 'boolean'}, 'history': {'type': 'array', 'items': {'type': 'object', 'required': ['date', 'price_aed', 'store'], 'properties': {'date': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'store': {'anyOf': [{'type': 'string', 'maxLength': 120, 'minLength': 1}, {'type': 'null'}]}, 'price_aed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'product': {'type': 'object', 'required': ['id', 'name', 'unit', 'size', 'comparison', 'page', 'open_in_browser', 'offers'], 'properties': {'id': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'page': {'anyOf': [{'type': 'string', 'format': 'uri'}, {'type': 'null'}]}, 'size': {'type': 'object', 'required': ['quantity', 'unit'], 'properties': {'unit': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'quantity': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}}, 'additionalProperties': False}, 'unit': {'enum': ['each', 'kg', 'l']}, 'offers': {'type': 'array', 'items': {'type': 'object', 'required': ['store_id', 'store', 'title', 'price_aed', 'unit_price_aed', 'unit', 'pack_quantity', 'sale_mode', 'url', 'observed_at', 'comparison', 'status', 'available'], 'properties': {'url': {'anyOf': [{'type': 'string', 'format': 'uri'}, {'type': 'null'}]}, 'unit': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'store': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'title': {'type': 'string', 'maxLength': 300, 'minLength': 1}, 'status': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'store_id': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'available': {'type': 'boolean'}, 'price_aed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'sale_mode': {'enum': ['pack', 'weight']}, 'comparison': {'enum': ['exact', 'equivalent']}, 'observed_at': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'pack_quantity': {'type': 'number'}, 'unit_price_aed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'comparison': {'enum': ['exact', 'equivalent']}, 'open_in_browser': {'type': 'string', 'format': 'uri'}}, 'additionalProperties': False}, 'currency': {'const': 'AED'}, 'attribution': {'type': 'string'}, 'observed_at': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'history_note': {'type': 'string', 'maxLength': 500, 'minLength': 1}, 'open_in_browser': {'type': 'string', 'format': 'uri'}}, 'additionalProperties': False}
list_stores
List Dubai stores and their published delivery rules, minimum orders, source URLs and verification dates. Unknown or expired delivery rules are explicitly labelled.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': [], 'properties': {}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['currency', 'observed_at', 'stale', 'attribution', 'open_in_browser', 'stores'], 'properties': {'stale': {'type': 'boolean'}, 'stores': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'url', 'kind', 'integrated', 'coverage_note', 'minimum_order_aed', 'minimum_source', 'policy_status', 'policy_reason', 'shipping_rule', 'source', 'checked_at'], 'properties': {'id': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'url': {'anyOf': [{'type': 'string', 'format': 'uri'}, {'type': 'null'}]}, 'kind': {'anyOf': [{'type': 'string', 'maxLength': 120, 'minLength': 1}, {'type': 'null'}]}, 'name': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'source': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'checked_at': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'integrated': {'type': 'boolean'}, 'coverage_note': {'type': 'string'}, 'policy_reason': {'anyOf': [{'type': 'string', 'maxLength': 120, 'minLength': 1}, {'type': 'null'}]}, 'policy_status': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'shipping_rule': {'anyOf': [{'type': 'object', 'description': 'Published rule with monetary fields in AED (suffix Aed); null means unknown.'}, {'type': 'null'}]}, 'minimum_source': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'minimum_order_aed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'currency': {'const': 'AED'}, 'attribution': {'type': 'string'}, 'observed_at': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'open_in_browser': {'type': 'string', 'format': 'uri'}}, 'additionalProperties': False}
search_products
Search the observed Dubai grocery catalogue by name, brand or identifier. Returns exact/equivalent matches and dated offers in AED. This does not run a live web search.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'maxLength': 120, 'minLength': 1}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['currency', 'observed_at', 'stale', 'attribution', 'open_in_browser', 'query', 'count', 'products'], 'properties': {'count': {'type': 'integer'}, 'query': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'stale': {'type': 'boolean'}, 'currency': {'const': 'AED'}, 'products': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'unit', 'size', 'comparison', 'page', 'open_in_browser', 'offers'], 'properties': {'id': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'page': {'anyOf': [{'type': 'string', 'format': 'uri'}, {'type': 'null'}]}, 'size': {'type': 'object', 'required': ['quantity', 'unit'], 'properties': {'unit': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'quantity': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}}, 'additionalProperties': False}, 'unit': {'enum': ['each', 'kg', 'l']}, 'offers': {'type': 'array', 'items': {'type': 'object', 'required': ['store_id', 'store', 'title', 'price_aed', 'unit_price_aed', 'unit', 'pack_quantity', 'sale_mode', 'url', 'observed_at', 'comparison', 'status', 'available'], 'properties': {'url': {'anyOf': [{'type': 'string', 'format': 'uri'}, {'type': 'null'}]}, 'unit': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'store': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'title': {'type': 'string', 'maxLength': 300, 'minLength': 1}, 'status': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'store_id': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'available': {'type': 'boolean'}, 'price_aed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}, 'sale_mode': {'enum': ['pack', 'weight']}, 'comparison': {'enum': ['exact', 'equivalent']}, 'observed_at': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'pack_quantity': {'type': 'number'}, 'unit_price_aed': {'anyOf': [{'type': 'number', 'multipleOf': 0.01, 'description': 'AED, rounded to two decimal places. Unknown amounts are null.'}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'comparison': {'enum': ['exact', 'equivalent']}, 'open_in_browser': {'type': 'string', 'format': 'uri'}}, 'additionalProperties': False}}, 'attribution': {'type': 'string'}, 'observed_at': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'open_in_browser': {'type': 'string', 'format': 'uri'}}, 'additionalProperties': False}
Añadido
list_stores
1 de October de 2026 a las 02:40
Añadido
find_price_online
1 de October de 2026 a las 02:40
Añadido
get_product
1 de October de 2026 a las 02:40
Añadido
search_products
1 de October de 2026 a las 02:40
Añadido
compare_grocery_list
1 de October de 2026 a las 02:40