Serveur MCP

Dubai Grocery Prices

ae.brainy/grocery-prices
Commerce et retail Public et accessible MCP 2025-11-25

Ce que fait ce 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.
Lecture seule Accès externe
Schéma d’entrée
{'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}
Schéma de sortie
{'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.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'maxLength': 200, 'minLength': 1}}, 'additionalProperties': False}
Schéma de sortie
{'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.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['product_id'], 'properties': {'product_id': {'type': 'string', 'maxLength': 80, 'minLength': 1}}, 'additionalProperties': False}
Schéma de sortie
{'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.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {}, 'additionalProperties': False}
Schéma de sortie
{'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.
Lecture seule Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'maxLength': 120, 'minLength': 1}}, 'additionalProperties': False}
Schéma de sortie
{'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}
Ajouté
list_stores
1 October 2026 02:40
Ajouté
find_price_online
1 October 2026 02:40
Ajouté
get_product
1 October 2026 02:40
Ajouté
search_products
1 October 2026 02:40
Ajouté
compare_grocery_list
1 October 2026 02:40