Skip to main content
À qui ça s’adresse : un assistant ou une application agent agissant pour le client, hors de son navigateur. Si l’assistant agit pour le restaurant, tu veux plutôt le MCP marchand à mcp.storekit.com. Chaque hôte de commande storekit est aussi un serveur MCP distant. Un assistant qui n’est nulle part près du navigateur du client (ChatGPT, Claude, une application agent, un IDE) peut s’y connecter, lire le menu d’un établissement, obtenir un prix et construire un cart que le client ouvre ensuite pour payer.

Endpoints

Il y a deux niveaux, et tous deux sont atteints sur l’hôte de commande propre au magasin : {host} est le domaine sur lequel les pages de commande du magasin sont servies, par exemple order.storekit.com. Les deux endpoints sont restreints à cet hôte, si bien qu’un brand sur son propre domaine ne peut répondre que pour ses propres établissements. Utilise l’endpoint brand quand le client n’a pas encore dit quelle succursale il veut : find_venues renvoie le slug que tous les autres outils prennent ensuite comme argument venue. Utilise l’endpoint venue quand le lieu est déjà fixé. Un GET ou HEAD sur l’un ou l’autre endpoint renvoie 200 et une ligne indiquant ce qu’est l’endpoint, ce qui permet à un client de le sonder avant d’ouvrir une session.

Protocole

JSON-RPC 2.0 sur HTTP, un message par POST. Les méthodes implémentées sont initialize, ping, tools/list et tools/call ; les révisions MCP 2025-06-18, 2025-03-26 et 2024-11-05 sont toutes traitées dans la révision que le client demande.
Chaque résultat est du JSON dans un bloc de contenu texte, dupliqué comme structuredContent pour les clients qui le lisent. L’endpoint est stateless : initialize ne renvoie aucun identifiant de session et rien n’est retenu entre les requêtes, donc une conversation porte le slug de l’établissement et l’identifiant du cart plutôt qu’une session. Les erreurs se répartissent selon qui peut agir dessus. Un argument mal formé est un JSON-RPC -32602 nommant le paramètre ; tout ce dont l’assistant peut se remettre (pas de catégorie de ce nom, pas de correspondance, un établissement qui n’accepte plus de commandes) revient sous forme de résultat d’outil avec isError: true dont le texte indique quoi faire ensuite.

Outils de lecture

get_menu et search_menu prennent tous deux des listes optionnelles excludeAllergens et diets. excludeAllergens nomme l’un des 14 allergènes UK (celery, gluten, crustaceans, fish, eggs, lupin, milk, molluscs, mustard, nuts, peanuts, sesame, soya, sulphites) et écarte tout article qui contient ou peut contenir l’un d’eux ; un article sans information d’allergène est conservé, car « non étiqueté » n’est pas la même chose qu’« exempt de ». diets nomme l’un des halal, kosher, vegan, vegetarian, gluten free et dairy free, et ne conserve que les articles étiquetés comme correspondant à chacun d’eux. Ce sont les mêmes règles que la page de commande applique à ses propres filtres allergènes et régimes, et le résultat renvoie sous filters les filtres qui ont été appliqués. Sur l’endpoint brand, chaque outil sauf find_venues prend un argument venue supplémentaire, et un slug qui n’appartient pas à ce brand est refusé avec la liste propre du brand plutôt que traité à partir du menu d’un autre brand. Les lectures portent readOnlyHint, si bien qu’un client peut les appeler sans demander au client au préalable. Les prix sont des chaînes formatées dans la devise de l’établissement, les descriptions sont nettoyées et tronquées, et chaque liste est plafonnée.
Les modes de fulfillment sont rapportés à partir de ce que le payload de l’établissement prouve : Delivery, Pickup et InStore. Le Catering n’est pas proposé via MCP.

Outils cart

La capability cart suit exactement le binding MCP cart d’UCP, donc un client UCP n’a besoin d’aucune table de correspondance. Ce que le binding signifie en pratique :
  • Chaque appel porte meta["ucp-agent"] avec ton profil d’agent. Un appel sans est rejeté.
  • L’identifiant du cart est un id de premier niveau, jamais imbriqué dans cart.
  • Les montants sont des entiers en unités mineures (450 correspond à £4,50).
  • Un problème métier est un résultat réussi portant messages[] : une ligne qui n’est plus vendable y est signalée plutôt que de disparaître.
  • Les lignes sont nommées par identifiant d’article avec les options entre parenthèses, BURGER(CHEESE;BACON:2), la même grammaire que celle utilisée par les liens basket prefill.
Un cart contient une intention, pas des prix : chaque opération le résout et le retarife par rapport au menu tel qu’il est à cet instant, si bien qu’un cart stocké ne peut pas afficher un montant que la page de l’établissement contredirait. Les carts expirent 24 heures après leur dernière écriture, et rien de propre au client n’y est stocké.
Un cart n’est pas une commande, et ces outils ne parlent que pour le côté client. Rien ici ne lit la file d’attente des commandes d’un magasin, ne modifie un menu ou ne change un réglage. Les outils renvoient une continue_url que le client ouvre pour vérifier le cart et payer sur la page de l’établissement : il n’y a pas d’outil de checkout, de paiement ou de réduction, et aucune commande n’est passée tant qu’il n’a pas terminé là-bas.

Voir aussi

Découverte UCP

Le profil qui publie ces endpoints et la capability cart.

Outils WebMCP

Le jeu d’outils distinct qu’un agent appelle à l’intérieur du navigateur du client.