MCP 서버

Dubai Grocery Prices

ae.brainy/grocery-prices
커머스 및 리테일 공개 · 연결 가능 MCP 2025-11-25

이 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.
읽기 전용 외부 접근 가능
입력 스키마
{'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}
출력 스키마
{'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.
읽기 전용 외부 접근 가능
입력 스키마
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'maxLength': 200, 'minLength': 1}}, 'additionalProperties': False}
출력 스키마
{'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.
읽기 전용 외부 접근 가능
입력 스키마
{'type': 'object', 'required': ['product_id'], 'properties': {'product_id': {'type': 'string', 'maxLength': 80, 'minLength': 1}}, 'additionalProperties': False}
출력 스키마
{'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.
읽기 전용 외부 접근 가능
입력 스키마
{'type': 'object', 'required': [], 'properties': {}, 'additionalProperties': False}
출력 스키마
{'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.
읽기 전용 외부 접근 가능
입력 스키마
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'maxLength': 120, 'minLength': 1}}, 'additionalProperties': False}
출력 스키마
{'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}
추가됨
list_stores
2026년 10월 1일 2:40 AM
추가됨
find_price_online
2026년 10월 1일 2:40 AM
추가됨
get_product
2026년 10월 1일 2:40 AM
추가됨
search_products
2026년 10월 1일 2:40 AM
추가됨
compare_grocery_list
2026년 10월 1일 2:40 AM