story-theme-mcp 1.7.1 → 1.7.2
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/knowledge/guides.js +1 -1
- package/src/server.js +2 -2
- package/src/shops/app-tools.js +3 -3
- package/src/shops/client.js +2 -2
- package/src/shops/format.js +2 -2
- package/src/shops/tools.js +5 -5
- 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 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) |
|
|
66
|
+
| L'appli Story Thème (Story Theme 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
|
|
|
@@ -106,7 +106,7 @@ Prompts prêts à l'emploi : `creer-boutique`, `refaire-une-page`, `auditer-un-t
|
|
|
106
106
|
|
|
107
107
|
## Limites
|
|
108
108
|
|
|
109
|
-
Le MCP ne publie jamais un thème : il écrit dans un thème non publié, le marchand vérifie et publie lui-même. Sans l'appli Story Apps installée sur la boutique, il fabrique seulement un zip à importer. Il ne crée ni produits, ni collections, ni menus, ni images, ni réductions par lui-même : `shop_graphql` le permet quand une boutique est connectée, sinon la check-list les liste. Et il ne remplace pas une vérification visuelle dans l'éditeur Shopify.
|
|
109
|
+
Le MCP ne publie jamais un thème : il écrit dans un thème non publié, le marchand vérifie et publie lui-même. Sans l'appli Story Theme Apps installée sur la boutique, il fabrique seulement un zip à importer. Il ne crée ni produits, ni collections, ni menus, ni images, ni réductions par lui-même : `shop_graphql` le permet quand une boutique est connectée, sinon la check-list les liste. Et il ne remplace pas une vérification visuelle dans l'éditeur Shopify.
|
|
110
110
|
|
|
111
111
|
## Développement (New Story)
|
|
112
112
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "story-theme-mcp",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.2",
|
|
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/knowledge/guides.js
CHANGED
|
@@ -217,7 +217,7 @@ Formats conseillés :
|
|
|
217
217
|
limites: {
|
|
218
218
|
title: 'Ce que le MCP (V1) ne fait pas',
|
|
219
219
|
body: `- Il ne publie jamais un thème : il écrit dans un thème NON publié (push_to_shop) ou fabrique un zip à importer (export_theme) ; le marchand vérifie et publie lui-même.
|
|
220
|
-
- Sans l'appli Story Apps sur la boutique, il n'a accès à rien d'elle : ni ses produits, ni ses thèmes. Appelez list_shops pour le savoir.
|
|
220
|
+
- Sans l'appli Story Theme Apps sur la boutique, il n'a accès à rien d'elle : ni ses produits, ni ses thèmes. Appelez list_shops pour le savoir.
|
|
221
221
|
- Il ne crée pas de lui-même produits, collections, menus, pages, réductions ni images : avec une boutique connectée, shop_graphql le permet ; sinon la check-list les liste.
|
|
222
222
|
- Il ne modifie jamais le code du thème (Liquid, CSS, JS) : seulement les modèles, les groupes de sections et les réglages, comme l'éditeur de thème.
|
|
223
223
|
- Il ne garantit pas le rendu visuel : prévisualisez toujours dans l'éditeur Shopify avant de publier.`,
|
package/src/server.js
CHANGED
|
@@ -107,7 +107,7 @@ 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
|
|
110
|
+
**L'appli Story Theme 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 ;
|
|
@@ -1649,7 +1649,7 @@ Read the file first (read_file) to get ids.`,
|
|
|
1649
1649
|
);
|
|
1650
1650
|
}
|
|
1651
1651
|
|
|
1652
|
-
// Boutiques du compte, via l'appli Shopify Story Apps (src/shops/).
|
|
1652
|
+
// Boutiques du compte, via l'appli Shopify Story Theme Apps (src/shops/).
|
|
1653
1653
|
registerShopTools(server, config, { ctx });
|
|
1654
1654
|
|
|
1655
1655
|
return server;
|
package/src/shops/app-tools.js
CHANGED
|
@@ -11,9 +11,9 @@ import { formatApp } from './format.js';
|
|
|
11
11
|
export const DEMANDER_APPLI =
|
|
12
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 Story
|
|
14
|
+
export const APPLI_ABSENTE = `L'appli Story Theme 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 Story
|
|
16
|
+
const PREREQUIS = `Nécessite l'appli Story Theme 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())])
|
|
@@ -31,7 +31,7 @@ export function registerAppTools(server, { client, ok, fail }) {
|
|
|
31
31
|
const data = await client.app(module, { shops: shops ?? 'all', ...reste });
|
|
32
32
|
return ok(formatApp(data), data);
|
|
33
33
|
} catch (e) {
|
|
34
|
-
if (/sans Story Apps/.test(e.message)) return fail(`${e.message}\n\n${APPLI_ABSENTE}`);
|
|
34
|
+
if (/sans Story (Theme )?Apps/.test(e.message)) return fail(`${e.message}\n\n${APPLI_ABSENTE}`);
|
|
35
35
|
return fail(e.message);
|
|
36
36
|
}
|
|
37
37
|
};
|
package/src/shops/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Client de la passerelle multi-boutiques de Story Apps (l'appli Shopify du Story Thème).
|
|
1
|
+
// Client de la passerelle multi-boutiques de Story Theme Apps (l'appli Shopify du Story Thème).
|
|
2
2
|
// Le jeton est celui du MCP (STORY_MCP_TOKEN) : aucune clé Shopify n'est jamais stockée ici.
|
|
3
3
|
|
|
4
4
|
const DEFAULT_APPS = 'https://apps.story-theme.com';
|
|
@@ -24,7 +24,7 @@ export function createShopsClient({ token, base = appsBase(), fetchImpl = global
|
|
|
24
24
|
signal: AbortSignal.timeout(30000),
|
|
25
25
|
});
|
|
26
26
|
} catch {
|
|
27
|
-
throw new ShopsError('Story Apps injoignable. Vérifiez votre connexion, puis réessayez.');
|
|
27
|
+
throw new ShopsError('Story Theme Apps injoignable. Vérifiez votre connexion, puis réessayez.');
|
|
28
28
|
}
|
|
29
29
|
const data = await res.json().catch(() => ({}));
|
|
30
30
|
if (!res.ok) throw new ShopsError(data.error || `Erreur ${res.status}`);
|
package/src/shops/format.js
CHANGED
|
@@ -17,7 +17,7 @@ export function formatShopList(data) {
|
|
|
17
17
|
const lignes = [BANDEAU, `Compte : ${data.account?.email || '?'} · ${shops.length} boutique${shops.length > 1 ? 's' : ''} connectée${shops.length > 1 ? 's' : ''}`, ''];
|
|
18
18
|
if (!shops.length) {
|
|
19
19
|
lignes.push(
|
|
20
|
-
"Aucune boutique connectée. Pour en connecter une : installez l'appli Story Apps sur la boutique (depuis l'
|
|
20
|
+
"Aucune boutique connectée. Pour en connecter une : installez l'appli Story Theme Apps sur la boutique (depuis l'espace membre Story Thème, page MCP & Appli), et branchez la boutique avec Theme Access (même page).",
|
|
21
21
|
);
|
|
22
22
|
return lignes.join('\n');
|
|
23
23
|
}
|
|
@@ -38,7 +38,7 @@ export function formatOverview(data) {
|
|
|
38
38
|
lignes.push(` ${n(s.products)} produits · ${n(s.collections)} collections`);
|
|
39
39
|
const m = s.modules || {};
|
|
40
40
|
lignes.push(
|
|
41
|
-
` Story Apps : ${n(m.reviews)} avis${m.reviewsPending ? ` (${m.reviewsPending} à modérer)` : ''} · ${n(m.abTests)} test${m.abTests > 1 ? 's' : ''} A/B · offres cumulables ${m.offers ? 'actives' : 'non activées'}`,
|
|
41
|
+
` Story Theme Apps : ${n(m.reviews)} avis${m.reviewsPending ? ` (${m.reviewsPending} à modérer)` : ''} · ${n(m.abTests)} test${m.abTests > 1 ? 's' : ''} A/B · offres cumulables ${m.offers ? 'actives' : 'non activées'}`,
|
|
42
42
|
);
|
|
43
43
|
if (s.errors?.length) lignes.push(` ⚠️ ${s.errors.map((e) => e.message).join(' · ')}`);
|
|
44
44
|
}
|
package/src/shops/tools.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Outils « multi-boutiques » du MCP Story Thème : lire et modifier TOUTES les boutiques d'un
|
|
2
|
-
// client en même temps, sans se déconnecter, via l'appli Shopify Story Apps.
|
|
2
|
+
// client en même temps, sans se déconnecter, via l'appli Shopify Story Theme Apps.
|
|
3
3
|
//
|
|
4
4
|
// Branchement : dans src/server.js, juste avant `return server;` de createServer :
|
|
5
5
|
// registerShopTools(server, config);
|
|
@@ -22,7 +22,7 @@ const garde = (fn) => async (args) => {
|
|
|
22
22
|
try {
|
|
23
23
|
return await fn(args || {});
|
|
24
24
|
} catch (e) {
|
|
25
|
-
if (e instanceof ShopsError && /sans Story Apps/.test(e.message)) {
|
|
25
|
+
if (e instanceof ShopsError && /sans Story (Theme )?Apps/.test(e.message)) {
|
|
26
26
|
// La boutique est sans doute branchée par Theme Access : l'outil n'est pas le bon.
|
|
27
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
|
}
|
|
@@ -44,7 +44,7 @@ export function registerShopTools(server, config, { fetchImpl, ctx } = {}) {
|
|
|
44
44
|
{
|
|
45
45
|
title: 'Vos boutiques',
|
|
46
46
|
description:
|
|
47
|
-
"Lists every Shopify store of this Story Theme account that has the Story Apps app installed: name, domain, handle, theme version, licence. Call it first before any multi-store work. Stores are reached through Story Apps: no Shopify key needed.",
|
|
47
|
+
"Lists every Shopify store of this Story Theme account that has the Story Theme Apps app installed: name, domain, handle, theme version, licence. Call it first before any multi-store work. Stores are reached through Story Theme Apps: no Shopify key needed.",
|
|
48
48
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
49
49
|
},
|
|
50
50
|
garde(async () => {
|
|
@@ -58,7 +58,7 @@ export function registerShopTools(server, config, { fetchImpl, ctx } = {}) {
|
|
|
58
58
|
{
|
|
59
59
|
title: "Vue d'ensemble des boutiques",
|
|
60
60
|
description:
|
|
61
|
-
'Only for stores where the
|
|
61
|
+
'Only for stores where the Story Theme Apps app is installed. Key figures in one call: products, collections, Shopify plan, theme version and pending update, licence, and Story Theme Apps modules (reviews, pending reviews, A/B tests, stackable offers). A store connected with Theme Access only, without the app, is NOT reachable here: app_status says what to tell the merchant.',
|
|
62
62
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
63
63
|
},
|
|
64
64
|
garde(async () => {
|
|
@@ -72,7 +72,7 @@ export function registerShopTools(server, config, { fetchImpl, ctx } = {}) {
|
|
|
72
72
|
{
|
|
73
73
|
title: 'Requête sur une ou plusieurs boutiques',
|
|
74
74
|
description:
|
|
75
|
-
'Only for stores where the
|
|
75
|
+
'Only for stores where the Story Theme Apps app is installed — NOT for a store connected with Theme Access only, 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 Theme Apps stores, in parallel, within the app scopes. For reviews, A/B tests, offers and discount codes prefer the app_* tools. A mutation on several stores needs confirm: true, only after the user explicitly agreed. Every access is logged.',
|
|
76
76
|
inputSchema: {
|
|
77
77
|
shops: cibleSchema,
|
|
78
78
|
query: z.string().describe('Requête ou mutation GraphQL Admin.'),
|
package/src/version.js
CHANGED