story-theme-mcp 1.7.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/package.json +1 -1
- package/src/server.js +2 -2
- package/src/shops/app-tools.js +10 -10
- package/src/shops/client.js +1 -1
- package/src/shops/direct.js +1 -1
- package/src/shops/format.js +1 -1
- package/src/shops/tools.js +2 -2
- package/src/version.js +1 -1
package/README.md
CHANGED
|
@@ -63,7 +63,7 @@ Le MCP ne contient pas le thème : au démarrage, il demande à l'espace membre
|
|
|
63
63
|
| Livrer | `export_theme` (zip à importer + check-list), `import_theme` (auditer un thème téléchargé d'une boutique) |
|
|
64
64
|
| Passer en 4.x | `migrate_v3` : une boutique en Story Thème 3.7 ou avant, reconstruite en 4.x avec son contenu (textes, photos, avis, FAQ, produits, couleurs, polices, logo, menus), section par section — ce que la mise à jour de l'espace membre ne sait pas faire |
|
|
65
65
|
| Vos boutiques (Theme Access) | `list_shops` (et la marche à suivre pour brancher une boutique), `pull_from_shop` (relire le thème de la boutique), `push_to_shop` (écrire le projet dans un thème non publié, sans zip), `update_theme` (mettre à jour le Story Thème dans un thème neuf non publié) — la boutique se branche une fois depuis l'espace membre avec un mot de passe Theme Access, qui n'ouvre que ses thèmes |
|
|
66
|
-
| L'appli
|
|
66
|
+
| L'appli Story Thème (Story Apps, gratuite) | `app_status`, `app_reviews` (import CSV, modération, réponses), `app_ab_tests`, `app_offers` (la remise des offres du thème), `app_discount_codes`, `shops_overview`, `shop_graphql` — sur les boutiques où le marchand a installé l'appli (depuis son espace membre) |
|
|
67
67
|
|
|
68
68
|
Prompts prêts à l'emploi : `creer-boutique`, `refaire-une-page`, `auditer-un-theme`. Les guides sont aussi exposés en ressources (`storytheme://guides/<sujet>`).
|
|
69
69
|
|
|
@@ -74,7 +74,7 @@ Prompts prêts à l'emploi : `creer-boutique`, `refaire-une-page`, `auditer-un-t
|
|
|
74
74
|
- **Aucun texte d'exemple livré** : après composition, chaque page est relue avec les règles de `list_texts`, dans les quatorze langues du thème ; un texte d'exemple restant part avec son bloc, ou la section part, et c'est dit. Sans annonce de la marque, la barre d'annonce est masquée plutôt que d'afficher les siennes ; le HTML glissé dans un texte est nettoyé.
|
|
75
75
|
- **Revue design** : textes d'exemple ou en anglais laissés sur une boutique française, avis d'exemple à remplacer, faux avis et faux chiffres des presets, bouton sans lien, plusieurs `<h1>`, contrastes insuffisants (WCAG AA, boutons compris), polices dépréciées par Shopify (Futura → Jost…), compte à rebours qui redémarre et stock simulé (pratiques commerciales trompeuses), pop-ups multiples, rythme des palettes.
|
|
76
76
|
- **Jamais le code du thème** : seuls `templates/*.json`, `sections/<groupe>.json` et `config/settings_data.json` sont modifiables, dans un dossier de projet. Le Liquid, le CSS et le JS du thème ne sont jamais touchés, ni en local ni à distance.
|
|
77
|
-
- **Écrire dans une boutique reste encadré** : `push_to_shop` n'envoie que les fichiers du projet, refuse une boutique qui ne tourne pas sur un Story Thème de la même version majeure, n'écrit dans le thème publié que des fichiers nommés (`files`, ex. un modèle B de test A/B) avec confirmation explicite, jamais le projet entier, et ne supprime jamais rien à distance. Les thèmes s'ouvrent par Theme Access (mot de passe chiffré dans l'espace membre, révocable par le marchand) ; l'appli
|
|
77
|
+
- **Écrire dans une boutique reste encadré** : `push_to_shop` n'envoie que les fichiers du projet, refuse une boutique qui ne tourne pas sur un Story Thème de la même version majeure, n'écrit dans le thème publié que des fichiers nommés (`files`, ex. un modèle B de test A/B) avec confirmation explicite, jamais le projet entier, et ne supprime jamais rien à distance. Les thèmes s'ouvrent par Theme Access (mot de passe chiffré dans l'espace membre, révocable par le marchand) ; l'appli, seulement sur les boutiques dont le compte a prouvé la propriété. Chaque accès est journalisé.
|
|
78
78
|
- **Historique** : chaque écriture est précédée d'un instantané ; `undo` revient en arrière autant de fois que nécessaire.
|
|
79
79
|
- **Export bloqué** tant qu'une erreur bloquante reste ; signalé « pas prêt à publier » tant qu'un point 🔴 reste.
|
|
80
80
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "story-theme-mcp",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.1",
|
|
4
4
|
"description": "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.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.js",
|
package/src/server.js
CHANGED
|
@@ -107,12 +107,12 @@ Si le marchand tourne sur le Story Thème 3.7 ou avant (pull_from_shop le détec
|
|
|
107
107
|
|
|
108
108
|
**Mise à jour** (boutique branchée déjà en 4.x) : update_theme({ shops }) crée un thème NON publié avec la dernière version du Story Thème et y recopie les modèles, les groupes de sections et les réglages de la boutique. Dites au marchand ce qui a été écarté (sections ou réglages que la nouvelle version n'a plus), et que les textes modifiés dans les fichiers de langue et le code ajouté à la main ne suivent pas. Il prévisualise et publie lui-même. En 3.x : migrate_v3.
|
|
109
109
|
|
|
110
|
-
**L'appli Story Thème**
|
|
110
|
+
**L'appli Story Thème** (Story Apps) est gratuite : le marchand l'installe lui-même depuis son espace membre (page MCP & Appli). Elle ajoute les avis clients, les tests A/B, les offres cumulables et récompenses panier, et les codes promo. Sur une boutique branchée où elle est installée, commencez par app_status, puis :
|
|
111
111
|
- app_reviews : importer un export CSV (Judge.me, Loox…), ajouter, modérer, répondre aux avis ;
|
|
112
112
|
- app_ab_tests : opposer deux modèles de page. Le modèle B doit exister dans le thème PUBLIÉ : composez-le (compose_page, edit_template), puis, avec l'accord du marchand, envoyez CE SEUL fichier : push_to_shop({ shops, theme: <thème publié>, files: ["templates/product.offre-b.json"], confirm: true }) — un modèle en plus ne change aucune page en ligne. Suivez les résultats (14 jours au moins), puis appliquez le gagnant ;
|
|
113
113
|
- app_offers : les paliers et lots se règlent dans le thème (offres de la fiche produit), l'appli applique la remise au panier : activate la met en place, diagnostic dit pourquoi une offre ne s'applique pas ;
|
|
114
114
|
- app_discount_codes : créer un code promo cumulable avec les offres.
|
|
115
|
-
Les actions irréversibles et celles sur plusieurs boutiques demandent confirm: true : décrivez ce qui va se passer et attendez le oui du marchand. Appli pas installée ? Il
|
|
115
|
+
Les actions irréversibles et celles sur plusieurs boutiques demandent confirm: true : décrivez ce qui va se passer et attendez le oui du marchand. Appli pas installée ? Il l'installe depuis son espace membre (page MCP & Appli > « Installer l'appli », ou « Demander l'appli » tant que l'installation en un clic n'est pas ouverte) ; en attendant, dites-lui ce qu'il faudra régler.
|
|
116
116
|
|
|
117
117
|
## 6. Après la V1
|
|
118
118
|
|
package/src/shops/app-tools.js
CHANGED
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { formatApp } from './format.js';
|
|
8
8
|
|
|
9
|
-
// Ce qu'il faut dire au marchand quand l'appli manque : il
|
|
10
|
-
//
|
|
9
|
+
// Ce qu'il faut dire au marchand quand l'appli manque : il l'installe lui-même, depuis son espace
|
|
10
|
+
// membre (bouton « Installer l'appli » ; « Demander l'appli » tant que Shopify ne l'a pas validée).
|
|
11
11
|
export const DEMANDER_APPLI =
|
|
12
|
-
"depuis son espace membre, page MCP & Appli
|
|
12
|
+
"depuis son espace membre, page MCP & Appli (https://story-theme.com/mcp) : « Installer l'appli », gratuite, en un clic — ou « Demander l'appli » si l'installation en un clic n'y est pas encore ouverte ; à défaut, contact@story-theme.com";
|
|
13
13
|
|
|
14
|
-
export const APPLI_ABSENTE = `L'appli
|
|
14
|
+
export const APPLI_ABSENTE = `L'appli Story Thème (Story Apps) n'est pas installée sur cette boutique, ou la boutique n'est pas branchée par Theme Access dans l'espace membre. Elle est gratuite : dites au marchand de l'installer ${DEMANDER_APPLI}, et de brancher sa boutique avec Theme Access (même page). En attendant, ses thèmes restent accessibles : pull_from_shop, push_to_shop, update_theme.`;
|
|
15
15
|
|
|
16
|
-
const PREREQUIS = `Nécessite l'appli
|
|
16
|
+
const PREREQUIS = `Nécessite l'appli Story Thème (Story Apps, gratuite) installée sur la boutique et la boutique branchée par Theme Access ; sinon, le marchand l'installe ${DEMANDER_APPLI}. Réglage par l'assistant : Story Thème 4.0+ publié et licence active.`;
|
|
17
17
|
|
|
18
18
|
const cibles = z
|
|
19
19
|
.union([z.string(), z.array(z.string())])
|
|
@@ -40,7 +40,7 @@ export function registerAppTools(server, { client, ok, fail }) {
|
|
|
40
40
|
'app_status',
|
|
41
41
|
{
|
|
42
42
|
title: "État de l'appli Story Thème",
|
|
43
|
-
description: `État des modules de l'appli
|
|
43
|
+
description: `État des modules de l'appli Story Thème sur une ou plusieurs boutiques : thème publié et sa version (mise à jour disponible ?), licence, avis (publiés, à modérer, bloc d'avis présent dans la fiche produit), tests A/B (en cours, intégration « Tests A/B Story » activée dans le thème), offres cumulables (remise automatique active ?), demandes RGPD en attente. À appeler avant de régler l'appli. ${PREREQUIS}`,
|
|
44
44
|
inputSchema: { shops: cibles },
|
|
45
45
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
46
46
|
},
|
|
@@ -64,7 +64,7 @@ export function registerAppTools(server, { client, ok, fail }) {
|
|
|
64
64
|
'app_reviews',
|
|
65
65
|
{
|
|
66
66
|
title: 'Avis clients (appli Story Thème)',
|
|
67
|
-
description: `Avis clients de l'appli
|
|
67
|
+
description: `Avis clients de l'appli Story Thème. Les avis publiés remplissent les étoiles natives du thème (reviews.rating, aussi lues par Google), le bloc d'avis et le mur d'avis. Actions : summary (par défaut : chiffres, produits les plus notés, avis à modérer, réglages) ; list (status all|published|pending|hidden, product, rating, limit, offset) ; add (reviews : jusqu'à 100 avis RÉELS, publish false pour les mettre en modération ; un avis renvoyé n'est pas doublé) ; import_csv (csv : le texte d'un export Judge.me, Loox, Shopify Product Reviews, Ali Reviews ou du modèle Story) ; publish / hide / pending (ids, ou all_pending: true pour tout publier) ; delete (ids, définitif, confirm: true) ; reply (id, reply) ; pin (id, pinned) ; settings (autoPublishMin 0 = tout modérer ou 1-5, allowPhotos, verifiedOnly). N'ajoutez JAMAIS d'avis inventés : uniquement de vrais avis de clients (reçus par e-mail, exportés d'une autre appli). Les e-mails des clients ne sont jamais renvoyés. ${PREREQUIS}`,
|
|
68
68
|
inputSchema: {
|
|
69
69
|
shops: cibles,
|
|
70
70
|
action: z.enum(['summary', 'list', 'add', 'import_csv', 'publish', 'hide', 'pending', 'delete', 'reply', 'pin', 'settings']).optional(),
|
|
@@ -95,7 +95,7 @@ export function registerAppTools(server, { client, ok, fail }) {
|
|
|
95
95
|
'app_ab_tests',
|
|
96
96
|
{
|
|
97
97
|
title: 'Tests A/B (appli Story Thème)',
|
|
98
|
-
description: `Tests A/B de l'appli
|
|
98
|
+
description: `Tests A/B de l'appli Story Thème : la moitié des visiteurs (réglable) voit un autre modèle de page, servi par ?view=. Actions : list (par défaut : tests, visiteurs, taux d'ajout au panier et de conversion, verdict en une phrase, jours restants) ; templates (modèles B disponibles dans le thème PUBLIÉ, et si l'intégration « Tests A/B Story » est activée) ; create (template product|collection|index|page, view = suffixe du modèle B, ex. "offre-b" pour templates/product.offre-b.json ; handles : pages visées, toutes par défaut ; split 10-90 ; goal conversion|add_to_cart ; autoStop ; name) ; start / stop (id, winner A|B) ; apply_winner (id, confirm: true : les pages visées passent sur le modèle B) ; delete (id, confirm: true). Le modèle B doit exister dans le thème PUBLIÉ : le composer dans le projet (compose_page / edit_template, ex. templates/product.offre-b.json), puis, après accord explicite du marchand, n'envoyer QUE ce fichier : push_to_shop({ shops, theme: <identifiant du thème publié>, files: ["templates/product.offre-b.json"], confirm: true }) — jamais le projet entier dans le thème publié (un modèle en plus ne change aucune page) ; ou le marchand le crée lui-même dans l'éditeur Shopify (Modèles > Créer un modèle). Puis create. Le marchand active l'intégration « Tests A/B Story » dans l'éditeur de thème (Paramètres du thème > Intégrations d'applis). Conclure après 14 jours au moins. ${PREREQUIS}`,
|
|
99
99
|
inputSchema: {
|
|
100
100
|
shops: cibles,
|
|
101
101
|
action: z.enum(['list', 'templates', 'create', 'start', 'stop', 'apply_winner', 'delete']).optional(),
|
|
@@ -119,7 +119,7 @@ export function registerAppTools(server, { client, ok, fail }) {
|
|
|
119
119
|
'app_offers',
|
|
120
120
|
{
|
|
121
121
|
title: 'Offres cumulables (appli Story Thème)',
|
|
122
|
-
description: `Offres cumulables de l'appli
|
|
122
|
+
description: `Offres cumulables de l'appli Story Thème. CE QUI VIT DANS LE THÈME (à régler avec edit_template / push_to_shop) : les offres par paliers (blocs « Offres produit » _offer de la fiche produit : quantité, articles offerts, remise, cadeaux), les bundles (section « Bundle builder », paliers _bundle-tier) et les récompenses du panier (bloc _cart-rewards du tiroir panier : livraison offerte, cadeaux dès un montant). CE QUI VIT DANS L'APPLI : une remise automatique (fonction Shopify « Offres et bundles Story Thème ») qui applique ces offres SANS code et se cumule avec les codes des clients ; elle relit le thème publié à chaque modification. Actions : read (par défaut : ce que le thème règle, état de la remise, désynchronisation, offres qui portent encore un code promo inutile) ; activate (crée la remise automatique, ou la met à jour et la RÉACTIVE si elle a été arrêtée) ; diagnostic (réductions actives qui empêchent le cumul) ; make_combinable (ids facultatif : rend ces réductions cumulables avec les remises produit) ; deactivate (confirm: true : les offres ne s'appliquent plus). Sans activate, les offres du thème s'affichent mais ne remisent rien. ${PREREQUIS}`,
|
|
123
123
|
inputSchema: {
|
|
124
124
|
shops: cibles,
|
|
125
125
|
action: z.enum(['read', 'activate', 'diagnostic', 'make_combinable', 'deactivate']).optional(),
|
|
@@ -135,7 +135,7 @@ export function registerAppTools(server, { client, ok, fail }) {
|
|
|
135
135
|
'app_discount_codes',
|
|
136
136
|
{
|
|
137
137
|
title: 'Codes promo (appli Story Thème)',
|
|
138
|
-
description: `Codes promo Shopify créés par l'appli
|
|
138
|
+
description: `Codes promo Shopify créés par l'appli Story Thème. Actions : list (par défaut ; query pour filtrer) ; create (code, type percentage|fixed, value : 10 = -10 % ou 10 € de remise ; facultatif : title, minimumSubtotal, startsAt / endsAt AAAA-MM-JJ, usageLimit, oncePerCustomer, products OU collections = handles visés, combinesWith) ; deactivate (id ou code : mis en pause, réactivable dans Shopify). Par défaut un code se cumule avec les remises produit (offres du thème appliquées par l'appli) et la livraison offerte, pas avec les autres codes. Pour les offres par paliers du thème, pas de code : app_offers. ${PREREQUIS}`,
|
|
139
139
|
inputSchema: {
|
|
140
140
|
shops: cibles,
|
|
141
141
|
action: z.enum(['list', 'create', 'deactivate']).optional(),
|
package/src/shops/client.js
CHANGED
|
@@ -34,7 +34,7 @@ export function createShopsClient({ token, base = appsBase(), fetchImpl = global
|
|
|
34
34
|
list: ({ overview = false } = {}) => appel(`/mcp/shops${overview ? '?overview=1' : ''}`),
|
|
35
35
|
graphql: ({ shops, query, variables, confirm }) =>
|
|
36
36
|
appel('/mcp/graphql', { method: 'POST', body: JSON.stringify({ shops, query, variables, confirm }) }),
|
|
37
|
-
// Les modules de l'appli
|
|
37
|
+
// Les modules de l'appli Story Thème : status, reviews, ab, offers, discounts.
|
|
38
38
|
app: (module, corps) => appel(`/mcp/app/${encodeURIComponent(module)}`, { method: 'POST', body: JSON.stringify(corps) }),
|
|
39
39
|
};
|
|
40
40
|
}
|
package/src/shops/direct.js
CHANGED
|
@@ -135,7 +135,7 @@ export function registerDirectTools(server, config, { ctx, ok, garde }) {
|
|
|
135
135
|
...lignes,
|
|
136
136
|
'',
|
|
137
137
|
branchees
|
|
138
|
-
? '● branchée (Theme Access) = ses THÈMES sont accessibles : push_to_shop (lister, écrire, créer), pull_from_shop (relire), update_theme (mise à jour du Story Thème), migrate_v3 (3.x → 4.x). Avec l’appli
|
|
138
|
+
? '● branchée (Theme Access) = ses THÈMES sont accessibles : push_to_shop (lister, écrire, créer), pull_from_shop (relire), update_theme (mise à jour du Story Thème), migrate_v3 (3.x → 4.x). Avec l’appli Story Thème installée en plus : app_status, app_reviews, app_ab_tests, app_offers, app_discount_codes. Ses produits, collections, pages et menus passent par le connecteur Shopify officiel du marchand.'
|
|
139
139
|
: '',
|
|
140
140
|
// Une seule boutique branchée sur trois, c'est deux marchands qui ignorent encore
|
|
141
141
|
// que c'est possible : la marche à suivre reste affichée tant qu'il en manque une.
|
package/src/shops/format.js
CHANGED
|
@@ -65,7 +65,7 @@ const LIBELLES = {
|
|
|
65
65
|
discounts: 'Codes promo',
|
|
66
66
|
};
|
|
67
67
|
|
|
68
|
-
/** Résultat d'un module de l'appli
|
|
68
|
+
/** Résultat d'un module de l'appli, boutique par boutique (message rédigé par l'appli). */
|
|
69
69
|
export function formatApp(data) {
|
|
70
70
|
const res = data.results || [];
|
|
71
71
|
const reussis = res.filter((r) => r.ok).length;
|
package/src/shops/tools.js
CHANGED
|
@@ -24,7 +24,7 @@ const garde = (fn) => async (args) => {
|
|
|
24
24
|
} catch (e) {
|
|
25
25
|
if (e instanceof ShopsError && /sans Story Apps/.test(e.message)) {
|
|
26
26
|
// La boutique est sans doute branchée par Theme Access : l'outil n'est pas le bon.
|
|
27
|
-
return fail(`${e.message}\nSi elle est branchée par Theme Access (● dans list_shops) sans l'appli
|
|
27
|
+
return fail(`${e.message}\nSi elle est branchée par Theme Access (● dans list_shops) sans l'appli Story Thème, seuls ses thèmes sont accessibles : pull_from_shop, push_to_shop, update_theme, migrate_v3. Pour les avis, tests A/B, offres et codes promo, le marchand demande l'appli ${DEMANDER_APPLI}. Pour ses produits, collections, pages et menus : le connecteur Shopify officiel du marchand.`);
|
|
28
28
|
}
|
|
29
29
|
return fail(e.message);
|
|
30
30
|
}
|
|
@@ -87,7 +87,7 @@ export function registerShopTools(server, config, { fetchImpl, ctx } = {}) {
|
|
|
87
87
|
}),
|
|
88
88
|
);
|
|
89
89
|
|
|
90
|
-
// Les modules de l'appli
|
|
90
|
+
// Les modules de l'appli (avis, A/B, offres, codes promo) : seulement la passerelle.
|
|
91
91
|
registerAppTools(server, { client, ok, fail });
|
|
92
92
|
|
|
93
93
|
// L'envoi direct suppose un projet sous la main : seul le serveur complet passe `ctx`.
|
package/src/version.js
CHANGED