story-theme-mcp
Serveur MCP du Story Thème : votre assistant IA connaît le thème Shopify Story par cœur et construit des boutiques propres et professionnelles.
npm · fingerprint 4dbfdc598b48e8f842607453 · repository · RSS
What changed
Changed 2026-10-20 11:41 UTC
6 descriptions rewritten, 1 tool added, 2 tools removed.
--- pinned/build_store +++ observed/build_store { "annotations": { "destructiveHint": false, - "description": "FIRST CALL for a new store, without asking questions first. Builds a complete first version in one call and exports the zip: colour schemes from the brand colour (or the style), font pairing, home page (recipe picked from the style), product page, collection page, about/contact/FAQ/tracking pages, the rest of the theme translated, demo templates removed, and the brand copy you pass in `copy` placed in the pages. Reuses the project if it already exists (undo restores). Returns the choices made and the questions to ask the merchant next. Styles: essentiel (polyvalent), premium (premium, luxe), mode (mode, prêt-à-porter), beaute (beauté, soin, bien-être), nature (naturel, artisanal, épicerie), maison (maison, déco, grand catalogue), tech (tech, accessoires), sport (sport, énergie), enfant (enfants, animaux, ludique), produit-unique (marque d’un produit phare (DTC)).", + "description": "Builds the complete first version of a store in one call — AFTER the one-shot brief of the instructions (or right away if the merchant says \"vas-y\") — and exports the zip. Identity (colour schemes, fonts, art direction), home page, product page, collection page, about / how-to / contact / FAQ / tracking pages (about and how-to composed for the business: beauty routine, tech getting started, fashion care…), 404 / password / blog texts in the store language, the rest of the theme translated, demo templates removed. All or nothing: if a page cannot be written, the project goes back to its previous state. The STRUCTURE comes from what the store sells (`business`, guessed from `activity` if absent): beauty proves results, tech compares specs, fashion shows the product worn with a size guide, food tells origin and offers tiers… Every section is filled with the brand texts of `copy` and the photos of `images`; a section with nothing to say is left out, never shipped with the theme's sample text. To design the pages yourself, pass `plan`: per page, the sections in order, in the compose_page format — the MCP assembles, translates, wires the catalogue and validates. Reuses the project if it exists (undo restores). Styles: essentiel (polyvalent), premium (premium, luxe), mode (mode, prêt-à-porter), beaute (beauté, soin, bien-être), nature (naturel, artisanal, épicerie), maison (maison, déco, grand catalogue), tech (tech, accessoires), sport (sport, énergie), enfant (enfants, animaux, ludique), produit-unique (marque d’un produit phare (DTC)).", "execution": { "taskSupport": "forbidden" }, - "description": "Ce qu’elle vend, en une phrase", + "description": "Ce qu’elle vend, en une phrase (sert à deviner le métier si business est absent)", "type": "string" }, "background_color": { + "business": { + "description": "Ce que la boutique vend, qui décide de la structure : beaute (Beauté, soin, cosmétique) ; alimentaire (Épicerie, café, boissons, gourmandises) ; artisanat (Artisanat, fait main, objets d’atelier) ; mode (Mode, chaussures, prêt-à-porter) ; bijoux (Bijoux, montres, maroquinerie, haut de gamme) ; tech (Tech, accessoires, gadgets) ; maison (Maison, déco, mobilier, grand catalogue) ; enfant-animaux (Enfants, bébés, animaux) ; sport (Sport, nutrition sportive, outdoor) ; generaliste (Boutique généraliste). Déduit de activity si absent", + "enum": [ + "beaute", + "alimentaire", + "artisanat", + "mode", + "bijoux", + "tech", + "maison", + "enfant-animaux", + "sport", + "generaliste" + ], + "type": "string" + }, "collection": { "description": "Handle de la collection principale (bouton du héro, meilleures ventes)", "type": "string" - "description": "Handles des collections à montrer (la première = principale). Sans eux, les listes montrent toutes les collections", + "description": "Handles des collections à montrer (la première = principale, la deuxième = sélection). Sans eux, les listes montrent toutes les collections", "items": { "type": "string" }, - "description": "Textes clés rédigés pour la marque, placés directement dans les pages", + "description": "Textes rédigés pour la marque, placés dans les pages. Toute section dont le contenu manque est écartée plutôt que laissée avec ses textes d’exemple", "properties": { "announcements": { - "description": "1 à 3 messages courts de la barre d’annonce", + "description": "1 à 3 messages courts de la barre d’annonce. « Livraison offerte dès 49 € » règle aussi la barre de livraison offerte de la fiche", "items": { "type": "string" }, - "description": "3 ou 4 bénéfices produits", + "description": "3 ou 4 bénéfices produits (colonnes à icônes ou cartes empilées selon la direction)", "items": { "properties": { + "icon": { + "type": "string" + }, "text": { "type": "string" }, + "benefits_eyebrow": { + "type": "string" + }, "benefits_title": { - "description": "Titre au-dessus des bénéfices (cartes empilées)", + "description": "Titre au-dessus des bénéfices", "type": "string" }, + "bestsellers_title": { + "description": "Titre de la liste de produits principale", + "type": "string" + }, + "brand_story_eyebrow": { + "type": "string" + }, "brand_story_text": { - "description": "2 ou 3 phrases vraies sur la marque", + "description": "2 ou 3 phrases vraies sur la marque (sa première phrase va aussi sous le logo du pied de page)", "type": "string" }, "brand_story_title": { + "bundle": { + "description": "Lot à composer sur l’accueil (créateur de lot) : remises à créer aussi dans Shopify", + "properties": { + "collection": { + "type": "string" + }, + "text": { + "type": "string" + }, + "tiers": { + "items": { + "properties": { + "count": { + "type": "number" + }, + "discount": { + "type": "number" + }, + "label": { + "type": "string" + } + }, + "required": [ + "count", + "discount" + ], + "type": "object" + }, + "type": "array" + }, + "title": { + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "collections_title": { + "type": "string" + }, + "comparison": { + "description": "Comparatif nous / l’alternative, ou modèle / modèle", + "properties": { + "columns": { + "description": "Colonnes, cinq au plus : la marque face à l’alternative ([\"Maison Lumen\", \"Bougie industrielle\"]), ou vos modèles (trois ou plus : comparatif de produits, { name, button: { label, link }, highlight })", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "properties": { + "badge": { + "type": "string" + }, + "button": { + "properties": { + "label": { + "type": "string" + }, + "link": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "highlight": { + "type": "boolean" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "rows": { + "description": "Critères honnêtes et vérifiables ; values : true (coche), false (croix) ou un texte, une valeur par colonne", + "items": { + "properties": { + "label": { + "type": "string" + }, + "values": { + "items": { + "type": [ + "boolean", + "string" + ] + }, + "type": "array" + } + }, + "required": [ + "label", + "values" + ], + "type": "object" + }, + "type": "array" + }, + "text": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "rows" + ], + "type": "object" + }, + "contact_hours": { + "description": "Horaires réels du service client (sinon aucun horaire affiché)", + "type": "string" + }, + "contact_intro": { + "type": "string" + }, + "contact_title": { + "type": "string" + }, "details": { - "description": "Détails produit réels : matières, utilisation, entretien (accordéons)", + "description": "Accordéons de la fiche produit : matière ou composition, utilisation, entretien, livraison et retours", "items": { "properties": { "text": { + "example_reviews": { + "description": "Avis d’EXEMPLE écrits pour la maquette (jamais dans proofs) : placés, listés dans « Ce que j’ai inventé », signalés par review_project jusqu’à leur remplacement par de vrais avis", + "items": { + "properties": { + "name": { + "type": "string" + }, + "role": { + "type": "string" + }, + "text": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "name", + "text" + ], + "type": "object" + }, + "type": "array" + }, "faq": { - "description": "4 à 6 questions/réponses ; conditions données par le marchand ou formulations générales", + "description": "4 à 6 questions/réponses : accueil, page FAQ, contact ; celles sur la livraison vont aussi sur la page de suivi", "items": { "properties": { "answer": { + "faq_title": { + "type": "string" + }, + "featured_badge": { + "description": "Pastille du produit en vedette (« Le plus vendu »), sinon aucune", + "type": "string" + }, + "footer_text": { + "description": "Une phrase sous le logo du pied de page (sinon la première phrase de brand_story_text)", + "type": "string" + }, "hero_button": { - "description": "Bouton du héro, 2 à 4 mots", + "description": "Bouton du héro, 2 à 4 mots (repris par les listes de produits)", "type": "string" }, + "hero_eyebrow": { + "description": "Sur-titre court au-dessus de la promesse (sinon aucun)", + "type": "string" + }, "hero_text": { "description": "Une phrase sous la promesse", "type": "string" + "hotspots": { + "description": "Points cliquables sur images.hotspots (produit expliqué) ; x, y en % de la photo", + "items": { + "properties": { + "product": { + "type": "string" + }, + "text": { + "type": "string" + }, + "title": { + "type": "string" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "type": "array" + }, + "hotspots_text": { + "type": "string" + }, + "hotspots_title": { + "type": "string" + }, + "lookbook_text": { + "type": "string" + }, + "lookbook_title": { + "description": "Titre de la galerie (lookbook, ambiance)", + "type": "string" + }, "manifesto": { "description": "Manifeste de marque en 1 ou 2 phrases fortes : s’illumine mot à mot au défilement (accueil et Notre histoire)", "type": "string" + "new_title": { + "description": "Titre de la liste de la troisième collection (nouveautés, saison)", + "type": "string" + }, "newsletter_text": { + "description": "Une vraie raison de s’inscrire (accueil, pied de page, pop-up)", "type": "string" }, "newsletter_title": { + "offers": { + "description": "Paliers d’offre de la fiche produit (1 / 2 / 3 pièces, lot) : leurs libellés et remises. Les réductions se créent ensuite dans Shopify", + "items": { + "properties": { + "badge": { + "type": "string" + }, + "discount": { + "description": "Remise en %", + "type": "number" + }, + "quantity": { + "type": "number" + }, + "text": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "type": "array" + }, + "offers_title": { + "type": "string" + }, + "personalization": { + "description": "Champ de personnalisation de la fiche (gravure, prénom brodé)", + "properties": { + "help": { + "type": "string" + }, + "label": { + "type": "string" + }, + "placeholder": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, "process": { - "description": "3 à 5 étapes de fabrication ou de préparation (direction organique / artisanale)", + "description": "3 à 5 étapes de fabrication, d’origine ou de préparation (frise ; scrollytelling avec photos)", "items": { "properties": { "icon": { + "product_benefits_text": { + "description": "Une phrase à côté des atouts du produit, sous la fiche", + "type": "string" + }, + "product_faq": { + "description": "Questions propres à la fiche produit", + "items": { + "properties": { + "answer": { + "type": "string" + }, + "question": { + "type": "string" + } + }, + "required": [ + "question", + "answer" + ], + "type": "object" + }, + "type": "array" + }, "reassurance": { - "description": "3 ou 4 arguments courts (livraison, retours, fabrication…), repris dans le bandeau défilant et les listes à puces", + "description": "3 ou 4 arguments courts (livraison, retours, fabrication…) : bandeau défilant, badges de confiance de la fiche, colonnes à icônes", "items": { "type": "string" }, + "related_title": { + "description": "Titre des produits associés sous la fiche", + "type": "string" + }, + "results": { + "description": "2 ou 3 résultats observés, en liste à côté de l’avant / après", + "items": { + "type": "string" + }, + "type": "array" + }, + "results_text": { + "type": "string" + }, + "results_title": { + "description": "Titre de l’avant / après (avec images.before_after)", + "type": "string" + }, + "reviews_title": { + "type": "string" + }, "rotating_words": { "description": "3 à 5 mots qui tournent dans le titre du héro, placés à la fin du titre (ex. tenue, humeur, occasion)", "items": { + "selection_title": { + "description": "Titre de la liste de la deuxième collection", + "type": "string" + }, "showcase_text": { "type": "string" }, - "description": "Phrase forte du grand visuel (zoom au défilement)", + "description": "Phrase forte du grand visuel qui s’ouvre au défilement (avec une photo large)", "type": "string" }, + "size_guide": { + "description": "Guide des tailles près du bouton d’achat (mode, chaussures)", + "properties": { + "note": { + "type": "string" + }, + "rows": { + "anyOf": [ + { + "items": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "array" + }, + { + "type": "string" + } + ], + "description": "Lignes du tableau, la première = en-têtes (ex. [[\"EU\",\"Longueur du pied\"],[\"38\",\"24 cm\"]])" + }, + "title": { + "type": "string" + }, + "unit": { + "enum": [ + "cm", + "in", + "none" + ], + "type": "string" + } + }, + "required": [ + "rows" + ], + "type": "object" + }, + "specs": { + "description": "Caractéristiques clé / valeur (dimensions, actifs, origine, compatibilité) : fiche technique sous la fiche produit, ou dans la colonne d’achat", + "items": { + "properties": { + "icon": { + "type": "string" + }, + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "specs_text": { + "type": "string" + }, + "specs_title": { + "type": "string" + }, "story_intro": { "type": "string" }, + "story_steps_title": { + "type": "string" + }, "story_title": { "description": "Titre de la page Notre histoire", "type": "string" + "tips_title": { + "type": "string" + }, + "tracking_text": { + "type": "string" + }, + "tracking_title": { + "type": "string" + }, + "ugc_text": { + "type": "string" + }, + "ugc_title": { + "type": "string" + }, + "usage_eyebrow": { + "description": "Sur-titre de la page Comment utiliser", + "type": "string" + }, "usage_faq": { "description": "Questions sur l’utilisation, l’entretien, la taille", "items": { + "usage_faq_title": { + "type": "string" + }, "usage_intro": { "type": "string" }, - "description": "3 à 5 étapes d’utilisation du produit, concrètes", + "description": "3 à 5 étapes d’utilisation, concrètes (page Comment utiliser — routine pour la beauté, préparation pour l’épicerie, prise en main pour la tech, entretien pour la mode et la maison ; routine de la fiche tech)", "items": { "properties": { "icon": { + "usage_steps_title": { + "description": "Titre au-dessus des étapes (sinon « En trois gestes »)", + "type": "string" + }, "usage_title": { "description": "Titre de la page Comment utiliser, ex. « Comment porter votre chouchou »", "type": "string" + }, + "values_title": { + "type": "string" } }, "type": "object" - "description": "Direction artistique : editorial (Éditorial chic : mode, bijoux, maroquinerie, marque premium) ; minimal (Minimal scandinave : maison, déco, objets, grand catalogue) ; organique (Naturel organique : bougies, épicerie fine, cosmétique naturelle, bio, fait main) ; artisan (Atelier artisanal : artisanat, céramique, maroquinerie faite main, producteur) ; douceur (Douceur beauté : beauté, soin, bien-être, maternité) ; pop (Pop coloré : enfants, animaux, snacks, accessoires fun, marque joyeuse) ; energie (Sport énergique : sport, nutrition, outdoor, streetwear) ; tech (Tech précis : électronique, accessoires, gadgets, produit technique). Déduite du style si absente", + "description": "Direction artistique : editorial (Éditorial chic : mode, bijoux, maroquinerie, marque premium) ; minimal (Minimal scandinave : maison, déco, objets, grand catalogue) ; organique (Naturel organique : bougies, épicerie fine, cosmétique naturelle, bio, fait main) ; artisan (Atelier artisanal : artisanat, céramique, maroquinerie faite main, producteur) ; douceur (Douceur beauté : beauté, soin, bien-être, maternité) ; pop (Pop coloré : enfants, animaux, snacks, accessoires fun, marque joyeuse) ; energie (Sport énergique : sport, nutrition, outdoor) ; urbain (Urbain brut : streetwear, sneakers, skate, drops, marque de rue) ; tech (Tech précis : électronique, accessoires, gadgets, produit technique). Sinon celle du métier", "enum": [ "editorial", "minimal", + "urbain", "tech" ], "type": "string" + "featured_product": { + "description": "Handle du produit mis en vedette (équivaut à products[0])", + "type": "string" + }, "fonts": { - "description": "Paire de polices (sinon celle du style)", + "description": "Paire de polices (sinon celle de la direction)", "enum": [ "editorial", "classic-serif", + "streetwear", "fashion-sans" ], "type": "string" - "description": "Recette d’accueil (sinon celle du style)", + "description": "Ancienne façon : imposer une recette d’accueil (préférez plan)", "enum": [ "accueil-essentiel", "accueil-marque-premium", - "description": "Photos déjà présentes dans Contenu > Fichiers. Sans photo : héro typographique, aucun carré vide", + "description": "Photos déjà présentes dans Contenu > Fichiers. Sans photo : héro typographique, et les sections à photos sont écartées (aucun carré vide)", "properties": { + "before_after": { + "description": "Deux vraies photos avant / après, même cadrage : section avant / après (beauté, nettoyage, rénovation)", + "properties": { + "after": { + "type": "string" + }, + "before": { + "type": "string" + } + }, + "required": [ + "before", + "after" + ], + "type": "object" + }, "hero": { "description": "Photo du héro, large et nette (1600 px de large ou plus ; nom du fichier dans Contenu > Fichiers, ex. darly-hero.jpg)", "type": "string" + "hotspots": { + "description": "Une photo en situation ou du produit seul : points cliquables (acheter le look avec products, produit expliqué avec copy.hotspots)", + "type": "string" + }, "large": { - "description": "Parmi ces photos, celles qui font 1600 px de large ou plus : seules elles vont en plein écran (zoom au défilement, héro des pages de marque). Sans elles, pas de zoom et héro typographique sur les pages de marque, plutôt qu’une photo floue", + "description": "Parmi ces photos, celles qui font 1600 px de large ou plus : seules elles vont en plein écran (zoom au défilement, héro des pages de marque)", "items": { "type": "string" }, - "description": "Photos d’ambiance (visuels des sections)", + "description": "Photos d’ambiance : galerie, scrollytelling, atouts du produit, fiche technique", "items": { "type": "string" }, - "description": "1 à 3 photos pour l’histoire de la marque", + "description": "1 à 3 photos pour l’histoire de la marque (atelier, fondateurs)", "items": { "type": "string" }, + }, + "ugc": { + "description": "Vraies photos de clients (3 ou plus) : section photos clients", + "items": { + "type": "string" + }, + "type": "array" } }, "type": "object" - "description": "Fiche produit avec offres par paliers (lots, remises par quantité, cadeau). ACTIVÉ PAR DÉFAUT : passez false seulement si le marchand n’en veut pas. Le thème affiche les paliers, les réductions correspondantes se créent ensuite dans Shopify.", + "description": "Offres par paliers sur la fiche produit. Par défaut : oui pour ce qui se rachète (consommables, beauté, épicerie, friandises) ou si copy.offers est écrit ; non pour la mode, la tech, la maison, les bijoux. true les impose, false les retire", "type": "boolean" }, "pages": { + "plan": { + "additionalProperties": { + "items": { + "additionalProperties": {}, + "properties": { + "blocks": { + "description": "main-product-composed uniquement : la colonne d’achat, dans l’ordre. fil (fil d’Ariane), note, titre, prix, variantes, guide-tailles (copy.size_guide), stock (stock réel Shopify), offres (copy.offers), quantite, achat, personnalisation (copy.personalization), barre-livraison (seuil lu dans les annonces), livraison (date estimée), badges (copy.reassurance), description, caracteristiques (copy.specs), details (copy.details en accordéons)", + "items": { + "enum": [ + "fil", + "note", + "titre", + "prix", + "variantes", + "guide-tailles", + "stock", + "offres", + "quantite", + "achat", + "personnalisation", + "barre-livraison", + "livraison", + "badges", + "description", + "caracteristiques", + "details" + ], + "type": "string" + }, + "type": "array" + }, + "collection": { + "description": "product-list, bundle-builder : handle de la collection montrée", + "type": "string" + }, + "collections": { + "description": "collection-list : handles des collections montrées", + "items": { + "type": "string" + }, + "type": "array" + }, + "content": { + "properties": { + "badge": { + "description": "Pastille (« Nouveauté ») ; \"\" retire celle du preset", + "type": "string" + }, + "buttons": { + "description": "[] retire les boutons", + "items": { + "properties": { + "label": { + "type": "string" + }, + "link": { + "type": "string" + }, + "style": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" + }, + "columns": { + "description": "comparison : les colonnes, la marque d’abord — un nom, ou { name, button: { label, link }, highlight, badge } pour un comparatif de modèles (« Product comparison »)", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "properties": { + "badge": { + "type": "string" + }, + "button": { + "properties": { + "label": { + "type": "string" + }, + "link": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "highlight": { + "type": "boolean" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "eyebrow": { + "description": "Sur-titre ; \"\" retire celui du preset", + "type": "string" + }, + "items": { + "description": "Éléments répétés (étapes, cartes, questions, chiffres, caractéristiques, lignes de comparaison, points cliquables, avis, photos…) : { title, text, label, value, icon, image, button: {label, link}, palette, question, answer, name, role, values: [..], product, x, y } ; le nombre d’éléments s’adapte", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + ] + }, + "type": "array" + }, + "label_after": { + "type": "string" + }, + "label_before": { + "type": "string" + }, + "lines": { + "description": "Lignes d’un bandeau défilant ou d’une liste à puces", + "items": { + "type": "string" + }, + "type": "array" + }, + "manifesto": { + "description": "Remplace le contenu par un texte révélé au défilement", + "type": "string" + }, + "rotating_words": { + "items": { + "type": "string" + }, + "type": "array" + }, + "text": { + "description": "Texte ; ligne vide = nouveau paragraphe ; \"\" retire le texte d’exemple", + "type": "string" + }, + "title": { + "description": "Titre ; **mot** = mot en gras (coloré par le style de titre)", + "type": "string" + }, + "title_tag": { + "enum": [ + "h1", + "h2", + "p" + ], + "type": "string" + } + }, + "type": "object" + }, + "id": { + "type": "string" + }, + "image": { + "description": "Photo de la section (héro, zoom, image des points cliquables) : nom du fichier dans Contenu > Fichiers", + "type": "string" + }, + "image_after": { + "description": "before-after : la photo « après », même cadrage et même lumière", + "type": "string" + }, + "image_before": { + "description": "before-after : la photo « avant »", + "type": "string" + }, + "image_mobile": { + "type": "string" + }, + "images": { + "description": "Photos des blocs image de la section, dans l’ordre (les blocs image sans photo sont retirés)", + "items": { + "type": "string" + }, + "type": "array" + }, + "palette": { + "description": "Palette du fond : background-1, background-2, inverse, scheme", + "type": "string" + }, + "preset": { + "description": "Preset de départ (get_section)", + "type": [ + "string", + "number" + ] + }, + "product": { + "description": "featured-product : handle du produit", + "type": "string" + }, + "separator": { + "description": "Formes : curve, slope, wave, waves, organic, tilt, peak, zigzag, scallop, clouds, mountains, torn, drip, fade, line ; animation : flow, swell, grow, parallax", + "properties": { + "animation": { + "type": "string" + }, + "bottom": { + "type": "string" + }, + "flip": { + "type": "boolean" + }, + "top": { + "type": "string" + } + }, + "type": "object" + }, + "settings": { + "additionalProperties": {}, + "description": "Réglages bruts de la section", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": { + "description": "Type de section (list_sections)", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": "array" + }, + "description": "Vos pages, dessinées par vous : { index: [...], product: [...], collection: [...], <page>: [...] } — chaque liste au format de compose_page (type, preset, palette, image(s), content). product : commencez par { type: \"main-product-composed\", blocks: [...] } pour la colonne d’achat. Une autre clé crée templates/page.<clé>.json (ingredients, lookbook, entretien…). Les pages absentes du plan suivent le métier. Types et presets vérifiés avant d’écrire", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, "primary_color": { "description": "Couleur de marque #RRGGBB", "type": "string" + "products": { + "description": "Handles des produits phares : le premier va dans la section produit en vedette (sans handle, pas de produit en vedette : la section disparaîtrait en ligne), les suivants dans « acheter le look »", + "items": { + "type": "string" + }, + "type": "array" + }, "proofs": { - "description": "Uniquement des preuves réelles. Sans elles, les sections d’avis et de chiffres sont remplacées par des sections factuelles", + "description": "Uniquement des preuves RÉELLES. Des avis d’exemple écrits pour la maquette vont dans copy.example_reviews", "properties": { "figures": { "description": "Chiffres réels et vérifiables, ex. {120}K+", - "description": "Déduit de l’activité si absent", + "description": "Couleurs et polices par défaut ; sinon celles du métier", "enum": [ "essentiel", "premium", - "description": "Change le tirage des sections d’enrichissement de l’accueil. Par défaut il dépend du nom : deux marques différentes n’ont pas la même page. Donnez n’importe quel mot pour obtenir une autre structure sur la même marque.", + "description": "Ignoré : la structure vient du métier, du contenu et des photos. Pour une autre structure, passez plan", "type": "string" } },
--- pinned/compose_page +++ observed/compose_page { "annotations": { "destructiveHint": false, - "description": "Designs a page freely with ANY section of the theme: for each section, a preset to start from plus its content (title, text, buttons, repeated items such as steps, cards, questions, figures, specs, comparison rows), palette, shape separators and photos. The MCP places everything in the right blocks, adds or removes items, and saves only if the file is valid. Use it for original pages: our story, how to use, ingredients, lookbook, gift guide, landing page. mode append adds the sections to an existing page.", + "description": "Designs a page freely with ANY section of the theme: for each section, a preset to start from plus its content (title, text, badge, buttons, repeated items such as steps, cards, questions, figures, specs, comparison rows and columns, hotspots, reviews, photos), palette, shape separators and photos (image, images, image_before / image_after), and the catalogue it shows (collection for a product list, collections, product for a featured product — else the project's main collection). The MCP places everything in the right blocks, adds or removes items, and saves only if the file is valid. Write every text: a preset text you do not replace stays as the theme's sample (list_texts shows them) — except the sample eyebrow and badge, removed when you write the content without them. Plain text, **bold**; HTML tags are cleaned (allowed formatting kept). Use it for original pages: our story, how to use, ingredients, lookbook, gift guide, landing page. mode append adds the sections at the end of an existing page (then edit_template move_section). For a whole store at once, pass the same sections to build_store plan.", "execution": { "taskSupport": "forbidden" }, + "collection": { + "description": "product-list, bundle-builder : handle de la collection montrée", + "type": "string" + }, + "collections": { + "description": "collection-list : handles des collections montrées", + "items": { + "type": "string" + }, + "type": "array" + }, "content": { "properties": { + "badge": { + "description": "Pastille (« Nouveauté ») ; \"\" retire celle du preset", + "type": "string" + }, "buttons": { "description": "[] retire les boutons", "items": { + "columns": { + "description": "comparison : les colonnes, la marque d’abord — un nom, ou { name, button: { label, link }, highlight, badge } pour un comparatif de modèles (« Product comparison »)", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "properties": { + "badge": { + "type": "string" + }, + "button": { + "properties": { + "label": { + "type": "string" + }, + "link": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "highlight": { + "type": "boolean" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + ] + }, + "type": "array" + }, "eyebrow": { - "description": "Sur-titre", + "description": "Sur-titre ; \"\" retire celui du preset", "type": "string" }, "items": { - "description": "Éléments répétés (étapes, cartes, questions, chiffres, caractéristiques, lignes de comparaison…) : { title, text, label, value, icon, image, button: {label, link}, palette, question, answer, name, role, values: [..] } ; le nombre d’éléments s’adapte", + "description": "Éléments répétés (étapes, cartes, questions, chiffres, caractéristiques, lignes de comparaison, points cliquables, avis, photos…) : { title, text, label, value, icon, image, button: {label, link}, palette, question, answer, name, role, values: [..], product, x, y } ; le nombre d’éléments s’adapte", "items": { "anyOf": [ { + "label_after": { + "type": "string" + }, + "label_before": { + "type": "string" + }, "lines": { "description": "Lignes d’un bandeau défilant ou d’une liste à puces", "items": { - "description": "Photo de la section (héro, zoom) : nom du fichier dans Contenu > Fichiers", + "description": "Photo de la section (héro, zoom, image des points cliquables) : nom du fichier dans Contenu > Fichiers", "type": "string" }, + "image_after": { + "description": "before-after : la photo « après », même cadrage et même lumière", + "type": "string" + }, + "image_before": { + "description": "before-after : la photo « avant »", + "type": "string" + }, "image_mobile": { "type": "string" }, + "product": { + "description": "featured-product : handle du produit", + "type": "string" + }, "separator": { "description": "Formes : curve, slope, wave, waves, organic, tilt, peak, zigzag, scallop, clouds, mountains, torn, drip, fade, line ; animation : flow, swell, grow, parallax", "properties": {
--- pinned/inspiration +++ observed/inspiration { "annotations": { "openWorldHint": false, - "description": "The eleven Story Theme demo stores, composed by the theme designer. Without arguments: the catalogue (niche, positioning). With `demo`: how that store composes its pages — sections in order, palettes, block types. Look at the demo closest to the merchant’s business BEFORE building, and take inspiration from the sequence and rhythm — never from its texts.", + "description": "The ten Story Theme demo stores, composed by the theme designer. Without arguments: the catalogue (niche, positioning). With `demo`: how that store composes its pages — sections in order, palettes, block types. Look at the demo closest to the merchant’s business BEFORE building, and take inspiration from the sequence and rhythm — never from its texts.", "execution": { "taskSupport": "forbidden" },
--- pinned/migrate_v3 +++ observed/migrate_v3 { "annotations": { "destructiveHint": false, - "description": "Migrates a store running Story Theme 3.x (3.7 or older) to the current 4.x, which the member area update cannot do (the 4.0 rebuilt every section schema: copied settings would give an empty store). Reads the 3.x theme straight from a connected store (`shop` + `theme`), or from a theme exported from the store (`source`: folder or .zip). Every section is read for what the merchant wrote — titles, texts, buttons, photos, videos, products, collections, reviews, questions — and rebuilt with the 4.0 section that does the same job, from its preset. Also carries colours, fonts, logo, menus, announcements, footer menus and app blocks. Creates a new project (the current one) and returns the migration report: sections guessed, texts that found no place. Then review each page (read_file, compose_page, edit_template), review_project, and push_to_shop({ shops, create: true }) to send it to a NEW unpublished theme: the 3.x theme stays untouched.", + "description": "Migrates a store running Story Theme 3.x (3.7 or older) to the current 4.x, which the member area update cannot do (the 4.0 rebuilt every section schema: copied settings would give an empty store). Reads the 3.x theme straight from a connected store (`shop` + `theme`), or from a theme exported from the store (`source`: folder or .zip). Every section is read for what the merchant wrote — titles, texts, buttons, photos, videos, products, collections, reviews, questions — and rebuilt with the 4.0 section that does the same job, from its preset. Also carries colours, fonts, logo, menus, announcements, footer brand and menus, header toggles, custom Liquid, app blocks and app embeds, the sticky add-to-cart and the cart reward tiers; preset sample texts the merchant never had are removed. Creates a new project (the current one) and returns the migration report: sections guessed, texts that found no place, and texts absent from the 3.x export (preset leftovers to remove). Then review each page (read_file, compose_page, edit_template), review_project, and push_to_shop({ shops, create: true }) to send it to a NEW unpublished theme: the 3.x theme stays untouched.", "execution": { "taskSupport": "forbidden" },
--- pinned/push_to_shop +++ observed/push_to_shop { "annotations": { "destructiveHint": true, - "description": "Writes the project files (page templates, section groups, theme settings) straight into a theme of one connected store — no zip, no manual import. Without `theme`, lists the store themes. With `create: true`, creates a new UNPUBLISHED theme from the latest Story Theme release and writes the project into it. Before writing into an existing theme, re-reads it: files the merchant changed in the Shopify editor since the last exchange stop the push (pull_from_shop first). The published theme is refused unless confirm: true. Theme code is never touched.", + "description": "Writes the project files (page templates, section groups, theme settings) straight into a theme of one connected store — no zip, no manual import. Without `theme`, lists the store themes. With `create: true`, creates a new UNPUBLISHED theme from the latest Story Theme release and writes the project into it. `files` limits the push to those project files (everything else in the theme is untouched). Before writing into an existing theme, re-reads it: files the merchant changed in the Shopify editor since the last exchange stop the push (pull_from_shop first). The PUBLISHED theme never receives the whole project: it needs `files` (e.g. one new template) AND confirm: true, after the merchant explicitly agreed. Theme code is never touched.", "execution": { "taskSupport": "forbidden" }, - "description": "Obligatoire pour écrire dans le thème PUBLIÉ. Seulement après demande explicite du marchand.", + "description": "Obligatoire pour écrire dans le thème PUBLIÉ (avec files). Seulement après demande explicite du marchand.", "type": "boolean" }, "create": { + "files": { + "description": "N’envoyer que ces fichiers du projet (ex. [\"templates/product.offre-b.json\"]) ; le reste du thème n’est pas touché. Obligatoire pour le thème PUBLIÉ.", + "items": { + "type": "string" + }, + "type": "array" + }, "overwrite": { "description": "Écraser des fichiers modifiés dans Shopify depuis le dernier échange. Seulement après accord explicite du marchand : sinon pull_from_shop.", "type": "boolean"
--- pinned/read_guide +++ observed/read_guide { "annotations": { "openWorldHint": false, - "description": "Read a Story Theme guide (French). Topics: demarrage, architecture, design-pro, couleurs, typographie, accueil, fiche-produit, offres, entete-pied, pages, redaction, images, seo-performance, accessibilite, lancement, limites, signatures, reproduire.", + "description": "Read a Story Theme guide (French). Topics: demarrage, architecture, design-pro, couleurs, typographie, accueil, fiche-produit, offres, entete-pied, pages, redaction, images, seo-performance, accessibilite, lancement, limites, signatures, reproduire, metiers.", "execution": { "taskSupport": "forbidden" }, - "reproduire" + "reproduire", + "metiers" ], "type": "string" }
+ tool added: update_theme
tool removed: shop_graphql
tool removed: shops_overview
Changed 2026-10-19 13:06 UTC
2 descriptions rewritten, 1 schema or annotation change with the description left byte-identical.
--- pinned/migrate_v3 +++ observed/migrate_v3 { "annotations": { "destructiveHint": false, - "description": "Langue de la boutique ; par défaut celle du thème 3.x (fichier de traductions par défaut)", + "description": "Langue de la boutique ; par défaut, devinée d’après ses textes", "type": "string" }, "name": {
--- pinned/shop_graphql +++ observed/shop_graphql { "annotations": { "destructiveHint": true, - "description": "Runs one Shopify Admin GraphQL operation (API 2025-10) on one, several or all connected stores, in parallel. Queries and mutations within the Story Apps scopes (products, collections, pages, menus, files, discounts, themes read). A mutation on several stores needs confirm: true, only after the user explicitly agreed. Every access is logged.", + "description": "Only for stores where the Story Apps app is installed (Story Theme team stores) — NOT for a merchant store connected with Theme Access, which only opens its themes (use pull_from_shop / push_to_shop; for products, collections, pages, menus and discounts, use the merchant's official Shopify connector). Runs one Shopify Admin GraphQL operation on one, several or all Story Apps stores, in parallel. A mutation on several stores needs confirm: true, only after the user explicitly agreed. Every access is logged.", "execution": { "taskSupport": "forbidden" },
--- pinned/shops_overview +++ observed/shops_overview { "annotations": { "openWorldHint": true, - "description": "Key figures of all connected stores in one call: products, collections, Shopify plan, theme version and pending update, licence, and Story Apps modules (reviews, pending reviews, A/B tests, post-purchase offers).", + "description": "Only for stores where the Story Apps app is installed (Story Theme team stores). Key figures in one call: products, collections, Shopify plan, theme version and pending update, licence, and Story Apps modules (reviews, pending reviews, A/B tests, post-purchase offers). A merchant store connected with Theme Access is NOT reachable here.", "execution": { "taskSupport": "forbidden" },
Changed 2026-10-16 11:33 UTC
1 description rewritten, 2 tools added.
+ tool added: migrate_v3
+ tool added: pull_from_shop
--- pinned/push_to_shop +++ observed/push_to_shop { "annotations": { "destructiveHint": true, - "description": "Writes the project files (page templates, section groups, theme settings) straight into a theme of one connected store — no zip, no manual import. Without `theme`, lists the store themes. With `create: true`, creates a brand new unpublished theme from the project and writes nothing else. The published theme is refused unless confirm: true. Theme code is never touched.", + "description": "Writes the project files (page templates, section groups, theme settings) straight into a theme of one connected store — no zip, no manual import. Without `theme`, lists the store themes. With `create: true`, creates a new UNPUBLISHED theme from the latest Story Theme release and writes the project into it. Before writing into an existing theme, re-reads it: files the merchant changed in the Shopify editor since the last exchange stop the push (pull_from_shop first). The published theme is refused unless confirm: true. Theme code is never touched.", "execution": { "taskSupport": "forbidden" }, + "overwrite": { + "description": "Écraser des fichiers modifiés dans Shopify depuis le dernier échange. Seulement après accord explicite du marchand : sinon pull_from_shop.", + "type": "boolean" + }, "project": { "description": "Projet à envoyer (par défaut : le projet en cours).", "type": "string"
Current tools
Show all 41 tool fingerprints
Watch this server yourself
If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.
npx -y mcp-pin@0.2.3 -- <your story-theme-mcp command>
Or subscribe to this page's RSS feed to be told when it changes.
Badge
The badge states one fact about time and nothing else. It never claims a server is safe.
[](https://mcp-pin.gautamkhosla.com/servers/46ab569b4ca82391.html)